php使用Canal監(jiān)聽msyql的過(guò)程詳解
- canal需要java8
- 去官網(wǎng)下載java8
安裝Java
#創(chuàng)建目錄 mkdir -p /usr/local/java/ #解壓到目錄 tar zxvf jdk-8u411-linux-x64.tar.gz -C /usr/local/java/
配置環(huán)境變量在 /etc/profile 最后加入
export JAVA_HOME=/usr/local/java/jdk1.8.0_411 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin
使之生效
source /etc/profile
查看是否安裝成功
java -version
設(shè)置mysql用戶權(quán)限
#創(chuàng)建用戶名和密碼都為 canal 的用戶 create user 'canal'@'%' identified by 'canal'; #授予該用戶對(duì)所有數(shù)據(jù)庫(kù)和表的查詢、復(fù)制主節(jié)點(diǎn)數(shù)據(jù)的操作權(quán)限 GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; FLUSH PRIVILEGES; #重新加載權(quán)限
修改mysql配置
vim /etc/my.cnf
修改部分內(nèi)容如下
# 開啟 binlog log-bin=mysql-bin #master端的ID號(hào),不能和 canal 的 slaveId 重復(fù); server-id=1 #行級(jí),記錄每次操作后每行記錄的變化。 binlog-format=row #指定庫(kù),縮小監(jiān)控的范圍。 binlog-do-db=test
查看是否開啟主從
show master status;
安裝canal
下載最新canal
下載 wget https://github.com/alibaba/canal/releases/download/canal-1.1.7/canal.deployer-1.1.7.tar.gz #創(chuàng)建canal目錄 mkdir -p /usr/local/canal/ #解壓到canal目錄 tar -zxvf canal.deployer-1.1.7.tar.gz -C /usr/local/canal/
查看canal主配置文件
cat /usr/local/canal/conf/canal.properties
查看會(huì)看到暴露了三個(gè)端口和指定了一個(gè)實(shí)例
canal.admin.port = 11110 canal.port = 11111 canal.metrics.pull.port = 11112 #多個(gè)實(shí)例使用逗號(hào)分隔: canal.destinations = example1,example2, #這里對(duì)應(yīng)/usr/local/canal/conf/example/ canal.destinations = example
canal.destinations:canal能可以收集多個(gè)MySQL數(shù)據(jù)庫(kù)數(shù)據(jù),每個(gè)MySQL數(shù)據(jù)庫(kù)都有獨(dú)立的配置文件控制。具體配置規(guī)則: conf/目錄下,使用文件夾放置,文件夾名代表一個(gè)MySQL實(shí)例。canal.destinations用于配置需要監(jiān)控?cái)?shù)據(jù)的數(shù)據(jù)庫(kù)。如果是多個(gè),使用,隔開。
修改實(shí)例配置文件
修改實(shí)例配置
vim /usr/local/canal/conf/example/instance.properties
在文件最后加入
#配置 slaveId ,不能等于 mysql 配置里的 server Id 即可 canal.instance.mysql.slaveId=10 #數(shù)據(jù)庫(kù)連接 canal.instance.master.address=127.0.0.1:3306 #數(shù)據(jù)庫(kù)賬號(hào)密碼 canal.instance.dbUsername=canal canal.instance.dbPassword=canal #代表數(shù)據(jù)庫(kù)的編碼方式 canal.instance.connectionCharset = UTF-8 #設(shè)置白名單,這里是監(jiān)控test庫(kù)下所有表 canal.instance.filter.regex=test\\..* #設(shè)置黑名單,這里設(shè)置排除test庫(kù)下以_noc結(jié)尾的表 canal.instance.filter.black.regex=test\\..*_noc
這個(gè)正則表達(dá)式 test\.*_noc 的含義是:
test:精確匹配字符串 "test"。 \\.:匹配一個(gè)點(diǎn)(.),因?yàn)辄c(diǎn)在正則表達(dá)式中有特殊含義,所以需要使用 \\ 進(jìn)行轉(zhuǎn)義。 *:匹配零個(gè)或多個(gè)任意字符。 _noc:精確匹配字符串 "_noc"。 因此,這個(gè)正則表達(dá)式可以用來(lái)匹配所有以 test. 開頭且以 _noc 結(jié)尾的字符串。在 Canal 的配置中使用這個(gè)正則表達(dá)式,就可以實(shí)現(xiàn)排除以 test. 開頭且以 _noc 結(jié)尾的數(shù)據(jù)庫(kù)和表,而監(jiān)控其他數(shù)據(jù)庫(kù)和表。
比如我們要查詢 test庫(kù)下users表id為3的用戶信息,sql語(yǔ)句可以這么寫
SELECT * FROM test.users WHERE id = 3;
這里的test.users就是正則要匹配的地方
如果系統(tǒng)是1個(gè) cpu,需要將 canal.instance.parser.parallel 設(shè)置為 false
啟動(dòng)和停止
#啟動(dòng)
/usr/local/canal/bin/startup.sh
#停止
/usr/local/canal/bin/stop.sh
查看是否啟動(dòng)成功
ps -ef | grep canal
php測(cè)試
使用 canal-php
composer require xingwenge/canal_php
新建index.php文件
<?php require __DIR__.'/vendor/autoload.php'; use xingwenge\canal_php\CanalClient; use xingwenge\canal_php\CanalConnectorFactory; use xingwenge\canal_php\Fmt; try { $client = CanalConnectorFactory::createClient(CanalClient::TYPE_SOCKET_CLUE); # $client = CanalConnectorFactory::createClient(CanalClient::TYPE_SWOOLE); $client->connect("127.0.0.1", 11111); $client->checkValid(); //設(shè)置過(guò)濾tes庫(kù)t下的所有表 $client->subscribe("1001", "example", "test.*"); while (true) { $message = $client->get(100); if ($entries = $message->getEntries()) { foreach ($entries as $entry) { Fmt::println($entry); } } sleep(1); } $client->disConnect(); } catch (\Exception $e) { echo $e->getMessage(), PHP_EOL; }
運(yùn)行php文件
php index.php
eventType:1、是新增行,2、修改行,3、刪除行、4、新增表
也可以直接將數(shù)據(jù)寫入rabbitmq
修改conf/canal.properties
vim conf/canal.properties
修改RabbitMQ配置如下
rabbitmq.host = 127.0.0.1 rabbitmq.virtual.host = / #交換機(jī)名稱 rabbitmq.exchange =exchange.canal #隊(duì)列名稱 rabbitmq.queue = canal_queue #路由鍵名 rabbitmq.routingKey = canal-routing-key #賬號(hào)密碼 rabbitmq.username =admin rabbitmq.password =admin #路由模式,這里是嚴(yán)格模式 rabbitmq.deliveryMode =direct
修改實(shí)例配置conf/example/instance.properties
vim conf/example/instance.properties
修改部分內(nèi)容如下
#rabbitmq的路由鍵配置 #這里與canal.properties里的rabbitmq.routingKey一樣 canal.mq.topic=canal-routing-key canal.mq.partition=0 canal.instance.multi.stream.on=false #rabbitmq 的 routing key #dynamic topic route by schema or table regex #canal.mq.dynamicTopic=mytest1.user,topic2:mytest2\\..*,.*\\..* #hash partition config #canal.mq.enableDynamicQueuePartition=false #canal.mq.partitionsNum=3 #canal.mq.dynamicTopicPartitionNum=test.*:4,mycanal:6 #canal.mq.partitionHash=test.table:id^name,.*\\..*
以上就是php使用Canal監(jiān)聽msyql的詳細(xì)內(nèi)容,更多關(guān)于php Canal監(jiān)聽msyql的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
PHP實(shí)現(xiàn)在對(duì)象之外訪問(wèn)其私有屬性private及保護(hù)屬性protected的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)在對(duì)象之外訪問(wèn)其私有屬性private及保護(hù)屬性protected的方法,簡(jiǎn)單介紹了php public、private及protected的功能及用法,并結(jié)合實(shí)例形式分析了php在對(duì)象之外訪問(wèn)其私有屬性private及保護(hù)屬性protected的方法,需要的朋友可以參考下2017-11-11PDO版本問(wèn)題 Invalid parameter number: no parameters were bound
發(fā)現(xiàn)在客戶的某個(gè)PHP版本下,執(zhí)行某類操作的時(shí)候,總是會(huì)報(bào)如下錯(cuò)誤 Invalid parameter number: no parameters were bound,經(jīng)google,發(fā)現(xiàn)是php版本過(guò)低導(dǎo)致2013-01-01php頁(yè)碼形式分頁(yè)函數(shù)支持靜態(tài)化地址及ajax分頁(yè)
這篇文章主要介紹了php頁(yè)碼形式分頁(yè)函數(shù),此分頁(yè)支持靜態(tài)化地址分頁(yè)和無(wú)鏈接地址時(shí)的ajax分頁(yè),需要的朋友可以參考下2014-03-03php訪問(wèn)對(duì)象中的成員的實(shí)例方法
在本篇文章里小編給大家整理了一篇關(guān)于php訪問(wèn)對(duì)象中的成員的實(shí)例方法,有需要的朋友們可以跟著學(xué)習(xí)參考下。2021-10-10PHP排序算法之基數(shù)排序(Radix Sort)實(shí)例詳解
這篇文章主要介紹了PHP排序算法之基數(shù)排序(Radix Sort),結(jié)合實(shí)例形式詳細(xì)分析了php基數(shù)排序算法的原理、實(shí)現(xiàn)方法與相關(guān)使用技巧,需要的朋友可以參考下2018-04-04PHP實(shí)現(xiàn)的無(wú)限分類類庫(kù)定義與用法示例【基于thinkPHP】
這篇文章主要介紹了PHP實(shí)現(xiàn)的無(wú)限分類類庫(kù)定義與用法,結(jié)合實(shí)例形式分析了基于thinkPHP實(shí)現(xiàn)的無(wú)限分類類庫(kù)相關(guān)定義及具體使用操作技巧,需要的朋友可以參考下2018-08-08PHP數(shù)組操作——獲取數(shù)組最后一個(gè)值的方法
這篇文章主要介紹了PHP數(shù)組操作——獲取數(shù)組最后一個(gè)值的方法,需要的朋友可以參考下2015-04-04