企業(yè)業(yè)務(wù)數(shù)據(jù)整合利器-異構(gòu)數(shù)據(jù)同步系統(tǒng)Arkgate

Arkgate源起

隨著數(shù)據(jù)庫访敌、大數(shù)據(jù)生態(tài)的普遍應(yīng)用和數(shù)據(jù)聯(lián)動(dòng)的重要性凉敲,MySQL數(shù)據(jù)庫運(yùn)維過程中關(guān)于數(shù)據(jù)同步需求不斷增多,常見的需求有:

1.從源端分庫分表的MySQL集群進(jìn)行數(shù)據(jù)匯總,數(shù)據(jù)合并到一個(gè)MySQL集群中爷抓。

2.從源端MySQL同步數(shù)據(jù)到HBase或者ES等OLAP類型的存儲(chǔ)引擎中势决。

3.從源端MySQL同步數(shù)據(jù)回流到Redis等緩存引擎中。

4.從源端的一種MySQL表結(jié)構(gòu)按需同步數(shù)據(jù)到另外一種MySQL表結(jié)構(gòu)中蓝撇。

????數(shù)據(jù)同步過程中往往要求數(shù)據(jù)同步時(shí)效性高果复,需要實(shí)時(shí)或者準(zhǔn)實(shí)時(shí)的同步。滿足時(shí)效性的同時(shí)還要兼顧各種數(shù)據(jù)同步的需求渤昌,相比的不易操控原生主從復(fù)制虽抄,想著有一個(gè)第三方的主從同步軟件來實(shí)現(xiàn)數(shù)據(jù)同步的功能,它可以實(shí)現(xiàn):

a.對(duì)數(shù)據(jù)庫表的更新做異構(gòu)化独柑,當(dāng)上層數(shù)據(jù)庫表結(jié)構(gòu)及存儲(chǔ)方式不能滿足應(yīng)用需求時(shí)迈窟,可以自動(dòng)完成數(shù)據(jù)轉(zhuǎn)換、數(shù)據(jù)清洗及數(shù)據(jù)裝載的功能忌栅,同步數(shù)據(jù)并持久化到另一種適合應(yīng)用程序訪問計(jì)算的表結(jié)構(gòu)中车酣。

b.針對(duì)一些統(tǒng)計(jì)業(yè)務(wù),可以獲取每天的增量數(shù)據(jù)同步到大數(shù)據(jù)系統(tǒng)中索绪,例如存儲(chǔ)到HBase中供數(shù)據(jù)部門進(jìn)行數(shù)倉分析骇径。數(shù)據(jù)同步軟件充當(dāng)橋梁,進(jìn)行OLTP和OLAP系統(tǒng)隔離和數(shù)據(jù)聯(lián)通者春,它實(shí)時(shí)地獲取到源端MySQL最新的數(shù)據(jù)變化并同步到目標(biāo)OLAP數(shù)據(jù)庫中破衔,這樣就可以既利用到了專業(yè)OLAP數(shù)據(jù)庫對(duì)數(shù)據(jù)的快速處理,又避免了長時(shí)間的數(shù)據(jù)同步對(duì)OLTP的影響钱烟,同時(shí)還保證了被分析數(shù)據(jù)的時(shí)效性晰筛。

c.當(dāng)目的端同樣是MySQL數(shù)據(jù)庫時(shí),亦可滿足MySQL數(shù)據(jù)庫異地同步拴袭、異地雙活读第、跨云容災(zāi)的需求。

?基于諸多數(shù)據(jù)同步的需求拥刻,誕生了這款數(shù)據(jù)整合利器-MySQL實(shí)時(shí)異構(gòu)同步系統(tǒng)Arkgate怜瞒。


Arkgate架構(gòu)

Arkgate設(shè)計(jì)之初來源于MySQL的運(yùn)維需求,在進(jìn)行架構(gòu)設(shè)計(jì)過程中也是想兼顧著Arkgate 100%兼容MySQL語法及對(duì)源端目的端完全透明的想法般哼。

基于強(qiáng)大的MySQL Replication功能吴汪,對(duì)于源端MySQL數(shù)據(jù)庫的變更,Arkgate模擬了MySQL從庫的IO Thread蒸眠,不斷地Dump MySQL的Binlog Events漾橙,實(shí)時(shí)地將源端MySQL數(shù)據(jù)庫的增量更新同步到目標(biāo)OLAP數(shù)據(jù)庫中,其架構(gòu)圖如下:


源端可支持MySQL所有分支版本楞卡,目的端數(shù)據(jù)庫支持HBase霜运、Elasticsearch脾歇、MySQL、Redis淘捡、TiDB藕各、Kafka等諸多數(shù)據(jù)庫,以解決不同人群及業(yè)務(wù)的需求焦除。滿足同構(gòu)座韵、異構(gòu)數(shù)據(jù)源間數(shù)據(jù)遷移和實(shí)時(shí)同步的需求√呔考慮到多目的端適配、增量數(shù)據(jù)同步和斷點(diǎn)續(xù)傳的需求宦棺,Arkgate分為三大組件瓣距,一個(gè)是Arkgate 采集組件,一個(gè)是Arkgate存儲(chǔ)組件代咸,一個(gè)是Arkgate同步組件蹈丸。

Arkgate采集組件作為一款MySQL的插件,用于模擬MySQL Slave采集源端的Binlog Events呐芥,插件方式安裝方便且可兼容所有MySQL版本的Binlog格式逻杖,能復(fù)用官方多線程并發(fā)復(fù)制的功能,同時(shí)還支持多通道復(fù)制思瘟,一個(gè)插件可以為多個(gè)集群做數(shù)據(jù)同步荸百。

Arkgate存儲(chǔ)組件用于持久化存儲(chǔ)源端數(shù)據(jù)的變更,簡稱Arkgate 數(shù)據(jù)中心滨攻,目前支持使用原生MySQL和ArkDB來作為Arkgate存儲(chǔ)層够话,它負(fù)責(zé)持久化存儲(chǔ)自Arkgate采集源端某一個(gè)時(shí)間點(diǎn)后的增量數(shù)據(jù)。

Arkgate同步組件用于數(shù)據(jù)同步光绕,簡稱Arkgate Adapter女嘲,它只需要訪問Arkgate存儲(chǔ)組件的數(shù)據(jù),便可以滿足不同目的端數(shù)據(jù)同步的需求诞帐,當(dāng)需要新增一類目的端數(shù)據(jù)源時(shí)欣尼,適配Adapter即可快速滿足數(shù)據(jù)同步的需求。

Arkgate三大組件支持在一臺(tái)機(jī)器混合部署停蕉。

架構(gòu)圖進(jìn)一步演變?yōu)椋?/p>


Arkgate實(shí)現(xiàn)方式和MySQL數(shù)據(jù)庫主從是同一個(gè)道理愕鼓,其Arkgate采集組件會(huì)偽裝成一個(gè)從庫,從源端MySQL主庫上dump指定的binlog慧起,Arkgate收到之后將其解析出來拒啰,直接在線轉(zhuǎn)換成為一種更通用的Json數(shù)據(jù)格式存儲(chǔ)到Arkgate數(shù)據(jù)中心中。

Arkgate采集層寫入Arkgate 數(shù)據(jù)中心的方式支持本地和遠(yuǎn)程插入完慧,本地插入是當(dāng)Arkgate采集組件和Arkgate數(shù)據(jù)中心復(fù)用同一個(gè)MySQL時(shí)谋旦,如果兩者獨(dú)立部署則為遠(yuǎn)程插入剩失。Arkgate采集層是做為Arkgate 數(shù)據(jù)中心的客戶端進(jìn)行數(shù)據(jù)插入的。

