MySQL增量訂閱&消費組件Canal POC

POC的目的:
一、與MYSQL的對接方式,配置文檔
二、訂閱的延遲
三、訂閱後宕機消息會不會丟失
四、能不能從指定的點開始從新訂閱
五、高併發寫入的時候,日誌的順序是否還能保持,不考慮消費的狀況訂閱是否會延遲java

###寫完word文檔直接拷貝過來,格式通常般。。。

 

Canal介紹

官網地址:https://github.com/alibaba/canalmysql

Mysql主備複製原理

 

從上層來看,複製分紅三步:linux

  1. master將改變記錄到二進制日誌(binary log)中(這些記錄叫作二進制日誌事件,binary log events,能夠經過show binlog events進行查看);
  2. slave將master的binary log events拷貝到它的中繼日誌(relay log);
  3. slave重作中繼日誌中的事件,將改變反映它本身的數據。

Canal工做原理

 

  1. 原理相對比較簡單:
  2. canal模擬mysql slave的交互協議,假裝本身爲mysql slave,向mysql master發送dump協議
  3. mysql master收到dump請求,開始推送binary log給slave(也就是canal)
  4. canal解析binary log對象(原始爲byte流)

 

Canal安裝部署

下載canal

直接下載,訪問:https://github.com/alibaba/canal/releases,也能夠在linux上直接聯網下載:git

服務端包:https://github.com/alibaba/canal/releases/download/v1.0.23/canal.deployer-1.0.23.tar.gzgithub

客戶端包:https://github.com/alibaba/canal/releases/download/v1.0.23/canal.example-1.0.23.tar.gz算法

解壓canal

Mkdir /app/canalspring

Mkdir /app/canal-examplesql

Tar zxvf canal.deployer-1.0.23.tar.gz -C /app/canal數據庫

Tar zxvf canal.example-1.0.23.tar.gz -C /app/canal-example數組

MySQL配置修改

a. canal的原理是基於mysql binlog技術,因此這裏必定須要開啓mysql的binlog寫入功能,建議配置binlog模式爲row.

**針對阿里雲RDS帳號默認已經有binlog dump權限,不須要任何權限或者binlog設置,能夠直接跳過這一步**

[mysqld]

log-bin=mysql-bin #添加這一行就ok

binlog-format=ROW #選擇row模式

server_id=1 #配置mysql replaction須要定義,不能和canal的slaveId重複

b. canal的原理是模擬本身爲mysql slave,因此這裏必定須要作爲mysql slave的相關權限.

CREATE USER canal IDENTIFIED BY 'canal'; 

GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';

-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;

FLUSH PRIVILEGES;

針對已有的帳戶可直接經過grant

Canal配置修改

vi conf/example/instance.properties
#################################################
## mysql serverId
canal.instance.mysql.slaveId = 1234
 
# position info,須要改爲本身的數據庫信息
canal.instance.master.address = 172.16.0.158:3306 
canal.instance.master.journal.name = 
canal.instance.master.position = 
canal.instance.master.timestamp = 
 
#canal.instance.standby.address = 
#canal.instance.standby.journal.name =
#canal.instance.standby.position = 
#canal.instance.standby.timestamp = 
 
# username/password,須要改爲本身的數據庫信息
canal.instance.dbUsername = canal  
canal.instance.dbPassword = canal
canal.instance.defaultDatabaseName =canal
canal.instance.connectionCharset = UTF-8
 
# table regex
canal.instance.filter.regex = .*\\..*
 
#################################################

 

說明:

  • canal.instance.connectionCharset 表明數據庫的編碼方式對應到java中的編碼類型,好比UTF-8,GBK , ISO-8859-1

 

Canal-Server啓停

sh bin/startup.sh 啓動
sh bin/stop.sh  中止
vi logs/canal/canal.log  查看canal日誌
vi logs/example/example.log  查看instance的日誌

 

Canal-Client啓停

Cd /app/canal-example
sh bin/startup.sh 啓動canal客戶端
sh bin/stop.sh  中止canal客戶端
tail -f /app/canal-example/logs/example/entry.log 查看canal客戶端訂閱的日誌

 

嘗試修改mysql數據庫,如上述咱們配置的庫是canal,咱們建立一個userinfo的用戶表,能夠在entry.log裏面打印出userinfo的信息

 

Canal-Client開發

到此爲止整個canal環境搭建完成。

不過canal-example是一個已經編譯好的包,若是咱們須要對源碼進行修改,輸出一些咱們本身想要的信息,能夠從新開發canal客戶端。

客戶端源碼官方下載地址:https://github.com/alibaba/canal/wiki/ClientExample

 

 

