原理描述:
基于Canal开源产品,获取数据库增量日志数据。 什么是Canal, Canal是拉去源库binlog日志的,跟从库功能类似。
典型管理系统架构,manager(web管理)+node(工作节点)
a. manager运行时推送同步配置到node节点
b. node节点将同步状态反馈到manager上
部署描述
服务器1 | 安装包 |
---|---|
172.18.165.118 | manager.deployer-4.2.17.tar.gz,node.deployer-4.2.17.tar.gz,apache-zookeeper-3.5.5-bin.tar.gz,Jdk-1.8 |
172.18.165.119 | node.deployer-4.2.17.tar.gz,apache-zookeeper-3.5.5-bin.tar.gz,Jdk-1.8 |
172.18.165.120 | node.deployer-4.2.17.tar.gz,apache-zookeeper-3.5.5-bin.tar.gz,Jdk-1.8 |
本实验,3个节点,其中一个节点同时安装manager和node,各节点安装信息如上,配置都是4核8G的服务器
下载manager,node工具
https://github.com/alibaba/otter/releases
下载zookeeper
http://apache.fayea.com/zookeeper/stable/
#yum install -y java-1.8.0-openjdk-devel.x86_64
#vim /etc/profile
export JAVA_HOME=jre-1.8.0-openjdk-1.8.0.171-7.b10.el7.x86_64
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
#source /etc/profile
# java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)
上面每台服务器都要安装
1. 安装
#mkdir -p /data/services/
#mkdir -p /data/serviceLogs/
#mkdir -p /data/servicesLogs/zookeeper/
#mkdir -p /data/services/zookeeper-data/
#tar xf apache-zookeeper-3.5.5-bin.tar.gz
# mv apache-zookeeper-3.5.5-bin /data/services/
下载的二进制包,直接安装即可,这里每台服务器都要执行
2.配置
环境变量配置,每台服务器上执行;
#echo 'export PATH=$PATH:/data/services/apache-zookeeper-3.5.5-bin/bin' >> /etc/profile && source /etc/profile
配置文件重命名,每台服务器上执行
#cd /data/services/apache-zookeeper-3.5.5-bin/conf
#mv zoo_sample.cfg zoo.cfg
编辑配置文件内容,每台服务器一样即可
#vim zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/services/zookeeper-data/
dataLogDir=/data/servicesLogs/zookeeper/
clientPort=2181
server.1= 172.18.165.118:2888:3888
server.2= 172.18.165.119:2888:3888
server.3= 172.18.165.120:2888:3888
配置解释:
tickTime:这个时间是作为zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是说每个tickTime时间就会发送一个心跳。
initLimit:这个配置项是用来配置zookeeper接受客户端(这里所说的客户端不是用户连接zookeeper服务器的客户端,而是zookeeper服务器集群中连接到leader的follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。
当已经超过10个心跳的时间(也就是tickTime)长度后 zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20秒。
syncLimit:这个配置项标识leader与follower之间发送消息,请求和应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是5*2000=10秒。
dataDir:顾名思义就是zookeeper保存数据的目录,默认情况下zookeeper将写数据的日志文件也保存在这个目录里;
clientPort:这个端口就是客户端连接Zookeeper服务器的端口,Zookeeper会监听这个端口接受客户端的访问请求;
server.A=B:C:D:中的A是一个数字,表示这个是第几号服务器,B是这个服务器的IP地址,C第一个端口用来集群成员的信息交换,表示这个服务器与集群中的leader服务器交换信息的端口,D是在leader挂掉时专门用来进行选举leader所用的端口。
3.创建ServerID标识
除了修改zoo.cfg配置文件外,zookeeper集群模式下还要配置一个myid文件,这个文件需要放在dataDir目录下
服务器 | 执行命令 |
---|---|
172.18.165.118 | #echo '1' >> /data/services/zookeeper-data/myid |
172.18.165.119 | #echo '2' >> /data/services/zookeeper-data/myid |
172.18.165.120 | #echo '3' >> /data/services/zookeeper-data/myid |
这个文件里面有一个数据就是A的值(该A就是zoo.cfg文件中server.A=B:C:D中的A),在zoo.cfg文件中配置的dataDir路径中创建myid文件。
4.启动zookeeper
#/data/services/apache-zookeeper-3.5.5-bin/bin/zkServer.sh start
(2)manager安装
1.安装
#mkdir otter-manager
#tar xf manager.deployer-4.2.17.tar.gz -C otter-manager
#mv otter-manager /data/services/
上一篇文章给出了下载地址,二进制解压即可。
2.配置
#vim /data/services/otter-manager/conf/otter.properties
otter.domainName = 172.18.165.118
otter.port = 8088
otter.jetty = jetty.xml
otter.database.driver.class.name = com.mysql.jdbc.Driver
otter.database.driver.url = jdbc:mysql://xxxxxx.aliyuncs.com:3306/otter_tools
otter.database.driver.username = online_otter
otter.database.driver.password = online_xxxxxx
otter.communication.manager.port = 1099
otter.communication.payload = 8388608
otter.communication.pool.size = 10
otter.zookeeper.cluster.default = 172.18.165.118:2181,172.18.165.119:2181,172.18.165.120:2181
otter.zookeeper.sessionTimeout = 60000
otter.manager.address = ${otter.domainName}:${otter.communication.manager.port}
otter.manager.productionMode = true
otter.manager.monitor.self.enable = true
otter.manager.monitor.self.interval = 120
otter.manager.monitor.recovery.paused = true
otter.manager.monitor.email.host = smtp.yeah.net
otter.manager.monitor.email.username = [email protected]
otter.manager.monitor.email.password = xxxxxxx
otter.manager.monitor.email.stmp.port = 465
上面监听地址,连接数据库地址和SMTP地址,账号密码修改成自己的,还有zookeeper集群地址
zookeeper最近的版本中有个内嵌的管理控制台是通过jetty启动,也会占用8080 端口。
因为manage和zookeeper同一台机子,所以我讲manager的端口改成了8088端口。
4.导入otter元数据
#下载地址:github, 路径:manager/deployer/src/main/resources/sql/otter-manager-schema.sql
mysql> source otter-manager-schema.sql
由于5.7版本不兼容,在session级别修改sql_mode,mysql5.7执行前运行: SET sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
点击我github_otter_manage_sql地址
5.启动
#sh /data/services/otter-manager/bin/startup.sh
1.安装前准备
安装前,我们需要在manager管理控制台配置node信息,否则ndoe节点无法加入manage
步骤1 :点击机器管理,zookeeper管理步骤2 :配置zookeeper地址,输入内容
172.18.165.118:2181,172.18.165.119:2181,172.18.165.120:2181
我们可以看到节点序号是1,状态是未启动。到这里,准备工作结束
2.安装node
#mkdir otter-node
#tar xf node.deployer-4.2.17.tar.gz -C otter-node
# mv otter-node /data/services/
安装文件下载连接在第一个文档,二进制解压即可。
2.配置1之node
#vim /data/services/otter-node/conf/otter.properties
otter.nodeHome = ${user.dir}/../
otter.htdocs.dir = ${otter.nodeHome}/htdocs
otter.download.dir = ${otter.nodeHome}/download
otter.extend.dir= ${otter.nodeHome}/extend
otter.zookeeper.sessionTimeout = 60000
otter.communication.payload = 8388608
otter.communication.pool.size = 10
otter.manager.address = 172.18.165.118:1099
只需要修改manager地址即可
6.配置2之 nid
#echo 1 > /data/services/otter-node/conf/nid
nid配置是准备前的配置序号ID对应,这步一定要配置正确,否则异常。
7.启动
#sh /data/services/otter-node/bin/startup.sh
8.验证
#taif -f /data/services/otter-node/logs/node/cat node.log
OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
2019-06-27 20:21:02.701 [main] INFO com.alibaba.otter.node.deployer.OtterLauncher - INFO ## the otter server is running now ......
这个时候,我们可以看到,node01已经状态变成启动
9.重复以上操作,配置node02,node03
我们需要将3个node节点状态配置成功,记住node和node3不同之处配置如下
节点2:
#echo 2 > /data/services/otter-node/conf/nid
节点3:
#echo 3 > /data/services/otter-node/conf/nid
到这里,我们成功安装整个otter,如果你会配置,已经可以正常使用了。
otter配置比较繁琐,并不会特别复杂,我这里先大概说下流程和几个关键名词解释
**otter名词解释:**
数据源:读取的源实例信息,和写入的目标实例信息
数据表:配置映射用的,用于配置,源实例,什么库,什么表,同步到目标什么库,什么表
canal:otter是做增量同步的,增量同步基于mysql的binlog日志,并且是row格式。这里需要配置你读取binlog的信息,和数据源里面的源实例信息可以说是同一个。
通道配置: otter采用一个实例一个通道方式。一个实例可以多个配置多个库
pipeline:主要核心功能如下
(1)选择你的canal配置,读取哪个实例的binlog。
(2)选择整个同步是在哪个节点上进行,例如我们部署了三个node节点,可以由node1进行读取的操作,可以由node2进行目标实例写入操作。也可以同时放到一个节点上。
(3)binlog位置,默认不写就读最新位置的。
(4)高级配置里面有是否跳过DDL,传输模式,负载均衡算法等,一般保持默认即可。
**流程:**
(1)新增数据源,一般最少配置2个,一个读取的源库,一个目标
(2)数据表,配置映射关系,从哪里同步到哪里。
(3)Canal,配置读取binlog的信息
上面步骤创建好后,我们就可以正式开始配置通道了
(4)创建通道
(5)创建pipeline
(6)创建表映射关系
(7)启动通道
我这里新增了两个数据源,一个叫read(读取源)实例,一个叫write(写入的目标)实例.
(1)详细编辑配置如下
(2)配置成功后的列表
source_read_testing_01: 要读取数据的实例
target_write_testing_01: 要写入数据的实例2. 同步表配置
(1)读库表配置-详细信息编辑
这里主要是配置你要读取的数据库名,表名。
schema name: 配置库名称
Table name:因为我们是同步库下面的所有表,所以就填写了一个正则表达式;
数据源:选择源库(上面的步骤实例配置已配置,选择即可)
(2)写库表配置-详细信息编辑
这里主要是配置你要写入的数据库名,表名。
Schema name: 配置库名称
Table name:因为我们是同步库下面的所有表,所以就填写了一个正则表达式;
数据源:选择目标库(上面的步骤实例配置已配置,选择即可)
Canal配置,主要是读取的源实例的binlog日志用的
Canal名称: 自定义
Zookeeper:默认会自动选择,前面已配置过了
数据库类型:Mysql
数据库地址:就是你要获取数据库binlog的地址【和源库实例一样】
账号密码:需要有获取binlog权限的账号噢。
其他内容可不填写
创建Canal
选择基于当前日志变更,选择行记录;名称可自定义;5.Pipeline配置
步骤2 : 新增Pipleline,点击添加
选择select 和load 的节点。一个是读,一个是写。选择同一个节点,减少网络之间的传输。
Canal名称: 选择刚才canal配置添加的,其他保持不变6.映射关系配置
意思就是,你要在这条通道上,什么样的规则进行同步,就是表与表之间的配置
步骤1: 点击Pipeline进入映射关系配置步骤2:添加映射关系
步骤3:查找数据表
源数据表: 选择只读源库表
目标数据表: 选择目标库表
保存后,内容如下,返回通道首页7.启动通道
在源库新增数据,验证目标库表是否正常
1.报警配置
步骤1 :在系统管理中,找到系统参数。
编辑默认报警联系人 key = otterteam values=邮箱地址
步骤2 :在Pipeline下面找到监控,编辑内容如下,key直接写上面设置的otterteam
步骤1 :插入测试表
SQL> CREATE TABLE t_alert_01 (id INT,alert_name VARCHAR(20)) ;
准备测试表,该表是一张没有主键的表,插入数据,otter肯定会报错,因为otter不支持没有主键的表同步。
步骤2 :插入数据
SQL> INSERT INTO t_alert_01 VALUES (1,"abc");
otter报警无法发送邮件,或者收到邮件报警,参考如下
>确保otter.manager配置文件正确
#cat /data/services/otter-manager/conf/otter.properties
# manager email user config
otter.manager.monitor.email.host = smtp.yeah.net
otter.manager.monitor.email.username = [email protected]
otter.manager.monitor.email.password = xxxxxx
otter.manager.monitor.email.stmp.port = 465
>确保SMTP服务设置正确
163的 yeah邮箱服务器,需要单独设置SMTP客户端密码,并且开启SMTP客户端服务。否则无法收到邮件
city_order_refund_service,(.*).(.*),15,city_order_refund_service,(.*).(.*),5
city_order_service,(.*).(.*),15,city_order_service,(.*).(.*),5
city_bid_service,(.*).(.*),15,city_bid_service,(.*).(.*),5
city_bill_service,(.*).(.*),15,city_bill_service,(.*).(.*),5
rocketmq_service,(.*).(.*),15,rocketmq_service,(.*).(.*),5
city_cts_service,(.*).(.*),15,city_cts_service,(.*).(.*),5
city_crs_service,(.*).(.*),15,city_crs_service,(.*).(.*),5
city_cms_service,(.*).(.*),15,city_cms_service,(.*).(.*),5
city_cas_service,(.*).(.*),15,city_cas_service,(.*).(.*),5
city_service,(.*).(.*),15,city_service,(.*).(.*),5
解释:
格式:stringS,stringS,stringS,stringT,stringT,stringT
从左往右
第一个stringS:源库名称,例子:city_order_refund_service
第二个stringS:源表名,例子:(.).(.)正则匹配
第三个stringS:源库ID,例子:如下图,序号ID值
第一个stringT:目标库名称,例子:city_order_refund_service
第二个stringT:目标表名,例子:(.).(.)正则匹配
第三个stringT:目标库ID,例子:如上图,找到目标库对应的ID即可
点击任意一列的查看按钮,如下
已自动添加
共计配置12条通道。共计70+个库,1000张表。
描述: 共计配置12条通道。共计70+个库,1000张表。 QPS在1000/s左右的写入操作。
目前我们还采用了DTLE同步工具,同步案例一样,同步的数据量也一样,下图是DTLE的日常服务器消耗监控图
```Otter秒杀Dtle
案例: 在其中一条通道,执行50万条update语句,观察服务器情况。
Otter监控延迟