首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >etcd簇id不匹配

etcd簇id不匹配
EN

Stack Overflow用户
提问于 2016-11-14 09:56:03
回答 6查看 18K关注 0票数 6

嘿,由于某种原因,我有一个群集id错配,我在一个节点上,在几次清除数据dir之后,就会断开它,更改集群令牌和节点名称,而在另一个节点上删除。

这是我使用的脚本

代码语言:javascript
复制
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

我得到了

代码语言:javascript
复制
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)

其他的人连跑都没有,怎么可能呢?

谢谢

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-03-12 11:52:36

对于那些从谷歌偶然发现这一点的人来说:

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

您应该删除对等方并重新添加它为就像在这篇有用的文章中所显示的

为了解决这个问题,它非常简单,首先我们必须登录到集群其余部分上的现有工作服务器,并从其成员列表中删除server00: etcdctl member remove <UID> 这是免费的,可以允许新的server00加入,但是我们只需要通过发出add命令告诉集群它可以: etcdctl member add server00 http://1.2.3.4:2380 如果您跟踪server00上的日志,那么您就会看到所有的事情都开始活跃起来了。您可以使用以下命令来确认这一点: etcdctl member list etcdctl cluster-health

使用"etcdctl成员列表“查找当前成员的ID,并找到试图加入ID错误的集群的ID,然后删除带有"etcdctl成员删除”的“成员”中的对等方,然后尝试重新加入他。希望能帮上忙。

票数 10
EN

Stack Overflow用户

发布于 2019-08-21 17:38:42

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

运行带有“--集群状态新”的etcd实例,将在数据目录中生成一个集群ID。如果尝试然后/稍后加入现有集群,它将使用旧的生成的集群ID (即发生错配错误时)。是的,从技术上讲,OP有一个“旧集群”,但更有可能,而且100%常见的情况是,当有人试图站起来他们的第一个集群时,他们没有注意到程序必须改变。我发现etcd在提供一个好的使用模型方面通常是失败的。

因此,删除该成员(如果新节点从未成功地加入)和/或删除新节点的数据目录将“修复”该问题,但是OP如何设置第二个集群节点才是问题所在。

这里有一个设置细微差别的例子:(叹息.谢谢你.)

代码语言:javascript
复制
# 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目录中。在以后的运行中,您只需要(注意,不需要集群状态):

代码语言:javascript
复制
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:

代码语言:javascript
复制
etcdctl --endpoints="https://127.0.0.1:2379" member add etcd2 --peer-urls="http://<next node's IP address>:2380"

添加成员很重要。如果不先这样做,您将无法成功地加入。

代码语言:javascript
复制
# 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"

注意这里烦人的额外参数。-初始群集必须有100%的集群中所有节点被识别.加入集群后这并不重要,因为集群数据无论如何都会被复制.此外,还需要“-初始-集群存在”。

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

代码语言:javascript
复制
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个节点在一个集群,否则木筏领导人选举过程将打破一切。对于2个节点,当一个节点下降或断开连接时,该节点将不会选择自己并在一个选举循环中旋转。客户不能与处于选举模式的etcd服务对话.很好的可用性!如果1下降,至少需要3个节点来处理。

票数 3
EN

Stack Overflow用户

发布于 2017-11-12 12:42:47

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

rafthttp:请求集群ID不匹配(got 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 /成员文件夹,在所有节点上重新启动了etcd,并且瞧!

附注:

/var/lib/etcd -是etcd保存其数据的文件夹

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40585943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档