etcd cluster id mistmatch

时间:2016-11-14 09:56:03

标签: cluster-computing etcd

嘿,由于某种原因,我有一个群集ID不匹配,我在1节点上有它然后在清除数据dir几次后消失,更改群集令牌和节点名称,但在另一个上显示

这是我使用的脚本

IP0=10.150.0.1
IP1=10.150.0.2
IP2=10.150.0.3
IP3=10.150.0.4
NODENAME0=node0
NODENAME1=node1
NODENAME2=node2
NODENAME3=node3

# changing these on each box
THISIP=$IP2
THISNODENAME=$NODENAME2

etcd --name $THISNODENAME --initial-advertise-peer-urls http://$THISIP:2380 \
 --data-dir /root/etcd-data \
 --listen-peer-urls http://$THISIP:2380 \
 --listen-client-urls http://$THISIP:2379,http://127.0.0.1:2379 \
 --advertise-client-urls http://$THISIP:2379 \
 --initial-cluster-token etcd-cluster-2 \
 --initial-cluster $NODENAME0=http://$IP0:2380,$NODENAME1=http://$IP1:2380,$NODENAME2=http://$IP2:2380,$NODENAME3=http://$IP3:2380 \
 --initial-cluster-state new

我得到了

2016-11-11 22:13:12.090515 I | etcdmain: etcd Version: 2.3.7   
2016-11-11 22:13:12.090643 N | etcdmain: the server is already initialized as member before, starting as etcd member...
2016-11-11 22:13:12.090713 I | etcdmain: listening for peers on http://10.150.0.3:2380
2016-11-11 22:13:12.090745 I | etcdmain: listening for client requests on http://10.150.0.3:2379
2016-11-11 22:13:12.090771 I | etcdmain: listening for client requests on http://127.0.0.1:2379
2016-11-11 22:13:12.090960 I | etcdserver: name = node2
2016-11-11 22:13:12.090976 I | etcdserver: data dir = /root/etcd-data
2016-11-11 22:13:12.090983 I | etcdserver: member dir = /root/etcd-data/member
2016-11-11 22:13:12.090990 I | etcdserver: heartbeat = 100ms
2016-11-11 22:13:12.090995 I | etcdserver: election = 1000ms
2016-11-11 22:13:12.091001 I | etcdserver: snapshot count = 10000
2016-11-11 22:13:12.091011 I | etcdserver: advertise client URLs = http://10.150.0.3:2379
2016-11-11 22:13:12.091269 I | etcdserver: restarting member 7fbd572038b372f6 in cluster 4e73d7b9b94fe83b at commit index 4
2016-11-11 22:13:12.091317 I | raft: 7fbd572038b372f6 became follower at term 8
2016-11-11 22:13:12.091346 I | raft: newRaft 7fbd572038b372f6 [peers: [], term: 8, commit: 4, applied: 0, lastindex: 4, lastterm: 1]
2016-11-11 22:13:12.091516 I | etcdserver: starting server... [version: 2.3.7, cluster version: to_be_decided]
2016-11-11 22:13:12.091869 E | etcdmain: failed to notify systemd for readiness: No socket
2016-11-11 22:13:12.091894 E | etcdmain: forgot to set Type=notify in systemd service file?
2016-11-11 22:13:12.096380 N | etcdserver: added member 7508b3e625cfed5 [http://10.150.0.4:2380] to cluster 4e73d7b9b94fe83b
2016-11-11 22:13:12.099800 N | etcdserver: added member 14c76eb5d27acbc5 [http://10.150.0.1:2380] to cluster 4e73d7b9b94fe83b
2016-11-11 22:13:12.100957 N | etcdserver: added local member 7fbd572038b372f6 [http://10.150.0.2:2380] to cluster 4e73d7b9b94fe83b
2016-11-11 22:13:12.102711 N | etcdserver: added member d416fca114f17871 [http://10.150.0.3:2380] to cluster 4e73d7b9b94fe83b
2016-11-11 22:13:12.134330 E | rafthttp: request cluster ID mismatch (got cfd5ef74b3dcf6fe want 4e73d7b9b94fe83b)

其他成员甚至没有跑,这怎么可能?

谢谢

6 个答案:

答案 0 :(得分:2)

对于所有从谷歌偶然发现此事的人:

错误是关于对等成员ID,它试图加入与群集中已存在的另一个成员(可能是旧实例)同名的群集(具有相同的对等名称,但另一个ID,这是问题)。

你应该删除对等体并重新添加它,如有用的帖子所示:https://ngineered.co.uk/blog/how-to-replace-a-etcd-node

使用“etcdctl成员列表”查找当前成员的ID,找到尝试使用错误ID加入群集的ID,然后使用“etcdctl member remove”从“members”中删除该对等项并尝试重新加入他。 希望它有所帮助。

答案 1 :(得分:1)

两年后,我刚遇到同样的问题。德米特里(Dmitry)的回答很好,但是却错过了OP在设置etcd集群时可能首先犯的错误。

任何时候使用“ --cluster-state new”运行etcd实例,都会在数据目录中生成集群ID。如果您尝试随后/以后加入现有集群,它将使用该旧生成的集群ID(即发生不匹配错误的时间)。是的,从技术上讲,OP具有一个“旧集群”,但更有可能且100%常见的是,当某人试图站起他们的第一个集群时,他们没有注意到程序必须更改。我发现etcd通常无法提供良好的使用模型。

因此,删除成员(如果新节点从未成功加入则不需要,)和/或删除新节点的数据目录将“解决”该问题,但它是OP如何设置第二个集群节点的问题那个问题。

这是设置细微差别的一个示例:(叹息...感谢您的etcd ...)

# On the 1st node (I used Centos7 minimal, with etcd installed)
sudo firewall-cmd --permanent --add-port=2379/tcp
sudo firewall-cmd --permanent --add-port=2380/tcp
sudo firewall-cmd --reload

export CL_NAME=etcd1
export HOST=$(hostname)
export IP_ADDR=$(ip -4 addr show ens33 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')

# turn on etcdctl v3 api support, why is this not default?!
export ETCDCTL_API=3

sudo etcd --name $CL_NAME --data-dir ~/data --advertise-client-urls=http://127.0.0.1:2379,https://$IP_ADDR:2379 --listen-client-urls=https://0.0.0.0:2379 --initial-advertise-peer-urls https://$IP_ADDR:2380 --listen-peer-urls https://$IP_ADDR:2380 --initial-cluster-state new

好的,第一个节点正在运行。群集数据位于〜/ data目录中。在以后的运行中,您仅需要(请注意,不需要集群状态):

sudo etcd --name $CL_NAME --data-dir ~/data --advertise-client-urls=http://127.0.0.1:2379,https://$IP_ADDR:2379 --listen-client-urls=https://0.0.0.0:2379 --initial-advertise-peer-urls https://$IP_ADDR:2380 --listen-peer-urls https://$IP_ADDR:2380

接下来,添加第二个节点的预期群集名称和对等URL:

etcdctl --endpoints="https://127.0.0.1:2379" member add etcd2 --peer-urls="http://<next node's IP address>:2380"

添加成员很重要。您必须先加入才能成功加入。

# Next on the 2nd/new node
export CL_NAME=etcd1
export HOST=$(hostname)
export IP_ADDR=$(ip -4 addr show ens33 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')

sudo etcd --name $CL_NAME --data-dir ~/data --advertise-client-urls=https://127.0.0.1:2379,https://$IP_ADDR:2379 --listen-client-urls=https://0.0.0.0:2379 --initial-advertise-peer-urls https://$IP_ADDR:2380 --listen-peer-urls https://$IP_ADDR:2380 --initial-cluster-state existing --initial-cluster="etcd1=http://<IP of 1st node>:2380,etcd2=http://$IP_ADD:2380"

请注意此处令人讨厌的额外参数。 --initial-cluster必须已确定集群中所有节点的100%...加入集群后没关系,因为集群数据仍会被复制...而且“ --initial-cluster存在”也是必需的

同样,在第二个节点第一次运行/加入之后,您可以在没有任何群集参数的情况下运行它:

sudo etcd --name $CL_NAME --data-dir ~/data --advertise-client-urls=http://127.0.0.1:2379,https://$IP_ADDR:2379 --listen-client-urls=https://0.0.0.0:2379 --initial-advertise-peer-urls https://$IP_ADDR:2380 --listen-peer-urls https://$IP_ADDR:2380

当然,您可以在其中使用所有群集设置的情况下继续运行etcd,但是对于数据目录中的内容,它们“可能”被忽略。请记住,如果您加入第3个节点,则新节点成员的知识将复制到其余节点,并且当群集发生变化时,那些“初始”群集设置将来可能会完全错误/误导。因此,除非实际加入一个,否则就没有初始集群设置即可运行加入的节点。

最后一点,您应该/必须在集群中至少运行3个节点,否则RAFT领导者选举过程将破坏一切。对于2个节点,当1个节点发生故障或断开连接时,该节点将不会自行选举并进入选举循环。客户无法与处于选举模式的etcd服务交谈...可用性很高!如果1个节点发生故障,则至少需要3个节点来处理。

答案 2 :(得分:0)

我的--data-dir = / var / etcd / data,删除并重新创建它,这对我有用。似乎我在此目录中留下了之前的etcd集群,这可能会影响etcd设置。

答案 3 :(得分:0)

我遇到了同样的问题,我们的领导者etd服务器崩溃了,用新的替换后我们收到了错误

 rafthttp: request sent was ignored (cluster ID mismatch)

它正在寻找旧的cluster-Id并生成一些错误配置的随机本地群集。

按照以下步骤解决问题。

  1. 登录其他工作群集并从中删除无法访问的成员 群集

    etcdctl cluster-health etcdctl member remove member-id

  2. 登录新服务器并在etcd进程正在运行时停止systemctl etcd2 stop

  3. 从数据目录中删除数据rm -rf /var/etcd2/data在删除数据之前,请将此数据备份到其他文件夹中。

  4. 现在使用--initial-cluster-state existing参数启动群集,如果您已将服务器添加到现有群集,请不要使用--initial-cluster-state new

  5. 现在返回其中一个正在运行的etcd服务器并将此新成员添加到群集etcdctl member add node0 http://$IP:2380

  6. 我花了很多时间来调试这个问题,现在我的集群正在运行所有成员。希望这些信息有所帮助

答案 4 :(得分:0)

在我的情况下我得到了错误

rafthttp:请求群集ID不匹配(已获取1b3a88599e79f82b b33939d80a381a57)

由于一个节点上的配置不正确

我的两个节点进入了配置

env ETCD_INITIAL_CLUSTER =“etcd-01 = http://172.16.50.101:2380,etcd-02=http://172.16.50.102:2380,etcd-03=http://172.16.50.103:2380

并且有一个节点

env ETCD_INITIAL_CLUSTER =“etcd-01 = http://172.16.50.101:2380

解决问题我在所有节点上停止了etcd,编辑了错误的配置, 删除所有节点中的/ var / lib / etcd / member文件夹,在所有节点上重新启动etcd并瞧!

P.S。

/ var / lib / etcd - 是etcd在我的案例中保存其数据的文件夹

答案 5 :(得分:0)

  1. 向现有 etcd 集群添加新节点。

    etcdctl member add <new_node_name> --peer-urls="http://<new_node_ip>:2380"

注意,如果您启用了 TLS,请将 http 替换为 https

  1. 在新节点中运行 etcd。 重要添加“--initial-cluster-state existing”,目的是告诉新节点加入现有集群,而不是创建新集群。< /p>

    etcd --name <new_node_name> --initial-cluster-state existing ...

  2. 检查结果

    etcdctl member list