美文网首页
docker swarm init --force-new-cl

docker swarm init --force-new-cl

作者: CodingCode | 来源:发表于2021-04-16 03:02 被阅读0次

    这是最近碰到问题,然后重建swarm网络过程中用的命令以及经验总结。

    $ docker swarm init --force-new-cluster
        --force-new-cluster            Force create a new cluster from current state
    

    字面意思是基于当前状态,重建swarm网络。

    使用场景:

    我们知道swarm是基于raft协议来运行的,所以通常会有多个manager节点,当超过半数的manager节点都存活的时候,swarm网络才能达成共识,执行操作,否则是不能做swarm相关的操作的。

    注意 worker节点不参与投票,所以worker节点不影响swarm网络的状态。

    假设现在有一个5 manager节点,3个worker节点的swarm cluster环境;对应5节点的swarm网络允许最大的manager节点宕数是2,也就是说可以挂掉1个或者2个manager节点,整个swarm cluster还能继续允许正常;但是如果挂掉了三个manager节点了,那么此时只有两个manager节点活的,而两个不能形成多数投票,此时swarm网络不能做任何swarm 相关的操作,例如:docker node ls, docker service ls这些命令都不允许,因为没有超过半数的投票:

    $ docker node ls
    Error response from daemon: This node is not a swarm manager. Worker nodes can't be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.
    

    此时应该怎么办呢?最佳方案是把挂掉的其他manager节点赶快恢复回来,让swarm cluster重新形成多数活节点。

    然而如果坏掉的节点彻底坏掉了,已经不能恢复了,那么怎么办呢?此时就可以使用docker swarm init --force-new-cluster命令。

    注意此时虽然swarm cluster不能操作了,但是所有的worker都不影响正常的业务transaction。

    参数--force-new-cluster的用法

    命令docker swarm init --force-new-cluster需要在一台活着的manager节点上执行,其含义是:

    1. 在执行命令的node上重新初始化swarm cluster
    2. 这个cluster只包含当前自己一个node
    3. 这个cluster会试图重新创建所有的services (它本身是manager节点,包含之前所有的cluster信息)
    4. 这个cluster会把还活着的其他manager节点和worker节点自动加进来。

    此后用户就可以手动把其他的新节点加进来了:

    $ docker swarm join --token ...
    

    至此就完整了恢复了swarm cluster环境。

    相关文章

      网友评论

          本文标题:docker swarm init --force-new-cl

          本文链接:https://www.haomeiwen.com/subject/cksslltx.html