这是最近碰到问题,然后重建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节点上执行,其含义是:
- 在执行命令的node上重新初始化swarm cluster
- 这个cluster只包含当前自己一个node
- 这个cluster会试图重新创建所有的services (它本身是manager节点,包含之前所有的cluster信息)
- 这个cluster会把还活着的其他manager节点和worker节点自动加进来。
此后用户就可以手动把其他的新节点加进来了:
$ docker swarm join --token ...
至此就完整了恢复了swarm cluster环境。
网友评论