Canal-Server HA配置

更多配置策略請參考官方文檔:https://github.com/alibaba/canal/wiki/AdminGuide

a. 修改canal.properties,加上zookeeper配置

canal.zkServers=172.16.7.122:2181
canal.instance.global.spring.xml = classpath:spring/default-instance.xml

b. 建立example目錄,並修改instance.properties

canal.instance.mysql.slaveId = 1234 ##另一臺機器改爲1235,保證slaveId不重複便可
canal.instance.master.address = 172.16.0.158:3306

注意: 兩臺機器上的instance目錄的名字須要保證徹底一致,HA模式是依賴於instance name進行管理,同時必須都選擇default-instance.xml配置

啓動兩臺機器的canal,啓動後,你能夠查看logs/example/example.log,只會看到一臺機器上出現了啓動成功的日誌。查看一下zookeeper中的節點信息,也能夠知道當前工做的節點爲172.16.0.157:11111

 

Canal pom版本須要1.0.22或以上,不然zkclient可能發生衝突

<dependency>
    <groupId>com.alibaba.otter</groupId>
    <artifactId>canal.client</artifactId>
    <version>1.0.22</version>
</dependency>

 

 

Canal POC

消費位點

Canal client接收到日誌以後要提交ack確認

connector.ack(batchId); // 提交確認

canal server在接收了客戶端的ack後,就會記錄客戶端提交的最後位點,若是canal client沒有提交位點,則下一次canal client啓動的時候  會將最後記錄的位點把日誌從新推送過來,直到canal client提交ack確認爲止。

訂閱延遲

Canal-server單點模式下,訂閱延遲平均22.65毫秒,HA模式下,訂閱延遲平均24.16毫秒,具體數據請參考附錄。

宕機消息是否丟失

中止正在工做的172.16.0.157的canal server,這時172.16.0.158會立馬啓動example instance,提供新的數據服務。與此同時,客戶端也會隨着canal server的切換,經過獲取zookeeper中的最新地址,與新的canal server創建連接,繼續消費數據,整個過程自動完成。

 

從指定的點開始訂閱

mysql連接時的起始位置(instance.properties)

  • canal.instance.master.journal.name + canal.instance.master.position : 精確指定一個binlog位點,進行啓動
  • canal.instance.master.timestamp : 指定一個時間戳,canal會自動遍歷mysql binlog,找到對應時間戳的binlog位點後,進行啓動
  • 不指定任何信息:默認從當前數據庫的位點,進行啓動。(show master status)

 

另外,能夠從一個指定的點開始獲取日誌:

CanalEntry.getHeader().getLogfileOffset()
 

 

高併發下的日誌順序

高併發下測試方案:

mysql的主鍵id是自增的,不管業務如何高併發,但插入到mysql的id確定是自增且有序的,咱們以此爲基準來判斷canal訂閱到日誌是否也是有序的。

首先在canal客戶端獲取id列的值,分批存入一個數組,而後對這個數組進行冒泡排序,若是在冒泡算法中出現一次冒泡,則說明canal訂閱到的日誌出現亂序。

 

實驗結果:

本地開發機(i5-5200U CPU @2.2GHz 2.19GHz 8Gb內存),共開啓1000個線程,每一個線程插入1000條記錄,mysql最大鏈接數設置1000,總共100萬條記錄,canal client沒有輸出亂序日誌,而且canal client輸入的分批次(canal自動分批)size總和爲100萬。另外,當插入數據庫動做完成以後,canal-client輸出也同時完成,說明訂閱並無出現較大的延遲,整個過程持續840s,1190tps/s。

 

數據庫也共100萬條記錄:

 

附錄

訂閱延遲—canal server單點

canal-client收到日誌時間

mysql插入時間

訂閱延遲(ms)

1489994604188.00

1489994604142.00

46.00

1489994605180.00

1489994605149.00

31.00

1489994606165.00

1489994606151.00

14.00

1489994607165.00

1489994607153.00

12.00

1489994608199.00

1489994608155.00

44.00

1489994609199.00

1489994609157.00

42.00

1489994610187.00

1489994610160.00

27.00

1489994611184.00

1489994611163.00

21.00

1489994612176.00

1489994612172.00

4.00

1489994613208.00

1489994613174.00

34.00

1489994614197.00

1489994614175.00

22.00

1489994615186.00

1489994615176.00

10.00

1489994616184.00

1489994616178.00

6.00

1489994617189.00

1489994617180.00

9.00

1489994618208.00

1489994618182.00

26.00

1489994619206.00

1489994619185.00

21.00

