Синхронизация Binlog MySQL в реальном времени на основе Canal и Kafka

задняя часть
Синхронизация Binlog MySQL в реальном времени на основе Canal и Kafka

помещение

В последнее время архитектура бизнес-системы в основном завершена, а построение уровня данных относительно слабое, поскольку текущая работа автора сосредоточена на построении небольшой платформы данных. Задачей с относительно высоким приоритетом является синхронизация данных бизнес-системы практически в реальном времени (включая сохранение, обновление или мягкое удаление) с другим источником данных.Перед сохранением необходимо очистить данные и построить относительно разумную базу данных. это удобно для последующей статистики бизнес-данных. Модель данных для расширенной функциональности, такой как создание системы маркировки. Основываясь на ресурсах и возможностях текущей команды, исследование было расставлено по приоритетам.AlibabaПромежуточное ПО с открытым исходным кодомCanalиспользование.

В этой статье кратко рассказывается, как быстро построить наборCanalсопутствующие компоненты.

О канале

Краткое введение в промежуточное ПОCanalпредыстория и обоснование.

Введение

Следующее введение и обоснование следующего раздела взяты изCanalПроектREADME:

Canal[kə'næl], переводится как водный путь/труба/канав, основное назначение основано наMySQLАнализ добавочного журнала базы данных, обеспечивающий подписку и потребление добавочных данных.CanalПо правильному произношению фонетический символ похож на "стучать мочи", не так, как многие думаютCan Nal,"За это автор был осмеян дамой-разработчиком". На заре существования Alibaba из-за развертывания двухкомпьютерных залов в Ханчжоу и США возникла необходимость в бизнес-синхронизации между компьютерными залами.triggerПолучите дополнительные изменения. С 2010 года бизнес постепенно пытался анализировать журнал базы данных, чтобы получить добавочные изменения для синхронизации, что привело к большому количеству добавочных услуг подписки на базу данных и потребления.

Услуги, основанные на инкрементальной подписке и потреблении журналов, включают:

  • Зеркальное отображение базы данных.
  • Резервное копирование базы данных в режиме реального времени.
  • Построение индексов и обслуживание в режиме реального времени (разделение разнородных индексов, инвертирование индексов и т. д.).
  • бизнесCacheобновить.
  • Инкрементальная обработка данных с помощью бизнес-логики.

Как работает канал

MySQLПринцип активно-резервной репликации:

  • MySQLизMasterЭкземпляр записывает изменения данных в двоичный журнал (binary log, где записи называются событиями бинарного журналаbinary log events, в состоянии пройтиshow binlog eventsсмотреть)
  • MySQLизSlaveэкземпляр будетmasterизbinary log eventsскопировать в свой журнал ретрансляции (relay log)
  • MySQLизSlaveповтор экземпляраrelay logсобытие в изменении данных, чтобы отразить его в собственных данных

Canalработает следующим образом:

  • CanalмоделированиеMySQL Slaveпротокол взаимодействия, маскирующийся подMySQL Slave,В направленииMySQL MasterОтправитьdumpпротокол
  • MySQL MasterПолучатьdumpзапросить, начать толкатьbinary logдаватьSlave(которыйCanal)
  • CanalРазобратьbinary logобъект (изначальноbyteпоток) и может быть отправлен в соответствующую очередь сообщений и другое промежуточное ПО через коннектор.

Версии каналов и детали

На момент начала написания этой статьи (2020-03-05),CanalПоследняя выпущенная версияv1.1.5-alpha-1(2019-10-09выпущена), последняя официальная версияv1.1.4(2019-09-02Опубликовано). в,v1.1.4В основном добавлены функции аутентификации и мониторинга, а также произведена оптимизация производительности.Встроенные коннекторы в этой версииTcp,KafkaиRockerMQ. иv1.1.5-alpha-1версия была добавленаRabbitMQразъем, но эта версияRabbitMQСоединителю временно не удается определить подключениеRabbitMQномер порта, но проблема уже вmasterРемонт в ветке (подробности смотрите в исходникахCanalRabbitMQProducerпредставление класса). Другими словами,v1.1.4В настоящее время в этом выпуске можно использовать только встроенные соединители.Tcp,KafkaиRockerMQТри, если вы хотите попробоватьRabbitMQРазъем, вы можете выбрать один из следующих двух способов:

  • выберитеv1.1.5-alpha-1версия, но не может быть измененаRabbitMQизportсвойство, по умолчанию5672.
  • на основеmasterФилиал строит самCanal.

В настоящее время,CanalАктивность проекта относительно высока, но, учитывая стабильность функции, автор рекомендует использовать стабильную версию для реализации в производственной среде.v1.1.4Версия,"Пример, используемый в этой статье,v1.1.4версия, сKafkaиспользование коннектора".CanalВ основном он включает в себя три основных компонента:

  • canal-admin: Модуль фонового управления, обеспечивающийWebUIизCanalспособность управления.
  • canal-adapter: Адаптер, добавляющий функции адаптации и запуска клиентского лендинга данных, в т.ч.REST, адаптер журнала, синхронизация данных реляционной базы данных (синхронизация между таблицами),HBaseсинхронизация данных,ESсинхронизация данных и т.д.
  • canal-deployer: Издатель, где расположены основные функции, в том числеbinlogЭтот модуль предоставляет такие функции, как синтаксический анализ, преобразование и отправка сообщений на коннектор.

В целом,canal-deployerЧасти являются обязательными, а две другие части могут быть выбраны по мере необходимости.

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

Создание набора полезных компонентов требует развертыванияMySQL,Zookeeper,KafkaиCanalПримеры четырех промежуточного программного обеспечения, ниже приводится краткий анализ процесса развертывания. Выбранная система виртуальной машиныCentOS7.

Установить MySQL

Для простоты выберитеyumИсходная установка (официальная ссылкаhttps://dev.mysql.com/downloads/repo/yum):

::: Информация Хотя mysql80-community-release-el7-3 имеет ключевое слово mysql80 в имени пакета, он интегрировал последние хранилища установочных пакетов основных версий MySQL 5.6, 5.7 и 8.x и т. д. :::

Выберите последнюю версиюMySQL8.xСообщество, скачатьCentOS7Применимыйrpm包:

cd /data/mysql
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
// 下载完毕之后
sudo rpm -Uvh mysql80-community-release-el7-3.noarch.rpm

Перечислите это сейчасyumна складеMySQLСвязанные пакеты:

[root@localhost mysql]# yum repolist all | grep mysql
mysql-cluster-7.5-community/x86_64 MySQL Cluster 7.5 Community   disabled
mysql-cluster-7.5-community-source MySQL Cluster 7.5 Community - disabled
mysql-cluster-7.6-community/x86_64 MySQL Cluster 7.6 Community   disabled
mysql-cluster-7.6-community-source MySQL Cluster 7.6 Community - disabled
mysql-cluster-8.0-community/x86_64 MySQL Cluster 8.0 Community   disabled
mysql-cluster-8.0-community-source MySQL Cluster 8.0 Community - disabled
mysql-connectors-community/x86_64  MySQL Connectors Community    enabled:    141
mysql-connectors-community-source  MySQL Connectors Community -  disabled
mysql-tools-community/x86_64       MySQL Tools Community         enabled:    105
mysql-tools-community-source       MySQL Tools Community - Sourc disabled
mysql-tools-preview/x86_64         MySQL Tools Preview           disabled
mysql-tools-preview-source         MySQL Tools Preview - Source  disabled
mysql55-community/x86_64           MySQL 5.5 Community Server    disabled
mysql55-community-source           MySQL 5.5 Community Server -  disabled
mysql56-community/x86_64           MySQL 5.6 Community Server    disabled
mysql56-community-source           MySQL 5.6 Community Server -  disabled
mysql57-community/x86_64           MySQL 5.7 Community Server    disabled
mysql57-community-source           MySQL 5.7 Community Server -  disabled
mysql80-community/x86_64           MySQL 8.0 Community Server    enabled:    161
mysql80-community-source           MySQL 8.0 Community Server -  disabled

редактировать/etc/yum.repos.d/mysql-community.repoдокумент([mysql80-community]в блокеenabled设置为1, на самом деле по умолчанию так, менять не надо, если хотите выбрать5.xВерсия должна модифицировать соответствующий блок):

[mysql80-community]
name=MySQL 8.0 Community Server
baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

затем установитеMySQLСлужить:

sudo yum install mysql-community-server

Этот процесс относительно долгий, так как необходимо загрузить и установить 5rpmИнсталляционный пакет (или сжатый пакет всех инсталляционных пакетов вместе взятых)mysql-8.0.18-1.el7.x86_64.rpm-bundle.tar). Если сеть относительно плохая, вы также можете вручную скачать и установить его прямо с официального сайта:

// 下载下面5个rpm包 common --> libs --> libs-compat --> client --> server
mysql-community-common
mysql-community-libs
mysql-community-libs-compat
mysql-community-client
mysql-community-server

// 强制安装
rpm -ivh mysql-community-common-8.0.18-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-libs-8.0.18-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-libs-compat-8.0.18-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-client-8.0.18-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-server-8.0.18-1.el7.x86_64.rpm --force --nodeps

После установки запуститеMySQLобслуживание, затем поискMySQLУслугиrootВременный пароль учетной записи используется для первого входа в систему (mysql -u root -p):

// 启动服务,关闭服务就是service mysqld stop
service mysqld start
// 查看临时密码 cat /var/log/mysqld.log
[root@localhost log]# cat /var/log/mysqld.log 
2020-03-02T06:03:53.996423Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.18) initializing of server in progress as process 22780
2020-03-02T06:03:57.321447Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: >kjYaXENK6li
2020-03-02T06:04:00.123845Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.18) starting as process 22834
// 登录临时root用户,使用临时密码
[root@localhost log]# mysql -u root -p

