双机房多活实战(二) --mysql同步otter

[TOC]

一、环境准备

准备两台机器,搭建阿里开源的mysql同步工具otter,canal就是 它的子项目。

mysql zk manager node
node5 1 1 1 1
node6 1 1

二、中间件安装

JDK

yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel

zk安装,启动

./zkServer.sh start

mysql安装,启动

mysql修改offset

注意双向同步要求两个库表的主键不能重复,如果自增主键要把主键offset错开并1指定increment 如下:

如果都是雪花id,或者uuid 之类的主键,则不用

vim /etc/my.cnf
#开启bin log模式
log-bin=mysql-bin
binlog_format=row
#如果mysql为多写模式,需要在每个写库配置自增主键的偏移量和步长,避免主键冲突,偏移量和步长根据写库数量做配置
#例如myql双写模式场景下,MySQL-A配置如下
auto-increment-increment=2
auto-increment-offset=1
 
#MySQL-B配置如下
#auto-increment-increment=2
#auto-increment-offset=2

账号备忘

#默认root账号
root
Root@123456
#otter同步账号
otter
Otter@123456

三、安装otter-manager

1.下载解压

mkdir -p ./otter/manager
cd ./otter/manager
wget .....otter-4.2.18/manager.deployer-4.2.18.tar.gz
tar -zxvf manager.deployer-4.2.18.tar.gz

2.执行数据库表初始化语句

wget .../otter-manager-schema.sql

3.在cli执行

source otter-manager-schema.sql

4.创建mysql用户

#这个主要用于otter manager后台使用
create user 'otter'@'%' identified by 'Otter@123456'; 
grant all on *.* to 'otter'@'%' identified by 'Otter@123456';
flush privileges;

5.修改manager的配置信息

cd /usr/local/opt/manager4.2.18
vi conf/otter.properties
# otter manager管理后台的域名或访问ip,页面跳转时会用这个值 
otter.domainName = 192.168.56.105
# otter manager管理后台的访问端口
otter.port = 8080
#jdbc
otter.database.driver.url = jdbc:mysql://127.0.0.1:3306/otter?useSSL=false
#按理应该使用otter,Otter@123456,这里直接用root
otter.database.driver.username = root
otter.database.driver.password = Root@123456
#otter通讯地址,默认可不改
otter.communication.manager.port = 1099
#zk根据实际部署该
otter.zookeeper.cluster.default = 127.0.0.1:2181

6.启动

./bin/startup.sh

7.验证

访问: 127.0.0.1:8080/,出现otter的页面,即代表启动成功

初始密码:admin/admin

otter-manager.png

四、安装otter node

这一步骤需要在两个机房里至少各自选一个服务器作为select node。

1.下载解压

mkdir -p ./otter/node
cd ./otter/node
wget .../otter-4.2.18/node.deployer-4.2.18.tar.gz
tar -zxvf node.deployer-4.2.18.tar.gz

2.安装aria2c

#yum安装
sudo yum install epel-release
sudo yum install aria2
#编译安装,准备
yum install -y gcc gcc-c++

wget .../release-1.36.0/aria2-1.36.0.tar.gz
tar -zxvf aria2-1.36.0.tar.gz
cd aria2-1.36.0
./configure
make
make install
#验证
aria2c -v

3.配置zookeeper

首先访问manager页面的机器管理页面,点击zookeeper管理,添加一个zookeeper。

注意

公网ip。

4.配置Node节点

首先访问manager页面的机器管理页面,点击机器管理->Node管理,添加node节点

otter_7_node_3.png

机器添加完成后,跳转到机器列表页面,获取对应的机器序号nid

otter_7_node_2.png

注意

如果是生产环境,需要 启用外部id,(还有另外的一处pipline也要启用外部ip)。

5.修改配置

将环境准备中添加机器后获取到的序号(1),保存到conf目录下的nid文件

例如:echo 5 > conf/nid

修改conf/otter.properties,修改如下信息:

otter.manager.address = 127.0.0.1:1099  #修改为otter master外部ip地址

6.启动

./bin/startup.sh

双A同步

双A同步相比于双向同步,主要区别是双A机房会在两地修改同一条记录,而双向同步只是两地的数据做互相同步,两地修改的数据内容无交集

  所以双A同步需要额外处理数据同步一致性问题. 同步一致性算法:[Otter数据一致性],目前开源版本主要是提供了单向回环补救的一致性方案。

双A同步相比于双向同步,整个配置主要是一些参数上有变化,具体步骤:

五、配置otter-admin

0 )数据源、数据表、canal配置

菜单-配置管理,为两个mysql实例分别配置如题这3个信息,后续在配置 channel,pipline时会用。

数据表

一般 table name 直接用通配写法

.*

canal

位点信息为canal开始同步的位置,该信息可在mysql中使用如下语句获取:show master status\G;

其中自定义点位 的journalName和position的值对应如下的File、Position,其余canal信息可用默认,点击保存即可。

如果是新库,那不用勾选自定义点位。

otter_3.png