Arkgate數(shù)據(jù)中心的數(shù)據(jù)是可以對(duì)外提供服務(wù)的册着,開發(fā)只需關(guān)注datacenter數(shù)據(jù)庫即可獲取源端增量數(shù)據(jù)的更新拴孤,其存儲(chǔ)方式為Json。

Arkgate Adapter解析Json數(shù)據(jù)并按需裝載到目標(biāo)數(shù)據(jù)庫即可即可實(shí)現(xiàn)數(shù)據(jù)庫的異構(gòu)實(shí)時(shí)同步需求甲捏。

相比MySQL原生復(fù)制而言演熟,Arkgate進(jìn)行了同步數(shù)據(jù)持久化存儲(chǔ)。那么性能會(huì)有損耗嗎司顿?當(dāng)MySQL同步壓力不大時(shí)芒粹,Arkgate同步會(huì)慢于原生MySQL復(fù)制呛踊。但當(dāng)并發(fā)壓力大吞吐量大時(shí)权烧,Arkgate同步性能要遠(yuǎn)遠(yuǎn)優(yōu)于原生MySQL復(fù)制呕乎。這是因?yàn)锳rkgate除了支持多線程并行復(fù)制時(shí)還支持配置多個(gè)同步通道较幌,在上述架構(gòu)圖中每一個(gè)復(fù)制都是一個(gè)單獨(dú)并且完全獨(dú)立的通道衷戈,通道由一個(gè)MySQL源端和一個(gè)目的端數(shù)據(jù)源共同確定再扭。不同的通道可以對(duì)應(yīng)同一個(gè)數(shù)據(jù)庫實(shí)例发侵,在每新建一個(gè)通道時(shí)需要給對(duì)應(yīng)的通道起一個(gè)datacenter名字旁理,通道名實(shí)質(zhì)是一個(gè)數(shù)據(jù)庫名字付材,配置多個(gè)通道時(shí)會(huì)在Arkgate數(shù)據(jù)中心創(chuàng)建多個(gè)數(shù)據(jù)庫朦拖,Arkgate采集組件會(huì)將所有拿到的Binlog解析后存儲(chǔ)到各自對(duì)應(yīng)的datacenter中。同樣Arkgate Adapter支持并行向目的端進(jìn)行數(shù)據(jù)裝載厌衔,大大提升數(shù)據(jù)同步的性能璧帝,保證數(shù)據(jù)同步實(shí)時(shí)性。

Arkgate同步原理

Arkgate同步流程

Arkgate數(shù)據(jù)同步流程簡潔明了富寿,它不會(huì)侵入線上源端和目的端裸弦,只需要在源端MySQL和支持的目的端數(shù)據(jù)庫類型進(jìn)行訪問授權(quán)即可,其主要流程為:

1.在線MySQL 作喘, 提供源端MySQL實(shí)例或集群的訪問信息理疙,源端可以是RDS、自建數(shù)據(jù)庫泞坦。需要在源端給Arkgate 采集組件進(jìn)行用戶授權(quán)窖贤。例如:

mysql>GRANT select,replication client,replication slave ON *.* TO 'arkgate'@'arkgate 服務(wù)器 IP' IDENTIFIED BY 'arkgate_test' ;

2.Arkgate采集,Arkgate部署完成后Arkgate即可模擬MySQL從庫的IO Thread贰锁,不斷地Dump MySQL的Binlog Events赃梧,實(shí)時(shí)地將源端MySQL數(shù)據(jù)庫的增量更新在線轉(zhuǎn)換為JSON數(shù)據(jù)格式存儲(chǔ)到Arkgate數(shù)據(jù)中心。

3.Arkgate數(shù)據(jù)中心豌熄,可以是MySQL或ArkDB數(shù)據(jù)庫實(shí)例授嘀,可以存儲(chǔ)多個(gè)Arkgate通道的數(shù)據(jù)÷嘞眨考慮資源使用情況蹄皱,支持Arkgate采集組件在Arkgate數(shù)據(jù)中心部署览闰。

4.Arkgate Adapter,由go語言開發(fā)的數(shù)據(jù)裝載程序巷折,可以內(nèi)置HBase压鉴、ES、MySQL锻拘、NewSQL的Adapter程序油吭,實(shí)時(shí)往目標(biāo)異構(gòu)數(shù)據(jù)庫消費(fèi)Arkgate數(shù)據(jù)中心的數(shù)據(jù),完成數(shù)據(jù)實(shí)時(shí)異構(gòu)的數(shù)據(jù)轉(zhuǎn)換署拟、數(shù)據(jù)清洗及數(shù)據(jù)裝載婉宰。

5.目標(biāo)異構(gòu)數(shù)據(jù)庫,即需要數(shù)據(jù)實(shí)時(shí)同步的存儲(chǔ)庫推穷。例如HBase心包、ES、ArkDB/MySQL/TiDB/Kafka/Redis等缨恒。需要在目的端給Arkgate Adapter進(jìn)行用戶授權(quán)。例如:

mysql>GRANT all on *.* to 'arkgate'@'arkgate adapter 服務(wù)器 IP' identified by 'arkgate_test';

Arkgate創(chuàng)建復(fù)制通道

Arkgate部署完成后轮听,創(chuàng)建復(fù)制通道非常簡單骗露。登陸Arkgate采集層所在MySQL/ArkDB實(shí)例,手動(dòng)部署流程如下:

mysql> ?set global arkgate_create_datacenter="arkgate_test";

# 此命令會(huì)創(chuàng)建一個(gè)名為arkgate_test的通道血巍,它會(huì)在Arkgate datacenter創(chuàng)建arkgate_test庫來存儲(chǔ)該通道解析的Binlog數(shù)據(jù)

mysql> set global arkgate_replication_source ="arkgate_test:1";

# 此命令1表示原生mysql實(shí)例(默認(rèn)值),2表示源為公有云

mysql> set global arkgate_json_full_image="arkgate_test:1";

#此命令用于控制是否同步表的默認(rèn)值萧锉、comment等信息

mysql> set global arkgate_replication_member="arkgate_test:master:db1:127.0.0.1:3306";

#此命令需要指定復(fù)制的源端數(shù)據(jù)庫, arkgate_test為創(chuàng)建的datacenter名稱, master說明同步的是主庫。其中述寡,db1為同步實(shí)例名稱,可以根據(jù)需要設(shè)置柿隙,后邊的IP和port為源庫ip,port信息

mysql> set global arkgate_replication_binlog_position="arkgate_test:mysql-bin.000001:154";

# 指定arkgate同步源端的binlog文件和position點(diǎn)

mysql> set arkgate_json_include_serverid="arkgate_test:1";

# 此命令用于雙活場景時(shí)保存server_id信息

mysql> set global arkgate_replication_start = "arkgate_test:arkgate:arkgate_test";

# 此命令啟動(dòng)arkgate同步:arkgate_test為設(shè)置的datacenter通道名,然后是連接源庫的賬號(hào)密碼?

復(fù)制通道創(chuàng)建成功后,即可實(shí)時(shí)查看同步的狀態(tài):

mysql> select * from information_schema.arkgate_datacenter_full_list\G;

*************************** 1. row ***************************

? ? ? Datacenter_Name: arkgate_test

? ? ? ? Instance_Name: db1

? ? ? ? ? Master_Host: 127.0.0.1

? ? ? ? ? Master_Port: 3306

