使用otter实现MySQL跨机房双向同步

2020/03 作者:ihunter 0 0


在要进行双向同步的数据库执行以下语句 (记得修改密码)(主从库都要执行)

/* 供 otter 使用, otter 需要对 retl.* 的读写权限,以及对业务表的读写权限*/

/* 1. 创建database retl */
    CREATE DATABASE retl;

/* 2. 用户授权 给同步用户授权 */
    

/* 业务表授权,这里可以限定只授权同步业务的表 */
    

/* 3. 创建系统表 */
    
    USE otter;
    DROP TABLE IF EXISTS retl.retl_buffer;
    DROP TABLE IF EXISTS retl.retl_mark;
    DROP TABLE IF EXISTS retl.xdual;

    CREATE TABLE retl_buffer
    (
     ID BIGINT(20) AUTO_INCREMENT,
     TABLE_ID INT(11) NOT NULL,
     FULL_NAME varchar(512),
     TYPE CHAR(1) NOT NULL,
     PK_DATA VARCHAR(256) NOT NULL,
     GMT_CREATE TIMESTAMP NOT NULL,
     GMT_MODIFIED TIMESTAMP NOT NULL,
     CONSTRAINT RETL_BUFFER_ID PRIMARY KEY (ID)
    )  ENGINE=InnoDB DEFAULT CHARSET=utf8;

    CREATE TABLE retl_mark
    (
     ID BIGINT AUTO_INCREMENT,
     CHANNEL_ID INT(11),
     CHANNEL_INFO varchar(128),
     CONSTRAINT RETL_MARK_ID PRIMARY KEY (ID)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

    CREATE TABLE xdual (
      ID BIGINT(20) NOT NULL AUTO_INCREMENT,
      X timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (ID)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

/* 4. 插入初始化数据 */
    INSERT INTO retl.xdual(id, x) VALUES (1,now()) ON DUPLICATE KEY UPDATE x = now();

 数据库配置(主从库都要修改,请保证server-id不相同)

  • 在需要双向同的数据库开启binlog,并设置为row模式

  • my.cnf (/etc/mysql/my.cnf) 的 [mysqld] 节点下启用binlog

# 开启binlog
log-bin=mysql-bin
# 设置row模式
binlog-format=ROW
character_set_server=utf8
# 双向同步保证id不相同,避免无法辨别数据库而回环
server-id=1
# 允许外部访问
# bind-address = 0.0.0.0

 otter账号授权
授权需要双向授权 (主库)
 

# 如果有多个机器ip请全部授权

# 授予主从复制权限
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON . TO otter@’%’;
# 授予retl 库操作权限
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `retl`.* TO otter@'ip';
# 授予操作库增删查改,alter,index权限 用于更新数据库记录
GRANT update, insert, delete, update, alter, indexON mytest.person_info TO otter@'ip';
flush PRIVILEGES;

授权需要双向授权 (从库)
 

# 如果有多个机器ip请全部授权

# 授予主从复制权限
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON . TO otter@’%’;
# 授予retl 库操作权限
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `retl`.* TO otter@'ip';
# 授予操作库增删查改,alter,index权限 用于更新数据库记录
GRANT update, insert, delete, update, alter, indexON mytest.person_info TO otter@'ip';
flush PRIVILEGES;

 配置数据源

  • 尽量使用专用账号,避免重复配置数据源

  • 同一个数据源的表只需要配置一次

  • 点击验证,如果报字符类型不一致问题,可忽略


开始添加数据源

配置数据源


数据源列表

 配置表

  • schema name 配置数据库名(支持正则.* 匹配整个实例下所有数据库)

  • table name配置表名,支持正则配置

  •  如: .* 匹配全库

  •  (yibai_product_map|yibai_product) 最外层一定要加括号,否则无法同步"|"后面的部分,

  •  保证 Find schema and tables: 有你需要同步的所有表

 

开始添加数据表


配置数据表

 

配置canal

  • canal用于取binlog,

  • canal名字保存后不能修改,尽量做到见名知意

  • 此处账号要有 主从复制权限

  • 数据库地址为同步源库数据库地址

添加canal

配置canal

canal列表 双向需要配置两个canal 分别负责读取不同库的binlog

支持主备切换

主备切换配置

配置Channel

开始添加Channel

开始配置Channel

  •  双向同步需要开启数据一致性算法 

 配置Pipeline

进入pipeline(点击channel名称)

添加pipeline             

配置pipeline(主库)

  •  配置一个单相同步的通道

  •  选择node, 此处选择多个是用于分担压力和保证高可用

  •  也可以选择单个

  •  选择主站点,同步会以主站点数据为准

  •  选择对应的源库canal

  •  消费批次支持修改



pipeline高级配置(主库)

  •  主库要支持ddl


pipeline配置从(从库)

  •  与主库唯一的不同在于 主站点选择否

pipeline高级配置(从库)

  •  从库要取消ddl的支持

  •  跳过ddl异常

 配置映射关系

点击Pipeline进入映射配置

映射关系配置1

  •  选择源库和目标库

  •  权重越大越晚执行,用于业务关联表配置

  •  点击下一步

映射关系配置2

  •  如果是单表可以看到对应的字段

  •  将需要同步的字段对应拉入到下面对应框中,支持不同字段名称的同步

  •  如果配置了多个表则无法看到字段,直接点击下一步即可


映射配置3

- 映射配置4

  •  此处用于配置组合字段

  •  如果需要变更某个字段后相关字段也要跟着更新,可以配置组合字段

  •  全字段的组合,与Channel中的行模式一致

  •  点击保存即可


配置多个映射

  •     字段映射支持配置多个表

  •     需要表源库是相同的数据库实例

  •     双向同步需要相同的主库,

- 到此处配置完成

channel启动
 - 点击启动

启动后检查是否异常  日志查看

  •  日志只记录异常,根据时间和channel名称可以确认你新开启的同步任务是否异常

  •  如果发生异常,点击日志内容,即可看到异常内容

- 监控查看

  •  此处可以看到同步延时等信息

  •  采集一般60s 采集一次,

  •  如果数据库日志没有变更不会采集

  •  如果channel挂起也不会进行采集

  •  内存不足/数据库压力较大 可能会部分channel不进行采集

  •  如果发现为进行日志采集请及时确认原因

pipeling监控

 点击监控可以看到各个监控指标 

监控指标

同步进度

  •  如果同步异常,重新导入表做同步,或者需要变更同步起始位点

  •  先关闭同步任务

  •  删除此处position 位点状态

  •  删除后在canal 中配置新的位点,启动同步任务即可


赞(1) 更多分享

上篇: 没有了
下篇: Mysql 查询天、周,月,季度、年的数据