成都蜀美網(wǎng)站建設(shè)網(wǎng)頁制作代碼
座右銘:《堅(jiān)持有效輸出,創(chuàng)造價(jià)值無限》
最近想了解下canal,自行搭建并完成數(shù)據(jù)同步。經(jīng)過了幾天的踩坑之旅,今天終于搭建成功了。
環(huán)境:canalv1.1.5、MySQL8.0、JDK1.8
安裝MySQL
創(chuàng)建存放目錄
mkdir /docker-local
mkdir /docker-local/mysql8
之前安裝過MySQL,但是沒有配置conf,使用canal需要指定一個(gè)serveid
docker run --privileged=true -it \-p 3306:3306 --name mysql \-e MYSQL_ROOT_PASSWORD=123456 \-v /docker-local/mysql8/conf:/etc/mysql/conf.d \-v /docker-local/mysql8/data:/var/lib/mysql \-d mysql:8.0.26
編輯my.cnf
cd /docker-local/mysql8/conf
vim my.cnf
[mysqld]
server-id=1
保存,重啟mysql
docker restart mysql
創(chuàng)建用戶
創(chuàng)建用戶,方便canal使用
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
注意:安裝canal還需要開啟binlog,因?yàn)閙ysql8.0默認(rèn)是開啟的,并且是row模式,所以我這里沒有其他操作。
安裝canal
創(chuàng)建存放目錄
mkdir docker-local/canal
cd /docker-local/canal/
拉取鏡像
docker pull canal/canal-server:v1.1.5
運(yùn)行
docker run --name canal -d canal/canal-server:v1.1.5
復(fù)制容器中的配置文件到本地
docker cp canal:/home/admin/canal-server/conf/canal.properties /docker-local/canal
docker cp canal:/home/admin/canal-server/conf/example/instance.properties /docker-local/canal
修改instance.properties
vim instance.properties
停止
docker stop canal && docker rm canal
重新運(yùn)行
docker run --name canal -p 11111:11111 \
-v /docker-local/canal/instance.properties:/home/admin/canal-server/conf/example/instance.properties \
-v /docker-local/canal/canal.properties:/home/admin/canal-server/conf/canal.properties \
-v /docker-local/canal/log/:/home/admin/canal-server/logs/ \
-d canal/canal-server:v1.1.5
查看啟動(dòng)日志
cat log/canal/canal.log
cat /docker-local/canal/log/example/example.log
遇到的問題
connect /192.168.64.139:3306 failure
Caused by: java.io.IOException: connect /192.168.64.139:3306 failure
發(fā)現(xiàn)canal連不上mysql
修改firewalld配置文件
vim /etc/firewalld/zones/public.xml
增加3306端口
<port protocol="tcp" port="3306"/>
重啟firewalld
systemctl restart firewalld
再次查看日志
部署成功
問題原因
在centos7上部署docker容器,其網(wǎng)絡(luò)模式采用的是bridger模式。
啟動(dòng)docker時(shí),docker進(jìn)程會(huì)創(chuàng)建一個(gè)名為docker0的虛擬網(wǎng)橋,用于宿主機(jī)與容器之間的通信。當(dāng)啟動(dòng)一個(gè)docker容器時(shí),docker容器將會(huì)附加到虛擬網(wǎng)橋上,容器內(nèi)的報(bào)文通過docker0向外轉(zhuǎn)發(fā)。
如果docker容器訪問宿主機(jī),那么docker0網(wǎng)橋?qū)?bào)文直接轉(zhuǎn)發(fā)到本機(jī),報(bào)文的源地址是docker0網(wǎng)段的地址。而如果docker容器訪問宿主機(jī)以外的機(jī)器,docker的SNAT網(wǎng)橋會(huì)將報(bào)文的源地址轉(zhuǎn)換為宿主機(jī)的地址,通過宿主機(jī)的網(wǎng)卡向外發(fā)送。
當(dāng)docker容器訪問宿主機(jī)時(shí),如果宿主機(jī)服務(wù)端口會(huì)被防火墻攔截,無法連通宿主機(jī),出現(xiàn)No route to host的錯(cuò)誤。
而訪問宿主機(jī)所在局域網(wǎng)內(nèi)的其他機(jī)器,由于報(bào)文的源地址是宿主機(jī)ip,因此,不會(huì)被目的機(jī)器防火墻攔截,所以可以訪問。
也可以開放對(duì)應(yīng)的端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
卸載canal
docker stop canal && docker rm canal
rm -rf /docker-local/canal
這里,我一直認(rèn)為我本地可以連接到mysql,就不用開啟端口了。
至此,就搭建完成了。