Canal basada y Kafka lograr cerca de sincronización en tiempo real de MySQL binlog

premisa

Recientemente, básicamente completa arquitectura del sistema de negocios, la construcción a nivel de datos es relativamente débil debido a que actualmente el foco de trabajo es construir una pequeña plataforma de datos. Una tarea de mayor prioridad es la necesidad de sistemas en tiempo casi real de negocio de sincronización de datos (incluyendo reserva, actualizar, eliminar o blandos) a una otra fuente de datos, los datos necesarios para ser limpiados antes y persistencia para construir una relativamente fácil de seguir las estadísticas comerciales razonables, Construyendo el sistema de etiquetas modelo de datos como de extensión. Sobre la base de los recursos y capacidades del equipo actual, la prioridad de la investigación Alibabamiddleware de código abierto Canalutilización.

En este artículo se explica brevemente cómo construir rápidamente un conjunto de Canalcomponentes relacionados.

sobre Canal

breve introducción

Introducción a los siguientes principios y el siguiente son del Canal de proyecto README:

Canal[kə'næl], Traducido significa canal / tubería / trinchera, el objetivo principal se basa en MySQLun análisis de registros de base de datos incrementales, la suscripción proporcionar datos incrementales y el consumo. Alibaba pronto como Hangzhou y los Estados Unidos para desplegar una habitación doble, hay espacio a través de las necesidades del negocio sincronizado aplicación se basa principalmente en los negocios triggerlos cambios incrementales de adquisición. A partir de 2010, el negocio de tratar gradualmente para que el cambio incremental de análisis de registros de base de datos de sincronización, lo que dio lugar a un gran número de bases de datos de suscripción adicionales y los negocios de consumo.

Acceder a base de suscripción incrementales y el negocio de consumo, incluyendo:

  • Database Mirroring
  • Base de datos de copia de seguridad en tiempo real
  • Construir y mantener en tiempo real del índice (índice de isómeros resueltos, el índice invertido, etc.)
  • negocio Cachede refresco
  • Con la lógica de negocio de procesamiento de datos incrementales

las obras del Canal

MySQLCopiar principio de espera:

  • MySQLEl Masterejemplo de los datos de cambio de escritos en el registro binario ( binary logque se llama binarios registro de eventos registra binary log events, puede show binlog eventsser visto)
  • MySQLEl Slaveejemplo masterse binary log eventscopia en su relay log ( relay log)
  • MySQLEl Slaveejemplo de repetición relay logdel evento, los datos cambian para reflejar sus propios datos

CanalFunciona de la siguiente manera:

  • CanalSimulación MySQL Slavede los protocolos de interacción, se disfrazó MySQL Slavede MySQL Masterenvío dumpprotocolo
  • MySQL MasterLa recepción de dumpla solicitud, a partir de un empuje binary loga Slave(es decir Canal)
  • CanalAnalizar binary logel objeto (como el original bytestream), y puede ser transmitida al conector correspondiente o similar a través de la cola de mensajes middleware

Versiones y componentes en el Canal

A partir del momento en que empecé a escribir este artículo ( 2020-03-05), Canalla última versión v1.1.5-alpha-1( 2019-10-09liberado), es la última versión oficial v1.1.4( 2019-09-02liberado). Entre ellos, v1.1.4el principal autenticación añadido, funciones de vigilancia, e hizo una serie de optimizaciones de rendimiento, esta versión de los conectores están integrados Tcp, Kafkay RockerMQ. La v1.1.5-alpha-1versión ha añadido un RabbitMQconector, pero esta versión del RabbitMQconector es temporalmente incapaz de definir la conexión RabbitMQnúmero de puerto, pero el problema ha sido masterreparado rama (ver específicamente el código fuente de la CanalRabbitMQProducerclase de registro presentada). En otras palabras, v1.1.4la versión actualmente sólo puede utilizar los conectores incorporados Tcp, Kafkay RockerMQtres clases de los primeros usuarios si desea utilizar el RabbitMQconector, puede utilizar una de las dos formas siguientes:

  • Selección v1.1.5-alpha-1de versiones, pero no se puede modificar RabbitMQla portpropiedad, de manera predeterminada 5672.
  • Con base en masterellos mismos construyeron rama Canal.

En la actualidad, la Canalactividad del proyecto es relativamente alto, pero teniendo en cuenta la función de la estabilidad, el autor sugirió el uso de la versión estable implementado en un entorno de producción, puede utilizar la corriente v1.1.4versión de los ejemplos de este artículo utilizan es opcional v1.1.4versión, con los Kafkaconectores utilizados . CanalEl núcleo comprende tres componentes principales:

  • canal-admin: Módulo de administración, para proporcionar a WebUIla Canaladministración.
  • canal-adapter: Adaptador, aumento del adaptador de datos de clientes y empezar capacidades de aterrizaje, incluyendo RESTadaptador de registro, la sincronización de datos base de datos relacional (tabla de sincronización a la mesa), HBasesincronización de datos, ESsincronización de datos, y así sucesivamente.
  • canal-deployer: Editor, donde las funciones básicas, incluyendo binlogel análisis sintáctico, la conversión y el envío de mensajes al conector, y así sucesivamente funciones proporcionadas por este módulo.

En general, el canal-deployerse requiere miembro, los otros dos componentes se pueden utilizar en la demanda.

Desplegar el middleware necesario

Para construir un conjunto de componentes se puede utilizar para desplegar MySQL, Zookeeper, Kafkay Canalcuatro instancias de middleware, el siguiente análisis simple del proceso de despliegue. La selección de un sistema de máquina virtual CentOS7.

Instalación de MySQL

Por simplicidad, la elección de yumla fuente de instalación (enlace oficial es https://dev.mysql.com/downloads/repo/yum):

Información :::
mysql80-Community-Prensa-el7-3 Aunque el nombre del paquete con un mysql80 de palabras clave, de hecho, ha integrado la corriente principal de MySQL versión 8.x 5.6,5.7, y así el último repositorio de paquetes de instalación
:::

La selección de la última versión del MySQL8.xCommunity Edition, descargar CentOS7el aplicable 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

En este momento, la lista de lo que yumel repositorio de MySQLpaquetes relacionados:

[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

Editar /etc/yum.repos.d/mysql-community.repoel archivo ( [mysql80-community]bloque enabled设置为1, de hecho, el valor predeterminado es así, no cambian, si usted quiere elegir 5.xla versión que resulta necesario modificar el bloque correspondiente):

[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

Y luego instalar el MySQLservicio:

sudo yum install mysql-community-server

Este proceso es relativamente largo, debido a la necesidad de descargar e instalar 5 rpmde instalación (o paquete de instalación se comprime todas las combinaciones mysql-8.0.18-1.el7.x86_64.rpm-bundle.tar). Si la red es relativamente pobre, también se puede instalar directamente desde el sitio web oficial para descarga de forma manual:

// 下载下面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

Después de la instalación, inicie el MySQLservicio, y luego buscar MySQLel servicio rootcuenta contraseña temporal para el primer aterrizaje ( 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

A continuación, haga lo siguiente:

  • Modificar la rootcontraseña del usuario: ALTER USER 'root'@'localhost' IDENTIFIED BY 'QWqw12!@';(Tenga en cuenta las reglas de contraseña debe contener letras mayúsculas y minúsculas, números y caracteres especiales)
  • Actualizar rootla hostbase de datos de conmutación use mysql;, designado hostcomo %para permitir el acceso remoto a otros servidoresUPDATE USER SET HOST = '%' WHERE USER = 'root';
  • Dando 'root'@'%'a los usuarios todos los permisos, ejecutarGRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
  • Cambio root'@'%de validación de contraseña de usuario gobierna de manera que pueda utilizar Navicatherramientas tales como el acceso a:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'QWqw12!@';

Después de la operación se ha completado, puede utilizar rootel acceso remoto en esta máquina virtual MySQLservicios. Por último, asegúrese de abrir binlog(nota que está MySQL8.xhabilitado por defecto binlog) SHOW VARIABLES LIKE '%bin%';:

Por último, en MySQLel Shellsiguiente orden, crear un nuevo nombre de usuario canalcontraseña para QWqw12!@nuevos usuarios, dando REPLICATION SLAVEy REPLICATION CLIENTpermisos:

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!@';

Volviendo al rootusuario, crear una base de datos test:

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

instalar Zookeeper

CanalY Kafkalas agrupaciones se basan en Zookeeperhacer la coordinación de servicios, con el fin de facilitar la gestión, por lo general el despliegue independiente Zookeeperde servicios o Zookeeperclúster. Aquí elijo 2020-03-04lanzado 3.6.0la versión:

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

El zoo.cfgdocumento dataDirestablece /data/zk/data, y luego empezar 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

Señalar aquí que tenemos que empezar esta versión del Zookeeperservicio debe ser instalado localmente JDK8+, esto requiere discreción. El puerto por defecto se pone en marcha 2181, el registro después de un exitoso comienzo de la siguiente manera:

AnSo Kafka

KafkaEs un alto rendimiento distribuye cola de mensajes middleware, que depende de la implementación Zookeeper. El autor de esta elección 2.4.0y la Scalaversión 2.13del paquete de instalación:

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

Porque después de la descompresión /data/kafka/kafka_2.13-2.4.0/config/server.propertiesde configuración correspondiente zookeeper.connect=localhost:2181ya satisfacer la necesidad, sin tener que modificar, es necesario modificar el archivo de registro de directorio log.dirses /data/kafka/data. Y luego iniciar el Kafkaservicio:

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

Una vez que esto empieza a salir de la consola será el final del Kafkaproceso, se puede añadir -daemonparámetros para controlar el Kafkaproceso en segundo plano no cuelgue operación.

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

Instalación y uso del Canal

Y, finalmente, a la protagonista en el escenario, donde la elección Canalde la v1.1.4versión estable, sólo tiene que descargar el deployermódulo:

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

directorio desempaquetado de la siguiente manera:

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

En entornos de desarrollo y prueba recomendaciones logback.xmlal nivel de registro modificado para DEBUGfacilitar problema de posicionamiento. Debemos centrarnos en canal.propertiesy instance.propertiesdos archivos de configuración. canal.propertiesArchivos, es necesario modificar:

  • Retire canal.instance.parser.parallelThreadSize = 16esta configuración de elementos comentarios , es decir, para permitir que este elemento de configuración, y el número de subprocesos asociados ejemplo analizador, no se mostrará configurado para bloquear o no ser resuelto.
  • canal.serverModeLos elementos de configuración especificados como kafkavalores opcionales son tcp, kafkay rocketmq( mastersucursal o la última v1.1.5-alpha-1versión, puede utilizar rabbitmq), de manera predeterminada kafka.
  • canal.mq.serversConfiguración requiere designado como un Kafkaservicio o un grupo de Brokerdirección configurada aquí 127.0.0.1:9092.

canal.mq.servers tienen diferentes significados en diferentes canal.serverMode.
En el modo de kafka, se refiere al servicio de Kafka o la dirección agrupación de agentes, que es bootstrap.servers
bajo el modo rocketmq, consulte la lista de NameServer
en el modo RabbitMQ, se refieren a los servicios de host y puerto RabbitMQ

Otros elementos de configuración pueden hacer referencia a los siguientes dos oficiales Wikienlaces:

instance.propertiesGeneralmente se refiere a una configuración de ejemplo de base de datos, Canalla arquitectura soporta una Canalinstancia de servicio, manejar múltiples instancias de base de binlogresolución asíncrono. instance.propertiesTenga que modificar la configuración de elementos incluyen:

  • canal.instance.mysql.slaveIdY la necesidad de configurar un Masternodo de servicio IDcompletamente diferentes valores, aquí configurados 654321.
  • Ejemplos de fuentes de datos de configuración, incluyendo la dirección, la contraseña de usuario y la base de datos de destino:
    • canal.instance.master.addressAquí designado 127.0.0.1:3306.
    • canal.instance.dbUsernameAquí designado canal.
    • canal.instance.dbPasswordAquí designado QWqw12!@.
    • Nuevo canal.instance.defaultDatabaseName, designado aquí test(necesidad de MySQLconstruir en una testbase de datos, consulte el procedimiento anterior).
  • KafkaConfiguración, donde el uso temporal de estática topicy única partition:
    • canal.mq.topic, Designada aquí test, que es analizada por el binlogdatos estructurados se envía Kafkaal nombre testde topicla .
    • canal.mq.partitionAquí designado 0.

Después de configurar el trabajo, puede comenzar Canalel servicio:

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

Tras la salida, ver ejemplos del registro son los siguientes:

En testla creación de una base de datos de órdenes de mesa, y llevar a cabo unos sencillos 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';

Esta vez, puede tomar ventaja Kafkade kafka-console-consumero Kafka Toolspara ver testlos topicdatos:

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

Los datos específicos son los siguientes:

// 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
{"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
{"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
{"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"}

Visible Kafkael nombre testdel topicque se ha escrito estructurado correspondientes binlogdatos de eventos, el consumidor puede escribir escuchar Kafkacorrespondiente topica continuación para obtener datos para su posterior procesamiento.

resumen

En este artículo se describe más espacio para otro middleware es cómo implementar, el lado que el tema Canalen sí no es complicado de implementar, su archivo de configuración más elementos de atributos, pero en realidad requiere de elementos y los cambios de configuración autodefinidos son relativamente menos, es de entender sus costos de operación y mantenimiento y los costes de aprendizaje no son altos. Más tarde los análisis estructurado sobre la base de binloghacer eventos ELTy persistencia, así como relacionada con el trabajo Canalde entorno de producción niveles disponibles HApara grupos de construcción.

referencias:

blog personal

(Fin de la presente memoria, ea-20200306 c-3-d)

Supongo que te gusta

Origin www.cnblogs.com/throwable/p/12483983.html
Recomendado
Clasificación