Распределенные мастер-выборы с помощью куратора

распределенный

Заявление об авторских правах: эта статья является оригинальной статьей блоггера и соответствует соглашению об авторских правах CC 4.0 BY-SA. Пожалуйста, приложите ссылку на оригинальный источник и это заявление для перепечатки.
Ссылка на эту статью:Гу Депэн.GitHub.IO/note/2019/1…
демонстрационный пример:GitHub.com/Гу Депэн/…

1. Кураторская концепция

1. Что такое куратор?

Curator — это клиент Zookeeper с открытым исходным кодом от Netflix, а затем переданный в дар Apache.Среда Curator упакована в собственный интерфейс API зоопарка. Решено много очень низкоуровневых деталей разработки клиента ZooKeeper. Предоставляет различные сценарии применения ZooKeeper (распределенная блокировка, выбор лидера, общий счетчик, Абстрактная инкапсуляция механизмов кэширования, распределенных очередей и т.д.).

2. Концепция избрания лидера

Когда мы разрабатываем распределенную систему, нам нужен главный узел для управления, но если есть только один главный узел, главный зависает, и вся распределенная система не может работать, поэтому мы рассматриваем В случае высокой доступности нам необходимо возобновить мастер-кластер, и выбрать лидера в мастер-кластере для выполнения задач.

3. Два способа выбора куратора

1. Защелка выноски:

В соответствии с корневым путем несколько клиентов создают временные последовательные узлы по пути, например: лидер/узел_1, лидер/узел_2, лидер/узел_3, клиент с наименьшим номером узла становится лидером и не может его захватить Узел-лидер прослушивает событие удаления предыдущего узла и повторно принимает мастер после удаления предыдущего узла.

2.Селектор выноски:

Распределенная блокировка используется для захвата мастера, а тот, кто захватывает блокировку, является мастер-узлом.

Реализация кода Two.curator

1. Ведущий пакет

<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>4.2.0</version>
</dependency>

2. Зарегистрируйте зоопарк

RetryPolicy retryPolicy  = new ExponentialBackoffRetry(zkConfig.getBaseSleepTimeMs(),zkConfig.getMaxRetries());
CuratorFramework client = CuratorFrameworkFactory.builder()
        .connectString(zkConfig.getServer())
        .retryPolicy(retryPolicy)
        .namespace(zkConfig.getNamespace())
        .build();
client.start();

3. Метод LeaderLatch для выбора лидера

String lockPath = "/leader";
LeaderLatch leaderLatch = new LeaderLatch(client,lockPath);
LeaderLatchListener listener = new LeaderLatchListener() {
    @Override
    public void isLeader() {
        System.out.println("i am master");
    }

    @Override
    public void notLeader() {
        System.out.println("i am salver");
    }
};
leaderLatch.addListener(listener);
leaderLatch.start();
leaderLatch.await();

Анализ: создайте объект LeaderLatch, клиент — это объект CuratorFramework для zookeeper, lockPath — каталог соревнований, а метод isLeader запускается в LeaderLatchListener, когда узел становится лидером. Метод notLeader срабатывает, когда мастер-узел теряет лидерство (вызов метода close, потеря связи с zookeeper и т. д.). Только главный узел может продолжить выполнение кода после LeaderLatch.await(), а те, кто не захватит главный узел, всегда будут ждать.

4.LeaderSelector метод для выбора лидера

String lockPath = "/leader";
LeaderSelector leaderSelector = new LeaderSelector(client,lockPath,new LeaderSelectorListenerAdapter(){
    @Override
    public void takeLeadership(CuratorFramework curatorFramework) throws Exception {
        System.out.println("i am master");
    }
});
leaderSelector.autoRequeue();
leaderSelector.start();

Анализ: создайте объект LeaderSelector, клиент — это объект CuratorFramework для zookeeper, lockPath — каталог соревнования, когда он будет выбран в качестве главного узла, выполните метод takeLeadership, когда метод выполняется Когда закончите, отпустите лидерство. Метод autoRequeue() гарантирует, что узел может получить лидерство после освобождения лидерства.