嘿,由于某种原因,我有一个群集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)
其他成员甚至没有跑,这怎么可能?
谢谢
答案 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并生成一些错误配置的随机本地群集。
按照以下步骤解决问题。
登录其他工作群集并从中删除无法访问的成员 群集
etcdctl cluster-health
etcdctl member remove member-id
登录新服务器并在etcd进程正在运行时停止systemctl etcd2 stop
从数据目录中删除数据rm -rf /var/etcd2/data
在删除数据之前,请将此数据备份到其他文件夹中。
现在使用--initial-cluster-state existing
参数启动群集,如果您已将服务器添加到现有群集,请不要使用--initial-cluster-state new
。
现在返回其中一个正在运行的etcd服务器并将此新成员添加到群集etcdctl member add node0 http://$IP:2380
我花了很多时间来调试这个问题,现在我的集群正在运行所有成员。希望这些信息有所帮助
答案 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)
向现有 etcd 集群添加新节点。
etcdctl member add <new_node_name> --peer-urls="http://<new_node_ip>:2380"
注意,如果您启用了 TLS,请将 http 替换为 https
在新节点中运行 etcd。 重要添加“--initial-cluster-state existing”,目的是告诉新节点加入现有集群,而不是创建新集群。< /p>
etcd --name <new_node_name> --initial-cluster-state existing ...
检查结果
etcdctl member list