【发布时间】:2019-01-08 15:05:05
【问题描述】:
我最感兴趣的是我从docker node ls 得到的信息。 Docker 将加入节点的信息存储在哪里?
【问题讨论】:
标签: docker docker-swarm docker-swarm-mode
我最感兴趣的是我从docker node ls 得到的信息。 Docker 将加入节点的信息存储在哪里?
【问题讨论】:
标签: docker docker-swarm docker-swarm-mode
来自docker node ls 的信息可以在处理Manager nodes membership 的分布式数据存储中找到。
当使用 Manager 节点引导集群时,您实际上是创建了一个单节点数据库。加入集群的每个额外 Manager 都会增加该容量并形成分布式一致数据存储(使用称为 Raft 的算法)。
这种分布式数据存储可确保整个节点成员状态在出现故障和分区的情况下保持一致。
当您加入新的代理节点(处理 docker 服务/任务)时,该节点及其信息将添加到由 Manager 节点处理的分布式数据存储中。由于 Agent 的角色与 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 不同。实际上,让 Manager 最终获得不同的节点列表会很糟糕,因为它们都被困在一个分区中,但他们各自不断地将节点添加到本地存储中,而彼此之间没有“同步”这个列表。
重新启动所有 Swarm 管理器时,它将停止处理新数据和加入集群的节点,直到大多数管理器节点成功重新启动并可以再次相互联系。因为我们在重启后恢复了大多数,所以我们可以安全地处理新的更新并将新节点添加到集群中。因此,仍处于重新启动过程中的少数人必须在该过程完成后赶上大多数人。
【讨论】: