Canal 最初只支持將數(shù)據(jù)從 MySQL 同步到 Kafka简肴,RabbitMQ 等消息隊列中,從 1.1.1 版本開始百侧,Canal 實現(xiàn)了一個配套落地的模塊 Canal Adapter砰识,實現(xiàn)對 Canal Server 訂閱的 binlog 消息進(jìn)行消費,支持將數(shù)據(jù)輸出至 HBase佣渴,MySQL辫狼,Elasticsearch等。
機器規(guī)劃
IP地址 | 服務(wù) |
---|---|
192.168.1.151:3306 | canal元數(shù)據(jù)庫 |
192.168.1.154:3306 | 源數(shù)據(jù)庫 |
192.168.1.151:3306 | 目標(biāo)數(shù)據(jù)庫 |
192.168.1.156 | canal辛润、canal server膨处、canal adapter、zookeeper |
192.168.1.155 | canal、canal server真椿、canal adapter秦叛、canal admin |
準(zhǔn)備工作
1、源庫需要binlog以及binlog模式為ROW
2瀑粥、部署zookeeper集群(192.168.1.156)
這里因機器限制挣跋,暫時部署zookeeper單節(jié)點,版本這里采用zookeeper-3.4.10狞换。
tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/
mv /opt/zookeeper-3.4.10 /opt/zookeeper
mkdir /opt/zookeeper/{data,logs}
cd /opt/zookeeper/conf/
cp zoo_sample.cfg zoo.cfg
編輯zoo.cfg內(nèi)容
tickTime:ZooKeeper使用的基本時間單位(毫秒)避咆。 它用于做心跳,并且最小會話(session)超時將是tickTime的兩倍修噪。
initLimit:用于限制ZooKeeper服務(wù)器必須連接到Leader服務(wù)器的時間長度查库,有必要可以設(shè)置在一點點的時間長度。
syncLimit:服務(wù)器與領(lǐng)導(dǎo)者之間過時的距離黄琼》可以通過心跳檢測機制,來檢測機器的存活狀態(tài)脏款。如果Leader發(fā)出心跳包围苫。在syncLimit之后,還沒有從Folloer那里收到響應(yīng)撤师,那么就認(rèn)為這個F已經(jīng)不在線了.所以這個參數(shù)不移設(shè)置過大剂府。
dataDir:配置存儲內(nèi)存數(shù)據(jù)庫快照的位置以及數(shù)據(jù)庫更新的事務(wù)日志。
clientPort:偵聽客戶端連接的端口
創(chuàng)建myid剃盾,注明上面zoo.cfg中的server.x中的x
echo "1" > ../data/myid
配置環(huán)境變量
vim /etc/profile
#添加以下代碼
export ZOOKEEPER_HOME=/opt/zookeeper
export PATH=$ZOOKEEPER_HOME/bin:$PATH
#執(zhí)行初始化環(huán)境變量系統(tǒng)變量文件
source /etc/profile
啟動zookeeper
/opt/zookeeper/bin/zkServer.sh start
部署canal Admin(192.168.1.155)
mkdir /opt/canal/{admin,server,adapter}
wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.admin-1.1.5.tar.gz
tar -xzvf canal.admin-1.1.5.tar.gz -C /opt/canal/admin
初始化 Canal Admin 元數(shù)據(jù)庫
將解壓后的壓縮包conf里面的canal_manager.sql挪到元數(shù)據(jù)庫那臺機器后腺占,進(jìn)行導(dǎo)入。
Canal Admin 配置文件
修改配置文件:vim /opt/canal/admin/conf/application.yml
server:
port: 8089
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
spring.datasource:
address: 192.168.1.151:3306 #元數(shù)據(jù)庫信息
database: canal_manager #庫名
username: root #用戶
password: 123456 #密碼
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=false
hikari:
maximum-pool-size: 30
minimum-idle: 1
canal:
adminUser: admin
adminPasswd: admin
啟動 Canal Admin
/opt/canal/admin/bin/startup.sh
瀏覽器輸入192.168.1.155:8089,訪問管理界面痒谴,默認(rèn)賬號:admin衰伯,密碼 :123456
部署canal server(192.168.1.155、192.168.1.156)
wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz
tar -zxvf canal.deployer-1.1.5.tar.gz -C /opt/canal/server
因為是使用canal Admin集群部署的积蔚,所以server節(jié)點只需要配置Admin的信息即可意鲸;統(tǒng)一的配置文件是由Admin界面管理,編輯 /opt/canal/server/conf/canal_local.properties 文件
server 1的配置文件
# register ip
canal.register.ip = 192.168.1.155
# canal admin config
canal.admin.manager = 192.168.1.155:8089
canal.admin.port = 11110
canal.admin.user = admin
canal.admin.passwd = 4ACFE3202A5FF5CF467898FC58AAB1D615029441
# admin auto register
canal.admin.register.auto = true
canal.admin.register.cluster = canal-cluster-1
canal.admin.register.name = canal-server-1
server 2的配置文件
# register ip
canal.register.ip = 192.168.1.156
# canal admin config
canal.admin.manager = 192.168.1.155:8089
canal.admin.port = 11110
canal.admin.user = admin
canal.admin.passwd = 4ACFE3202A5FF5CF467898FC58AAB1D615029441
# admin auto register
canal.admin.register.auto = true
canal.admin.register.cluster = canal-cluster-1
canal.admin.register.name = canal-server-2
Canal Admin 創(chuàng)建集群
進(jìn)入admin管理界面库倘,新建集群临扮,配置zookeeper信息
點擊主配置
點擊載入模板论矾、暫時不用修改配置文件教翩,點擊保存即可
啟動server
/opt/canal/server/bin/startup.sh local
在 Admin 上查看注冊的 Canal Server。
設(shè)置mysql同步mysql配置贪壳。
server 默認(rèn)情況下把源庫對表結(jié)構(gòu)修改的記錄存儲在本地 H2 數(shù)據(jù)庫中饱亿,當(dāng) server 主備切換后會導(dǎo)致新的 server 無法正常同步數(shù)據(jù),因此修改 TSDB 的設(shè)置將外部 MySQL 數(shù)據(jù)庫作為 server 存儲表結(jié)構(gòu)變更信息的庫。在admin界面選擇相對應(yīng)的集群彪笼,修改配置文件钻注。
修改地方如下:
點擊保存。
在元數(shù)據(jù)庫上創(chuàng)建canal_tsdb庫配猫。
創(chuàng)建 Instance
在 Instance 管理界面幅恋,點擊新建 Instance
點擊載入模板后,修改以下信息
點擊保存泵肄,查看Instance 日志捆交,能正常讀取到binlog以及偏移量為正常。
部署canal adapter(192.168.1.155腐巢、192.168.1.156)
wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.adapter-1.1.5.tar.gz
tar -zxvf canal.adapter-1.1.5.tar.gz -C /opt/canal/adapter
server 只支持將數(shù)據(jù)輸出到消息隊列中品追,因此需要額外部署 Adapter 訂閱 server 中的消息,然后寫入目標(biāo) MySQL冯丙。編輯/opt/canal/adapter/conf/application.yml
server:
port: 8081
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
default-property-inclusion: non_null
canal.conf:
mode: tcp #tcp kafka rocketMQ rabbitMQ
flatMessage: true
zookeeperHosts:
syncBatchSize: 1000
retries: 0
timeout:
accessKey:
secretKey:
consumerProperties:
# canal tcp consumer
#canal.tcp.server.host: 127.0.0.1:11111
canal.tcp.server.host:
canal.tcp.zookeeper.hosts: 192.168.1.156:2181 #zookeeper地址
canal.tcp.batch.size: 500
canal.tcp.username:
canal.tcp.password:
# kafka consumer
kafka.bootstrap.servers: 127.0.0.1:9092
kafka.enable.auto.commit: false
kafka.auto.commit.interval.ms: 1000
kafka.auto.offset.reset: latest
kafka.request.timeout.ms: 40000
kafka.session.timeout.ms: 30000
kafka.isolation.level: read_committed
kafka.max.poll.records: 1000
# rocketMQ consumer
rocketmq.namespace:
rocketmq.namesrv.addr: 127.0.0.1:9876
rocketmq.batch.size: 1000
rocketmq.enable.message.trace: false
rocketmq.customized.trace.topic:
rocketmq.access.channel:
rocketmq.subscribe.filter:
# rabbitMQ consumer
rabbitmq.host:
rabbitmq.virtual.host:
rabbitmq.username:
rabbitmq.password:
rabbitmq.resource.ownerId:
#源庫信息
srcDataSources:
defaultDS:
url: jdbc:mysql://192.168.1.154:3306/data?useUnicode=true
username: root
password: 123456
#目標(biāo)庫信息
canalAdapters:
- instance: data_test01 # canal instance Name or mq topic name
groups:
- groupId: g1
outerAdapters:
- name: rdb
key: mysql1
properties:
jdbc.driverClassName: com.mysql.jdbc.Driver
jdbc.url: jdbc:mysql://192.168.1.151:3306/data?useUnicode=true
jdbc.username: root
jdbc.password: 123456
配置rdb目錄里面的文件
mv /opt/canal/adapter/conf/rdb/my_user.yml /opt/canal/adapter/conf/rdb/date_test01.yml
#配置文件如下
dataSourceKey: defaultDS
destination: data_test01
groupId: g1
outerAdapterKey: mysql1
concurrent: true
dbMapping:
database: data
table: test01
targetTable: test01
targetPk:
id: id
mapAll: true
mirrorDb: true
啟動 Adapter
/opt/canal/adapter/bin/startup.sh