clickhouse admite la sincronización nativa de Binlog mysql

Para poder monitorear eventos binlog, necesitamos usar middleware de terceros como canal antes, lo que sin duda aumenta la complejidad del sistema.

ClickHouse 20.8 agregará el motor MaterializeMySQL, que puede materializar datos mysql en tiempo real a través de registros binlog, mejorando el rendimiento de las consultas de los almacenes de datos y la puntualidad de la sincronización de datos; el trabajo de análisis de datos original realizado en mysql se puede realizar mediante clickhouse, que puede Ser significativo Reducir la carga de mysql en línea, desde entonces, los negocios OLTP y OLAP se han integrado perfectamente.

La nueva función utiliza el motor de base de datos de MaterializeMySQL, que se puede asignar a una base de datos en MySQL y crear automáticamente el correspondiente ReplacingMergeTree en ClickHouse.

Compatible con el motor de base de datos MaterializeMySQL:

1. Admite la sincronización de datos a nivel de base de datos mysql, pero el nivel de tabla no es compatible temporalmente.
2. La biblioteca MySQL se asigna a la tabla creada automáticamente como el motor ReplacingMergeTree en clickhouse.
3. Admite sincronización completa e incremental Se realiza una copia completa cuando se crea el motor de base de datos por primera vez y luego se realiza la sincronización incremental de datos mediante el monitoreo de los cambios de bitácoras.
4. Operaciones admitidas: insertar, actualizar, eliminar, alterar, crear, eliminar, truncar y la mayoría de las operaciones DDL.
5. La replicación de MySQL admitida es la replicación de GTID.

Proceso de sincronización de MaterializeMySQL:

1. Cree una tabla de mapeo de MySQL, complete la información de conexión de MySQL (dirección IP + puerto + nombre de base de datos + nombre de usuario + contraseña) en el motor MaterializeMySQL, ClickHouse creará una tabla de datos cuyo motor es ReplacingMergeTree, donde la CLAVE PRIMARIA del La tabla MySQL se utiliza como La PARTICIÓN POR de ReplacingMergeTree se divide por 1000 según el tamaño del tipo;
2. En este momento, ClickHouse extraerá todas las estructuras de la tabla en la base de datos de objetos MySQL y agregará los campos _sign y _version. El campo _sign indica si los datos se eliminan y el campo _version indica la última versión de los datos;
3. La primera sincronización usa la sincronización completa de los datos de la tabla en MySQL, y la versión _version es toda la 1.
4. Se usa la sincronización incremental posterior para consumir el SQL en el binlog. Cuando ClickHouse supervisa los eventos de inserción, actualización y eliminación, utilice _ El número de versión se incrementa automáticamente de forma global en la base de datos para registrar los datos más recientes. Cuando ClickHouse se sincroniza con la declaración de eliminación, el valor del campo _sign se actualiza a -1 (en este momento, las personas familiarizadas con MySQL definitivamente pensarán en una pseudo eliminación. Sí, sí, usa pseudo eliminación).

Inserte la descripción de la imagen aquí

Actualmente MaterializeMySQL admite los siguientes eventos binlog:

MYSQL_WRITE_ROWS_EVENT
_sign = 1 , _version ++

MYSQL_DELETE_ROWS_EVENT
_sign = -1 , _version ++

MYSQL_UPDATE_ROWS_EVENT
nuevo data_sign = 1

MYSQL_QUERY_EVENT
支持 CREAR TABLA 、 DROP TABLE 、 RENOMBRAR TABLA 等。

Proceso de construcción:

--添加mysql配置文件
vim /etc/my.cnf

server_id							= 66
binlog_format                       = ROW
log_bin								= /data/3306/binlog/mysql-bin
gtid-mode							= on
enforce-gtid-consistency       		= 1			# 设置为主从强一致性
log-slave-updates                   = 1			# 记录日志

--查询mysql版本信息
select version() ;
+------------+
| version()  |
+------------+
| 5.7.28-log |
+------------+

--创建测试库、表
create database clickhouse_test;
use clickhouse_test;

CREATE TABLE `scene` (
   `id` int NOT NULL AUTO_INCREMENT,
   `code` int NOT NULL,
   `title` text DEFAULT NULL,
   `updatetime` datetime DEFAULT NULL,
   PRIMARY KEY (`id`),   			## 主键要设置为not null,否则ClickHouse同步会报错
   KEY `idx_code` (`code`)   		## 索引键也要设置为not null,否则ClickHouse同步会报错
 ) ENGINE=InnoDB default charset=Latin1;

