Заявление об авторских правах: эта статья является оригинальной статьей блоггера и соответствует соглашению об авторских правах 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() гарантирует, что узел может получить лидерство после освобождения лидерства.