Далее сделайте следующее:

  • ИсправлятьrootПароль пользователя:ALTER USER 'root'@'localhost' IDENTIFIED BY 'QWqw12!@';(Обратите внимание, что правила пароля должны содержать буквы верхнего и нижнего регистра, цифры и специальные символы)
  • возобновитьrootизhost, переключить базу данныхuse mysql;, указавhostза%так что другие серверы могут быть доступны удаленноUPDATE USER SET HOST = '%' WHERE USER = 'root';
  • наделять'root'@'%'пользователь, все права, выполнитьGRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
  • Изменятьroot'@'%Правила проверки пароля пользователя, чтобы их можно было использоватьNavicatи другие инструменты для доступа:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'QWqw12!@';

После завершения операции вы можете использоватьrootУдаленный доступ пользователя к этой виртуальной машинеMySQLСлужить. Наконец подтвердите, включен ли онbinlog(Обратите внимание, чтоMySQL8.xВключено по умолчаниюbinlog)SHOW VARIABLES LIKE '%bin%';:

Наконец вMySQLизShellВыполните следующую команду, чтобы создать новое имя пользователяcanalпарольQWqw12!@новых пользователей, даваяREPLICATION SLAVEиREPLICATION CLIENTРазрешения:

CREATE USER canal IDENTIFIED BY 'QWqw12!@';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
ALTER USER 'canal'@'%' IDENTIFIED WITH mysql_native_password BY 'QWqw12!@';