? ? ? ? ? Binlog_File: mysql-bin.000001

? ? ? ? ? ?Binlog_Pos: 154

? ? ?Transfer_Running: Yes

? ? ? ? ? ?Last_Error:

? ? ? ? ? ? Stop_Time:

? ? ? ?Transfer_Stage: transfer_wait_master_send

Seconds_Behind_Master: 0

? ? ? ? Slave_Members:?

? ? ? Sql_Buffer_Size: 0 Bytes

?Table_Cache_Elements: 0(0 Bytes)

? ? ?Parallel_Workers: 5

? Worker_Queue_Length: 10000

? ? Events_Per_Second: 0

? ? ? Trxs_Per_Second: 0

? ? ?Master_Gtid_Mode: Yes

? ? Checkpoint_Period: 50(ms)

1 row in set (0.02 sec)

Arkgate系統(tǒng)庫表

創(chuàng)建通道后會(huì)在Arkgate采集層所在MySQL/ArkDB實(shí)例的information_schema 創(chuàng)建如下系統(tǒng)表:

mysql> use information_schema

Database changed

mysql> show tables like '%arkgate%';

+------------------------------------------+

| Tables_in_information_schema (%arkgate%) |

+------------------------------------------+

| arkgate_datacenter_threads ? ? ? ? ? ? ? |

| arkgate_datacenter_full_list ? ? ? ? ? ? |

| arkgate_fliter_list ? ? ? ? ? ? ? ? ? ? ?|

| arkgate_slave_list ? ? ? ? ? ? ? ? ? ? ? |

| arkgate_datacenter_list ? ? ? ? ? ? ? ? ?|

| arkgate_datacenter_options ? ? ? ? ? ? ? |

| arkgate_datacenter_tables ? ? ? ? ? ? ? ?|

+------------------------------------------+

7 rows in set (0.00 sec)

其庫表簡述如下(名稱:說明):

arkgate主體插件

????安裝后可以通過show variables like "%arkgate%";命令看到所有包含的變量鲫凶。

arkgate_datacenter_threads

????information schema插件禀崖,這個(gè)插件主要是用來觀察每一個(gè)通道下,同步binlog到datacenter的線程的狀態(tài)螟炫。查詢這個(gè)表可以查到所有通道的線程狀態(tài)波附,可以通過增加where條件來查詢某一個(gè)通道的信息。

arkgate_datacenter_full_list

????information schema插件昼钻,這個(gè)插件是用來查看所有通道的詳細(xì)信息的掸屡,包括復(fù)制狀態(tài),位置信息等然评,可以通過where條件指定通道名稱查詢具體某一個(gè)通道的信息仅财。

arkgate_filter_list

????information schema插件,這個(gè)插件是用來查看所有通道定義的白/黑名單的碗淌,即定義哪些庫需要復(fù)制盏求,哪些是不需要復(fù)制的抖锥。可以通過where條件指定通道名稱查詢具體某一個(gè)通道的信息风喇。

arkgate_slave_list

????information schema插件宁改,這個(gè)插件是用來觀察所有通道定義的從庫狀態(tài)信息,可以通過where條件指定通道名稱查詢具體某一個(gè)通道的信息魂莫。

arkgate_datacenter_list

????information schema插件还蹲,這個(gè)插件是用來查看所有通道的簡單狀態(tài)的,包括是否正常復(fù)制及延遲時(shí)間耙考,主要是為監(jiān)控程序服務(wù)的谜喊。可以通過where條件指定通道名稱查詢具體某一個(gè)通道的信息倦始。

arkgate_datacenter_options

????information schema插件斗遏,這個(gè)插件是用來查看所有通道的獨(dú)享配置變量信息的,可以通過where條件指定通道名稱查詢具體某一個(gè)通道的信息鞋邑。

arkgate_datacenter_tables

????information schema插件诵次,這個(gè)插件是用來查看所有通道復(fù)制時(shí),對(duì)具體某一個(gè)表的命中及分發(fā)狀態(tài)枚碗,如果某一個(gè)表的binlog事件很多逾一,那相應(yīng)的引用計(jì)數(shù)就會(huì)很大,可以通過where條件指定通道名稱查詢具體某一個(gè)通道的信息肮雨。

????同時(shí)會(huì)在Arkgate Datacenter所在的MySQL/ArkDB實(shí)例創(chuàng)建與通道同名的arkgate_test庫來存儲(chǔ)該通道解析的Binlog數(shù)據(jù)遵堵。

mysql> use arkgate_test

Database changed

mysql> show tables;

+----------------------------+

| Tables_in_arkgate_test ? ? |

+----------------------------+

| instances ? ? ? ? ? ? ? ? ?|

| master_positions ? ? ? ? ? |

| slave_positions ? ? ? ? ? ?|

| transfer_checkpoint ? ? ? ?|

| transfer_data ? ? ? ? ? ? ?|

| transfer_filter ? ? ? ? ? ?|

| transfer_meta ? ? ? ? ? ? ?|

| transfer_option ? ? ? ? ? ?|

| transfer_sequence ? ? ? ? ?|

+----------------------------+

9 rows in set (0.00 sec)


其庫表簡述如下(名稱:說明):

instance

????存儲(chǔ)這個(gè)datacenter中要復(fù)制的主節(jié)點(diǎn)與從節(jié)點(diǎn)的配置信息。

master_positions

????存儲(chǔ)在復(fù)制過程中binlog以事務(wù)為單位的結(jié)束位置或者開始位置怨规。

slave_positions

????存儲(chǔ)的是在instances表中所記錄的所有slave節(jié)點(diǎn)陌宿。在master節(jié)點(diǎn)上分析到一個(gè)事務(wù)的結(jié)束位置時(shí),會(huì)取一次slave的show master status;位置波丰,這個(gè)信息會(huì)存儲(chǔ)到這個(gè)表中壳坪。

transfer_data

????存儲(chǔ)將binlog轉(zhuǎn)譯之后的JSON數(shù)據(jù),為源端增量同步數(shù)據(jù)掰烟。

transfer_checkpoint

????存儲(chǔ)最新的checkpoint位置信息弥虐。

transfer_filter

????存儲(chǔ)復(fù)制白名單及黑名單信息。

transfer_meta

????存儲(chǔ)復(fù)制過程中所有表的元數(shù)據(jù)信息媚赖。

transfer_option

????存儲(chǔ)復(fù)制一些配置參數(shù)

transfer_sequence

????存儲(chǔ)Arkgate維護(hù)的自增ID的表霜瘪。

了解這些Arkgate的庫表信息后,就可以進(jìn)一步深入了解Arkgate同步原理及Arkgate如何適配源端惧磺、目的端數(shù)據(jù)庫類型的操作流程颖对。

Arkgate同步原理

至此大家都知道Arkgate采集層是偽裝成源端MySQL的從庫,通過實(shí)時(shí)訂閱Binlog Events并把它解析轉(zhuǎn)換為JSON格式的數(shù)據(jù)磨隘,然后通過HASH分發(fā)存儲(chǔ)到Arkgate數(shù)據(jù)中心缤底。