1)配置一个channel:

otter_1.png

2)配置两个pipeline:

otter_2.png

注意:除了需要定义一个主站点外,需要在高级设置中将一个pipeline的“支持DDL”设置为false,另一个设置为true,否则将提示“一个channel中只允许开启单向ddl同步!”错误

3)每个pipeline各自配置canal,定义映射关系。

pipeLine:

select异常:跳过
ddl异常:跳过
Load异常:跳过
支持ddl同步: 主->是; 非主->否
启用公网同步: 是
otter_4_pipeline.png

otter_5_pipeline.png

配置同步映射规则

otter_6_mapRule.png
otter_7_mapRule.png

4) 创建两个辅助库retl

otter的双向同步需要在每个mysql实例都创建辅助库 retl,具体步骤如下:

wget https://raw.github.com/alibaba/otter/master/node/deployer/src/main/resources/sql/otter-system-ddl-mysql.sql
   
   #再执行下otter-system-ddl-mysql.sql

5) 启动

回到otterAdmin,点击启用即可开启同步。

6) 问题修复

-------------- 重置 otter---------------------------
查询两个实例的binlog 点位
show master status;
重新同步

六、监控告警

openJDK有些版本发不了邮件,会报错
Caused by: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
需要修改java.security
yum安装的话位置:/usr/lib/jvm/java-1.8.0-openjdk-<version>/jre/lib/security/java.security
找到 jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \ DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \ include jdk.disabled.namedCurves
把SSLv3, TLSv1, TLSv1.1删除

七.异地机房库初始化

如果不是完全的新项目,而是对线上项目进行双机房改造,那还需要对新机房做数据初始化、以及必要的散列。

1.mysqldump导出/导入数据

在导出数据时,可以先把一些有时效性、无效的数据 删掉,比如token,log等,先归档到其他库,这样提升导出、导入的效率。

#单独安装mysqldump
yum -y install mysql-client
#mysqldump 备份 使用最佳实践
mysqldump  -h IP地址 \
-u用户名 -p \
--skip-tz-utc \
--no-create-info  \
--insert-ignore   \
--master-data=2   \
--default-character-set=utf8 \
--set-gtid-purged=off \
--ignore-table=wechat.weixin_vermicelli \
--ignore-table=wechat.sms_send_record \
--ignore-table=wechat.weixin_error_log \
--ignore-table=wechat.weixin_receivetext \
--ignore-table=wechat.weixin_scene \
--ignore-table=wechat.sys_logon_log \
--ignore-table=wechat.weixin_account_modify_log  wechat > dump.sql;

#mysqldump导入
mysql wechat < dump_where_DML.sql中的binlog点位。




2.otter manager

  • otter pipline 中,删除同步点位。
  • 修改canal自定义点位为dump_where_DML.sql中的binlog点位
  • 启动channel同步,双向同步搭建完成

数据修复

全量同步用于修复数据

尚未生产验证,建议当有问题以后迫不得已才使用

  1. 保持channel 启动状态

  2. 把你想要同步表的表名及记录ID插入到retl_buffer表即可。

    例如:希望把node6的 test.user2 表全部同步到node5的test.user2。

    #在node6执行
    insert into retl.retl_buffer(ID,TABLE_ID,FULL_NAME,TYPE,PK_DATA,GMT_CREATE,GMT_MODIFIED) 
    (select null,0,'test.user2','I',id,now(),now() from test.user2);
    
    
  3. 如果sql执行报错 1067,解决如下:

show variables like ‘sql_mode’
#(1)临时修改:
set session
sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
#(2)永久修改
vi my.cnf
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION


机房间网络打通

跨机房同步网络打通2种方案:

  1. 使用公网ip暴露端口
    zk,node,manager,mysql 用到的端口开到外网,并用ip白名单限制
  1. 打通网络
    openvpn ,或者云vpn产品

跨机房的otter配置,有个很大的问题就是网络访问问题,比如:manager需要能访问node,node之间需要能互相访问,manager和node需要能访问zookeeper,load node需要能访问源mysql等。如何把所有的关节打通是一个比较繁琐的问题,如果生产环境搭建有问题,可以多留意manager和node的日志。

注意:上线备忘

  1. pipline 高级设置 忽略3个异常,select ,load,ddl

  2. 注意node,pipline 公网相关设置, 如公网ip等。

  3. 注意mysql表的主键是不是递增的,offset有没有错开,increment是否为2,或者主键统一用雪花id、uuid

  4. 涉及端口

    #node
    9090、2088、2090
    #manager
    8080(webUI),1099(管理node)
    #zk
    2181
    
  5. 数据表 不要写太复杂的正则,因为在页面上测试正确的正则,可能实际同步时会有问题。

    #如下:排除某些没意义的表,这个写法webUI上测试可以,实际同步时不行,改成通配符就可
    #如下范例排除 user3,user2
    ^((?!user3|user2).)*$
    

^((?!weixin_vermicelli|weixin_certifyauth_accesstoken|weixin_scene).)*$



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容