- 前言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都會自動更新相應的數據,完美!