Docker Swarm:如果所有 Swarm 管理器重新启动会发生什么

Docker Swarm: what happens if all swarm managers reboot

我最感兴趣的是从docker node ls那里得到的信息。 Docker 在哪里存储加入节点的信息?

docker在哪里存储加入节点的信息?

来自 docker node ls 的信息可以在处理管理器 nodes membership 的分布式数据存储中找到。

使用管理器节点引导集群时,您实际上创建了一个单节点数据库。每个加入集群的附加管理器都将增加该容量并形成分布式一致的数据存储(使用称为 Raft 的算法)。

这个分布式数据存储确保整个节点成员状态在出现故障和分区时是一致的。

当您加入一个新的代理节点(处理 docker Services/Tasks)时,该节点及其信息将添加到由管理器节点处理的分布式数据存储中。由于代理与管理器的角色有所不同,因此这些节点的存储方式不同(请参阅 Swarmkit 中的 store/nodes section)。

总结一下:

+----------------------------------------------------------------------------------+
|                        Distributed Consistent Datastore                          |
|                                                                                  |
|                +-----------------------------------------------+                 |
|                |          Raft cluster membership store        |                 |
|                |                                               |                 |
|                +---^--------------------^------------------^---+                 |
|                    |                    |                  |                     |
|      +-------------+----+     +---------+--------+     +---+--------------+      |
|      |                  |     |                  |     |                  |      |
|      |     Manager      |     |     Manager      |     |      Manager     |      |
|      |                  |     |                  |     |                  |      |
|      +------------------+     +------------------+     +------------------+      |
|                +-----------------------------------------------+                 |
|                |           Node Membership store               |                 |
|                |                                               |                 |
|                +-----^-------------^-------------^----------^--+                 |
|                      |             |             |          |                    |
+----------------------------------------------------------------------------------+
                       |             |             |          |
    +---------+---+----+----+   +----+----+   +----+---+   +--+-----+--+--------+
    |         |   |         |   |         |   |        |   |        |  |        |
    | Agent   |   |  Agent  |   |  Agent  |   |  Agent |   | Agent  |  | Agent  |
    |         |   |         |   |         |   |        |   |        |  |        |
    +---------+   +---------+   +---------+   +--------+   +--------+  +--------+

如果所有 Swarm 管理器重新启动会怎样?

因为分布式存储正在使用 Raft consensus algorithm,如果您丢失了大部分管理器节点,您将无法处理更多更新和添加新节点(管理器和代理)。这是为了避免数据不一致,即少数管理器的状态在网络分区期间与大多数管理器不同。事实上,让管理器以不同的节点列表结束是很糟糕的,因为它们都被困在一个分区中,但它们各自不断地向本地存储添加节点,而没有 "synchronizing" 他们之间的这个列表。

当重新启动所有 Swarm 管理器时,它将停止处理新数据和加入集群的节点,直到大多数管理器节点已成功重新启动并可以再次相互联系。因为我们在重启后恢复了大部分,所以我们可以安全地处理新更新并将新节点添加到集群。因此,当该过程完成时,仍在重启过程中的少数人将不得不赶上大多数人。