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


POC的目的:
1、與MYSQL的對接方式,配置文檔
2、訂閱的延遲
3、訂閱后宕機消息會不會丟失
4、能不能從指定的點開始重新訂閱
5、高並發寫入的時候,日志的順序是否還能保持,不考慮消費的情況訂閱是否會延遲

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

 

Canal介紹

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

Mysql主備復制原理

 

從上層來看,復制分成三步:

  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上直接聯網下載:

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

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

解壓canal

Mkdir /app/canal

Mkdir /app/canal-example

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM