温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

【Otter】关于otter双A模式的一点疑问

发布时间:2020-08-11 06:50:03 来源:ITPUB博客 阅读:742 作者:小亮520cl 栏目:MySQL数据库
何为双A模式:可以简单理解为mysql的双主模式,互为主从
具体可参考:https://github.com/alibaba/otter/wiki/Manager配置介绍


官方博客的配置方法:

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

  1. 配置一个channel 
    【Otter】关于otter双A模式的一点疑问
  2. 配置两个pipeline
    【Otter】关于otter双A模式的一点疑问
  3. * 注意:除了需要定义一个主站点外,需要在高级设置中将一个pipeline的“支持DDL”设置为false,另一个设置为true,否则将提示“一个channel中只允许开启单向ddl同步!”错误
  4. 每个pipeline各自配置canal,定义映射关系

背景:
111<->112 双A模式

111->112_canal:111 同步数据至112 
  1. 主站点:true
  2. 支持ddl同步:    关闭     
  3. 跳过ddl异常:    开启

112->111_canal:112同步数据至111
  1. 主站点:flase
  2. 支持ddl同步:    开启
  3. 跳过ddl异常:    开启

在以上的背景下
疑问一:数据的增删查改都没问题,但是当在111上 执行create table/Truncate 这类DDL语句后,不会同步到112上,反之在112上执行可以同步至111,因为支持ddl同步这个参数的原因

解决办法:
待续

疑问二:当表没有主键约束时,在非主站点上执行insert会重复插入一条如:
  1. 非主站点上执行:
  2. mysql> insert into test3 values(5);
  3. Query OK, 1 row affected (0.01 sec)

  4. mysql> select * from test3;
  5. +------+
  6. | id |
  7. +------+
  8. | 4 |
  9. | 5 |
  10. | 5 |
  11. +------+
  12. 3 rows in set (0.00 sec)

  13. 主站点上:
  14. mysql> select * from test3;
  15. +------+
  16. | id |
  17. +------+
  18. | 4 |
  19. | 5 |
  20. +------+
  21. 2 rows in set (0.00 sec)
同步至主站点了,但是非主站点会再插入一遍
原因:otter设计的单向回环
【Otter】关于otter双A模式的一点疑问

思路:最终一致性

适用场景: A地和B地数据不对等,比如A地为主,写入量比较高,B地有少量的数据写入

单向回环流程:(比如图中以HZ为trusted source站点)

  • us->hz同步的数据,会再次进入hz->us队列,形成一次单向回环
  • hz->us同步的数据,不会进入us->hz队列(回环终止,保证不进入死循环)

解决办法:设计表都带上自增主键


疑问三:如果两边同时插入一条数据,自增id怎么办?
  1. mysql> select * from admin;
  2. +----+---------+
  3. | id | role_id |
  4. +----+---------+
  5. | 8 | 77 |
  6. | 9 | 777 |
  7. | 11 | 99 |
  8. | 12 | 999 |
  9. | 16 | 888 |    ---可以看到,主站点丢失,未插入!
  10. +----+---------+
  11. 5 rows in set (0.00 sec)


在github上otter数据库入库算法》部分看到这样一段话:合并算法执行后,单pk主键只有一条记录,减少并行load算法的复杂性(比如batch合并,并行/串行等处理)
因为并发插入之间的时间间隔非常短,短于同步之间的延迟,在主副站点分别插入后是同一条pk建,并且副站点后插入,那么副站点是最新副本集也就是trust 点,副站点数据覆盖主站点数据,《otter数据一致性》详解!

解决办法:参考官方双a的做法,设置步长和起始值
  1. 修改两台的步长
  2. mysql> show global variables like '%auto_increment_increment%';
  3. +--------------------------+-------+
  4. | Variable_name | Value |
  5. +--------------------------+-------+
  6. | auto_increment_increment | 2 |
  7. +--------------------------+-------+

  8. mysql> show global variables like '%auto_increment_increment%';
  9. +--------------------------+-------+
  10. | Variable_name | Value |
  11. +--------------------------+-------+
  12. | auto_increment_increment | 1 |
  13. +--------------------------+-------+

  14. 再次测试
  15. [root@DB-22 dbaadmin]# python test.py 
    ()
    ()
    all over Mon Jul 31 17:54:10 2017
    [root@DB-22 dbaadmin]# python test.py 
    ()
    ()
    all over Mon Jul 31 17:54:21 2017



  16. mysql> select * from admin;
    +----+---------+
    | id | role_id |
    +----+---------+
    | 28 |     111 |
    +----+---------+
    1 row in set (0.00 sec)


    mysql> select * from admin;
    +----+---------+
    | id | role_id |
    +----+---------+
    | 28 |     111 |
    | 29 |     888 |
    | 30 |      88 |
    +----+---------+
    3 rows in set (0.00 sec)


    mysql> select * from admin;
    +----+---------+
    | id | role_id |
    +----+---------+
    | 28 |     111 |
    | 29 |     888 |
    | 30 |      88 |
    | 31 |     888 |
    | 32 |      88 |
    +----+---------+
    5 rows in set (0.00 sec)






向AI问一下细节
推荐阅读:
  1. 基于MySQL和Otter实现生产环境安全的数据同步及查询
  2. 有关mongodb升级的一些疑问

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

猜你喜欢

AI