помещение
CanalПоследняя официальная версия была2019-9-2опубликованоv1.1.4, автор поставил эту версию несколько месяцев назадCanalПеренесено в производственную среду, развернутоHAкластер. Хотя в процессе встречается много ям, но при условии отсутствия проблем,Canalэффект все еще очень очевиден. После того, как на прошлой неделе обновление было переведено в онлайн, исходные данные заказа для бизнес-системы были удалены.RabbitMQЗависимость от push-уведомлений в реальном времени, нижестоящая статистическая служба полностью проходит через основную бизнес-библиотеку восходящего потока.binlogСобытия агрегируются, тем самым реализуя разделение двух разных модулей основного бизнеса и статистики в реальном времени.

В этой статье кратко анализируется, как создать надежную производственную среду.CanalКластер высокой доступности.
Архитектура кластера высокой доступности Canal
CanalизHAФактически он включает в себя серверHAи клиентаHA, принципы реализации этих двух схожи, и оба достигаются за счетZookeeperЭкземпляр определяет конкретный путь для вытесненияEPHEMERAL(временный) метод узла, тот, который преуспеет в вытеснении, будет использоваться в качестве работающего узла (статусrunning), а сторона, которая не сможет выполнить вытеснение, будет служить резервным узлом (состояниеstandby). Следующее анализирует только серверную частьHAСоздание кластера, поскольку обычно используются встроенные конвейеры данных, такие какKafka, который в основном скрывает детали клиента. Предположим, что клиент используетKafka, то есть,CanalСинхронизируется с основной библиотекой наbinlogСобытия в конечном итоге послужатKafka,ТакCanalСерверHAАрхитектура кластера примерно следующая:

Это видно глобально, в то время как работаетCanalСервер может поддерживать одновременный мониторинг нескольких вышестоящих баз данных.binlog, абстракция конфигурации синтаксического анализа основной библиотеки находится вCanalсрок вInstance(пример):

определить несколькоInstanceОперация очень проста, основной файл конфигурации$CANAL_HOME/conf/canal.propertiesсерединаcanal.destinationsЭлементы конфигурации разделяются запятыми, например:
# canal.destinations=[Instance标识1,Instance标识2...,Instance标识n]
canal.destinations=customer-service,payment-service
затем в$CANAL_HOME/confдобавить в каталогcustomer-serviceа такжеpayment-serviceпапку, поставь оригинал$CANAL_HOME/conf/exampleв папкеinstance.propertiesСкопируйте прошлое и измените конфигурацию внутри по мере необходимости:
$CANAL_HOME
- conf
- customer-service
- instance.properties # 这里主要配置customer-service主库的连接信息、过滤规则和目标topic的配置等等
配置 【canal.mq.topic = customer-service】
- payment-service
- instance.properties # 这里主要配置payment-service主库的连接信息和过滤规则和目标topic的配置等等
配置 【canal.mq.topic = payment-service】
а такжеCanalокончательно решенbinlogсобытия будутtopicзаcustomer-serviceилиpayment-serviceОтправитьKafkaВ кластере это гарантирует, что проанализированные данные из разных источников данныхbinlogНе грязный.
Canal будет отслеживать изменения файла конфигурации каждого экземпляра instance.properties в режиме реального времени. Как только он обнаружит, что в файле конфигурации есть изменения свойств, он выполнит горячую перезагрузку. Принцип заключается в том, что изменение файла конфигурации экземпляра не требует перезапуска. служба каналов.
Построить кластер высокой доступности Canal
Для простоты Zookeeper и Kafka используют в качестве примера один узел, фактически рекомендуется, чтобы и Zookeeper, и Kafka использовали кластер узлов с нечетным числом (>=3) в производственной среде.
местный авторCentOS7.xвиртуальная машина192.168.56.200установлен наZookeeperа такжеKafka, локальная машина разработки192.168.56.1даWindows10операционная система. Виртуальная машина имеетMySQL8.xсервер (CanalТребоватьMySQLобслуживание наbinlogфункции поддерживаются и требуютbinlogТипROW, эти две точкиMySQL8.xвключено по умолчанию), теперь объясните подробно, как собрать его на этих двух машинах.CanalСерверHAкластер.
В рабочей среде машина, которая создает кластер высокой доступности сервера Canal, предпочтительно находится в той же интрасети, и рекомендуется, чтобы сервер принадлежал исключительно Canal, и не должно быть развернуто никакого другого промежуточного программного обеспечения или приложений. начать с 4 ядер и 8 ГБ памяти.
Скачать текущий (2020-08-22) последняя версияcanal.deployer-1.1.4.tar.gz:

скопировать и разархивироватьcanal.deployer-1.1.4.tar.gzна виртуальную машину/data/canalкаталог и извлеките копию на диск локальной машины разработки.Демонстрационное использование напрямуюexampleидентифицированныйInstance. Изменить виртуальную машину/data/canal/conf/example/instance.properties:

