色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

從MySQL到ClickHouse實時復制與實現

馬哥Linux運維 ? 來源:bohutang.me ? 2023-01-03 10:54 ? 次閱讀

很多人看到標題還以為自己走錯了夜場,其實沒有。

ClickHouse 可以掛載為 MySQL 的一個從庫 ,先全量再增量的實時同步 MySQL 數據,這個功能可以說是今年最亮眼、最剛需的功能,基于它我們可以輕松的打造一套企業級解決方案,讓 OLTP 和 OLAP 的融合從此不再頭疼。

目前支持 MySQL 5.6/5.7/8.0 版本,兼容 Delete/Update 語句,及大部分常用的 DDL 操作。

代碼還處于 Alpha 版本階段,畢竟是兩個異構生態的融合,仍然有不少的工作要做,同時也期待著社區用戶的反饋,以加速迭代。

代碼獲取

由于還在驗收階段,我們只好把 github 上的 pull request 代碼 pull 到本地。

git fetch origin pull/10851/head:mysql_replica_experiment

開始編譯…

MySQL Master

我們需要一個開啟 binlog 的 MySQL 作為 master:

docker run -d -e MYSQL_ROOT_PASSWORD=123 mysql:5.7 mysqld --datadir=/var/lib/mysql --server-id=1 --log-bin=/var/lib/mysql/mysql-bin.log --gtid-mode=ON --enforce-gtid-consistency

創建數據庫和表,并寫入數據:

mysql> create database ckdb;
mysql> use ckdb;
mysql> create table t1(a int not null primary key, b int);
mysql> insert into t1 values(1,1),(2,2);
mysql> select * from t1;
+---+------+
| a | b    |
+---+------+
| 1 |    1 |
| 2 |    2 |
+---+------+
2 rows in set (0.00 sec)

ClickHouse Slave

目前以 database 為單位進行復制,不同的 database 可以來自不同的 MySQL master,這樣就可以實現多個 MySQL 源數據同步到一個 ClickHouse 做 OLAP 分析功能。

創建一個復制通道:

clickhouse :) CREATE DATABASE ckdb ENGINE = MaterializeMySQL('172.17.0.2:3306', 'ckdb', 'root', '123');
clickhouse :) use ckdb;
clickhouse :) show tables;
┌─name─┐
│ t1   │
└──────┘
clickhouse :) select * from t1;
┌─a─┬─b─┐
│ 1 │ 1 │
└───┴───┘
┌─a─┬─b─┐
│ 2 │ 2 │
└───┴───┘


2 rows in set. Elapsed: 0.017 sec.

看下 ClickHouse 的同步位點:
cat ckdatas/metadata/ckdb/.metadata

Version:1
Binlog File:mysql-bin.000001
Binlog Position:913
Data Version:0

Delete

首先在 MySQL Master 上執行一個刪除操作:

mysql> delete from t1 where a=1;
Query OK, 1 row affected (0.01 sec)

然后在 ClickHouse Slave 側查看記錄:

clickhouse :) select * from t1;


SELECT *
FROM t1


┌─a─┬─b─┐
│ 2 │ 2 │
└───┴───┘


1 rows in set. Elapsed: 0.032 sec.

此時的 metadata 里 Data Version 已經遞增到 2:

cat ckdatas/metadata/ckdb/.metadata
Version:1
Binlog File:mysql-bin.000001
Binlog Position:1171
Data Version:2

Update

MySQL Master:

mysql> select * from t1;
+---+------+
| a | b    |
+---+------+
| 2 |    2 |
+---+------+
1 row in set (0.00 sec)


mysql> update t1 set b=b+1;


mysql> select * from t1;
+---+------+
| a | b    |
+---+------+
| 2 |    3 |
+---+------+
1 row in set (0.00 sec)

ClickHouse Slave:

clickhouse :) select * from t1;


SELECT *
FROM t1


┌─a─┬─b─┐
│ 2 │ 3 │
└───┴───┘


1 rows in set. Elapsed: 0.023 sec.

實現機制

在探討機制之前,首先需要了解下 MySQL 的 binlog event ,主要有以下幾種類型:

1. MYSQL_QUERY_EVENT-- DDL
2. MYSQL_WRITE_ROWS_EVENT-- insert數據
3. MYSQL_UPDATE_ROWS_EVENT -- update數據
4. MYSQL_DELETE_ROWS_EVENT -- delete數據

當一個事務提交后,MySQL 會把執行的 SQL 處理成相應的 binlog event,并持久化到 binlog 文件。

binlog 是 MySQL 對外輸出的重要途徑,只要你實現 MySQL Replication Protocol,就可以流式的消費MySQL 生產的 binlog event,具體協議見 Replication Protocol。

由于歷史原因,協議繁瑣而詭異,這不是本文重點。

對于 ClickHouse 消費 MySQL binlog 來說,主要有以下3個難點:

DDL 兼容

Delete/Update 支持

Query 過濾

DDL

DDL 兼容花費了大量的代碼去實現。

首先,我們看看 MySQL 的表復制到 ClickHouse 后會變成什么樣子。

MySQL master:

mysql> show create table t1G;
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `a` int(11) NOT NULL,
  `b` int(11) DEFAULT NULL,
  PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

ClickHouse slave:

ATTACH TABLE t1
(
    `a` Int32,
    `b` Nullable(Int32),
    `_sign` Int8,
    `_version` UInt64
)
ENGINE = ReplacingMergeTree(_version)
PARTITION BY intDiv(a, 4294967)
ORDER BY tuple(a)
SETTINGS index_granularity = 8192

可以看到:

默認增加了 2 個隱藏字段:_sign(-1刪除, 1寫入) 和 _version(數據版本)

引擎轉換成了 ReplacingMergeTree,以 _version 作為 column version

原主鍵字段 a 作為排序和分區鍵

這只是一個表的復制,其他還有非常多的DDL處理,比如增加列、索引等,感興趣可以觀摩 Parsers/MySQL 下代碼。

Update和Delete

當我們在 MySQL master 執行:

mysql> delete from t1 where a=1;
mysql> update t1 set b=b+1;

ClickHouse t1數據(把 _sign 和 _version 一并查詢):

clickhouse :) select a,b,_sign, _version from t1;


SELECT
    a,
    b,
    _sign,
    _version
FROM t1


┌─a─┬─b─┬─_sign─┬─_version─┐
│ 1 │ 1 │     1 │        1 │
│ 2 │ 2 │     1 │        1 │
└───┴───┴───────┴──────────┘
┌─a─┬─b─┬─_sign─┬─_version─┐
│ 1 │ 1 │    -1 │        2 │
└───┴───┴───────┴──────────┘
┌─a─┬─b─┬─_sign─┬─_version─┐
│ 2 │ 3 │     1 │        3 │
└───┴───┴───────┴──────────┘

根據返回結果,可以看到是由 3 個 part 組成。

part1 由mysql> insert into t1 values(1,1),(2,2)生成:

┌─a─┬─b─┬─_sign─┬─_version─┐
│ 1 │ 1 │     1 │        1 │
│ 2 │ 2 │     1 │        1 │
└───┴───┴───────┴──────────┘

part2 由mysql> delete from t1 where a=1生成:

┌─a─┬─b─┬─_sign─┬─_version─┐
│ 1 │ 1 │    -1 │        2 │
└───┴───┴───────┴──────────┘
說明:
_sign = -1表明處于刪除狀態

part3 由update t1 set b=b+1生成:

┌─a─┬─b─┬─_sign─┬─_version─┐
│ 2 │ 3 │     1 │        3 │
└───┴───┴───────┴──────────┘

使用 final 查詢:

clickhouse :) select a,b,_sign,_version from t1 final;


SELECT
    a,
    b,
    _sign,
    _version
FROM t1
FINAL


┌─a─┬─b─┬─_sign─┬─_version─┐
│ 1 │ 1 │    -1 │        2 │
└───┴───┴───────┴──────────┘
┌─a─┬─b─┬─_sign─┬─_version─┐
│ 2 │ 3 │     1 │        3 │
└───┴───┴───────┴──────────┘