整個(gè)實(shí)時(shí)訂閱過程是多線程并發(fā)處理的顾患,那么存在一個(gè)問題是最新被處理的Binlog有可能是不完整的,存在空洞个唧,因?yàn)榫€程通過操作系統(tǒng)內(nèi)核調(diào)度時(shí)執(zhí)行有先有后江解,最新執(zhí)行的事務(wù)前面經(jīng)常會(huì)存在還沒有執(zhí)行的事務(wù),而此時(shí)最新的事務(wù)已經(jīng)插入到datacenter中了徙歼,而沒有執(zhí)行的當(dāng)然在datacenter中不會(huì)有犁河,那么如果應(yīng)用程序讀的太快的話,就會(huì)導(dǎo)致有些數(shù)據(jù)讀不到魄梯,因?yàn)閼?yīng)用程序已經(jīng)認(rèn)為讀過的位置之前的事務(wù)都已經(jīng)讀取完畢了桨螺。那這樣就導(dǎo)致了數(shù)據(jù)丟失的問題。

Arkgate 是通過transfer_checkpoint表來解決數(shù)據(jù)空洞的問題酿秸,transfer_checkpoint表結(jié)構(gòu)如下:

mysql> show create table transfer_checkpoint\G;

*************************** 1. row ***************************

? ? ? ?Table: transfer_checkpoint

