我最感兴趣的是从
docker node ls
命令获取的信息。Docker在哪里存储有关加入节点的信息?docker node ls
命令获取的信息。Docker在哪里存储有关加入节点的信息?docker node ls
命令的信息可以在处理管理器节点成员资格的分布式数据存储中找到。
当使用管理器节点引导集群时,实际上创建了一个单节点数据库。每个加入集群的额外管理器都会增加其容量,并形成一个分布式一致的数据存储(使用称为Raft的算法)。
这种分布式数据存储确保整个节点成员状态在失败和分区存在的情况下保持一致。
当您加入新的代理节点(处理docker服务/任务)时,该节点及其信息将添加到由管理器节点处理的分布式数据存储中。由于代理与管理器的角色略有不同,因此这些节点存储方式也不同(请参见Swarmkit中的store/nodes部分)。
总之:
+----------------------------------------------------------------------------------+
| Distributed Consistent Datastore |
| |
| +-----------------------------------------------+ |
| | Raft cluster membership store | |
| | | |
| +---^--------------------^------------------^---+ |
| | | | |
| +-------------+----+ +---------+--------+ +---+--------------+ |
| | | | | | | |
| | Manager | | Manager | | Manager | |
| | | | | | | |
| +------------------+ +------------------+ +------------------+ |
| +-----------------------------------------------+ |
| | Node Membership store | |
| | | |
| +-----^-------------^-------------^----------^--+ |
| | | | | |
+----------------------------------------------------------------------------------+
| | | |
+---------+---+----+----+ +----+----+ +----+---+ +--+-----+--+--------+
| | | | | | | | | | | |
| Agent | | Agent | | Agent | | Agent | | Agent | | Agent |
| | | | | | | | | | | |
+---------+ +---------+ +---------+ +--------+ +--------+ +--------+
由于分布式存储使用Raft共识算法,如果您失去大多数管理节点,则无法处理任何更新并添加新节点(包括管理节点和代理节点)。这是为了避免不一致的数据,在网络分区期间,少数管理器的状态与大多数管理器不同。确实,如果管理器最终具有不同的节点列表,那将是糟糕的,因为它们都被卡在分区中,但它们个别地继续在本地存储中添加节点,而没有在彼此之间“同步”此列表。
当重新启动所有Swarm管理器时,它只会停止处理新数据和加入集群的节点,直到大多数管理器节点成功重新启动并再次相互联系。因为我们在重新启动后恢复了大多数,所以我们可以安全地处理新的更新并向集群添加新的节点。仍在重新启动过程中的少数派将在该过程完成时赶上大多数派。