第1周工作文档

任务

  • 熟悉项目代码和搭建环境
  • 调研和选型数据同步方案

调研

1.Binlog三种模式

  • **statement **

每一条会修改数据的 SQL 都会记录到 master 的 bin-log 中。slave 在复制的时候 SQL 进程会解析成和原来 master 端执行过的相同的 SQL 再次执行。
注意:只记录每条数据的变化,但是某些情况下会导致数据同步缺失

  • **mixed **

在 Mixed 模式下,MySQL 会根据执行的每一条具体的 SQL 语句来区分对待记录的日志形式,也就是在 statement 和 row 之间选择一种。
注意:一般情况下以S模式处理,特殊情况下为R模式,存在不确定性

  • **row **日志中会记录成每一行数据被修改的形式,然后在 slave 端再对相同的数据进行修改。

注意:记录每条数据的变化及上下文相关信息,在日志量和性能上有影响

2.Mysql 操作

创建

# 创建数据库
CREATE DATABASE `test` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

# 创建数据表
CREATE TABLE IF NOT EXISTS `runoob_tbl`(    `runoob_id` INT UNSIGNED AUTO_INCREMENT,    `runoob_title` VARCHAR(100) NOT NULL,    `runoob_author` VARCHAR(40) NOT NULL,    `submission_date` DATE,    PRIMARY KEY ( `runoob_id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

查询

# 查看所有数据库
show databases;

# 查看所有数据表
show tables;

# 查询数据
select * from runoob_tbl;

插入

INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date)
     VALUES     ("学习 MySQL", "菜鸟教程", NOW());
     
INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date)
     VALUES     ("学习 ClickHouse", "菜鸟教程", NOW());

更新

update runoob_tbl set runoob_author='1' where runoob_id=1;

删除

# 
DROP database test;

# 
DROP table runoob_tbl;

# 行数据
delete from runoob_tbl where runoob_id=1;

3.ClickHouse操作

官方网址:

DBeaver可视化工具:

创建

# 
CREATE DATABASE test;


# 
CREATE TABLE test.runoob_tbl
(
    `runoob_id` UInt32,
    `runoob_title` String,
    `runoob_author` String,
    `submission_date` Date
)
ENGINE = ReplacingMergeTree
PARTITION BY toYYYYMM(submission_date)
ORDER BY runoob_id
SETTINGS index_granularity = 8192;

查询

# 查看所有数据库
show databases;

# 查看所有数据表
show tables;

# 查询数据
select * from test.runoob_tbl;

插入

insert into test.runoob_tbl (runoob_id,runoob_title,runoob_author, submission_date) values (51,'Django','菜鸟教程',toDate('2022-01-12'));

更新

alter table test.runoob_tbl  update runoob_title = 'Flask'  where runoob_id = 10;

删除

# 
DROP database test;

# 
DROP table test.runoob_tbl

# 行数据
alter table default.runoob_tbl  delete where runoob_id = 10;

压缩显示

OPTIMIZE TABLE runoob_tbl final;


### 4.第三方中间件对比

ClickHouse 数据同步到 Mysql,使用binlog_format=row模式进行,确保数据一致性。

方式一:使用Python库(clickhouse-mysql-data-reader)

优点:简单,支持全量表同步数据
缺点:功能不完备,不支持增量实时
遇到的问题:在行模式下,更新操作和修改事件没有支持

方式二:使用Golang库(Bifrost)

优点:管理界面操作简单,有报警通知,可根据表进行增量,全量同步。
缺点:功能强大配置复杂
遇到的问题:

  • 同步速度慢

解决办法是:
1.设置同步提交超时提交时间为 PluginCommitTimeOut int = 1, 一秒提交一次同步请求。

  • 同步数据乱

解决办法是:
1.设置同步方式为普通模式,跟随msyql的insert,update,delete操作
2.不自动创建CK表,手动选择表进行同步操作,否则不能生效。

测试

分别使用本地mysql 8.0版本服务器,内网192.168.0.171的ClickHouse进行同步测试

全量同步

数据库表_ oceanengine_creative_back_20211225 行数:2298282,用时:10分钟左右_

增量同步

数据库表_runoob_tbl ,新增,更新,删除操作成功,用时:1秒钟左右_

结论

  • 使用binlog的row模式进行同步
  • 在整个调研测试中Bifrost符合要求

问题

  • 如何在现有的数据库系统应用?