Create Table: CREATE TABLE `transfer_checkpoint` (

? `flag` int(11) NOT NULL COMMENT 'primary key placeholder',

? `id` bigint(20) unsigned NOT NULL COMMENT 'eid',

? `tid` bigint(20) unsigned NOT NULL COMMENT 'tid',

? PRIMARY KEY (`flag`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='checkpoint sequence, before which are all avialable'

1 row in set (0.00 sec)

transfer_checkpoint表用來存儲(chǔ)最新的checkpoint位置信息,只有一行數(shù)據(jù)灭翔,每一個(gè)列的具體意義如下:

flag: 數(shù)據(jù)寫入時(shí)該字段數(shù)據(jù)恒為0即可。

id: 表示可安全讀取的最大事件id辣苏。

tid:表示可安全讀取的最大事務(wù)id肝箱。

????transfer_checkpoint表只存儲(chǔ)了兩個(gè)id值,這兩個(gè)id值就是對(duì)應(yīng)transfer_data中的id值稀蟋,在transfer_data表中煌张,所有小于這兩個(gè)id值的數(shù)據(jù)都是完整的,不會(huì)丟失數(shù)據(jù)糊治,而大于這兩個(gè)值的數(shù)據(jù)唱矛,則事務(wù)之間存在空洞的問題罚舱。這個(gè)表只會(huì)有一條記錄井辜。簡單而言,在應(yīng)用程序使用過程中管闷,只要把這個(gè)表中的id值記錄為當(dāng)前可以讀取的最大位置即可,可以保證數(shù)據(jù)安全粥脚。

????而transfer_data表是用來真正的存儲(chǔ)將Binlog轉(zhuǎn)譯之后的Json數(shù)據(jù)的,在給業(yè)務(wù)程序使用的時(shí)候包个,只需要不斷輪循這個(gè)表中的數(shù)據(jù)刷允,通過id范圍來不斷拉取新數(shù)據(jù)即可,當(dāng)然id范圍是不可以大于transfer_checkpoint表中的id值的碧囊。transfer_data表結(jié)構(gòu)如下:

mysql> show create table transfer_data\G;

*************************** 1. row ***************************

? ? ? ?Table: transfer_data

Create Table: CREATE TABLE `transfer_data` (

? `id` bigint(20) unsigned NOT NULL COMMENT 'id but not auto increment',

? `tid` bigint(20) unsigned NOT NULL COMMENT 'transaction id',

? `dbname` varchar(64) DEFAULT NULL COMMENT 'dbname',

? `tablename` varchar(64) DEFAULT NULL COMMENT 'tablename',

? `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'the create time of event ',

? `instance_name` varchar(64) DEFAULT NULL COMMENT 'the source instance of this event',

? `binlog_hash` varchar(64) DEFAULT NULL COMMENT 'binlog_hash',

? `optype` varchar(64) DEFAULT NULL COMMENT 'operation type, include insert, update...',

? `data` longblob COMMENT 'binlog transfer data, format json',

? PRIMARY KEY (`id`,`tid`),

? UNIQUE KEY `uniq_binlog_hash` (`binlog_hash`),

? KEY `idx_dbtablename` (`dbname`,`tablename`),

? KEY `idx_create_time` (`create_time`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='binlog transfer data'

1 row in set (0.00 sec)

這里只介紹關(guān)鍵的兩個(gè)字段id和tid树灶,字段值和transfer_checkpoint表關(guān)聯(lián),涉及到數(shù)據(jù)安全糯而。

????????ID天通,這個(gè)列存儲(chǔ)的是一個(gè)序號(hào),是Arkgate自己維護(hù)的一個(gè)自增序號(hào)熄驼,每讀一個(gè)Binlog事務(wù)像寒,序號(hào)就加1烘豹,因?yàn)槊恳粋€(gè)事務(wù)是一個(gè)Binlog的原子單元,arkgate在存儲(chǔ)時(shí)也是以事件為單位的诺祸。維護(hù)一個(gè)這樣的ID携悯,主要是為了與另一個(gè)列TID一起來做聯(lián)合主鍵使用的,因?yàn)锽inlog在文件中是有序的筷笨,而插入到transfer_data中之后(如果是并發(fā)插入的話)憔鬼,如果沒有這個(gè)聯(lián)合主鍵的話,很難保證實(shí)際的順序奥秆,同時(shí)這也是為開發(fā)提供的一個(gè)自己維護(hù)的游標(biāo)信息逊彭,在具體使用過程中,開發(fā)需要自己來維護(hù)這兩個(gè)ID值构订,這樣才能知道異構(gòu)數(shù)據(jù)已經(jīng)同步到什么位置了侮叮。

????????TID,這個(gè)值是與Binlog中的事務(wù)相關(guān)的悼瘾,每次開始一個(gè)新事務(wù)囊榜,這個(gè)值就加1,也就是說亥宿,在transfer_data表中卸勺,不同數(shù)據(jù)中,如果TID的值相同的話烫扼,說明這些變更是同一個(gè)事務(wù)產(chǎn)生的曙求,但是ID值肯定是不同的。

那么數(shù)據(jù)同步過程中如何感知源端DDL變更呢映企?transfer_meta這個(gè)表就是做這個(gè)事悟狱,它主要是用來存儲(chǔ)在解析Binlog的過程中,出現(xiàn)的所有表的元數(shù)據(jù)信息堰氓,以Json格式存儲(chǔ)挤渐。transfer_meta表結(jié)構(gòu)如下:

mysql> show create table transfer_meta\G;

*************************** 1. row ***************************

? ? ? ?Table: transfer_meta

Create Table: CREATE TABLE `transfer_meta` (

? `dbname` varchar(64) NOT NULL COMMENT 'database name',

? `tablename` varchar(64) NOT NULL COMMENT 'table name',

? `version` bigint(20) NOT NULL COMMENT 'map to transfer_data column id',

? `metadata` text COMMENT 'table struct',

? `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'the load time of table',

? PRIMARY KEY (`dbname`,`tablename`,`version`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='transfer meta data '

1 row in set (0.00 sec)


列定義如下:

????dbname,表示當(dāng)前表所屬的數(shù)據(jù)庫名双絮。

????tablename浴麻,表名。

????version囤攀,表示當(dāng)前表結(jié)構(gòu)的版本號(hào)软免,針對(duì)同一個(gè)表,在transfer_data中的id列的值焚挠,處于當(dāng)前version和下一個(gè)version之間時(shí)膏萧,需要使用當(dāng)前version的表結(jié)構(gòu)。也就是說,根據(jù)transfer_data中的id值向抢,找到大于這個(gè)id值的version中最小的那個(gè)认境,就是當(dāng)前所需要的meta信息。

????metadata挟鸠,當(dāng)前表結(jié)構(gòu)的Json格式存儲(chǔ)叉信。

????update_time,出現(xiàn)時(shí)間艘希。

????transfer_meta表的作用是將所有在復(fù)制時(shí)用到的表對(duì)象硼身,分析之后轉(zhuǎn)換為Json格式的表結(jié)構(gòu),方便上層應(yīng)用程序?qū)son格式的Binlog中使用到的表有足夠的了解覆享,在應(yīng)用程序每次讀取datacenter中的數(shù)據(jù)時(shí)佳遂,遇到一個(gè)表時(shí)可以首先來這里獲取表結(jié)構(gòu),這個(gè)表里面存儲(chǔ)的表結(jié)果撒顿,是不斷更新的丑罪,都是最新版本的表結(jié)構(gòu)的Json存儲(chǔ)。與transfer_data表中的optype列的meta值對(duì)應(yīng)凤壁,如果值是meta時(shí)吩屹,說明有新的表出現(xiàn)了,或者這個(gè)表在被修改之后拧抖,又一次出現(xiàn)了煤搜。

Arkgate保證同步的數(shù)據(jù)安全后,Arkgate adapter只需要消費(fèi)transfer_data表中的數(shù)據(jù)往目標(biāo)數(shù)據(jù)庫進(jìn)行數(shù)據(jù)裝載即可唧席。

至此Arkgate同步原理告一段落擦盾,其同步流程如下圖:


Arkgate適配

目前Arkgate源端只支持MySQL,目的端支持適配HBase淌哟、ES迹卢、ArkDB/MySQL/TiDB/Kafka/Redis等。如果基于Arkgate需要新增Arkgate的源端和目的端適配該如何處理呢绞绒?

新增源端適配-Oracle舉例

如何同步Oracle數(shù)據(jù)非本文討論重點(diǎn)婶希,重點(diǎn)在于介紹支持Oracle同步的工具如何適配Arkgate榕暇。其實(shí)這里可以將Oracle同步的工具當(dāng)做Arkgate datacenter的客戶端蓬衡,按照Arkgate自定義的數(shù)據(jù)格式進(jìn)行數(shù)據(jù)寫入即可,這樣可以復(fù)用當(dāng)前的Arkgate Adapter實(shí)現(xiàn)對(duì)多種類型目的端進(jìn)行同步彤枢。

前面介紹transfer_data表時(shí)說過此表是真正存儲(chǔ)同步源端的增量數(shù)據(jù)狰晚,其數(shù)據(jù)是轉(zhuǎn)存儲(chǔ)為JSON數(shù)據(jù)格式存在transfer_data表data字段中。那么從源端同步的數(shù)據(jù)按照如下的格式進(jìn)行JSON數(shù)據(jù)適配即可完成源端數(shù)據(jù)庫類型適配缴啡。

DML JSON格式

tranfer_data的data字段存放的是Json數(shù)據(jù)格式壁晒,里面的pk代表主鍵的索引下標(biāo),表示表的第幾列為主鍵,"pk":[0]表示表的第一列為主鍵业栅,"pk":[0秒咐,1]表示表的第一列和第二列為聯(lián)合主鍵谬晕。

insert操作只有new數(shù)據(jù)。


?update操作有new和old 數(shù)據(jù)携取。


delete操作只有old數(shù)據(jù)攒钳。


DDL JSON格式

Truncate操作的JSON內(nèi)容如下,DATA列為空,沒有任何數(shù)據(jù)


ALTERTABLE操作JSON內(nèi)容如下


RENAME操作的JSON內(nèi)容如下:


DDL操作雷滋,transfer_data都是optype=meta的記錄不撑。data數(shù)據(jù)表示操作后的表結(jié)構(gòu)。


數(shù)據(jù)插入transfer_data時(shí)需要維護(hù)OPTYPE的類型晤斩,這個(gè)列存儲(chǔ)當(dāng)前事件的操作類型焕檬,目前包括INSERT、UPDATE澳泵、DELETE实愚、TRUNCATE、ALTERTABLE兔辅、RENAME爆侣、CREATETABLE、META幢妄。其支持的類型來源是:

optype:

ddl: META,CREATEDB,CREATETABLE,ALTERTABLE,RENAME,TRUNCATE,DROPDB,DROPTABLE

dml: INSERT,UPDATE,DELETE

????????應(yīng)用程序(例如Arkgate Adapter)需要哪一種變更兔仰,就處理哪一種,否則可以直接忽略或者不查即可蕉鸳,如果值是META時(shí)乎赴,說明有新的表出現(xiàn)了,或者這個(gè)表在被修改之后又一次出現(xiàn)了潮尝,此時(shí)就需要去arkgate_meta表中獲取最新的meta信息榕吼。需要注意的是meta每次改表建表都會(huì)有, 所以meta后面不一定都是create table,只是提醒消費(fèi)者勉失,原表的表結(jié)構(gòu)是什么樣子羹蚣,后面如果是alter table的話,就可以直接用了乱凿⊥缢兀或者提醒消費(fèi)者表結(jié)構(gòu)發(fā)生了變化,需要新載入一個(gè)表徒蟆。

????meta是一個(gè)邏輯上的東西,meta的主要作用是增量同步到目的庫胁出,當(dāng)arkgate adapter發(fā)現(xiàn)目的庫沒有表結(jié)構(gòu)時(shí)adapter會(huì)根據(jù)meta創(chuàng)建表結(jié)構(gòu)。

新增目的端適配

新增目的端相比新增源端更簡單明了段审,Arkgate adapter當(dāng)作目的端的客戶端進(jìn)行數(shù)據(jù)同步即可,需要同步的數(shù)據(jù)來源于transfer_data表全蝶。

Arkgate運(yùn)行要求

Arkgate使用過程中,對(duì)于源端MySQL和數(shù)據(jù)同步的內(nèi)容如下要求:

1.要求源端MySQL必須記錄Binlog并且設(shè)置binlog_format為ROW、binlog_row_image為FULL抑淫。其源端MySQL類型支持MySQL绷落、ArkDB、PXC始苇、MGR嘱函、MGC及公有云RDS,源端不同MySQL集群架構(gòu)及分支版本都可以通過同一個(gè)Arkgate來做數(shù)據(jù)傳輸埂蕊。

2.Arkgate需要源端所有數(shù)據(jù)庫的查詢權(quán)限往弓。

3.源端需同步的表必須有主鍵和InnoDB存儲(chǔ)引擎。

4.Arkgate只同步庫表級(jí)別DDL和數(shù)據(jù)蓄氧,不同步視圖函似、觸發(fā)器、存儲(chǔ)過程和函數(shù)喉童。

Arkgate功能介紹

庫表聚合

????Arkgate支持分庫分表數(shù)據(jù)合并撇寞,庫表合并邏輯豐富,支持的功能列表如下:

過濾同步

Arkgate支持字段過濾和DDL操作過濾同步堂氯,支持的功能列表如下:

數(shù)據(jù)壓縮及加密

Arkgate支持?jǐn)?shù)據(jù)壓縮及加密蔑担。

1.Arkgate提供參數(shù)arkgate_compression_write用來控制Arkgate在向DataCenter寫入數(shù)據(jù)時(shí)是否開啟壓縮功能,支持在線修改咽白。已有通道需要stop復(fù)制通道再start 復(fù)制通道才能生效啤握。

2.Arkgate支持使用官方MySQL SSL來完成數(shù)據(jù)傳輸加密。

數(shù)據(jù)沖突處理

????Arkgate 中的 adpater程序支持?jǐn)?shù)據(jù)沖突處理晶框。數(shù)據(jù)沖突處理針對(duì)有主鍵或者唯一鍵的表排抬,對(duì)于源端(src)的每個(gè) DML 修改的行的主鍵或者唯一鍵字段都會(huì)和目的端(dst)做驗(yàn)證,如果兩端數(shù)據(jù)不 一致授段,會(huì)在 conflict_log 表中記錄源端蹲蒲、目的端信息、DML 操作類型和 SQL 語句侵贵、源端舊數(shù)據(jù)届搁、源端新數(shù)據(jù)、目的端沖突數(shù)據(jù)窍育、在目的端操作類型卡睦、回滾語句,并且給出執(zhí)行建議蔫骂。