1489994620202.00

1489994620187.00

15.00

1489994621195.00

1489994621188.00

7.00

1489994622230.00

1489994622189.00

41.00

1489994623220.00

1489994623190.00

30.00

1489994624210.00

1489994624192.00

18.00

1489994625202.00

1489994625195.00

7.00

1489994626236.00

1489994626199.00

37.00

1489994627227.00

1489994627200.00

27.00

1489994628217.00

1489994628202.00

15.00

1489994629211.00

1489994629203.00

8.00

1489994630212.00

1489994630205.00

7.00

1489994631210.00

1489994631206.00

4.00

1489994632249.00

1489994632208.00

41.00

1489994633250.00

1489994633210.00

40.00

1489994634215.00

1489994634211.00

4.00

1489994635216.00

1489994635212.00

4.00

1489994636257.00

1489994636214.00

43.00

1489994637285.00

1489994637241.00

44.00

1489994638278.00

1489994638243.00

35.00

1489994639283.00

1489994639246.00

37.00

1489994640283.00

1489994640248.00

35.00

1489994641271.00

1489994641250.00

21.00

1489994642262.00

1489994642251.00

11.00

1489994643255.00

1489994643252.00

3.00

1489994644268.00

1489994644254.00

14.00

1489994645268.00

1489994645255.00

13.00

1489994646300.00

1489994646256.00

44.00

1489994647292.00

1489994647259.00

33.00

1489994648287.00

1489994648260.00

27.00

1489994649273.00

1489994649262.00

11.00

1489994650267.00

1489994650263.00

4.00

1489994651302.00

1489994651265.00

37.00

1489994652293.00

1489994652268.00

25.00

1489994653288.00

1489994653270.00

18.00

1489994654298.00

1489994654271.00

27.00

1489994655289.00

1489994655273.00

16.00

1489994656278.00

1489994656275.00

3.00

1489994657282.00

1489994657277.00

5.00

1489994658325.00

1489994658280.00

45.00

1489994659313.00

1489994659282.00

31.00

1489994660291.00

1489994660284.00

7.00

1489994661299.00

1489994661286.00

13.00

1489994662290.00

1489994662287.00

3.00

1489994663331.00

1489994663288.00

43.00

1489994664318.00

1489994664291.00

27.00

1489994665332.00

1489994665293.00

39.00

1489994666327.00

1489994666295.00

32.00

1489994667321.00

1489994667297.00

24.00

1489994668315.00

1489994668300.00

15.00

1489994669316.00

1489994669301.00

15.00

1489994670311.00

1489994670302.00

9.00

1489994671334.00

1489994671304.00

30.00

1489994672334.00

1489994672306.00

28.00

1489994673332.00

1489994673307.00

25.00

1489994674327.00

1489994674309.00

18.00

1489994675324.00

1489994675310.00

14.00

1489994676317.00

1489994676312.00

5.00

1489994677325.00

1489994677313.00

12.00

1489994678319.00

1489994678314.00

5.00

1489994679352.00

1489994679315.00

37.00

1489994680356.00

1489994680317.00

39.00

1489994681351.00

1489994681318.00

33.00

1489994682344.00

1489994682320.00

24.00

1489994683342.00

1489994683324.00

18.00

1489994684369.00

1489994684326.00

43.00

1489994685368.00

1489994685327.00

41.00

1489994686361.00

1489994686329.00

32.00

1489994687353.00

1489994687330.00

23.00

1489994688345.00

1489994688331.00

14.00

1489994689357.00

1489994689333.00

24.00

1489994690345.00

1489994690334.00

11.00

1489994691346.00

1489994691336.00

10.00

1489994692340.00

1489994692337.00

3.00

1489994693376.00

1489994693339.00

37.00

1489994694404.00

1489994694362.00

42.00

1489994695397.00

1489994695363.00

34.00

1489994696389.00

1489994696366.00

23.00

1489994697395.00

1489994697367.00

28.00

1489994698392.00

1489994698369.00

23.00

1489994699378.00

1489994699370.00

8.00

1489994700408.00

1489994700372.00

36.00

1489994701401.00

1489994701375.00

26.00

1489994702400.00

1489994702377.00

23.00

1489994703392.00

1489994703379.00

13.00

 

平均:22.65ms

 

訂閱延遲—canal server集羣(兩個節點-主從)

canal-client收到日誌時間

mysql插入時間

訂閱延遲(s)

1490007771482.00

1490007771476.00

6.00

1490007772508.00

1490007772478.00

30.00

1490007773524.00

1490007773488.00

36.00

1490007774494.00

1490007774489.00

