更多运维进阶知识请看:
https://edu.51cto.com/course/30254.html
https://edu.51cto.com/course/31241.html
为了优化查询效率,我们采用了如下的解决方式:
首先,用canal集群同步mysql数据到elasticsearch集群
然后,我们再通过elasticsearch来进行查询操作
canal 工作原理
canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
canal 解析 binary log 对象(原始为 byte 流)
canal数据同步架构
mysql主从复制原理
1、canal server两个节点
3、zookeeper集群三个节点
本文省略了zookeeper集群和mysql的部署及配置方式,需要注意的是mysql需要开启binlog日志
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.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=.*\\..*
修改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
#连上zookeeper
./zkCli.sh
目录结构
#读取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),也只会有一个工作,另一个处于阻塞状态