es 全量同步mysql_使用canal将mysql同步到es中
因為自己項目中需要用到mysql數(shù)據(jù)同步到es中,查找了相關(guān)資料最后決定用canal來做,所以便有了本文,下面一起來看如何使用canal吧
canal教程
根據(jù) https://github.com/alibaba/canal 上的原理解釋,我們知道 canal 會模擬 mysql slave 的交互協(xié)議,偽裝自己為 mysql slave,然后向 mysql master 發(fā)送 dump 協(xié)議。
mysql master 收到 dump 請求,開始推送 binary log 給 slave(也就是 canal),然后 canal 解析 binary log 對象(原始為 byte流)。
經(jīng) canal 解析過的對象,我們使用起來就非常的方便了。
再根據(jù) https://github.com/alibaba/canal/releases 提供的版本信息,你會發(fā)現(xiàn) canal 其實相當(dāng)于一個中間件,專門用來解析 MySQL 的 binlog 日志。canal 解析好了之后,會封裝成一個數(shù)據(jù)對象,通過 protobuf3.0 協(xié)議進行交互,讓 canal 客戶端進行消費。
根據(jù)上面的解釋,以及 canal 提供的版本信息,我們在使用 canal 的時候,首選要安裝一個 canal.deployer-1.1.4.tar.gz 進行解析 MySQL 的 binlog 日志。
下載后,復(fù)制 canal.deployer-1.1.4.tar.gz 到 MySQL 主機上,比如放在 /usr/local/soft/目錄下。然后依次執(zhí)行下面的命令:
mkdir canalcd canaltar -zxvf ../canal.deployer-1.1.4-SNAPSHOT.tar.gz然后修改 canal 的配置文件 vim conf/example/instance.properties
這三項改成你自己的,比如我的配置如下:
canal.instance.dbUsername=canalcanal.instance.dbPassword=canalcanal.instance.connectionCharset = UTF-8canal.instance.defaultDatabaseName =canal_test然后保存并退出。(VI 模式下,按 Esc 輸入 :wq 回車退出。)
接著,我們檢查一下 MySQL 的配置。確定版本和是否開啟了 binlog 日志,以及日志格式。
show variables like 'binlog_format';show variables like 'log_bin';select version();canal 支持 binlog 格式為 ROW 的模式。如果你沒開啟 binlog,并且格式是非 row 的,建議修改一下 mysql 的配置文件。
執(zhí)行 mysql –help | grep my.cnf 找到 mysql 的 my.cnf 文件。
執(zhí)行 vim /etc/my.cnf 命令。添加下面 3 個配置。
log-bin=mysql-bin #添加這一行就okbinlog-format=ROW #選擇row模式server_id=1 #配置mysql replaction需要定義,不能和canal的slaveId重復(fù)然后保存并退出。
接著執(zhí)行 sudo service mysqld restart 重啟 MySQL。
需要注意的是你的 mysql 用戶,必須要有 REPLICATION SLAVE 權(quán)限。該權(quán)限授予 slave 服務(wù)器以該賬戶連接 master 后可以執(zhí)行 replicate 操作的權(quán)利。
如果沒有權(quán)限,則使用 root 賬戶登錄進 MySQL,執(zhí)行下面的語句,創(chuàng)建用戶,分配權(quán)限。
CREATE USER canal IDENTIFIED BY ‘canal’;GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON . TO ‘‘canal’’@’%’;FLUSH PRIVILEGES;MySQL 啟動后,就可以開啟 canal 服務(wù)了。
/usr/local/soft/canal/bin/startup.sh開啟后,觀察 canal 服務(wù)的日志,確保服務(wù)正常。
tail 300f /usr/local/soft/canal/logs/canal/canal.log查看 canal 的日志
確定沒有問題后,開始編寫我們的測試程序。
pom.xml 中導(dǎo)入下面的依賴。
com.alibaba.otter canal.client 1.1.4使用JAVA進行測試
import java.net.InetSocketAddress;import java.util.List;import com.alibaba.otter.canal.client.CanalConnectors;import com.alibaba.otter.canal.client.CanalConnector;import com.alibaba.otter.canal.common.utils.AddressUtils;import com.alibaba.otter.canal.protocol.Message;import com.alibaba.otter.canal.protocol.CanalEntry.Column;import com.alibaba.otter.canal.protocol.CanalEntry.Entry;import com.alibaba.otter.canal.protocol.CanalEntry.EntryType;import com.alibaba.otter.canal.protocol.CanalEntry.EventType;import com.alibaba.otter.canal.protocol.CanalEntry.RowChange;import com.alibaba.otter.canal.protocol.CanalEntry.RowData;public class SimpleCanalClientExample {public static void main(String args[]) { // 創(chuàng)建鏈接 CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress(AddressUtils.getHostIp(), 11111), "example總結(jié)
以上是生活随笔為你收集整理的es 全量同步mysql_使用canal将mysql同步到es中的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: drivespeed.exe是一款安全的
- 下一篇: 二十万存银行一年利息有多少?20万怎么理