數(shù)據(jù)沖突處理目前支持四種處理模式:

exec_mode =0 ,表示數(shù)據(jù)沖突時(shí)則目的端跳過沖突數(shù)據(jù)不做任何處理么翰,沖突日志會(huì)記錄每個(gè)沖突的數(shù)據(jù)并記錄跳過的SQL語句牺汤。

exec_mode =1 ,表示數(shù)據(jù)沖突時(shí)則目的端會(huì)覆蓋執(zhí)行replace into來保證與源庫數(shù)據(jù)保持一致辽旋,沖突日志會(huì)記錄沖突數(shù)據(jù)并自動(dòng)生成回滾語句。

exec_mode =2 ,表示自動(dòng)化數(shù)據(jù)沖突處理且可以原生自動(dòng)回調(diào)第三方程序接口(如客戶已有系統(tǒng)接口)以實(shí)現(xiàn)自動(dòng)處理沖突數(shù)據(jù)。

exec_mode=3,表示數(shù)據(jù)沖突則arkgate adapter自動(dòng)退出补胚,沖突日志會(huì)記錄沖突數(shù)據(jù)码耐。

????重點(diǎn)說一下exec_mode=2的執(zhí)行方式,Arkgate支持自動(dòng)化數(shù)據(jù)沖突處理且可以原生自動(dòng)回調(diào)第三方程序接口(如客戶已有系統(tǒng)接口)以實(shí)現(xiàn)自動(dòng)處理沖突數(shù)據(jù)溶其。對(duì)接線上業(yè)務(wù)系統(tǒng)的數(shù)據(jù)邏輯來處理數(shù)據(jù)沖突骚腥,將抉擇權(quán)上交給業(yè)務(wù),通過業(yè)務(wù)定義的數(shù)據(jù)沖突處理邏輯來保證數(shù)據(jù)的最終一致性瓶逃。當(dāng)遇到滿足沖突邏輯的數(shù)據(jù)時(shí),統(tǒng)一返回給業(yè)務(wù)層進(jìn)行數(shù)據(jù)處理束铭,從業(yè)務(wù)角度來把控?cái)?shù)據(jù)準(zhǔn)確性,保證數(shù)據(jù)的最終一致性厢绝,實(shí)現(xiàn)異地雙活中數(shù)據(jù)分類和校驗(yàn)邏輯契沫。

Arkgate 加載由業(yè)務(wù)提供的數(shù)據(jù)沖突處理 API 后,當(dāng)遇到滿足沖突邏輯的數(shù)據(jù)時(shí)昔汉,Arkgate 統(tǒng)一返回給業(yè)務(wù)層進(jìn)行數(shù)據(jù)處理懈万,從業(yè)務(wù)角度來把控?cái)?shù)據(jù)準(zhǔn)確性,保證數(shù)據(jù)的最終一致性靶病,整個(gè)數(shù)據(jù)沖突處理過程非阻塞会通。

通過加載 API 實(shí)現(xiàn)數(shù)據(jù)沖突處理的做法,也屬于業(yè)內(nèi)首創(chuàng)娄周,即完美解決了數(shù)據(jù)庫沖突涕侈,同時(shí)也對(duì)業(yè)務(wù)非常友好,提高了系統(tǒng)的靈活性煤辨。

異地雙活

????MySQL 數(shù)據(jù)實(shí)時(shí)異構(gòu)同步系統(tǒng)的另一大核心功能 MySQL 數(shù)據(jù)庫異地多活驾凶,以滿足數(shù)據(jù)庫跨數(shù)據(jù)中心、跨云掷酗、跨地域的多活需求调违。要求如下:

1.通過數(shù)據(jù)實(shí)時(shí)同步功能實(shí)現(xiàn)異地雙活兩 IDC 間 MySQL 數(shù)據(jù)庫的數(shù)據(jù)傳輸和實(shí)時(shí)同步,輸入源為 MySQL泻轰,輸出源為 MySQL技肩。傳輸過程中解決數(shù)據(jù)傳輸、數(shù)據(jù)回環(huán)浮声、數(shù)據(jù)沖突檢測(cè)和處理虚婿、數(shù)據(jù)最終一致性問題。

2.通過異地多活功能實(shí)現(xiàn)混合云間泳挥、跨 IDC 間的多活然痊,可以直接進(jìn)行流量切換,支持一致性讀配置屉符,支持跨云或跨 IDC 全鏈路服務(wù)監(jiān)控剧浸。

????除了已經(jīng)介紹過的數(shù)據(jù)沖突處理外锹引,數(shù)據(jù)延時(shí)優(yōu)化和數(shù)據(jù)回環(huán)解決及數(shù)據(jù)一致性讀是異地雙活建設(shè)中必須要優(yōu)化解決的問題。

數(shù)據(jù)延時(shí)優(yōu)化

????多活系統(tǒng)中的最大挑戰(zhàn)是數(shù)據(jù)同步延時(shí)問題唆香,光速是一定的嫌变,距離越遠(yuǎn)則網(wǎng)絡(luò)傳輸?shù)臅r(shí)間越長,常說的 1000 公里以上則換算為 30ms 的網(wǎng)絡(luò)延遲(來回一次)躬它。對(duì)于應(yīng)用而言腾啥,單次后端交互的數(shù)據(jù)訪問新增 30ms 延時(shí)是無法容忍的。

????對(duì)于異地多活的系統(tǒng)而言冯吓,多點(diǎn)寫入是最快解決由于距離產(chǎn)生數(shù)據(jù)延時(shí)問題的方法倘待。由應(yīng)用層進(jìn)行業(yè)務(wù)單元化,例如單筆交易的所有操作都在距離最近的當(dāng)前機(jī)房內(nèi)完成组贺,這樣可以保證對(duì)于自己而言延柠,訪問的機(jī)房數(shù)據(jù)是最新的。例如業(yè)務(wù)按照某個(gè)維度將流量切分到各個(gè)業(yè)務(wù)單元锣披。按業(yè)務(wù)單元分類的數(shù)據(jù)訪問請(qǐng)求只能在同一個(gè)業(yè)務(wù)單元中單點(diǎn)寫入進(jìn)行贞间,盡量保證業(yè)務(wù)單元內(nèi)的所有業(yè)務(wù)請(qǐng)求都在自身單元內(nèi)完成,減少跨地域的訪問調(diào)用雹仿。

????同時(shí)進(jìn)行多線程并行同步增热,能夠高效保證低延遲準(zhǔn)實(shí)時(shí)的進(jìn)行數(shù)據(jù)同步。

數(shù)據(jù)回環(huán)解決