переключиться обратноrootпользователь, создайте базу данныхtest:

CREATE DATABASE `test` CHARSET `utf8mb4` COLLATE `utf8mb4_unicode_ci`;

Установить Зоокипер

CanalиKafkaкластеры зависят отZookeeperДля координации услуг, чтобы облегчить управление, он обычно развертывается независимо.Zookeeperслужба илиZookeeperкластер. Автор выбирает здесь2020-03-04Опубликовано3.6.0Версия:

midkr /data/zk
# 创建数据目录
midkr /data/zk/data
cd /data/zk
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.6.0/apache-zookeeper-3.6.0-bin.tar.gz
tar -zxvf apache-zookeeper-3.6.0-bin.tar.gz
cd apache-zookeeper-3.6.0-bin/conf
cp zoo_sample.cfg zoo.cfg && vim zoo.cfg

Пучокzoo.cfgв файлеdataDirУстановить как/data/zk/data, затем начнитеZookeeper:

[root@localhost conf]# sh /data/zk/apache-zookeeper-3.6.0-bin/bin/zkServer.sh start
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /data/zk/apache-zookeeper-3.6.0-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

Обратите внимание, что для запуска этой версииZookeeperСлужба должна быть установлена ​​локальноJDK8+, это должно решаться само собой. Порт по умолчанию для запуска:2181, журнал после успешного запуска выглядит следующим образом:

Установить Кафку

KafkaЯвляется высокопроизводительным промежуточным программным обеспечением распределенной очереди сообщений, его развертывание зависит отZookeeper. Автор этой подборки2.4.0иScalaВерсия2.13установочный пакет:

mkdir /data/kafka
mkdir /data/kafka/data
wget http://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.4.0/kafka_2.13-2.4.0.tgz
tar -zxvf kafka_2.13-2.4.0.tgz

После декомпрессии/data/kafka/kafka_2.13-2.4.0/config/server.propertiesсоответствует конфигурацииzookeeper.connect=localhost:2181Он уже соответствует потребностям и не нуждается в модификации.Вам необходимо изменить каталог лог-файлаlog.dirsза/data/kafka/data. затем начнитеKafkaСлужить:

sh /data/kafka/kafka_2.13-2.4.0/bin/kafka-server-start.sh /data/kafka/kafka_2.13-2.4.0/config/server.properties

Таким образом, запуск завершится, как только вы выйдете из консоли.Kafkaпроцесс, вы можете добавить-daemonПараметры используются для управленияKafkaФон процесса не зависает и запускается.

sh /data/kafka/kafka_2.13-2.4.0/bin/kafka-server-start.sh -daemon /data/kafka/kafka_2.13-2.4.0/config/server.properties

Установите и используйте канал

Наконец главный герой выходит на сцену, вот и выборCanalизv1.1.4Стабильная версия, просто скачайтеdeployerМодуль:

mkdir /data/canal
cd /data/canal
# 这里注意一点,Github在国内被墙,下载速度极慢,可以先用其他下载工具下载完再上传到服务器中
wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz
tar -zxvf canal.deployer-1.1.4.tar.gz

Распакованный каталог выглядит следующим образом:

- bin   # 运维脚本
- conf  # 配置文件
  canal_local.properties  # canal本地配置,一般不需要动
  canal.properties        # canal服务配置
  logback.xml             # logback日志配置
  metrics                 # 度量统计配置
  spring                  # spring-实例配置,主要和binlog位置计算、一些策略配置相关,可以在canal.properties选用其中的任意一个配置文件
  example                 # 实例配置文件夹,一般认为单个数据库对应一个独立的实例配置文件夹
    instance.properties   # 实例配置,一般指单个数据库的配置
- lib   # 服务依赖包
- logs  # 日志文件输出目录

В средах разработки и тестирования рекомендуется ставитьlogback.xmlУровень журнала изменен наDEBUGЛегко найти проблему. Здесь нужно обратить вниманиеcanal.propertiesиinstance.propertiesДва файла конфигурации.canal.propertiesфайл, который необходимо изменить:

  • Удалитьcanal.instance.parser.parallelThreadSize = 16этот элемент конфигурации"Примечания", то есть включение этого элемента конфигурации связано с количеством потоков парсера экземпляра, если он не настроен, то он будет заблокирован или не разобран.
  • canal.serverModeЭлемент конфигурации указан какkafka, необязательные значенияtcp,kafkaиrocketmq(masterфилиал или последнийv1.1.5-alpha-1версия, опциональноrabbitmq), значение по умолчаниюkafka.
  • canal.mq.serversконфигурация должна быть указана какKafkaслужба или кластерBrokerадрес, который настроен здесь как127.0.0.1:9092.

canal.mq.servers имеют разные значения в разных режимах canal.serverModes. В режиме kafka ссылается на адрес службы Kafka или брокера кластера, то есть bootstrap.servers В режиме RocketMQ ссылается на список NameServer. В режиме rabbitmq это относится к хосту и порту службы RabbitMQ.

Для других элементов конфигурации, пожалуйста, обратитесь к следующим двум официальнымWikiссылка на:

