Canal大做戰

- 前言mysql

以前我是經過實時的查庫,而後再將數據實時地更新或者新增到ES中。雖然如今能穩定運行,可是佔用了數據庫的資源,同時不容易擴展。一旦分庫分表,或者修改字段等,則須要開發升級。linux

所以利用成熟的中間件,能夠解決上訴問題。接下去我就會介紹我使用的canal以及canal-adapter組件。git

- 簡介github

canal是阿里巴巴開源的一個組件,他主要是經過mysql的binlog日誌來同步數據庫的數據。sql

canal-adapter是阿里巴巴針對canal的適配器,他能從canal server取得數據直接適配到其餘數據源。例如hbase,es,db等。docker

gitlub地址:https://github.com/alibaba/canal/releases數據庫

- 原理vim

1. mysql主備原理windows

官網的原理圖:bash

從圖中咱們能夠看出:

1.master主庫會將數據改變的動做記錄到binlog中
2.slave從庫會到主庫拉取binlog拷貝到本身的中繼日誌(relay log)
3.slave從庫讀取中繼日誌(relay log)而後更新本身的數據

2. canal工做原理

官網的原理圖:

由圖可知,canal假裝成mysql的從庫,模擬maser和slave的交互協議來拉取binlog,而後解析binlog獲取數據流。

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

- 瘋狂操做

上文說到要拉取數據庫的binlog日誌,所以要對數據庫修改一些配置。因爲canal目前僅支持Mysql,那麼咱們就從mysql開始下手!首先咱們確定要保證咱們的mysql要打開binlog。

1. binlog

show binary logs;

或者

show variables like 'log_%';

從客戶端上咱們發現未打開binlog!接下去就配置打開binlog!

linux: my.cnf
windows: my.ini

默認是linux的配置文件路徑是/etc/my.cnf,windows是mysql server包路徑下的my.ini文件

將下面的配置加到配置文件[mysqld]中便可!

# 這樣默認就會打開binlog 
log_bin=mysql-bin
# 必須選擇row模式 
binlog_format=ROW
# 配置mysql replaction須要定義,不能和canal的slaveId重複
server_id=1

打開binlog,而且必須設置row模式,這樣才能拿到每一條記錄的更新數據!注意service_id若在集羣中有多個節點的時候,不能相同!

若是是docker的話,則要按下面的步驟來找到映射到容器裏面的配置文件。先進入容器

docker exec -it mysql bash

進入容器以後能夠用find指令找一下配置的位置,找到後直接將上面配置加進去就行了

find / -name mysql

接下去直接重啓mysql就能夠啦,docker部署的話能夠繼續往下操做,列舉全部應用

docker ps -a

找到mysql應用id直接重啓就Ok啦!

docker restart id

接下去再按第一步查找一波就發現binlog都已經打開啦!

可是千萬不要忘了, 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;

當前用戶來經過grants查詢權限:

show grants for 'canal' ;

官方文檔:https://github.com/alibaba/canal/wiki/AdminGuide

2. canal-server

binlog打開以後,接下去就部署canal的server服務啦!

wget https://github.com/alibaba/canal/releases/download/canal-1.1.3-alpha-2/canal.deployer-1.1.3-SNAPSHOT.tar.gz

目前位置最新的穩定版本是1.1.2,可是奈何這個版本有jar包衝突。

後來看到canal的開發者說讓咱們用新的版本,所以我用1.1.3這個版本的包。

將jar包下載下來以後,解壓

mkdir canal
mkdir server
tar zxvf canal.deployer-1.1.3-SNAPSHOT.tar.gz -C /usr/local/canal/server/

能夠看到解壓的路徑

若是進入bin目錄,可進行重啓,關閉,開啓

cd bin
sh restart.sh  /   sh startup.sh  /  sh  stop.sh

若是要進行修改配置則要進入conf目錄

cd conf/example/
vim instance.properties

1.canal假裝成mysql的slave從庫節點的id
2.監聽的數據庫的地址
3.監聽的數據庫的一些配置

以上3點是必要配置。配置完直接啓動

此時canal的server端已經啓動完畢!

server官方文檔:https://github.com/alibaba/canal/wiki/QuickStart

3. canal-adapter

先下載和canal-server一樣版本的包,而後解壓

wget https://github.com/alibaba/canal/releases/download/canal-1.1.3-alpha-2/canal.adapter-1.1.3-SNAPSHOT.tar.gz
mkdir adapter
tar zxvf canal.adapter-1.1.3-SNAPSHOT.tar.gz -C /usr/local/canal/adapter/

能夠看到解壓的路徑

若是進入bin目錄,可進行重啓,關閉,開啓

cd bin
sh restart.sh  /   sh startup.sh  /  sh  stop.sh

若是要進行修改配置則要進入conf目錄

首先

vim application.yml

1.注意端口默認是8081,當心端口衝突
2.配置canal的server的地址
3.配置源數據源mysql的相關配置
4.配置目標數據源的相關配置,可配置db,hbase,es

以上3點是必要配置。

目標數據源用es爲例,則接下去配置es的相關配置

cd es
vim mytest_user.yml

最基本的話就是修改sql,這個sql是針對元數據源的,意思就是從這個數據庫查出來的哪些數據須要同步到es。

這兩個配置完直接啓動

此時canal的adapter端已經啓動完畢!

adapter官網文檔:https://github.com/dienh880426/canal/tree/master/client-adapter

adapter-es官方文檔:https://github.com/alibaba/canal/wiki/Sync-ES

4. 結果

最後驗證一波,發現只要數據庫有任何的增刪改,adapter適配器都會拉到binlog信息,而後ES都會自動更新相應的數據,完美!

相關文章
相關標籤/搜索