Где докер хранит информацию о соединенных узлах?
Информация из docker node ls
может быть найдена в распределенном хранилище данных, которое обрабатывает членство узлов Manager .
При начальной загрузке кластера с помощью узла Manager вы по существу создаете базу данных с одним узлом. Каждый дополнительный менеджер, присоединяющийся к кластеру, будет увеличивать эту емкость и формировать распределенное согласованное хранилище данных (используя алгоритм Raft).
Это распределенное хранилище данных обеспечивает согласованность всего состояния членства узла при наличии сбоев и разделов.
Когда вы присоединяетесь к новому узлу агента (работающему с Docker Services / Tasks), этот узел и его информация добавляются в распределенное хранилище данных, обрабатываемое узлами Manager. Поскольку агенты играют несколько иные роли, чем менеджеры, эти узлы хранятся по-разному (см. Раздел store / node в Swarmkit).
Подводя итог:
+----------------------------------------------------------------------------------+
| Distributed Consistent Datastore |
| |
| +-----------------------------------------------+ |
| | Raft cluster membership store | |
| | | |
| +---^--------------------^------------------^---+ |
| | | | |
| +-------------+----+ +---------+--------+ +---+--------------+ |
| | | | | | | |
| | Manager | | Manager | | Manager | |
| | | | | | | |
| +------------------+ +------------------+ +------------------+ |
| +-----------------------------------------------+ |
| | Node Membership store | |
| | | |
| +-----^-------------^-------------^----------^--+ |
| | | | | |
+----------------------------------------------------------------------------------+
| | | |
+---------+---+----+----+ +----+----+ +----+---+ +--+-----+--+--------+
| | | | | | | | | | | |
| Agent | | Agent | | Agent | | Agent | | Agent | | Agent |
| | | | | | | | | | | |
+---------+ +---------+ +---------+ +--------+ +--------+ +--------+
Что произойдет, если все менеджеры Swarm перезагрузятся?
Поскольку в распределенном хранилище используется алгоритм консенсуса Raft , если вы потеряете большинство узлов Manager, вы больше не сможете обрабатывать обновления и добавлять новые узлы (как Manager, так и агенты). Это делается для того, чтобы избежать противоречивых данных, когда у меньшинства менеджеров их состояние отличается от большинства во время сетевого раздела. Действительно, было бы плохо, если бы менеджеры заканчивали с другим списком узлов, потому что все они были прикреплены к разделу, но они индивидуально продолжали добавлять узлы в свои локальные хранилища, не «синхронизируя» этот список между собой.
При перезагрузке всех менеджеров Swarm он просто прекратит обработку новых данных и узлов, присоединяющихся к кластеру, до тех пор, пока большинство узлов Manager не перезагрузятся и не смогут снова связаться друг с другом. Поскольку мы восстановили большинство после перезагрузки, мы можем безопасно обрабатывать новые обновления и добавлять новые узлы в кластер. Таким образом, меньшинство, все еще находящееся в процессе перезагрузки, должно будет догнать большинство, когда этот процесс будет завершен.