instance.propertiesОбычно относится к конфигурации экземпляра базы данных,CanalАрхитектура поддерживаетCanalЭкземпляр службы, который обрабатывает несколько экземпляров базы данных.binlogАсинхронный разбор.instance.propertiesЭлементы конфигурации, которые необходимо изменить, в основном включают:

  • canal.instance.mysql.slaveIdнужно настроить иMasterСлужба узлаIDСовсем другие значения, тут автор настраивает как654321.
  • Настройте экземпляр источника данных, включая адрес, пользователя, пароль и целевую базу данных:
    • canal.instance.master.address, здесь указано как127.0.0.1:3306.
    • canal.instance.dbUsername, здесь указано какcanal.
    • canal.instance.dbPassword, здесь указано какQWqw12!@.
    • новыйcanal.instance.defaultDatabaseName, здесь указано какtest(требуетMySQLсоздатьtestбазу данных, см. предыдущий процесс).
  • KafkaСвязанная конфигурация, здесь мы временно используем статическийtopicи синглpartition:
    • canal.mq.topic, здесь указано какtest,"То есть анализ завершен.binlogСтруктурированные данные отправляются наKafkaназванный какtestизtopicсередина".
    • canal.mq.partition, здесь указано как0.

После настройки можно приступатьCanalСлужить:

sh /data/canal/bin/startup.sh 
# 查看服务日志
tail -100f /data/canal/logs/canal/canal
# 查看实例日志  -- 一般情况下,关注实例日志即可
tail -100f /data/canal/logs/example/example.log

После нормального запуска смотрите журнал экземпляра следующим образом:

существуетtestБаза данных создает таблицу заказов и выполняет несколько простых операций.DML:

use `test`;

CREATE TABLE `order`
(
    id          BIGINT UNIQUE PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
    order_id    VARCHAR(64)    NOT NULL COMMENT '订单ID',
    amount      DECIMAL(10, 2) NOT NULL DEFAULT 0 COMMENT '订单金额',
    create_time DATETIME       NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    UNIQUE uniq_order_id (`order_id`)
) COMMENT '订单表';

INSERT INTO `order`(order_id, amount) VALUES ('10086', 999);
UPDATE `order` SET amount = 10087 WHERE order_id = '10086';
DELETE  FROM `order` WHERE order_id = '10086';

В это время вы можете использоватьKafkaизkafka-console-consumerилиKafka ToolsПроверятьtestэтоtopicДанные:

sh /data/kafka/kafka_2.13-2.4.0/bin/kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --from-beginning --topic test

Конкретные данные следующие:

// test数据库建库脚本
{"data":null,"database":"`test`","es":1583143732000,"id":1,"isDdl":false,"mysqlType":null,"old":null,"pkNames":null,"sql":"CREATE DATABASE `test` CHARSET `utf8mb4` COLLATE `utf8mb4_unicode_ci`","sqlType":null,"table":"","ts":1583143930177,"type":"QUERY"}

// order表建表DDL
{"data":null,"database":"test","es":1583143957000,"id":2,"isDdl":true,"mysqlType":null,"old":null,"pkNames":null,"sql":"CREATE TABLE `order`\n(\n    id          BIGINT UNIQUE PRIMARY KEY AUTO_INCREMENT COMMENT '主键',\n    order_id    VARCHAR(64)    NOT NULL COMMENT '订单ID',\n    amount      DECIMAL(10, 2) NOT NULL DEFAULT 0 COMMENT '订单金额',\n    create_time DATETIME       NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',\n    UNIQUE uniq_order_id (`order_id`)\n) COMMENT '订单表'","sqlType":null,"table":"order","ts":1583143958045,"type":"CREATE"}

// INSERT Binlog事件
{"data":[{"id":"1","order_id":"10086","amount":"999.0","create_time":"2020-03-02 05:12:49"}],"database":"test","es":1583143969000,"id":3,"isDdl":false,"mysqlType":{"id":"BIGINT","order_id":"VARCHAR(64)","amount":"DECIMAL(10,2)","create_time":"DATETIME"},"old":null,"pkNames":["id"],"sql":"","sqlType":{"id":-5,"order_id":12,"amount":3,"create_time":93},"table":"order","ts":1583143969460,"type":"INSERT"}

// UPDATE Binlog事件
{"data":[{"id":"1","order_id":"10086","amount":"10087.0","create_time":"2020-03-02 05:12:49"}],"database":"test","es":1583143974000,"id":4,"isDdl":false,"mysqlType":{"id":"BIGINT","order_id":"VARCHAR(64)","amount":"DECIMAL(10,2)","create_time":"DATETIME"},"old":[{"amount":"999.0"}],"pkNames":["id"],"sql":"","sqlType":{"id":-5,"order_id":12,"amount":3,"create_time":93},"table":"order","ts":1583143974870,"type":"UPDATE"}

