简介
OTTER是阿里巴巴公司为了解决杭州/美国机房数据间同步研发的一个开源软件。OTTER基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数据库,是一个分布式数据库同步系统。
工作原理图:
原理描述:
- 基于Canal开源产品,获取数据库增量日志数据。
-
典型管理系统架构,manager(web管理)+node(工作节点)
- manager运行时推送同步配置到node节点
- node节点将同步状态反馈到manager上
- 基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作.
一、准备前--otter配置流程
1、**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)启动通道
2、下载包
otter的环境需要mysql ,jdk, zookeeper , node , manager,aria2
wget https://github.com/aria2/aria2/releases/download/release-1.30.0/aria2-1.30.0.tar.gz
wget https://github.com/alibaba/otter/releases/download/otter-4.2.17/manager.deployer-4.2.17.tar.gz
wget https://github.com/alibaba/otter/releases/download/otter-4.2.17/node.deployer-4.2.17.tar.gz
wget https://raw.github.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.5/apache-zookeeper-3.5.5-bin.tar.gz
3、安装包
3.1 需要软件
需要软件:java,MYSQL5.x,manager,node,ZOOKEEPER,aria2
3.2MYSQL
mysql 、java 安装
java 安装
yum install java-1.8.0-openjdk.x86_64 -y
java -version
或者
查看当前系统是否已安装JDK
yum list installed |grep java
如果没有就选择yum库中的包进行安装,查看yum库中JDK列表
yum -y list java*
该命令执行后,会列出JDK版本,选择自己合适的进行安装
安装命令:
yum -y install java-1.8.0-openjdk*
mysql 安装
下载并安装MySQL官方的 Yum Repository
[root@localhost ~]# wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
使用上面的命令就直接下载了安装用的Yum Repository,大概25KB的样子,然后就可以直接yum安装了。
[root@localhost ~]# yum -y install mysql57-community-release-el7-10.noarch.rpm
之后就开始安装MySQL服务器。
[root@localhost ~]# yum -y install mysql-community-server
这步可能会花些时间,安装完成后就会覆盖掉之前的mariadb。
systemctl start mysqld.service
此时MySQL已经开始正常运行,不过要想进入MySQL还得先找出此时root用户的密码,通过如下命令可以在日志文件中找出密码:
grep "password" /var/log/mysqld.log
mysql> set global validate_password_policy=0;
mysql> set global validate_password_length=1;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';
系统: CentOS 7(在CentOS 7中默认有安装MariaDB,这个是mysql的分支,一般来说还是使用自己安装的MySQL比较好)
1、下载并安装MySQL
wget -i -c https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
下载到指定位置后,就可以执行安装了
yum -y install mysql80-community-release-el7-3.noarch.rpm
yum -y install mysql-community-server
启动MySQL
启动MySQL服务:systemctl start mysqld.service
查看MySQL服务:systemctl status mysqld.service
mysqld.service
查看MySQL是不是开机自启,可以执行命令查看开机自启列表
1 |
|
此时如果要进入MySQL得找出root用户的密码,输入命令
grep "password" /var/log/mysqld.log
得到密码后,登录mysql,输入命令
mysql -uroot -p
然后回车,提示你输入密码,记得不要输错,输入时密码是不显示的。登录成功如下图
此时,你需要给你的MySql重新设置密码,因为MySQL默认的就是必须修改密码后才能操作数据库。
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Left@zuo123.';
设置密码的时候需要遵守MySQL密码设置规范,如果不符合规范是不能修改成功的。
如下图,我将密码设置为123456,它提示我 密码不符合规范
总之呢,我们先将密码设置成比较复杂的就好,比如 Abc@123...,先登录了再说。
如果想要设置简单好记的密码,可以修改密码设置规范,毕竟你不登录你就不能修改规范。
查看密码规范
SHOW VARIABLES LIKE 'validate_password%';
密码的长度是由validate_password_length决定的,而validate_password_length的计算公式是:
validate_password_length = validate_password_number_count + validate_password_special_char_count + (2 * validate_password_mixed_case_count)
这时候我们将密码设置规范修改一下:
set global validate_password.policy=0;
set global validate_password.length=1;
这时候就可以设置简单的密码了,比如123456
最后一步,设置允许远程连接。
如果直接使用命令:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password'; 会提示一个语法错误,有人说是mysql8的分配权限不能带密码隐士创建账号了,要先创建账号再设置权限。也有的说8.0.11之后移除了grant 添加用户的功能。
创建新用户 admin
创建用户:CREATE USER 'admin'@'%' IDENTIFIED BY '123456';
允许远程连接:GRANT ALL ON *.* TO 'admin'@'%';
本人测试过,使用 update user set host = '%' where user = 'root'; 也可以修改
如果使用客户端连接提示了plugin caching_sha2_password错误,这是因为MySQL8.0的密码策略默认为caching_sha2_password
使用命令修改策略
ALTER USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
箭头指的两个用户是我修改过的
然后关闭防火墙,测试连接成功!!
mysql配置:
show variables like 'binlog_format' #binlong 格式必须是row
show variables like '%server_id%' #必须有server_id,该参数跟数据库复制有关,详情看官网
show variables like '%char%' #字符集character_set_server 必须是utf8,否则配置数据源表验证不通过。
#/ETC/MY.CNF
[mysqld] 添加以下配置
character-set-server=utf8
collation-server=utf8_general_ci
binlog_format=row
log-bin=mysql-bin
server_id=1
sql_mode='ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
3.3、Centos7安装Zookeeper 3.5.5步骤
1、下载zookeeper安装包
进入zookeeper官网选择下载链接如下: https://www-eu.apache.org/dist/zookeeper/
选择最新稳定版本3.5.5,选择下载apache-zookeeper-3.5.5-bin.tar.gz,文件说明:
1)apache-zookeeper-3.5.5.tar.gz 源码包
2)apache-zookeeper-3.5.5-bin.tar.gz 安装包
2、vim修改配置文件 /etc/hosts ,增加如下内容:
192.168.3.71 edu-provider-01
3、保存后,执行 /etc/init.d/network restart 使配置文件 hosts生效
4、上传下载好的 apache-zookeeper-3.5.5-bin.tar.gz 包到 /usr/local/src 目录下
5、执行 tar -zxvf /usr/local/apache-zookeeper-3.5.5-bin.tar.gz 解压tar包
6、进入解压好的目录中创建 data 和 logs文件夹,命令如下:
[root@localhost apache-zookeeper-3.5.5-bin]# cd /usr/local//apache-zookeeper-3.5.5-bin/
[root@localhost apache-zookeeper-3.5.5-bin]# mkdir data
[root@localhost apache-zookeeper-3.5.5-bin]# mkdir logs
7、进入conf文件夹,并拷贝一份.cfg文件并编辑,编辑后的结果如图,保存
[root@localhost apache-zookeeper-3.5.5-bin]# cd conf/
[root@localhost conf]# cp zoo_sample.cfg zoo.cfg
[root@localhost conf]# vim zoo.cfg
请注意:edu-provider-01名称为hosts文件中输入的内容
8、进入data文件夹,创建myid文件,并输入1,保存
[root@localhost conf]# cd ../data/
[root@localhost data]# vim myid
请注意: 这里输入的1 是zoo.cfg文件中server.1的1
9、编辑profile文件,并加入zookeeper的环境变量
[root@localhost data]# vim /etc/profile
10、执行 命令使profile文件生效
[root@localhost data]# source /etc/profile
11、防火墙中添加允许zookeeper访问的端口,并重启防火墙
[root@localhost data]# firewall-cmd --permanent --zone=public --add-port=2181/tcp
[root@localhost data]# firewall-cmd --permanent --zone=public --add-port=2888/tcp
[root@localhost data]# firewall-cmd --permanent --zone=public --add-port=3888/tcp
[root@localhost data]# systemctl restart firewalld.service
12、启动 zookeeper服务并测试是否正常启动
[root@localhost data]# cd /usr/local/src/apache-zookeeper-3.5.5-bin/bin/
[root@localhost bin]# ./zkServer.sh start
图片说明已经正常启动,还可以使用jps命令查看,是否有 QuorumPeerMain
13、如果想要关闭执行stop命令
[root@localhost bin]# ./zkServer.sh stop
3.4、aria2 安装
下载解压aria2 到/usr/local/aria2/aria2-1.15.2(目录没有统一好,因为之前装了一个新版本1.33.1,在编译时要GCC>4.7 )
[root@master aria2-1.15.2]# ./configure
[root@master aria2-1.15.2]# make
[root@master aria2-1.15.2]# make install
#########标准源码安装三部曲############
[root@master aria2-1.15.2]# aria2c -v
或者YUM 安装
[root@test6 ~]# yum install epel-release
[root@test6 ~]# yum install aria2 -y
3.5、manager安装
1 下载sql文件并导入
wget https://raw.github.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql
source otter-manager-schema.sql
2 下载安装包
wget https://github.com/alibaba/otter/releases/download/v4.2.15/manager.deployer-4.2.15.tar.gz
tar xzvf manager.deployer-4.2.15.tar.gz -C /usr/local/otter-manager
3 修改配置文件otter.properties
cat otter.properties |grep -v ^#|grep -v ^$
otter.zookeeper.cluster.default = zk地址:2181
otter.domainName =本机IP地址
otter.database.driver.url = jdbc:mysql://IP:3306/otter
otter.database.driver.username = 用户名
otter.database.driver.password = 密码 //otter管理节点需要使用数据库,这里设置的是连接这台数据库的用户名密码
例:
4 启动manager
./bin/startup.sh
PS:manager 编译时间大约需要1分钟
检查日志:cat logs/manager.log
5 manager启动测试
访问地址 http://IP:8080/login.htm,初始密码为:admin/admin
用浏览器打开http://172.18.1.97:8088/
默认情况下,进去的是匿名账户,只有只读查看的权限,登录为管理员才可以有操作权限,管理员账号为admin/admin(otter自带)。
注:默认情况下是没有channel的,因为笔者的环境已经配置了在单向同步的,所以有显示一个channel。
manager启动之后,需要配置使用的zk、canal、node等地址、端口等信息。
zk配置
node配置
端口建议不要修改。
机器添加完成以后,机器管理的列表中第一列就是nid(这个就是到时候要保存到node/conf/nix文件中的值),如下:
上述三种类型的节点配置完成后,manager前期的配置就完成了。
manager配置完成之后,需要先启动相应的node节点,node节点启动之后,就可以配置真正的同步任务了。
node配置
首先cd NODE_HOME/conf
echo 1 > nid
node配置文件otter.properties(可以默认,不用做任何修改)如下:
cat otter.properties
# otter node root dir
otter.nodeHome = ${user.dir}/../
## otter node dir
otter.htdocs.dir = ${otter.nodeHome}/htdocs
otter.download.dir = ${otter.nodeHome}/download
otter.extend.dir= ${otter.nodeHome}/extend
## default zookeeper sesstion timeout = 60s
otter.zookeeper.sessionTimeout = 60000
## otter communication pool size
otter.communication.pool.size = 10
## otter arbitrate & node connect manager config
otter.manager.address = IP:1099
启动node
cd NODE_HOME/bin
./startup.sh
more node.log
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=96m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release.
5:13:09.364 [main] INFO com.alibaba.otter.node.deployer.OtterLauncher - INFO ## the otter server is running now ......
此时再查看manager控制台的机器管理,可以发现机器状态为已启动,如下:
manager/node都启动之后,就可以真正开始配置同步任务了。
例:
同步任务配置
分为下列几个步骤(不熟悉术语概念的建议回到页首重新review下):
1、添加canal
点位可以通过在主库执行show master status和select unix_timestamp()得到。
2、添加数据源
设置主库和从库的数据源
3、添加同步表
4、添加channel
5、添加pipeline
pipeline里面主要选择节点和canal。
6、添加映射关系
7、启动同步
注意:默认会同步ddl,对于分库分表同步到从库的时候,建议不要同步ddl以及跳过ddl。
插入数据试试看吧。。。。
otter同步异常问题排查与监控
笔者一开始启动后,确实报错了,如下:
TODO,等后续梳理确保都可重复执行之后,再补充。
otter简单性能测试
创建了一个简单的表使用mysqlslap进行测试。
注:我们因为环境受限,zk、manager、node、mysql主从均在一台服务器上,配置为16c/8GB阿里云服务器,无swap。
CREATE TABLE `otter_test_table1` (
`id` int(11) NOT NULL,
`name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
测试100w条插入
mysqlslap --defaults-file="/etc/my.cnf.57" --concurrency=50 --iterations=1 --create-schema=otter_test --query="insert into otter_test_table1 values(FLOOR(0 + (RAND() * 10000000)),'name93923') ON DUPLICATE KEY UPDATE name='wifeufwuwwu'" --number-of-queries=1000000 -uroot -p123456 -P3307 -h127.0.0.1
延迟、tps等如下:
测试2000w条插入
mysqlslap --defaults-file="/etc/my.cnf.57" --concurrency=100 --iterations=1 --create-schema=otter_test --query="insert into otter_test_table1 values(FLOOR(1000000 + (RAND() * 100000000)),'namefwei8388dfe88827d7f8fjfjweifiwewifeweuwewuweuewuweuuusyfyeywewew23') ON DUPLICATE KEY UPDATE name='wifeufwuwwu'" --number-of-queries=20000000 -uroot -p123456 -P3307 -h127.0.0.1
延迟、tps、cpu、io等待等如下:
可以看出后面基本上都在io等待了,一般来说数据库服务器io等待持续到10%之后,系统就很慢了,所以总体来说,如果不做太多的字段重命名、二次处理,otter性能本身还是不错的。
otter高可用
对外开源部分HA这一块基本上没有比较完善的。对于canal连接到db主从切换,可以参考:https://www.cnblogs.com/f-zhao/p/7681960.html,已经讲到位了。如果是半同步模式或者基于GTID的话,没有必要回退60s。
在otter中配置canal的主从切换依赖于groupKey,后面测了会补充。
其他参考
https://wenku.baidu.com/view/930a5723227916888586d70b.html
https://github.com/alibaba/otter/wiki/Faq
https://my.oschina.net/dxqr/blog/524795
http://shift-alt-ctrl.iteye.com/blog/2399603