5.00

1490007775512.00

1490007775491.00

21.00

1490007776527.00

1490007776493.00

34.00

1490007777552.00

1490007777500.00

52.00

1490007778539.00

1490007778502.00

37.00

1490007779522.00

1490007779504.00

18.00

1490007780528.00

1490007780506.00

22.00

1490007781538.00

1490007781521.00

17.00

1490007782552.00

1490007782523.00

29.00

1490007783531.00

1490007783525.00

6.00

1490007784551.00

1490007784527.00

24.00

1490007785562.00

1490007785528.00

34.00

1490007786567.00

1490007786530.00

37.00

1490007787539.00

1490007787531.00

8.00

1490007788558.00

1490007788532.00

26.00

1490007789576.00

1490007789534.00

42.00

1490007790576.00

1490007790536.00

40.00

1490007791540.00

1490007791537.00

3.00

1490007792584.00

1490007792539.00

45.00

1490007793555.00

1490007793541.00

14.00

1490007794565.00

1490007794543.00

22.00

1490007795573.00

1490007795544.00

29.00

1490007796590.00

1490007796545.00

45.00

1490007797562.00

1490007797547.00

15.00

1490007798565.00

1490007798548.00

17.00

1490007799572.00

1490007799551.00

21.00

1490007800568.00

1490007800553.00

15.00

1490007801580.00

1490007801554.00

26.00

1490007802588.00

1490007802555.00

33.00

1490007803595.00

1490007803557.00

38.00

1490007804577.00

1490007804558.00

19.00

1490007805583.00

1490007805559.00

24.00

1490007806596.00

1490007806560.00

36.00

1490007807566.00

1490007807562.00

4.00

1490007808581.00

1490007808564.00

17.00

1490007809596.00

1490007809567.00

29.00

1490007810607.00

1490007810570.00

37.00

1490007811578.00

1490007811571.00

7.00

1490007812591.00

1490007812572.00

19.00

1490007813610.00

1490007813586.00

24.00

1490007814629.00

1490007814588.00

41.00

1490007815601.00

1490007815590.00

11.00

1490007816614.00

1490007816591.00

23.00

1490007817622.00

1490007817592.00

30.00

1490007818600.00

1490007818594.00

6.00

1490007819611.00

1490007819596.00

15.00

1490007820612.00

1490007820598.00

14.00

1490007821623.00

1490007821600.00

23.00

1490007822632.00

1490007822602.00

30.00

1490007823641.00

1490007823618.00

23.00

1490007824641.00

1490007824619.00

22.00

1490007825658.00

1490007825621.00

37.00

1490007826664.00

1490007826622.00

42.00

1490007827632.00

1490007827623.00

9.00

1490007828646.00

1490007828625.00

21.00

1490007829633.00

1490007829627.00

6.00

1490007830650.00

1490007830628.00

22.00

1490007831660.00

1490007831630.00

30.00

1490007832672.00

1490007832631.00

41.00

1490007833645.00

1490007833633.00

12.00

1490007834656.00

1490007834635.00

21.00

1490007835668.00

1490007835637.00

31.00

1490007836661.00

1490007836639.00

22.00

1490007837668.00

1490007837640.00

28.00

1490007838678.00

1490007838642.00

36.00

1490007839689.00

1490007839644.00

45.00

1490007840665.00

1490007840646.00

19.00

1490007841666.00

1490007841647.00

19.00

1490007842677.00

1490007842649.00

28.00

1490007843688.00

1490007843662.00

26.00

1490007844699.00

1490007844667.00

32.00

1490007845703.00

1490007845669.00

34.00

1490007846696.00

1490007846672.00

24.00

1490007847696.00

1490007847674.00

22.00

1490007848704.00

1490007848678.00

26.00

1490007849715.00

1490007849680.00

35.00

1490007850698.00

1490007850681.00

17.00

1490007851703.00

1490007851682.00

21.00

1490007852714.00

1490007852684.00

30.00

1490007853722.00

1490007853685.00

37.00

1490007854692.00

1490007854687.00

5.00

1490007855733.00

1490007855689.00

44.00

1490007856702.00

1490007856690.00

12.00

1490007857702.00

1490007857692.00

10.00

1490007858726.00

1490007858693.00

33.00

1490007859699.00

1490007859694.00

5.00

1490007860720.00

1490007860695.00

25.00

1490007861720.00

1490007861697.00

23.00

1490007862728.00

1490007862698.00

30.00

1490007863705.00

1490007863700.00

5.00

1490007864706.00

1490007864701.00

5.00

平均:24.16ms

相關文章
相關標籤/搜索