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 Alibaba
middleware de código abierto Canal
utilización.
En este artículo se explica brevemente cómo construir rápidamente un conjunto de Canal
componentes 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 MySQL
un 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 trigger
los 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
Cache
de refresco - Con la lógica de negocio de procesamiento de datos incrementales
las obras del Canal
MySQL
Copiar principio de espera:
MySQL
ElMaster
ejemplo de los datos de cambio de escritos en el registro binario (binary log
que se llama binarios registro de eventos registrabinary log events
, puedeshow binlog events
ser visto)MySQL
ElSlave
ejemplomaster
sebinary log events
copia en su relay log (relay log
)MySQL
ElSlave
ejemplo de repeticiónrelay log
del evento, los datos cambian para reflejar sus propios datos
Canal
Funciona de la siguiente manera:
Canal
SimulaciónMySQL Slave
de los protocolos de interacción, se disfrazóMySQL Slave
deMySQL Master
envíodump
protocoloMySQL Master
La recepción dedump
la solicitud, a partir de un empujebinary log
aSlave
(es decirCanal
)Canal
Analizarbinary log
el objeto (como el originalbyte
stream), 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
), Canal
la última versión v1.1.5-alpha-1
( 2019-10-09
liberado), es la última versión oficial v1.1.4
( 2019-09-02
liberado). Entre ellos, v1.1.4
el 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
, Kafka
y RockerMQ
. La v1.1.5-alpha-1
versión ha añadido un RabbitMQ
conector, pero esta versión del RabbitMQ
conector es temporalmente incapaz de definir la conexión RabbitMQ
número de puerto, pero el problema ha sido master
reparado rama (ver específicamente el código fuente de la CanalRabbitMQProducer
clase de registro presentada). En otras palabras, v1.1.4
la versión actualmente sólo puede utilizar los conectores incorporados Tcp
, Kafka
y RockerMQ
tres clases de los primeros usuarios si desea utilizar el RabbitMQ
conector, puede utilizar una de las dos formas siguientes:
- Selección
v1.1.5-alpha-1
de versiones, pero no se puede modificarRabbitMQ
laport
propiedad, de manera predeterminada5672
. - Con base en
master
ellos mismos construyeron ramaCanal
.
En la actualidad, la Canal
actividad 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.4
versión de los ejemplos de este artículo utilizan es opcional v1.1.4
versión, con los Kafka
conectores utilizados . Canal
El núcleo comprende tres componentes principales:
canal-admin
: Módulo de administración, para proporcionar aWebUI
laCanal
administración.canal-adapter
: Adaptador, aumento del adaptador de datos de clientes y empezar capacidades de aterrizaje, incluyendoREST
adaptador de registro, la sincronización de datos base de datos relacional (tabla de sincronización a la mesa),HBase
sincronización de datos,ES
sincronización de datos, y así sucesivamente.canal-deployer
: Editor, donde las funciones básicas, incluyendobinlog
el 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-deployer
se 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
, Kafka
y Canal
cuatro 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 yum
la 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.x
Community Edition, descargar CentOS7
el 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 yum
el repositorio de MySQL
paquetes 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.repo
el archivo ( [mysql80-community]
bloque enabled设置为1
, de hecho, el valor predeterminado es así, no cambian, si usted quiere elegir 5.x
la 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 MySQL
servicio:
sudo yum install mysql-community-server
Este proceso es relativamente largo, debido a la necesidad de descargar e instalar 5 rpm
de 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 MySQL
servicio, y luego buscar MySQL
el servicio root
cuenta 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
root
contraseñ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
root
lahost
base de datos de conmutaciónuse mysql;
, designadohost
como%
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 utilizarNavicat
herramientas 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 root
el acceso remoto en esta máquina virtual MySQL
servicios. Por último, asegúrese de abrir binlog
(nota que está MySQL8.x
habilitado por defecto binlog
) SHOW VARIABLES LIKE '%bin%';
:
Por último, en MySQL
el Shell
siguiente orden, crear un nuevo nombre de usuario canal
contraseña para QWqw12!@
nuevos usuarios, dando REPLICATION SLAVE
y REPLICATION CLIENT
permisos:
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 root
usuario, crear una base de datos test
:
CREATE DATABASE `test` CHARSET `utf8mb4` COLLATE `utf8mb4_unicode_ci`;
instalar Zookeeper
Canal
Y Kafka
las agrupaciones se basan en Zookeeper
hacer la coordinación de servicios, con el fin de facilitar la gestión, por lo general el despliegue independiente Zookeeper
de servicios o Zookeeper
clúster. Aquí elijo 2020-03-04
lanzado 3.6.0
la 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.cfg
documento dataDir
establece /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 Zookeeper
servicio 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
Kafka
Es un alto rendimiento distribuye cola de mensajes middleware, que depende de la implementación Zookeeper
. El autor de esta elección 2.4.0
y la Scala
versión 2.13
del 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.properties
de configuración correspondiente zookeeper.connect=localhost:2181
ya satisfacer la necesidad, sin tener que modificar, es necesario modificar el archivo de registro de directorio log.dirs
es /data/kafka/data
. Y luego iniciar el Kafka
servicio:
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 Kafka
proceso, se puede añadir -daemon
parámetros para controlar el Kafka
proceso 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 Canal
de la v1.1.4
versión estable, sólo tiene que descargar el deployer
mó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.xml
al nivel de registro modificado para DEBUG
facilitar problema de posicionamiento. Debemos centrarnos en canal.properties
y instance.properties
dos archivos de configuración. canal.properties
Archivos, es necesario modificar:
- Retire
canal.instance.parser.parallelThreadSize = 16
esta 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.serverMode
Los elementos de configuración especificados comokafka
valores opcionales sontcp
,kafka
yrocketmq
(master
sucursal o la últimav1.1.5-alpha-1
versión, puede utilizarrabbitmq
), de manera predeterminadakafka
.canal.mq.servers
Configuración requiere designado como unKafka
servicio o un grupo deBroker
direcció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 Wiki
enlaces:
instance.properties
Generalmente se refiere a una configuración de ejemplo de base de datos, Canal
la arquitectura soporta una Canal
instancia de servicio, manejar múltiples instancias de base de binlog
resolución asíncrono. instance.properties
Tenga que modificar la configuración de elementos incluyen:
canal.instance.mysql.slaveId
Y la necesidad de configurar unMaster
nodo de servicioID
completamente diferentes valores, aquí configurados654321
.- 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.address
Aquí designado127.0.0.1:3306
.canal.instance.dbUsername
Aquí designadocanal
.canal.instance.dbPassword
Aquí designadoQWqw12!@
.- Nuevo
canal.instance.defaultDatabaseName
, designado aquítest
(necesidad deMySQL
construir en unatest
base de datos, consulte el procedimiento anterior).
Kafka
Configuración, donde el uso temporal de estáticatopic
y únicapartition
:canal.mq.topic
, Designada aquítest
, que es analizada por elbinlog
datos estructurados se envíaKafka
al nombretest
detopic
la .canal.mq.partition
Aquí designado0
.
Después de configurar el trabajo, puede comenzar Canal
el 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 test
la 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 Kafka
de kafka-console-consumer
o Kafka Tools
para ver test
los topic
datos:
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 Kafka
el nombre test
del topic
que se ha escrito estructurado correspondientes binlog
datos de eventos, el consumidor puede escribir escuchar Kafka
correspondiente topic
a 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 Canal
en 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 binlog
hacer eventos ELT
y persistencia, así como relacionada con el trabajo Canal
de entorno de producción niveles disponibles HA
para grupos de construcción.
referencias:
blog personal
(Fin de la presente memoria, ea-20200306 c-3-d)