代码之家  ›  专栏  ›  技术社区  ›  davidear

etcd群集id不匹配

  •  6
  • davidear  · 技术社区  · 9 年前

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

    这是我使用的脚本

    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 回复  |  直到 9 年前
        1
  •  9
  •   tedder42    7 年前

    对于所有在谷歌上偶然发现这一点的人:

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

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

    为了解决这个问题,非常简单,首先我们必须登录到集群其余部分的现有工作服务器,并从其成员列表中删除server00:

    etcdctl member remove <UID>

    这一免费设置了允许新服务器00加入的能力,但我们只需通过发出add命令告诉集群它可以加入:

    etcdctl member add server00 http://1.2.3.4:2380

    如果您跟踪server00上的日志,那么您将看到一切都会进入生活。您可以通过以下命令确认:

    etcdctl member list

    etcdctl cluster-health

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

        2
  •  3
  •   dubmojo    6 年前

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

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

    以下是设置细微差别的示例:(叹气…感谢您的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"
    

    请注意这里恼人的额外参数--初始集群必须100%识别集群中的所有节点……这在您加入集群后并不重要,因为集群数据将以任何方式复制……此外,还需要“初始集群存在”。

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

    sudo etcd--name$CL_name--data dir~/data--advertise客户端URL=http://127.0.0.1:2379,https://$IP_ADDR:2379——侦听客户端URL=https://0.0.0.0:2379--初始通告对等URL https://$IP_ADDR:2380--侦听对等URL https://$IP-ADDR:380
    

    当然,您可以在所有集群设置的情况下继续运行etcd,但数据目录中的内容可能会被忽略。请记住,如果您加入第三个节点,新节点成员的知识将复制到其余节点,并且这些“初始”群集设置在将来群集更改时可能完全错误/误导。因此,运行加入的节点时不使用初始群集设置,除非您实际加入了一个。

    此外,最后一点要说明的是,您应该/必须在集群中至少运行3个节点,否则,RAFT领导人选举过程将破坏一切。对于2个节点,当1个节点发生故障或断开连接时,节点将不会选择自身并在选举循环中旋转。客户端无法与处于选举模式的etcd服务进行对话…非常可用!如果1发生故障,您至少需要3个节点来处理。

        3
  •  2
  •   Alex    8 年前

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

    rafthttp:请求群集ID不匹配(获得1b3a88599e79f82b,需要B339D80A381A57)

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

    我的两个节点进入配置

    环境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 "

    一个节点得到

    环境ETCD_INITIAL_CLUSTER=“ETCD-01= http://172.16.50.101:2380 "

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

    附笔

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

        4
  •  1
  •   Yitong Feng    9 年前

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

        5
  •  1
  •   skipper21    8 年前

    我也遇到了同样的问题,我们的领先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

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

        6
  •  1
  •   Chen Meng    5 年前
    1. 将新节点添加到现有etcd群集。

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

    注意 或者,如果启用TLS,则替换 http 具有 https

    1. 在新节点中运行etcd。它是 重要的 加入‘ --初始群集状态已存在

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

    2. 检查结果

      etcdctl member list