2 rows in set. Elapsed: 0.016 sec.

可以看到 ReplacingMergeTree 已經根據 _version 和 OrderBy 對記錄進行去重。

Query

MySQL master:

mysql> select * from t1;
+---+------+
| a | b    |
+---+------+
| 2 |    3 |
+---+------+
1 row in set (0.00 sec)

ClickHouse slave:

clickhouse :) select * from t1;


SELECT *
FROM t1


┌─a─┬─b─┐
│ 2 │ 3 │
└───┴───┘


clickhouse :) select *,_sign,_version from t1;


SELECT
    *,
    _sign,
    _version
FROM t1


┌─a─┬─b─┬─_sign─┬─_version─┐
│ 1 │ 1 │    -1 │        2 │
│ 2 │ 3 │     1 │        3 │
└───┴───┴───────┴──────────┘
說明:這里還有一條刪除記錄,_sign為-1

MaterializeMySQL 被定義成一種存儲引擎,所以在讀取的時候,會根據 _sign 狀態進行判斷,如果是-1則是已經刪除,進行過濾。

總結

ClickHouse 實時復制同步 MySQL 數據是 upstream 2020 的一個 roadmap,在整體構架上比較有挑戰一直無人接單,挑戰主要來自兩方面:

對 MySQL 復制通道與協議非常熟悉

對 ClickHouse 整體機制非常熟悉

這樣,在兩個本來有點遙遠的山頭中間架起了一座高速,這條 10851號高速由 zhang1024(ClickHouse側) 和BohuTANG(MySQL復制) 兩個修路工聯合承建,目前正在接受 upstream 的驗收。

關于同步 MySQL 的數據,目前大家的方案基本都是在中間安置一個 binlog 消費工具,這個工具對 event 進行解析,然后再轉換成 ClickHouse 的 SQL 語句,寫到 ClickHouse server,鏈路較長,性能損耗較大。

10851號高速是在 ClickHouse 內部實現一套 binlog 消費方案,然后根據 event 解析成ClickHouse 內部的 block 結構,再直接寫回到底層存儲引擎,幾乎是最高效的一種實現方式。

基于 database 級的復制,實現了多源復制的功能,如果復制通道壞掉,我們只需在 ClickHouse 側刪除掉 database 然后再重建一次即可,非常方便。

對于單表的數據一致性,未來會實現一個 MySQL CRC 函數,用于校驗 MySQL 與 ClickHouse 的數據一致性。

要想富,先修路!

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據庫
    +關注

    關注

    7

    文章

    3794

    瀏覽量

    64362
  • 代碼
    +關注

    關注

    30

    文章

    4779

    瀏覽量

    68524
  • MySQL
    +關注

    關注

    1

    文章

    804

    瀏覽量

    26531

