我最感兴趣的是从docker node ls
获得的信息。 Docker在哪里存储有关联接节点的信息?
答案 0 :(得分:3)
来自docker node ls
的信息可以在处理Manager nodes membership的分布式数据存储中找到。
使用Manager节点引导集群时,实际上是创建一个单节点数据库。每加入群集的其他Manager都会增加容量,并形成分布式一致的数据存储(使用称为Raft的算法)。
在存在故障和分区的情况下,此分布式数据存储可确保整个节点成员状态是一致的。
当您加入新的Agent节点(通过docker Services / Tasks处理)时,此节点及其信息将添加到Manager节点处理的分布式数据存储中。由于代理的角色与管理器的角色有所不同,因此这些节点的存储方式有所不同(请参阅Swarmkit中的store/nodes section)。
总结:
+----------------------------------------------------------------------------------+
| Distributed Consistent Datastore |
| |
| +-----------------------------------------------+ |
| | Raft cluster membership store | |
| | | |
| +---^--------------------^------------------^---+ |
| | | | |
| +-------------+----+ +---------+--------+ +---+--------------+ |
| | | | | | | |
| | Manager | | Manager | | Manager | |
| | | | | | | |
| +------------------+ +------------------+ +------------------+ |
| +-----------------------------------------------+ |
| | Node Membership store | |
| | | |
| +-----^-------------^-------------^----------^--+ |
| | | | | |
+----------------------------------------------------------------------------------+
| | | |
+---------+---+----+----+ +----+----+ +----+---+ +--+-----+--+--------+
| | | | | | | | | | | |
| Agent | | Agent | | Agent | | Agent | | Agent | | Agent |
| | | | | | | | | | | |
+---------+ +---------+ +---------+ +--------+ +--------+ +--------+
由于分布式存储正在使用Raft consensus algorithm,如果丢失了大多数Manager节点,则无法再处理更新并添加新节点(Manager和Agents)。这是为了避免数据不一致,在网络分区期间少数Manager的状态与多数Manager的状态不一致。确实,让管理者以不同的节点列表结尾将是很糟糕的,因为它们都被卡在一个分区中,但是他们不断地将节点添加到本地存储中,而不会在彼此之间“同步”该列表。
重新引导所有Swarm管理器时,它将停止处理新数据和加入集群的节点,直到大多数Manager节点已成功重新引导并且可以再次相互联系。因为我们在重新启动后恢复了大多数,所以我们可以安全地处理新更新并将新节点添加到群集中。因此,仍在重新启动过程中的少数服务器将必须赶上多数服务器。