clickhouse prend en charge la synchronisation native Binlog mysql

Afin de pouvoir surveiller les événements binlog, nous devons utiliser un middleware tiers comme canal avant, ce qui augmente sans aucun doute la complexité du système.

ClickHouse 20.8 ajoutera le moteur MaterializeMySQL, qui peut matérialiser les données mysql en temps réel via les journaux binlog, améliorant les performances des requêtes des entrepôts de données et la rapidité de la synchronisation des données; le travail d'analyse des données original entrepris dans mysql peut être effectué par clickhouse, qui peut être significatif Réduire la charge de mysql en ligne, depuis lors, OLTP et OLAP sont parfaitement intégrés.

La nouvelle fonction utilise le moteur de base de données de MaterializeMySQL, qui peut être mappé à une base de données dans MySQL et créer automatiquement le ReplacingMergeTree correspondant dans ClickHouse.

Pris en charge par le moteur de base de données MaterializeMySQL:

1. Prise en charge de la synchronisation des données au niveau de la base de données mysql, mais le niveau de la table n'est pas pris en charge temporairement.
2. La bibliothèque MySQL est mappée à la table créée automatiquement en tant que moteur ReplacingMergeTree dans Clickhouse.
3. Prend en charge la synchronisation complète et incrémentielle. Une copie complète est effectuée lorsque le moteur de base de données est créé pour la première fois, puis la synchronisation incrémentielle des données est effectuée en surveillant les modifications du journal binlog.
4. Opérations prises en charge: insérer, mettre à jour, supprimer, modifier, créer, supprimer, tronquer et la plupart des opérations DDL.
5. La réplication MySQL prise en charge est la réplication GTID.

Processus de synchronisation de MaterialiseMySQL:

1. Créez une table de mappage MySQL, remplissez les informations de connexion MySQL (adresse IP + port + nom de la base de données + nom d'utilisateur + mot de passe) dans le moteur MaterializeMySQL, ClickHouse créera une table de données dont le moteur est ReplacingMergeTree, où la CLÉ PRIMAIRE du La table MySQL est utilisée car La PARTITION BY de ReplacingMergeTree est divisée par 1000 en fonction de la taille du type;
2. À ce stade, ClickHouse extrait toutes les structures de table sous la base de données d'objets MySQL et ajoute les champs _sign et _version. Le champ _sign indique si les données sont supprimées et le champ _version indique La dernière version des données;
3. La première synchronisation utilise la synchronisation complète des données de la table dans MySQL, et la version _version est toute 1;
4. La synchronisation incrémentielle suivante est utilisée pour consommer le SQL dans le journal de la corbeille. Lorsque ClickHouse surveille les événements d'insertion, de mise à jour et de suppression, utilisez _ Le numéro de version est automatiquement incrémenté globalement dans la base de données pour enregistrer les dernières données. Lorsque ClickHouse se synchronise avec l'instruction de suppression, la valeur du champ _sign est mis à jour à -1 (pour le moment, les personnes familiarisées avec MySQL penseront certainement à une pseudo suppression. Oui, oui, elle utilise une pseudo suppression).

Insérez la description de l'image ici

Actuellement, MaterialiseMySQL prend en charge les événements binlog suivants:

MYSQL_WRITE_ROWS_EVENT
_sign = 1 , _version ++

MYSQL_DELETE_ROWS_EVENT
_sign = -1 , _version ++

MYSQL_UPDATE_ROWS_EVENT
nouveau data_sign = 1

MYSQL_QUERY_EVENT
支持 CREATE TABLE 、 DROP TABLE 、 RENAME TABLE 等。

Processus de construction:

--添加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处也可以实时生成对应的列

Conditions non prises en charge par le moteur de base de données MaterializeMySQL:

1. Modifiez le nom de la table dans MySQL, ClickHouse ne se synchronisera pas et la requête signalera une erreur;

2. La modification du nom de la colonne n'est pas non plus prise en charge. Si tel est le cas, vous devez supprimer le canal et le reconstruire;

Pour plus de détails, veuillez faire attention au compte officiel
Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/weixin_45320660/article/details/114451162
conseillé
Classement