????多活系統(tǒng)中最受關(guān)注的點(diǎn)是數(shù)據(jù)如何破環(huán),即自身的數(shù)據(jù)變更不會(huì)再次同步到自己重復(fù)執(zhí)行胧辽。Arkgate 在數(shù)據(jù)同步傳輸過程中能夠識(shí)別數(shù)據(jù)來源和管理數(shù)據(jù)復(fù)制的生命周期(arkgate內(nèi)部維護(hù)的全局server_id)峻仇,當(dāng)屬于自身 IDC 的數(shù)據(jù)流再次回傳給自己時(shí),忽略這部分?jǐn)?shù)據(jù)變更邑商,讓數(shù)據(jù)變更生命周期化摄咆。


解決數(shù)據(jù)回環(huán)問題后,當(dāng)兩邊的 IDC 同時(shí)進(jìn)行數(shù)據(jù)變更人断,即可實(shí)現(xiàn)系統(tǒng)異地多活需求吭从。


數(shù)據(jù)一致性讀

Arkgate 的一致性讀分為自定義一致性讀和自路由一致性讀。

????1)自定義一致性讀可以理解為是通過 Arkgate 多活組件數(shù)據(jù)庫中間件提供的透明讀寫分離恶迈、權(quán)重分發(fā)涩金、Hint 分發(fā)等特性來控制讀寫請(qǐng)求的路由策略,可以自定義將需要強(qiáng)一致性的讀寫請(qǐng)求放到實(shí)時(shí)寫節(jié)點(diǎn)上進(jìn)行強(qiáng)一致性讀暇仲,此方式成為自定義一致性讀步做。

????2)自路由一致性讀是 Arkgate 可以自身設(shè)置讀請(qǐng)求在從節(jié)點(diǎn)多少延遲范圍內(nèi)進(jìn)行一致性讀,當(dāng)讀節(jié)點(diǎn)的請(qǐng)求超過設(shè)置的延遲閾值后奈附,Arkgate 自動(dòng)會(huì)將相關(guān)的讀請(qǐng)求路由到寫節(jié)點(diǎn)上全度,保證數(shù)據(jù)強(qiáng)一致性。當(dāng)數(shù)據(jù)延遲降到可接受范圍內(nèi)斥滤,讀寫請(qǐng)求又可以自動(dòng)化按需讀寫分離将鸵。

????其中自定義一致性讀是語句級(jí)別的,即可以在語句級(jí)別配置分發(fā)規(guī)則到指定的讀寫節(jié)點(diǎn)進(jìn)行數(shù)據(jù)訪問勉盅。自路由一致性讀是表級(jí)別的,即可以配置某一張表當(dāng)后端讀寫節(jié)點(diǎn)延遲過大時(shí)咨堤,該表的讀寫請(qǐng)求會(huì)統(tǒng)一分發(fā)到實(shí)時(shí)寫節(jié)點(diǎn)菇篡,保證數(shù)據(jù)強(qiáng)一致性漩符。

高可用切換

????異地雙活涉及到的組件有 Arkgate一喘、ArkProxy、ArkSentinel 及 MySQL 高可用集群嗜暴,后端 MySQL或公有云RDS 高可用集群切換根據(jù)架構(gòu)不同有不同的切換方案凸克,此處不做介紹,著重分析 Arkgate闷沥、ArkProxy萎战、ArkSentinel 的高可用切換。

????首先是 ArkSentinel舆逃,使用 5 節(jié)點(diǎn)的分布式哨兵集群蚂维,節(jié)點(diǎn)間自身互相高可用。當(dāng) ArkSentinel 發(fā)生故障路狮,由于組件的輕量級(jí)虫啥,重新啟動(dòng)即可。ArkSentinel實(shí)時(shí)監(jiān)控 ArkProxy奄妨、Arkgate 的運(yùn)行狀況涂籽,實(shí)現(xiàn)其系統(tǒng)監(jiān)控、故障發(fā)現(xiàn)砸抛、故障自動(dòng)切換等功能评雌,加上 Arkproxy 和 Arkgate 的配置可持久化的特性,發(fā)生故障時(shí)直焙,ArkSentinel 自動(dòng)發(fā)起投票將可用的 Arkproxy景东、Arkgate 的從庫提升為主庫,完成故障轉(zhuǎn)移的功能奔誓。

????其次是 Arkproxy耐薯,Arkproxy 集群是使用 Master-Standby 兩節(jié)點(diǎn)的高可用方 案,通過ArkSentinel監(jiān)控節(jié)點(diǎn)進(jìn)程的存活丝里,使用 VIP 或 DNS 對(duì)外提供一個(gè)統(tǒng)一的入口曲初。當(dāng) Arkproxy Master 節(jié)點(diǎn)出現(xiàn)故障時(shí),由 ArkSentinel 將實(shí)時(shí)的配置信息杯聚、路由信息持久化到 Standby 節(jié)點(diǎn)臼婆,同時(shí) ArkSentinel發(fā)起切換將 VIP 或DNS 綁定在 Standby 節(jié)點(diǎn)并提升為 Master,整個(gè)切換過程對(duì)前端應(yīng)用基本透明幌绍,業(yè)務(wù)無感知颁褂。

????最后是 Arkgate故响,Arkgate 數(shù)據(jù)同步的元數(shù)據(jù)信息是保存在 MySQL 高可用集群中的,當(dāng) Arkgate 節(jié)點(diǎn)故障停止后颁独,重啟 Arkgate 節(jié)點(diǎn)并訪問元數(shù)據(jù)信息即可斷點(diǎn)續(xù)傳輸之前的進(jìn)度彩届。當(dāng) Arkgate 節(jié)點(diǎn)不可恢復(fù)時(shí),可以快速提升 Standby 的節(jié)點(diǎn)為 Master誓酒。

綜上所述樟蠕,整個(gè)跨云異地雙活的架構(gòu)圖如下:



Arkgate核心特性

? ?最后總結(jié)下Arkgate的核心特性:

實(shí)時(shí)

Arkgate將自己偽裝成一個(gè)MySQL的從庫,通過實(shí)時(shí)訂閱Binlog Events并把它解析轉(zhuǎn)換為JSON格式的數(shù)據(jù)靠柑,然后通過HASH分發(fā)存儲(chǔ)到數(shù)據(jù)中心(MySQL數(shù)據(jù)庫)寨辩。Arkgate的Adapter系統(tǒng)從數(shù)據(jù)中心將JSON格式的數(shù)據(jù)取出來,并行存儲(chǔ)到目標(biāo)數(shù)據(jù)庫中歼冰。這個(gè)過程與MySQL主從復(fù)制類似靡狞,是準(zhǔn)實(shí)時(shí)的復(fù)制,并且是并行處理的隔嫡。

異構(gòu)?

在數(shù)據(jù)傳輸?shù)倪^程中甸怕,Adapter系統(tǒng)可以方便地根據(jù)需要異構(gòu)化數(shù)據(jù),把重新組合的數(shù)據(jù)傳輸?shù)侥康亩瞬煌拇鎯?chǔ)系統(tǒng)中腮恩。 數(shù)據(jù)到目標(biāo)數(shù)據(jù)庫列的對(duì)應(yīng)關(guān)系梢杭,實(shí)現(xiàn)了異構(gòu)存儲(chǔ)。

多通道?

Arkgate可以實(shí)現(xiàn)多通道的數(shù)據(jù)復(fù)制庆揪,各個(gè)通道之間不會(huì)互相影響式曲,這樣不但可以節(jié)省資源菌仁,同時(shí)還可以把多個(gè)源數(shù)據(jù)庫的數(shù)據(jù)同步到一個(gè)目的端来吩,實(shí)現(xiàn)數(shù)據(jù)的歸并。

