Canal обычно используется в сценариях синхронизации данных в реальном времени, поэтому высокая доступность особенно важна для сценариев реального времени. Canal поддерживает построение высокой доступности. Серверная и клиентская части Canal имеют соответствующие реализации высокой доступности. В больших данных данные синхронизации Canal обычно синхронизируются с Kafka. В данном случае Kafka эквивалентен Canal Client. Кластер Kafka имеет собственный атрибут HA, поэтому здесь мы ориентируемся только на HA Canal Server. Высокая доступность Canal Server предназначена главным образом для уменьшения количества запросов на дамп MySQL. Экземпляры на разных серверах (один и тот же экземпляр на разных серверах) требуют, чтобы одновременно работал только один, а остальные находились в состоянии ожидания (режим ожидания — это состояние экземпляра). ). Канал Принцип работы Сервера HA заключается в следующем:
Гарантийные шаги Canal HA следующие:
Машина работает на канале: node3, node4
Адрес смотрителя зоопарка: node3:2181,node4:2181,node5:2181
адрес MySQL: node2:3306
Загрузите установочный пакет Canal на node3, node4 и разархивируйте его в каталог «/software/canal», измените файл canal.properties в разделе «/software/canal/conf» и добавьте конфигурацию Zookeeper.
#Указываем адрес кластера Zookeeper
canal.zkServers = node3:2181,node4:2181,node5:2181
#Настраиваем XML-файл конфигурации Spring
canal.instance.global.spring.xml = classpath:spring/default-instance.xml
#canal записывает данные в Kafka, можно настроить с помощью: tcp, kafka, RocketMQ, TCP использует код канала для получения
canal.serverMode = kafka
#Настройте канал для записи адреса Kafka
canal.mq.servers = node1:9092,node2:9092,node3:9092
Войдите в каталог «/software/canal/conf/example» и измените файл «instance.properties»:
#Измените другой компьютер на 123457, чтобы убедиться, что идентификатор подчиненного устройства не повторяется.
canal.instance.mysql.slaveId=123456
#Настраиваем MySQL master Узлы и порты
canal.instance.master.address=node2:3306
#Настройте имя пользователя и пароль для подключения к MySQL, которые являются именем пользователя и паролем для предыдущих разрешений на копирование.
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
#Настройте Canal для импорта данных в Kafka topic
canal.mq.topic=canal_topic
Примечание. Имена каталогов экземпляров на двух компьютерах должны быть абсолютно одинаковыми. Режим высокой доступности зависит от имени экземпляра для управления. В то же время необходимо выбрать только конфигурацию default-instance.xml. информация о настройках Zookeeper.
#Запустить канал на узле3
[root@node3 ~]# cd /software/canal/bin
[root@node3 bin]# ./startup.sh
#Начать канал на узле 4
[root@node4 ~]# cd /software/canal/bin
[root@node4 bin]# ./startup.sh
После завершения запуска вы можете просмотреть соответствующую информацию о пути в Zookeeper:
После того как Canal HA будет построен по умолчанию, вы можете просмотреть узел активного канала, просмотрев «/otter/canal/destination/examples/running» в Zookeeper:
Проверьте Canal HA следующим образом:
mysql> insert into person values (4,"s1",21),(5,"s2",22),(6,"s3",23);
Можно заметить, что отслеживаемые данные в Kafka canal_topic выглядят следующим образом:
{"data":[{"id":"4","name":"s1","age":"21"},{"id":"5","name":"s2","age":"22"},{"id":"6","name":"s3","age":"23"}],"database":"testdb","es":1618849974000,"id":2,"isDdl":false,"mysqlType":{"id":"int","name":"varchar(255)","age":"int"},"old":null,"pkNames":null,"sql":"","sqlType":{"id":4,"name":12,"age":4},"table":"person","ts":1618849975203,"type":"INSERT"}
Завершите работу сервера канала node3:
[root@node3 ~]# cd /software/canal/bin
[root@node3 bin]# ./stop.sh
Просмотрите активный узел канала в пути Zookeeper «/otter/canal/destination/examples/running»:
Продолжайте записывать данные в таблицу «testdb.person» в MySQL:
mysql> insert into person values (7,"x1",24),(8,"x2",25),(9,"x3",26);
Вы можете наблюдать данные, записанные в Kafka «canal_topic» следующим образом:
{"data":[{"id":"7","name":"x1","age":"24"},{"id":"8","name":"x2","age":"25"},{"id":"9","name":"x3","age":"26"}],"database":"testdb","es":1618850233000,"id":2,"isDdl":false,"mysqlType":{"id":"int","name":"varchar(255)","age":"int"},"old":null,"pkNames":null,"sql":"","sqlType":{"id":4,"name":12,"age":4},"table":"person","ts":1618850234136,"type":"INSERT"}
После вышеуказанных испытаний Canal HA вступает в силу.
Примечание. После тестирования Canal HA использует Zookeeper для хранения позиции бинлога. Когда сервер Canal перезапускается и переключается на активный узел, последний фрагмент данных будет считываться повторно каждый раз. При использовании позиции бинлога локального хранилища, отличной от HA, такой проблемы не возникает.