Можно ли добавлять участников в кластер Aeron без перенастройки существующих?

Я ищу способ добавить новых участников в существующий кластер Aeron без перенастройки существующих.

Похоже, что члены кластера определяются статически во время запуска как описано в учебнике по работе с кластерами:

final ConsensusModule.Context consensusModuleContext = new ConsensusModule.Context()
    .errorHandler(errorHandler("Consensus Module"))
    .clusterMemberId(nodeId)                                                                    
    .clusterMembers(clusterMembers(Arrays.asList(hostnames))) // <------ HERE                   
    .clusterDir(new File(baseDir, "consensus-module"))                                          
    .ingressChannel("aeron:udp?term-length=64k")                                                
    .logChannel(logControlChannel(nodeId, hostname, LOG_CONTROL_PORT_OFFSET))                    
    .replicationChannel(logReplicationChannel(hostname))                                         
    .archiveContext(aeronArchiveContext.clone());

Если я правильно понимаю, если я хочу добавить больше узлов, мне нужно перенастроить каждый существующий узел, чтобы включить новый член.

Более того, я нашел это в Aeron Cookbook (выделено мной)

Ключевые аспекты Рафта:

  • есть Сильный Лидер, а это значит, что все записи в журнале идут от лидера к последователям
  • Raft использует рандомизированные таймеры для выбора лидеров. Это добавляет несколько миллисекунд к отказоустойчивости, но сокращает время согласования избранного лидера (в кластере Aeron это максимум таймаут выборов * 2).
  • протокол Raft позволяет изменять конфигурацию во время выполнения (т. е. добавлять новые или удалять узлы во время выполнения). На момент написания этой статьи эта функция все еще находилась на рассмотрении в Aeron Cluster.

Однако я вижу такие классы, как io.aeron.cluster.DynamicJoin, и их использование в io.aeron.cluster.ConsensusModuleAgent, что заставляет меня думать, что динамическое добавление узлов возможно и, возможно, кулинарная книга устарела.

Знаете ли вы способ присоединиться к большему количеству узлов, не затрагивая существующие?


person Svilen Ivanov    schedule 20.05.2021    source источник
comment
Глядя на io.aeron.cluster.DynamicMembershipTest#shouldDynamiclyJoinClusterOfThreeNoSnapshots — кажется многообещающим, что это возможно. Мне просто нужно понять код тестового жгута.   -  person Svilen Ivanov    schedule 20.05.2021


Ответы (1)


Да, это возможно! Контекст должен быть построен следующим образом:

ConsensusModule.Context()
    .errorHandler(errorHandler("Consensus Module"))
    .clusterMemberId(Aeron.NULL_VALUE) // <1>
    .clusterMembers("") // <2>
    .memberEndpoints(memberEndpoints(hostnames[nodeId], nodeId)) // <3>
    .clusterConsensusEndpoints(consensusEndpoints(hostnames)) // <4>
    .clusterDir(File(baseDir, "consensus-module"))
    .ingressChannel("aeron:udp?term-length=64k")
    .logChannel("aeron:udp?term-length=64k")
    .replicationChannel(logReplicationChannel(hostname))
    .archiveContext(aeronArchiveContext.clone())
  1. clusterMemberId должно быть установлено на Aeron.NULL_VALUE. Идентификатор участника будет сгенерирован автоматически
  2. clusterMembers должно быть пустым. Статические элементы не требуются для динамического узла.
  3. memberEndpoints — это конфигурация канала этого узла. Формат ingress:port,consensus:port,log:port,catchup:port,archive:port. Очень похоже на статическую clusterMembers конфигурацию для один узел, но без идентификатора члена впереди.
  4. clusterConsensusEndpoints – разделенный запятыми список каналов consensus:port известных членов кластера. Я думаю, что это похоже на загрузочный список хостов, к которым можно присоединиться.
person Svilen Ivanov    schedule 20.05.2021
comment
Более полный пример доступен здесь: io.aeron.test.cluster.TestCluster#startDynamicNode - person Svilen Ivanov; 21.05.2021