canal學習筆記(原理與環境搭建)

canal學習筆記(原理與環境搭建)

項目簡介

canal: [kə’næl]中文翻譯爲渠道,運河,管道
是阿里開源的使用Java開發的用於MySQL數據庫增量日誌數據的訂閱、消費和解析

歷史背景:

早期阿里在杭州和美國雙機房部署,存在跨機房數據同步的業務需求,實現方式主要是基於業務trigger(觸發器)獲取增量變更。從2010年開始,阿里逐漸嘗試採用解析數據庫日誌獲取增量變更進行同步,由此衍生出了canal項目


Github:https://github.com/alibaba/canal,目前一直在維護更新中

一. 原理

MySQL主從複製原理

MySQL主從複製原理

  • MySQL master 將數據變更寫入二進制日誌( binary log, 其中記錄叫做二進制日誌事件binary log
    events,可以通過 show binlog events 進行查看)
  • MySQL slave 將 master 的 binary log events 拷貝到它的中繼日誌(relay log)
  • MySQL slave 重放 relay log 中事件,將數據變更反映它自己的數據


    以上是canal的GitHub上對MySQL主從同步做的官方說明。上圖的大致流程:當Master(MySQL主庫)上的數據發生改變時,Master會記錄一條數據的變化到BinaryLog中。而Slave(MySQL從庫)中有I/O線程和SQL線程,I/O線程會調度請求Master的BinLog,將響應寫入到自己的RelayLog(中繼日誌)中,SQL線程會讀取RelayLog中的數據,並且在從庫中Replay(重放),這樣就將數據在從庫中也保存了一份。需要注意的是,由於slave中的I/O線程和SQL線程是調度執行的,因此MySQL主從同步時會有一點點延遲,但基本是準實時的。

canal工作原理

canal工作原理

  1. canal模擬MySQL slave的交互協議,將自己僞裝成MySQL slave,向MySQL master發送dump協議;
  2. MySQL master收到dump請求,開始推送binary log給canal;
  3. canal解析binary log對象(原始數據爲byte流);
  4. canal將數據交給業務程序,做相應處理(這裏的canal其實相當於服務端,具體需要執行後續操作的程序可以認爲是canal客戶端)

二. 應用場景

關於上面canal工作原理中的第4條,canal可以有以下應用場景:

  1. 數據庫實時備份
  2. 業務緩存刷新
  3. 構建搜索索引(ES索引)
  4. 業務層面(價格變化等重要業務信息)
  5. 異構數據備份(mysql=>oracle,mysql=>mongo,mysql=>redis,mysql=>es等)

關於第3點構建搜索索引,我們公司目前對於商品後臺的海運商品數據,頁面搜索是就是走的ES索引,而商品數據發生業務變化時,需要在業務代碼中更新MySQL,然後再顯式構建ES索引。這個功能點可以很好地用canal實現。
目前canal主要支持MySQL版本爲5.1.x,5.5.x,5.6.x,5.7.x,8.0.x。也支持mariaDB(MySQL被Oracle收購之後,MySQL的創始人擔心MySQL以後會被閉源,就拉了一個分支出來,是用他的女兒的名字命名的,和MySQL幾乎是一樣的,終生免費開源,詳情可以谷歌一下)

三. canal環境搭建

  1. 首先需要搭建MySQL環境,並啓動MySQL服務
  2. 開啓MySQL的binlog寫入功能,配置binlog-format爲ROW模式。需要在my.cnf中添加如下配置:
[mysqld]
log-bin=mysql-bin #開啓binlog
binlog-format=ROW #選擇ROW模式
server_id=1 #配置MySQL replaction需要定義,不要和canal的slaveId重複
  1. 配置一個canal連接MySQL的賬號,並且授予作爲MySQL slave的權限
CREATE USER canal IDENIFIED BY 'canal';
GRANT SELECT,REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
  1. 安裝部署canal服務端
    github下載canal壓縮包。由於github下載太慢,可以直接使用以下鏈接下載,下載完成後tar -zxvf解壓到指定目錄:
wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz

解壓後目錄如下圖:
在這裏插入圖片描述

  • bin目錄:運行程序:啓動、重啓、關閉等
  • conf目錄:配置文件
  • lib目錄:依賴的jar包
  • logs目錄:日誌
  1. 修改canal配置(主要是MySQL連接相關配置)
vim conf/example/instace.properties

主要有以下配置:

# MySQL連接地址
canal.instance.master.address=127.0.0.1:3306
# MySQL連接用戶名
canal.instance.dbUsername=canal
# MySQL連接密碼
canal.instance.dbPassword=canal
# 需要監聽的庫和表的正則匹配=*\\..*
canal.instance.filter.regex
# 隊列名:canal服務拿到數據後實際上是放在消息隊列中
canal.mq.topic=example
  1. 啓動canal服務
在bin目錄下 ./startup.sh
  1. canal server的默認端口號爲11111,可以在/conf目錄下canal.properties文件中修改,以下是一些常用canal命令:
# 查看canal進程
ps -ef |grep canal
# 查看canal的server日誌
cat logs/canal/canal.log
# 查看canl的instace的日誌
cat logs/example/example.log
# 關閉canal
在bin目錄下 ./stop.sh

也可以查看一些MySQL binlog相關的的配置:

# 查看是否啓用了日誌
show variables like 'log_bin';
# 顯示當前日誌狀態:日誌文件名、偏移座標等
show master status;
# 查看mysql binlog模式
show variables like 'binlog_format';
# 獲取binlog文件列表
show binary logs;
# 查看當前正在寫入的binlog文件(\G代表格式化)
show master status\G;
# 查看指定binlog文件的內容
show binlog events in 'mysql-bin.000017';

binlog有三種模式:

  1. ROW:不僅記錄sql語句,還會記錄每個字段的變化情況,但是會佔用較多的空間,需要使用mysqlbinlog工具進行查看;
  2. STATEMENT:只記錄sql語句,不記錄上下文信息,數據恢復時可能會導致數據丟失;
  3. MIX:比較靈活。例如表結構變更的情況就記錄爲STATEMENT,數據更新的情況就記錄爲ROW模式。








xshell能ping通虛擬機,但是不能連接虛擬機
關閉防火牆
1.查看防火牆是否關閉
sudo ufw status

2.關閉防火牆
sudo ufw disable

3.啓動22端口
sudo ufw allow 22
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章