1、Canal簡(jiǎn)介
??Canal主要用途是對(duì)MySQL數(shù)據(jù)庫(kù)增量日志進(jìn)行解析,提供增量數(shù)據(jù)的訂閱和消費(fèi),簡(jiǎn)單說(shuō)就是可以對(duì)MySQL的增量數(shù)據(jù)進(jìn)行實(shí)時(shí)同步,支持同步到MySQL、Elasticsearch、HBase等數(shù)據(jù)存儲(chǔ)中去。
??Canal會(huì)模擬MySQL主庫(kù)和從庫(kù)的交互協(xié)議,從而偽裝成MySQL的從庫(kù),然后向MySQL主庫(kù)發(fā)送dump協(xié)議,MySQL主庫(kù)收到dump請(qǐng)求會(huì)向canal推送binlog,canal通過(guò)解析binlog將數(shù)據(jù)同步到其他存儲(chǔ)中去。
官方文檔:《傳送門》。
2、基于Docker實(shí)現(xiàn)Mysql5.7的安裝并開(kāi)啟binlog日志
2.1、Mysql安裝
[root@localhost /]# docker pull mysql:5.7
[root@localhost /]# docker run --name mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
2.2、開(kāi)啟Mysql5.7的binlog配置
#進(jìn)入docker中的 Mysql5.7
[root@localhost /]# docker exec -it mysql5.7 /bin/bash
#在docker環(huán)境內(nèi)安裝vim工具,方便修改文件
bash-4.2# yum install vim
#修改my.cnf配置,修改內(nèi)容如下:
bash-4.2# vim /etc/my.cnf
#退出docker
bash-4.2# exit
#重啟docker mysql
[root@localhost /]# docker restart mysql5.7
??在/etc/my.cnf配置文件中添加如下配置:
[mysqld]
# 打開(kāi)binlog
log-bin=mysql-bin
# 選擇ROW(行)模式
binlog-format=ROW
# 配置MySQL replaction需要定義,不要和canal的slaveId重復(fù)
server_id=1
??在Mysql重新啟動(dòng)后,然后可以在客戶端中執(zhí)行show VARIABLES like 'log_bin’如果發(fā)現(xiàn)其中的value中為“ON”則說(shuō)明配置生效了。
2.3、創(chuàng)建授權(quán)用戶
??創(chuàng)建Mysql用戶,方便后續(xù)使用。
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
3、基于docker實(shí)現(xiàn)Elasticsearch的安裝和運(yùn)行
#拉去鏡像
docker pull elasticsearch:7.12.0
#創(chuàng)建docker容器掛在的目錄
mkdir -p /usr/local/soft/es/config
mkdir -p /usr/local/soft/es/data
mkdir -p /usr/local/soft/es/plugins
#配置文件,注意:echo “http.host: 0.0.0.0”;“:”后面有個(gè)空格!
echo "http.host: 0.0.0.0" >> /usr/local/soft/es/config/elasticsearch.yml
#創(chuàng)建容器并運(yùn)行
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms84m -Xmx512m" \
-v /usr/local/soft/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /usr/local/soft/es/data:/usr/share/elasticsearch/data \
-v /usr/local/soft/es/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.12.0
- -p 端口映射
- -e discovery.type=single-node 單點(diǎn)模式啟動(dòng)
- -e ES_JAVA_OPTS=“-Xms84m -Xmx512m”:設(shè)置啟動(dòng)占用的內(nèi)存范圍
- -v 目錄掛載
- -d 后臺(tái)運(yùn)行
??啟動(dòng)后,測(cè)試正常啟動(dòng)頁(yè)面訪問(wèn)http://127.0.0.1:9200,出現(xiàn)如下頁(yè)面說(shuō)明啟動(dòng)成功。
4、安裝并配置canal服務(wù)
#拉取鏡像
docker pull canal/canal-server:v1.1.6
#運(yùn)行鏡像
docker run --name canal -d canal/canal-server:v1.1.6
#找到文件位置后 exit退出容器 將容器內(nèi)部文件copy到外部
docker cp canal:/home/admin/canal-server/conf/canal.properties /usr/local/soft/canal-conf/
docker cp canal:/home/admin/canal-server/conf/example/instance.properties /usr/local/soft/canal-conf/
#修改配置文件instance.properties 和 canal.properties,實(shí)際上只修改了instance.properties的部分配置,canal.properties使用默認(rèn)配置
#重新運(yùn)行鏡像,運(yùn)行前,需要把前面運(yùn)行的容器停止并刪除
docker run --name canal -p 11111:11111 -d -v /usr/local/soft/canal-conf/instance.properties:/home/admin/canal-server/conf/example/instance.properties -v /usr/local/soft/canal-conf/canal.properties:/home/admin/canal-server/conf/canal.properties canal/canal-server:v1.1.6
#查看canal服務(wù)日志
#僅能看到canal服務(wù)的啟動(dòng)日志,比較簡(jiǎn)單
docker logs canal
#查看數(shù)據(jù)同步相關(guān)日志
#進(jìn)入canal服務(wù)
[root@localhost ~]# docker exec -it canal /bin/bash
#查看日志,數(shù)據(jù)同步日志
[root@908acdb7f259 canal-server]# cat canal-server/logs/example/example.log
??instance.properties需要修改的配置如下:
#Mysql數(shù)據(jù)庫(kù)地址
canal.instance.master.address=192.168.1.236:3306
#初始化時(shí)的日志文件名稱,可以不設(shè)置
canal.instance.master.journal.name=mysql-bin.000002
#初始化時(shí)的日志文件的當(dāng)前位置,可以不設(shè)置
canal.instance.master.position=2071
canal.instance.master.timestamp=
canal.instance.master.gtid=
#Mysql數(shù)據(jù)庫(kù)用戶名和密碼,前面創(chuàng)建的Mysql用戶
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8
# enable druid Decrypt database password
canal.instance.enableDruid=false
版本問(wèn)題:在搭建canal服務(wù)的時(shí)候,我最初使用的是v1.1.6版本,同步數(shù)據(jù)的時(shí)候出現(xiàn)錯(cuò)誤,后改成v1.1.5后,正常。
5、安裝并配置canal-adapter
#拉取鏡像
docker pull slpcat/canal-adapter:v1.1.5
#創(chuàng)建配置文件
mkdir -p /usr/local/soft/canal-adapter/conf/
#創(chuàng)建配置文件,在/usr/local/soft/canal-adapter/conf/目錄下創(chuàng)建
touch application.yml
#創(chuàng)建連接數(shù)據(jù)庫(kù)文件es7.yml
mkdir -p /usr/local/soft/canal-adapter/conf/es7
touch es7.yml
#啟動(dòng)
docker run --name canal-adapter -p 8081:8081 -v /usr/local/soft/canal-adapter/conf:/opt/canal-adapter/conf -d slpcat/canal-adapter:v1.1.5
#查看是否報(bào)錯(cuò)
docker logs canal-adapter
??application.yml配置文件內(nèi)容如下:
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
flatMessage: true
zookeeperHosts:
syncBatchSize: 1000
retries: 0
timeout:
accessKey:
secretKey:
consumerProperties:
# canal tcp consumer
canal.tcp.server.host: 192.168.1.236:11111 #canal服務(wù)地址
canal.tcp.batch.size: 500
canal.tcp.username:
canal.tcp.password:
srcDataSources:
defaultDS:
url: jdbc:mysql://192.168.1.236:3306/my_test?useUnicode=true #數(shù)據(jù)庫(kù)地址及用戶名密碼
username: canal
password: canal
canalAdapters:
- instance: example # canal instance Name or mq topic name
groups:
- groupId: g1
outerAdapters:
- name: logger
- name: es7 # 該版本發(fā)現(xiàn)只能是es7/es6
hosts: 192.168.1.236:9200 # 127.0.0.1:9200 for rest mode,ES鏈接,使用9200 是mode就需要修改成rest
properties:
mode: rest # transport # or rest
cluster.name: elasticsearch
??es7.yml配置文件,主要實(shí)現(xiàn)Mysql表字段與ES索引的對(duì)應(yīng)關(guān)系,具體內(nèi)容如下:
dataSourceKey: defaultDS
destination: example
groupId: g1
esMapping:
_index: ceshi
_id: _id
_type: _doc
upsert: true
# pk: id
#SQL 字段映射
sql: "SELECT
a.id AS _id,
a.username AS username,
a.age AS age,
a.test AS test
from
test a "
# objFields:
# _labels: array:;
etlCondition: "where a.c_time>='{0}'" # etl 的條件參數(shù)
commitBatch: 1
??my_test.test表結(jié)構(gòu):
CREATE TABLE `my_test`.`Untitled` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
`age` varbinary(50) NULL DEFAULT NULL,
`test` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
`c_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0),
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 18 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
6、其他
??完成上述配置,就完成了Mysql數(shù)據(jù)實(shí)時(shí)同步到Elasticsearch的配置,在實(shí)際環(huán)境中,還需要考慮服務(wù)防火墻、查看docker服務(wù)運(yùn)行狀態(tài)等問(wèn)題,需要的命令如下:
??Docker命令:
#docker命令
docker ps -a #查看是否啟動(dòng)
docker logs elasticsearch #啟動(dòng)日志查詢,查詢什么服務(wù),elasticsearch修改成對(duì)應(yīng)服務(wù)名即可
docker restart elasticsearch #重啟
docker exec -it elasticsearch bash #進(jìn)入docker服務(wù)
??Centos7防火墻相關(guān)命令:
一、防火墻的開(kāi)啟、關(guān)閉、禁用命令
- 設(shè)置開(kāi)機(jī)啟用防火墻:systemctl enable firewalld.service
- 設(shè)置開(kāi)機(jī)禁用防火墻:systemctl disable firewalld.service
- 啟動(dòng)防火墻:systemctl start firewalld
- 關(guān)閉防火墻:systemctl stop firewalld
- 檢查防火墻狀態(tài):systemctl status firewalld
二、使用firewall-cmd配置端口文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-691938.html
- 查看防火墻狀態(tài):firewall-cmd --state
- 重新加載配置:firewall-cmd --reload
- 查看開(kāi)放的端口:firewall-cmd --list-ports
- 開(kāi)啟防火墻端口:firewall-cmd --zone=public–add-port=9200/tcp --permanent
- 關(guān)閉防火墻端口:firewall-cmd --zone=public --remove-port=9200/tcp --permanent
命令含義:
–zone #作用域
–add-port=9200/tcp #添加端口,格式為:端口/通訊協(xié)議
–permanent #永久生效,沒(méi)有此參數(shù)重啟后失效
注意:添加端口后,必須用命令firewall-cmd --reload重新加載一遍才會(huì)生效文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-691938.html
到了這里,關(guān)于基于Canal實(shí)現(xiàn)Mysql數(shù)據(jù)實(shí)時(shí)同步到Elasticsearch(Docker版)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!