Обратите внимание, что здесь авторtopicустановить и базу данныхschemaПоследовательный. Другие детали не будут расширены.Если вам интересно, вы можете прочитать статью, написанную автором ранее.«Синхронизация Binlog MySQL в реальном времени на основе Canal и Kafka», в котором очень подробно описано, как развернуть доступныйCanalАвтономное обслуживание, в том числеMySQL,Zookeeperа такжеKafkaустановка и использование.
Точно так же добавьте точно такой же элемент конфигурации в соответствующий файл конфигурации на машине разработки, ноcanal.instance.mysql.slaveIdЭлементы конфигурации должны быть уникальными для каждого экземпляра и не могутserverIdконфликты, такие как:
# 虚拟机中的配置
canal.instance.mysql.slaveId=654321
# 开发机中的配置
canal.instance.mysql.slaveId=654322
Затем измените виртуальную машину/data/canal/conf/canal.propertiesЭлементы конфигурации, модификации в основном включают в себя:
| Key | Value |
|---|---|
canal.zkServers |
ЗаполнитьZookeeperсгруппированныйhost:port, заполните здесь192.168.56.200:2181
|
canal.serverMode |
kafka |
canal.instance.global.spring.xml |
classpath:spring/default-instance.xml(Обязательно измените эту конфигурацию, так как управление кластером на основе Zookeeper зависит от этой конфигурации) |
canal.mq.servers |
ЗаполнитьKafkaсгруппированныйhost:port, заполните здесь192.168.56.200:9092
|
Другие элементы конфигурации могут быть изменены по мере необходимости.заcanal.properties,CanalНесколько узлов кластера могут быть полностью согласованы, просто напишите одну копию и используйте ее.. Тогда вы можете начать дваCanalСлужбы, как правило, узел, который запускается первым, становитсяrunningузел:
- за
Linuxсистемы, вы можете использовать командуsh $CANAL_HOME/bin/startup.shзапускатьCanal. - за
Windowsсистема, напрямую приостановить выполнение командного интерфейса$CANAL_HOME/bin/startup.batСкрипт подойдет.
Если консоль сообщает об ошибке ch.qos.logback.core.LogbackException: неожиданное расширение имени файла файла... при запуске Windows, это на самом деле потому, что переменная заполнителя пути к файлу конфигурации журнала в сценарии не имеет предустановленного значения, поскольку показано на следующем рисунке:

LinuxЖурнал запуска под (example.log):

WindowsЖурнал запуска под (canal.log):

Тестовый кластер высокой доступности каналов
Сначала запустите виртуальную машинуCanalservice, а затем запустите локальную машину разработкиCanalСлужить:

видимый токclusterСписок содержит дваhost:port,а такжеrunningИнформация в узле содержит только информацию о виртуальной машине.host:port, что означает, что в виртуальной машине, когда узел в данный момент работаетCanalслужба, в локальной машине разработкиCanalобслуживание в качестве резервного узла. На этом этапе вы можете попробовать выполнить на виртуальной машинеsh stop.shзакрытиеCanalСлужить:

видимыйclusterСписок остается только на локальной машине разработкиCanalУслугиhost:port,а такжеrunningИнформация в узле также указывает на эту служебную информацию. слишком далекоуспешно провереноCanalАктивно-резервный режимвыключатель. На этом этапе вы можете повторно проверитьexample.log:

Расскажите об узлах данных, которые Canal сохраняет в Zookeeper.
предыдущее использованиеZooInspectorШоуCanalСохранить какZookeeperИнформация об узле в , вот краткий анализ. Структура дерева узлов следующая:
| путь к узлу | описывать |
|---|---|
/otter/canal |
Корневая директория |
/otter/canal/cluster |
CanalИнформация об узле кластера |
/otter/canal/destinations |
CanalвсеInstanceИнформация |
/otter/canal/clusterРасширение пути выглядит следующим образом:
# 其实就是挂载了所有集群节点的host:port信息
/otter/canal/cluster
- 192.168.56.1:11111
- 172.17.0.1:11111
/otter/canal/destinationsПуть будет относительно сложным, и расширенная информация выглядит следующим образом:
/otter/canal/destinations
- Instance标识
- running 记录当前为此Instance提供服务状态为running的Canal节点 [EPHEMERAL类型]
- cluster 记录当前为此Instance提供服务的Canal集群节点列表
- Client序号标识
- running 客户端当前正在读取的running节点 [EPHEMERAL类型]
- cluster 记录当前读取此Instance的客户端节点列表
- cursor 记录客户端读取的position信息
# 例如
/otter/canal/destinations
- example
- running -> {"active":true,"address":"192.168.56.1:11111"}
- cluster
- 192.168.56.1:11111
- 172.17.0.1:11111
- 1001
- running
- cluster
- cursor
Понимание информации, хранящейся в каждом пути, способствуетCanalПри сбое кластера используйте журналы для устранения неполадок.
резюме
CanalКластер находится в производстве в течение определенного периода времени, и большинство проблем и ям были обнаружены.Некоторые проблемы были решены путем блокировки определенных коммутаторов, а некоторые оставшиеся проблемы, которые не могут быть решены, также были решены вручную с помощью методов раннего предупреждения. .CanalизHAПо сути, это типичный активно-резервный режим, то есть одновременно только одиночный.Canalобслуживание в одиночкуInstance(Destination) для обработки, и поразмыслив, кажется, что это может обеспечить базовый порядок синхронизации логов первичного и вторичного реле.На самом деле резервный узел полностью неактивен (кроме мониторингаZookeeperизменения в пути), один разrunningВ случае сбоя или простоя узла резервный узел будет повышен доrunningnode для обеспечения доступности кластера.
(Конец этой статьи c-3-d e-a-20200822)