show tables;

--插入数据
INSERT INTO scene(code, title, updatetime) VALUES(1001,'aaa',NOW());
INSERT INTO scene(code, title, updatetime) VALUES(1002,'bbb',NOW());
INSERT INTO scene(code, title, updatetime) VALUES(1003,'ccc',NOW());
INSERT INTO scene(code, title, updatetime) VALUES(1004,'ddd',NOW());
commit;


--查询ClickHouse版本信息
SELECT version()						
┌─version()─┐
│ 20.8.3.18 │
└───────────┘

SET allow_experimental_database_materialize_mysql = 1
--该功能目前还处于实验阶段,在使用之前需要开启
select * from system.settings where name ='allow_experimental_database_materialize_mysql';

--创建一个复制管道
CREATE DATABASE clickhouse_mysql
ENGINE = MaterializeMySQL('127.0.0.1:3306', 'clickhouse_test', 'root', 'xxxxxxx')

SHOW DATABASES;
USE clickhouse_mysql;
SHOW TABLES;

SELECT * FROM scene;
┌─id─┬─code─┬─title─┬──────────updatetime─┐
│  11001 │ aaa   │ 2021-02-23 15:18:18 │
│  21002 │ bbb   │ 2021-02-23 15:18:23 │
│  31003 │ ccc   │ 2021-02-23 15:18:29 │
│  41004 │ ddd   │ 2021-02-23 15:18:34 │
└────┴──────┴───────┴─────────────────────┘


--尝试更新mysql表中数据,ClickHouse数据变化:_sign = 1 , _version ++
mysql> update scene set title='abc' where code=1001;
mysql> select * from scene;
+----+------+-------+---------------------+
| id | code | title | updatetime          |
+----+------+-------+---------------------+
|  1 | 1001 | abc   | 2021-02-23 15:18:18 |
|  2 | 1002 | bbb   | 2021-02-23 15:18:23 |
|  3 | 1003 | ccc   | 2021-02-23 15:18:29 |
|  4 | 1004 | ddd   | 2021-02-23 15:18:34 |
+----+------+-------+---------------------+

SELECT * FROM scene
┌─id─┬─code─┬─title─┬──────────updatetime─┐
│  11001 │ abc   │ 2021-02-23 15:18:18|  2 | 1002 | bbb   | 2021-02-23 15:18:23 |31003 │ ccc   │ 2021-02-23 15:18:29 │
│  41004 │ ddd   │ 2021-02-23 15:18:34 │
└────┴──────┴───────┴─────────────────────┘

SELECT *,_version,_sign FROM scene
┌─id─┬─code─┬─title─┬──────────updatetime─┬─_version─┬─_sign─┐
│  11001 │ aaa   │ 2021-02-23 15:18:1811 │
│  21002 │ bbb   │ 2021-02-23 15:18:2311 │
│  31003 │ ccc   │ 2021-02-23 15:18:2911 │
│  41004 │ ddd   │ 2021-02-23 15:18:3411 │
└────┴──────┴───────┴─────────────────────┴──────────┴───────┘
┌─id─┬─code─┬─title─┬──────────updatetime─┬─_version─┬─_sign─┐
│  11001 │ abc   │ 2021-02-23 15:18:1821 │
└────┴──────┴───────┴─────────────────────┴──────────┴───────┘


--尝试删除mysql表中数据,ClickHouse数据变化: _sign = -1 , _version ++
mysql> delete from scene where code=1002;
mysql> select * from scene;
+----+------+-------+---------------------+
| id | code | title | updatetime          |
+----+------+-------+---------------------+
|  1 | 1001 | abc   | 2021-02-23 15:18:18 |
|  3 | 1003 | ccc   | 2021-02-23 15:18:29 |
|  4 | 1004 | ddd   | 2021-02-23 15:18:34 |
+----+------+-------+---------------------+

SELECT * FROM scene
┌─id─┬─code─┬─title─┬──────────updatetime─┐
│  11001 │ abc   │ 2021-02-23 15:18:18 │
│  31003 │ ccc   │ 2021-02-23 15:18:29 │
│  41004 │ ddd   │ 2021-02-23 15:18:34 │
└────┴──────┴───────┴─────────────────────┘