// DELETE Binlog事件
{"data":[{"id":"1","order_id":"10086","amount":"10087.0","create_time":"2020-03-02 05:12:49"}],"database":"test","es":1583143980000,"id":5,"isDdl":false,"mysqlType":{"id":"BIGINT","order_id":"VARCHAR(64)","amount":"DECIMAL(10,2)","create_time":"DATETIME"},"old":null,"pkNames":["id"],"sql":"","sqlType":{"id":-5,"order_id":12,"amount":3,"create_time":93},"table":"order","ts":1583143981091,"type":"DELETE"}

видимыйKafkaназванныйtestизtopicСоответствующая структура была написанаbinlogДанные о событии, вы можете написать потребительские слушателиKafkaсоответствующийtopicЗатем полученные данные обрабатываются позже. Отправленная здесь структура данных может относиться кCanalИсходный код (текущее время редактирования2020-07-03изmasterотделение) вcom.alibaba.otter.canal.protocol.FlatMessage:

Обратите внимание на следующее:

  • FlatMessage.dataактуаленDMLвновь записанные данные, в то время какFlatMessage.oldисторические данные перед текущими вновь записанными данными, дляUPDATEТипDMLСказать,FlatMessage.dataиFlatMessage.oldданные будут существовать.
  • FlatMessage.sqlTypeизMap.Entry#value()вообще иjava.sql.JDBCTypeОтображение этого перечисления согласовано, и каждое из них может быть сопоставлено при разборе.ColumnатрибутJDBCType, а затем преобразовать его в соответствующийJavaтип.
  • Чтобы повысить эффективность передачи,CanalПри отправке в промежуточное программное обеспечение сообщения сообщение будет объединено,FlatMessageМожно содержать несколько разных записей об изменениях для одного и того же типа события, учитывая, чтоFlatMessage.dataдаList<Map<String, String>>тип, например, для той же таблицыINSERTсобытия, возможно, объединенные в одноFlatMessageэкземпляр, в то время какFlatMessage.dataсодержит два элемента.
  • CanalОтправитьFlatMessageкогда используешьFastJsonСериализация, я много видел оFastJsonИнформация, связанная с уязвимостью, должна быть психологически подготовлена ​​к обновлению версии.

резюме

Большая часть этой статьи посвящена тому, как развертывается другое ПО промежуточного слоя.CanalСамо развертывание не сложное, и его элементов атрибутов файла конфигурации относительно много, но на самом деле элементов конфигурации, которые необходимо настроить и изменить, относительно немного, а это означает, что затраты на его эксплуатацию и обслуживание, а также затраты на обучение невелики.

В настоящее время автор отвечает за архитектуру, часть обязанностей по эксплуатации и обслуживанию, а также за строительство центра обработки данных.UCloudПерешел на Alibaba Cloud и применил облакоRDS MySQL, и построил набор изCanalизHAКластер для подписки на основные сервисные данные после облегченногоETLи очистки, попадая в постоянно моделируемое хранилище данных на основе почти реального времениBinlogСобытие выполняет некоторые вычисления и обновления кеша в реальном времени, а также создает стыковку таблицы представления.MetabaseПредоставляет значки различных размеров для мониторинга рабочих показателей в режиме реального времени. В этом процессе было пройдено относительно большое количество ям. РазобратьCanalСгенерированоBinlogМероприятие заняло много времени на ранней стадии, учитывая низкую эффективность разработки, автору потребовалось некоторое время для написанияBinlogСвязующий слой анализа событий реализует функцию отображения неперцептивных объектов и высвобождает производительность. В следующей статье будет проанализировано этоBinlogРеализация инструмента синтаксического анализа событий поделится проблемами и решениями, возникшими позже, в том числе:CanalОстановленное исключение (если используется облакоRDS MySQL, эта яма относительно велика) иBinlogПроблемы с последовательностью событий и т. д.

Использованная литература:

(Конец этой статьи c-3-d e-a-20200306 r-a-20200709)

Технический публичный аккаунт Throwable Digest (id: throwable-doge) время от времени публикует оригинальные технические статьи автора (никогда не занимайтесь плагиатом и не перепечатывайте):

В этой статье используетсяmdniceнабор текста

Категории