etcd 集群 ID 不匹配

etcd cluster id mistmatch

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

这是我使用的脚本

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)

其他成员连运行都不是,怎么可能?

谢谢

对于所有从 google 偶然发现此内容的人:

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

您应该删除对等点并重新添加它 like shown in this helpful post:

In order to fix this it was pretty simple, first we had to log into an existing working server on the rest of the cluster and remove server00 from its member list:

etcdctl member remove <UID>

This free's up the ability to allow the new server00 to join but we needed to simply tell the cluster it could by issuing the add command:

etcdctl member add server00 http://1.2.3.4:2380

It you follow the logs on server00 you'll then see that everything spring into life. You can confirm this with the commands:

etcdctl member list

etcdctl cluster-health

使用 "etcdctl member list" 查找当前成员的 ID 是什么,找到试图使用错误 ID 加入集群的成员,然后使用 "etcdctl member remove " 从 "members" 中删除该对等方并尝试重新加入他。 希望对你有帮助。

我的 --data-dir=/var/etcd/data,删除并重新创建它,这对我有用。好像是我之前做的etcd集群的东西留在了这个目录,可能会影响etcd的设置。

我遇到了同样的问题,我们的领导 etcd 服务器宕机了,用新服务器替换后我们收到错误

 rafthttp: request sent was ignored (cluster ID mismatch)

它正在寻找旧的集群 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

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

在我的例子中,我得到了错误

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 保存数据的文件夹

2 年后,我才 运行 遇到同样的问题。 Dmitry 的回答很好,但忽略了 OP 在设置 etcd 集群时首先可能做错了什么。

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

因此,删除成员(如果新节点从未成功加入,则您真的不需要这样做)and/or 删除新节点的数据目录将 "fix" 问题,但它是如何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

好的,第一个节点是运行ning。集群数据在 ~/data 目录中。将来 运行s 你只需要(注意不需要集群状态):

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 existing” .

同样,在第 1 次第 2 个节点 runs/joins 之后,您可以 运行 它没有任何集群参数:

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

当然,您可以保留 运行ning etcd 以及其中的所有集群设置,但它们 "might" 会因为数据目录中的内容而被忽略。请记住,如果您加入第 3 个节点,新节点成员的知识将被复制到其余节点,并且这些 "initial" 集群设置在将来当您的集群发生变化时可能会完全 false/misleading。所以 运行 你加入的节点没有初始集群设置,除非你真的加入一个。

另外,最后一点要说的是,你 should/must 运行 集群中至少有 3 个节点,否则 RAFT 领导者选举过程将破坏一切。对于 2 个节点,当 1 个节点出现故障或断开连接时,该节点将不会自行选举并在选举循环中自旋。客户无法与处于选举模式的 etcd 服务对话……可用性很好!如果 1 个节点出现故障,您至少需要 3 个节点来处理。

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

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

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

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

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

  2. 检查结果

    etcdctl member list