SELECT  *,_version,_sign FROM scene
┌─id─┬─code─┬─title─┬──────────updatetime─┬─_version─┬─_sign─┐
│  11001 │ aaa   │ 2021-02-23 15:18:1811 │
│  21002 │ bbb   │ 2021-02-23 15:18:2311 │
│  31003 │ ccc   │ 2021-02-23 15:18:2911 │
│  41004 │ ddd   │ 2021-02-23 15:18:3411 │
└────┴──────┴───────┴─────────────────────┴──────────┴───────┘
┌─id─┬─code─┬─title─┬──────────updatetime─┬─_version─┬─_sign─┐
│  11001 │ abc   │ 2021-02-23 15:18:1821 │
└────┴──────┴───────┴─────────────────────┴──────────┴───────┘
┌─id─┬─code─┬─title─┬──────────updatetime─┬─_version─┬─_sign─┐
│  21002 │ bbb   │ 2021-02-23 15:18:233-1 │
└────┴──────┴───────┴─────────────────────┴──────────┴───────┘

-----------------------------------------------------------------------
ClickHouse 支持更新和删除,但是性能之差;MySQL修改、删除之后ClickHouse怎么做的?

SELECT * FROM scene;
等同于
select * from scene final where _sign = 1;

修改的数据用final去重;
删除的数据用_sign = 1 过滤;
-----------------------------------------------------------------------

--尝试追加mysql表中数据,ClickHouse数据变化:_sign = 1 , _version ++
mysql> INSERT INTO scene(code, title, updatetime) VALUES(1005,'eee',NOW());
mysql> INSERT INTO scene(code, title, updatetime) VALUES(1006,'fff',NOW());
mysql> INSERT INTO scene(code, title, updatetime) VALUES(1007,'ggg',NOW());
mysql> INSERT INTO scene(code, title, updatetime) VALUES(1008,'hhh',NOW());
mysql> select * from scene;
+----+------+-------+---------------------+
| id | code | title | updatetime          |
+----+------+-------+---------------------+
|  1 | 1001 | abc   | 2021-02-23 15:18:18 |
|  3 | 1003 | ccc   | 2021-02-23 15:18:29 |
|  4 | 1004 | ddd   | 2021-02-23 15:18:34 |
|  5 | 1005 | eee   | 2021-02-23 16:05:23 |
|  6 | 1006 | fff   | 2021-02-23 16:06:34 |
|  7 | 1007 | ggg   | 2021-02-23 16:06:34 |
|  8 | 1008 | hhh   | 2021-02-23 16:06:35 |
+----+------+-------+---------------------+

select * from scene;
┌─id─┬─code─┬─title─┬──────────updatetime─┐
│  11001 │ abc   │ 2021-02-23 15:18:18 │
│  31003 │ ccc   │ 2021-02-23 15:18:29 │
│  41004 │ ddd   │ 2021-02-23 15:18:34 │
│  51005 │ eee   │ 2021-02-23 16:05:23 │
│  61006 │ fff   │ 2021-02-23 16:06:34 │
│  71007 │ ggg   │ 2021-02-23 16:06:34 │
│  81008 │ hhh   │ 2021-02-23 16:06:35 │
└────┴──────┴───────┴─────────────────────┘
select *, _version,_sign  from scene;
┌─id─┬─code─┬─title─┬──────────updatetime─┬─_version─┬─_sign─┐
│  11001 │ abc   │ 2021-02-23 15:18:1821 │
│  21002 │ bbb   │ 2021-02-23 15:18:233-1 │
│  31003 │ ccc   │ 2021-02-23 15:18:2911 │
│  41004 │ ddd   │ 2021-02-23 15:18:3411 │
│  51005 │ eee   │ 2021-02-23 16:05:2341 │
│  61006 │ fff   │ 2021-02-23 16:06:3451 │
│  71007 │ ggg   │ 2021-02-23 16:06:3461 │
│  81008 │ hhh   │ 2021-02-23 16:06:3571 │
└────┴──────┴───────┴─────────────────────┴──────────┴───────┘


--在MySQL中执行删除表,ClickHouse也会删除表:
drop table scene

# 此时在clickhouse处会同步删除对应表,如果查询会报错
DB::Exception: Table scene_mms.scene doesn't exist.. 

--在mysql客户端新增一张表,clickhouse处也可以实时生成对应的数据表
--在mysql客户端添加列与删除列,clickhouse处也可以实时生成对应的列

Condiciones no admitidas por el motor de base de datos MaterializeMySQL:

1. Modifique el nombre de la tabla en MySQL, ClickHouse no se sincronizará y la consulta reportará un error;

2. Tampoco se admite la modificación del nombre de la columna. Si este es el caso, debe eliminar el canal y reconstruir;

Para más detalles, preste atención a la cuenta oficial.
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_45320660/article/details/114451162
Recomendado
Clasificación