更多运维进阶知识请看:

​https://edu.51cto.com/course/30254.html​

​https://edu.51cto.com/course/31241.html​


背景

为了优化查询效率,我们采用了如下的解决方式: 首先,用canal集群同步mysql数据到elasticsearch集群 然后,我们再通过elasticsearch来进行查询操作


canal简介

canal官方地址:​​https://github.com/alibaba/canal​

canal 工作原理

  • canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
  • MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
  • canal 解析 binary log 对象(原始为 byte 流)


canal数据同步架构

canal集群部署及使用_mysql

mysql主从复制原理

canal集群部署及使用_zookeeper_02

规划:

1、canal server两个节点 3、zookeeper集群三个节点 本文省略了zookeeper集群和mysql的部署及配置方式,需要注意的是mysql需要开启binlog日志


canal集群部署

mkdir /opt/canal
cd /opt/canal
wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz
tar xvf canal.deployer-1.1.5.tar.gz

canal集群配置
节点01

修改canal.properties配置文件

cp canal.properties canal.properties.bak
cd /opt/canal/conf/

vim canal.properties
#主要配置例举如下:
#保证canal集群中每个canal server的id都是唯一的
canal.id = 11
#canal server的地址
canal.ip = 192.168.1.111
#canal服务socket监听端口,代码中连接canal-server时,使用此段口连接
canal.port = 11111
canal.metrics.pull.port = 11112
#canal server注册的zookeeper地址,集群各节点之间用逗号分隔
canal.zkServers = 192.168.1.113:2181,192.168.1.114:2181,192.168.1.115:2181
#表示实例的配置文件instance.properties地址
canal.destinations = example
# 所有的组件(parser , sink , store)都选择了持久化模式,
# 目前持久化的方式主要是写入zookeeper,保证数据集群共享
canal.instance.global.spring.xml = classpath:spring/default-instance.xml

修改 instance.properties配置文件

cd /opt/canal/conf/example
cp instance.properties instance.properties.bak

vim instance.properties
#主要配置例举如下:
#canal集群中每个canal server的slaveld保持唯一
canal.instance.mysql.slaveId=111
#需要同步的数据库地址
canal.instance.master.address=192.168.1.77:3306
#数据库用户名、密码
canal.instance.dbUsername=root
canal.instance.dbPassword=xxxxx
#数据库连接编码
canal.instance.connectionCharset = UTF-8
#mysql 数据解析关注的表,Perl正则表达式.多个正则之间以逗号(,)分隔,转义符需要双斜杠(\)
canal.instance.filter.regex=.*\\..*

节点02

修改canal.properties配置文件

cd /opt/canal/conf/example
cp canal.properties canal.properties.bak

vim canal.properties
#保证canal集群中每个canal server的id都是唯一的
canal.id = 22
#canal server的地址
canal.ip = 192.168.1.113
#canal服务socket监听端口,代码中连接canal-server时,使用此段口连接
canal.port = 11111
canal.metrics.pull.port = 11112
#canal server注册的zookeeper地址,集群各节点之间用逗号分隔
canal.zkServers = 192.168.1.113:2181,192.168.1.114:2181,192.168.1.115:2181
#表示实例的配置文件instance.properties地址
canal.destinations = example
# 所有的组件(parser , sink , store)都选择了持久化模式,
# 目前持久化的方式主要是写入zookeeper,保证数据集群共享
canal.instance.global.spring.xml = classpath:spring/default-instance.xml

修改 instance.properties配置文件

cd /opt/canal/conf/example
cp instance.properties instance.properties.bak
vim instance.properties
canal.instance.mysql.slaveId=222
#需要同步的数据库地址
canal.instance.master.address=192.168.1.77:3306
canal.instance.master.journal.name=mysql-bin.000001
#数据库用户名、密码
canal.instance.dbUsername=root
canal.instance.dbPassword=xxxxx
#数据库连接编码
canal.instance.connectionCharset = UTF-8
#mysql 数据解析关注的表,Perl正则表达式.多个正则之间以逗号(,)分隔,转义符需要双斜杠(\)
canal.instance.filter.regex=.*\\..*

启动canal server

cd /opt/canal
./startup.sh
#查看进程状态
ps -ef |grep canal
#查看canal端口
ss -ntlup |grep 111
tcp LISTEN 0 50 192.168.1.113:11111 *:* users:(("java",pid=20672,fd=82))
tcp LISTEN 0 3 *:11112 *:* users:(("java",pid=20672,fd=77))
tcp LISTEN 0 50 192.168.1.113:11110

验证canal集群

#连上zookeeper
./zkCli.sh

目录结构

canal集群部署及使用_mysql_03

#读取binlog信息
ls /otter/canal/destinations/example
[1001, cluster, running]

get /otter/canal/destinations/example/1001/cursor
{"@type":"com.alibaba.otter.canal.protocol.position.LogPosition","identity":{"slaveId":-1,"sourceAddress":{"address":"192.168.1.77","port":3306}},"postion":{"gtid":"","included":false,"journalName":"mysql-bin.000013","position":606163903,"serverId":1,"timestamp":1658313261000}}

#查看当前哪个canal client在工作
get /otter/canal/destinations/example/1001/running
{"active":true,"address":"192.168.10.38:62071","clientId":1001}


#查看canal集群状态
ls /otter/canal/destinations/example/cluster
[192.168.1.111:11111, 192.168.1.113:11111]
#查看当前哪个canal server节点在工作
get /otter/canal/destinations/example/running
{"active":true,"address":"192.168.1.111:11111"}
#从上面信息可以看下,现在canal工作节点是192.168.1.111,现在咱们来验证下canal server集群工作节点的自动切换功能。
先停掉192.168.1.111的canal server
cd /opt/canal
./stop.sh
然后再次查看当前哪个canal节点在工作
./zkCli.sh
get /otter/canal/destinations/example/running
{"active":true,"address":"192.168.1.113:11111"}
#从上面输出信息可以看到,canal集群当前工作节点自动切换到了另外一个canal server节点

总结: 1、同一时间,两个canal(server),只会有一个工作,另一个处于阻塞状态; 2、同一时间,两个canal(client),也只会有一个工作,另一个处于阻塞状态