原文標題:從 MySQL 到 ClickHouse 實時復制與實現

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    MySQL的幾種復制配置

    MySQL主從復制、主主復制、雙主多配置
    發表于 04-16 09:50

    大數據實時分析領域的ClickHouse

    ClickHouse大數據實時分析領域的黑馬
    發表于 03-24 11:09

    mysql的主從復制

    mysql 主從復制
    發表于 04-28 14:30

    Centos7下如何搭建ClickHouse列式存儲數據庫

    性能的海量數據快速查詢的分布式實時處理平臺,在數據匯總查詢方面(如GROUP BY),ClickHouse的查詢速度非常快。2、數據庫特點(1)列式數據庫列式數據庫是以列相關存儲架構進行數據存儲的數據庫
    發表于 01-05 18:03

    MySQL實現延時復制

    公司有一套mysqlAB復制架構的生產庫,一主一的架構, 每周一凌晨0天都自動做全備。
    的頭像 發表于 05-05 22:20 ?1502次閱讀
    <b class='flag-5'>MySQL</b><b class='flag-5'>實現</b>延時<b class='flag-5'>復制</b>

    利用MySQL進行一主一的主從復制

    本文講述了如何使用MyBatisPlus+ShardingSphereJDBC進行讀寫分離,以及利用MySQL進行一主一的主從復制
    的頭像 發表于 07-28 09:47 ?1031次閱讀

    MySQL 5.7并行復制實現原理與調優

    眾所周知,MySQL復制延遲是一直被詬病的問題之一,然而在Inside君之前的兩篇博客中(1,2)中都已經提到了MySQL 5.7版本已經支持“真正”的并行復制功能,官方稱為為enh
    的頭像 發表于 12-23 14:52 ?543次閱讀

    MySQL 5.6并行復制架構及并行復制原理

    ySQL 5.6版本也支持所謂的并行復制,但是其并行只是基于schema的,也就是基于庫的。如果用戶的MySQL數據庫實例中存在多個schema,對于復制的速度的確可以有比較大的幫
    發表于 12-23 14:52 ?522次閱讀

    探討MySQL復制機制實現的方式

    MySQL Replication(主從復制)是指數據變化可以從一個MySQL Server被復制到另一個或多個MySQL Server上,
    的頭像 發表于 04-12 09:29 ?689次閱讀

    mysql主從復制三種模式

    MySQL主從復制是一種常見的數據同步方式,它可以實現將一個數據庫的更改同步其他多個數據庫的功能。主從復制可以提高數據庫的可用性和性能,以
    的頭像 發表于 11-16 14:04 ?1521次閱讀

    mysql如何實現主從復制的具體流程

    主從復制MySQL數據庫中常用的數據復制技術之一,它的主要目的是將一個數據庫服務器上的數據復制到其他服務器上,以實現數據的備份、高可用和分
    的頭像 發表于 11-16 14:10 ?777次閱讀

    mysql主從復制主要有幾種模式

    MySQL主從復制MySQL數據庫中常用的一種數據復制方式,用于實現數據的備份、負載均衡、故障恢復等目的。主從
    的頭像 發表于 11-16 14:15 ?1160次閱讀

    mysql主從復制的原理

    MySQL主從復制是一種數據庫復制技術,它允許將一個MySQL數據庫的更新操作自動復制到其他MySQL
    的頭像 發表于 11-16 14:18 ?482次閱讀

    mysql主從復制 混合類型的復制

    MySQL主從復制是一種常用的數據復制技術,可以實現數據從一個MySQL服務器(主服務器)復制到
    的頭像 發表于 11-16 14:20 ?550次閱讀

    配置MySQL主從復制和讀寫分離

    配置MySQL主從復制和讀寫分離
    的頭像 發表于 10-23 11:44 ?408次閱讀
    配置<b class='flag-5'>MySQL</b>主從<b class='flag-5'>復制</b>和讀寫分離
    主站蜘蛛池模板: 交换娇妻呻吟声不停中文字幕 | 九九在线中文字幕无码| 日本精品久久无码影院| 成年视频国产免费观看| 丝袜美女自摸| 久久天天综合| 高清毛片一区二区三区| 亚洲欧美成人| 全黄H全肉细节文短篇| 国产亚洲精品久久久久久鸭绿欲| 一个人看www| 欧美丰满熟妇BBB久久久| 国产精品一区二区在线播放| 最好看中文字幕国语| 私人玩物黑丝| 男女床上黄色| 好爽别插了无码视频| 拔擦拔擦8X永久华人免费播放器| 亚洲不卡视频| 乳液全集电影在线观看| 久久久GOGO无码啪啪艺术| 国产成人综合95精品视频免费| 综合人妻久久一区二区精品| 迅雷成人论坛| 日韩av国产av欧美天堂社区| 久久久久亚洲精品影视| 国产熟妇无码一区二| 办公室里呻吟的丰满老师电影| 伊人久久久久久久久久| 爽爽窝窝午夜精品一区二区| 女生下面免费看| 久久久久久88色偷偷| 国产亚洲精品字幕在线观看| 成 人 片 免费播放| aa级毛片毛片免费观看久| 亚洲在线v观看免费国| 天天插天天射天天干| 欧美又粗又长又大AAAA片| 浪荡受自我调教纯肉BL| 久草在线草a免费线看| 國產麻豆AVMDXMDX|