并行

?Arkgate通過獨(dú)特的同步機(jī)制了讨,實(shí)現(xiàn)了支持隨機(jī)分發(fā)内颗、按照表名分發(fā)的功能钧排,將Binlog順序存儲(chǔ)的數(shù)據(jù),巧妙地轉(zhuǎn)換為并行處理機(jī)制均澳,一方面保證了數(shù)據(jù)同步的實(shí)時(shí)性恨溜,另一方面提高了機(jī)器資源的使用率,節(jié)省資源找前,避免常見的MySQL Replication延遲問題糟袁。

插件式?

Arkgate采集層是一款MySQL的插件,使用起來非常方便躺盛,安裝之后即可使用项戴。Arkgate會(huì)把復(fù)制過程中的相關(guān)狀態(tài)存儲(chǔ)在information schema的表里面,可以查看相關(guān)表獲得相應(yīng)信息槽惫,實(shí)現(xiàn)狀態(tài)監(jiān)控和報(bào)警周叮。

數(shù)據(jù)完整性

Arkgate可以保證復(fù)制的數(shù)據(jù)完整性辩撑,在復(fù)制中斷后自動(dòng)識(shí)別Binlog的同步狀態(tài),找到正確的同步起點(diǎn)仿耽,它支持串行方式和并行方式合冀。Arkgate還支持配置復(fù)制從節(jié)點(diǎn),如果復(fù)制的主節(jié)點(diǎn)掛了项贺,會(huì)自動(dòng)切換到源數(shù)據(jù)庫的從節(jié)點(diǎn)繼續(xù)同步數(shù)據(jù)君躺。如果源數(shù)據(jù)庫集群中打開了GTID,可以保證目標(biāo)數(shù)據(jù)庫的數(shù)據(jù)完整性敬扛。

三重高可用?

Arkgate在建立一個(gè)復(fù)制通道時(shí)晰洒,可以配置一個(gè)Master和多個(gè)Slave朝抖,這個(gè)Master和Slave可以不與MySQL集群中的Master和Slave對(duì)應(yīng)啥箭,他只是相對(duì)于當(dāng)前的Arkgate復(fù)制通道而言的。Master節(jié)點(diǎn)可以指定一個(gè)具體的位置治宣,也可以不指定急侥,不指定的時(shí)候,默認(rèn)從當(dāng)前最新show master status位置開始復(fù)制侮邀。而Slave節(jié)點(diǎn)則不需要指定坏怪。其三重高可用是指:

第一重高可用:復(fù)制啟動(dòng)之后,假如Master節(jié)點(diǎn)掛了绊茧,如果Slave還是可用的話铝宵,Arkgate會(huì)選擇一個(gè)節(jié)點(diǎn)自動(dòng)切換過去,并且保證數(shù)據(jù)的完整性华畏。讓后端的分析業(yè)務(wù)無感知鹏秋。

第二重高可用:Arkgate本身無狀態(tài),所有復(fù)制相關(guān)的配置都存儲(chǔ)在了JSON所在的MySQL數(shù)據(jù)庫中亡笑,只需要在第一時(shí)間內(nèi)啟動(dòng)Arkgate并開始復(fù)制即可侣夷。

第三重高可用:如果需要的話,后端數(shù)據(jù)中心可以采用現(xiàn)有MySQL高可用架構(gòu)實(shí)現(xiàn)仑乌,實(shí)現(xiàn)數(shù)據(jù)中心的高可用百拓。

數(shù)據(jù)過濾?

Arkgate同步數(shù)據(jù)時(shí),可以指定白名單和黑名單晰甚,顯示指定要復(fù)制哪些庫表衙传,或者指定不復(fù)制哪些庫表,可以通過like 字符串指定模糊字符串厕九。如果指定了白名單蓖捶,則黑名單被忽略。

參數(shù)配置?

Arkgate有豐富的配置參數(shù)止剖,支持多個(gè)通道相互獨(dú)立的配置腺阳,做到獨(dú)立管理落君,互不影響。同時(shí)參數(shù)存儲(chǔ)在數(shù)據(jù)中心中亭引,保證一次配置绎速,永久有效。

跨云部署

Arkgate支持在私有云及各家公有云上混合部署焙蚓,滿足跨云備份纹冤、跨云災(zāi)備的需求。

異地多活

當(dāng)配置目標(biāo)數(shù)據(jù)庫為MySQL時(shí)购公,數(shù)據(jù)的傳輸實(shí)際上就變?yōu)榱薓ySQL到MySQL的數(shù)據(jù)復(fù)制了萌京,這樣就可以脫離自有的MySQL復(fù)制功能,而使用Arkgate來做數(shù)據(jù)復(fù)制宏浩。此方案的優(yōu)點(diǎn)是Arkgate的傳輸過程更可控知残,數(shù)據(jù)所見即所得,不會(huì)出現(xiàn)主從復(fù)制中斷重做數(shù)據(jù)的問題比庄,讓異地?cái)?shù)據(jù)同步更可靠求妹,在Adapter中也可以實(shí)現(xiàn)異地雙活中數(shù)據(jù)分類和校驗(yàn)的邏輯來滿足異地多活的需求。

Arkgate產(chǎn)品展望

異構(gòu)數(shù)據(jù)同步系統(tǒng)Arkgate作為一款高度兼容數(shù)據(jù)庫使用習(xí)慣的數(shù)據(jù)整合利器佳窑,已經(jīng)對(duì)外提供試用制恍。感興趣的小伙伴可以訪問 http://www.cloud-ark.com/#/Arkgate 獲取試用版。

我們希望異構(gòu)數(shù)據(jù)同步系統(tǒng)Arkgate能夠解決業(yè)務(wù)上數(shù)據(jù)孤島的問題神凑,隨心所欲進(jìn)行數(shù)據(jù)整合净神,讓一切變得簡單!

感興趣的小伙伴也可聯(lián)系:xzwen96(微信)溉委,歡迎技術(shù)交流鹃唯!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市薛躬,隨后出現(xiàn)的幾起案子俯渤,更是在濱河造成了極大的恐慌,老刑警劉巖型宝,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件八匠,死亡現(xiàn)場離奇詭異,居然都是意外死亡趴酣,警方通過查閱死者的電腦和手機(jī)梨树,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岖寞,“玉大人抡四,你說我怎么就攤上這事。” “怎么了指巡?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵淑履,是天一觀的道長。 經(jīng)常有香客問我藻雪,道長秘噪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任勉耀,我火速辦了婚禮指煎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘便斥。我一直安慰自己至壤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布枢纠。 她就那樣靜靜地躺著像街,像睡著了一般。 火紅的嫁衣襯著肌膚如雪京郑。 梳的紋絲不亂的頭發(fā)上宅广,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天葫掉,我揣著相機(jī)與錄音些举,去河邊找鬼。 笑死俭厚,一個(gè)胖子當(dāng)著我的面吹牛户魏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挪挤,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼叼丑,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了扛门?” 一聲冷哼從身側(cè)響起鸠信,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎论寨,沒想到半個(gè)月后星立,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡葬凳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年绰垂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片火焰。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡劲装,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情占业,我是刑警寧澤绒怨,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站谦疾,受9級(jí)特大地震影響窖逗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜餐蔬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一碎紊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧樊诺,春花似錦仗考、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至顿膨,卻和暖如春锅锨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恋沃。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國打工必搞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人囊咏。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓恕洲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親梅割。 傳聞我的和親對(duì)象是個(gè)殘疾皇子霜第,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360