设为首页 收藏本站
查看: 1241|回复: 0

[经验分享] (转)MySQL Group Replication介绍

[复制链接]

尚未签到

发表于 2018-10-11 09:32:05 | 显示全部楼层 |阅读模式
  这是一个振奋人心的消息!
  2016-12-12,一个重要的日子,mysql5.7.17 GA版发布,正式发布了Group Replication(组复制) Plugin,增强了MySQL原有的高可用方案(原有的高可用方案是指mysql主从架构),提供了重要的特性——多写,保证组内高可用,数据强一致性。
  1. 背景
  在介绍组复制之间,我们先简单介绍传统的复制和半同步复制:
1.1 传统复制
  传统mysql复制是完全异步化的复制。下图描述了传统复制的原理:


  master事务的提交不需要等待slave>1.2 半同步复制
  半同步复制是传统复制的变种,在master事务的commit之前,必须确保slave收到relay log并且响应给master以后,才能进行事务的commit。

  因为slave接受relay log之后有可能apply失败。这个时候master其实不知道slave的失败,照常提交了这个事务。由此,半同步复制一样也会出现数据不一致的情况。
1.3 组复制

  引入组复制,是为了解决传统复制和半同步复制可能产生数据不一致的问题。组复制依靠分布式一致性协议(Paxos协议的变体),实现了分布式下数据的强一致性,提供了真正的数据高可用方案(是否真正高可用还有待商榷)。其提供的多写方案,给我们实现多活方案带来了希望。
  一个replication group由若干个节点(数据库实例)组成,组内各个节点维护各自的数据副本(Share Nothing),通过一致性协议实现原子消息和全局有序消息,来实现组内实例数据的强一致。
2. 组复制介绍
2.1 数据一致性保证
  对于只读(RO)事务,组间实例无需进行通讯,就可以处理事务;对于读写(RW)事务,组内所有节点必须经过通讯,共同决定事务提交与否。
  引用mysql官方博客对于读写事务提交过程的描述,解释了如何保证了组内节点间数据的一致性的(难以翻译- -。):

  To be precise, when a transaction is ready to commit at the originating server, the server will atomically broadcasts the write values (rows changed) and the correspondent write set (unique>
2.2 事务冲突处理
  在高并发的情况下,节点间读写事务的提交可能会产生冲突,比如,两个不同的事务在两个节点上操作了同一行数据,这个时候就会产生冲突。首先,Group Replication是能够识别到这个冲突,然后对此的处理是,依赖事务提交的时间先后顺序,先发起提交的节点能够正确提交,而后面的提交,会失败。
2.3 故障检测
  Group Replication内部有故障检测机制,可以识别组内成员是否挂掉(组内节点心跳检测)。当一个节点失效,将由其他节点决定是否将这个失效的节点从group里面剔除。
2.4 组成员管理
  replication group需要维护组内节点的状态(在线?存活?挂掉?),对于失效的节点,由其他节点决定是否剔除。对于新加入的节点,需要维护它的视图与其他节点的视图保持一致。
2.5 容错能力
  组复制基于分布式一致性算法实现,一个组允许部分节点挂掉,只要保证绝大多数节点仍然存活并且之间的通讯是没有问题的,那么这个组对外仍然能够提供服务。
  假设一个复制组由2n + 1个节点,那么允许n个节点失效,这个复制组仍然能够对外提供服务。比如有3个节点组成的一个复制组,可允许1个节点失效,这个复制组仍然能够提供服务。
Group>  由此可以看出,复制组由奇数个节点组成为佳。
2.6 两种模式
  mysql5.7.17 Group Replication提供了single-primary和multi-primary两种模式。single-primary mode 组内只有一个节点负责写入,读可以从任意一个节点读取,组内数据保持强一致;而multi-primary mode 为多写,即写会下发到组内所有节点,组内所有节点同时可读,也是能够保证组内数据强一致性。一个group的所有节点必须配置使用同一种模式,不可混用。
2.6.1 Single-Primary Mode
  这个模式下,group内只有一台节点可写可读,其他节点只可以读。对于group的部署,需要先跑起primary节点(即那个可写可读的节点),然后再跑起其他的节点,并把这些节点一一加进group。其他的节点就会自动同步primary节点上面的变化,然后将自己设置为只读模式。
  当primary节点意外宕机或者下线,在满足大多数机器存活的情况下,group内部发起选举,选出下一个可用的读节点,提升为primary节点。
  primary选举根据group内节点的UUID按字典序来选择,即存活的节点按UUID字典序排列,然后选择排在最前的节点作为新的primary节点。

  【重要】 在切换primary期间,mysql group不会重定向应用所持有的连接。这需要应用层或者中间件层去保证。
  如何查看group内哪个节点是作为primary节点,官方提供了一个方法:
mysql> SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member';  
+--------------------------------------+
  
| VARIABLE_VALUE                       |
  
+--------------------------------------+
  
| 69e1a3b8-8397-11e6-8e67-bf68cbc061a4 |
  
+--------------------------------------+1 row in set (0,00 sec)12345671234567
  得到的是实例节点的UUID
2.6.2 Multi-Primary Mode
  多主模式,即多写,没有选择新primary的概念,group内的所有机器都是primary节点,同时可以进行读写操作,并且数据是一致的。让我等屌丝看到了多活方案的希望啊…

2.7 Requirements&Limitations
2.7.1 Requirements
  部署group replication有以下需求:
  1) 架构上

  •   存储引擎必须为innodb
  •   每个表必须提供主键
  •   只支持ipv4,网络带宽要好
  •   一个group最多只能有9个节点
  2) 配置上
  针对my.cnf,需要指定如下配置:
# Binary Log must be active.  
log-bin[=log_file_name]
  

  
# Binary Log Format must be set to ROW.
  
binlog-format=row# Global Transaction Identifiers must be turned on.
  
gtid-mode=ON# Replication applier needs to have replication metadata repositories stored in system tables.
  
master-info-repository=TABLErelay-log-info-repository=TABLE# Transaction write set extraction must be enabled.transaction-write-set-extraction=XXHASH64
  

  
# Servers need to log binary logs that are applied through the replication applier.
  
log-slave-updates
  

  
# Replication event checksums are not supported.
  
binlog-checksum=NONE1234567891011121314151617181920212212345678910111213141516171819202122
2.7.2 Limitations
  以下列举使用group replication的限制:

  •   不支持Replication event checksums,需要在my.cnf里面配置,在上节已经提及
  •   不支持Savepoints
  •   multi-primary mode部署方式不支持SERIALIZABLE事务隔离级别
  •   multi-primary mode部署方式不能完全支持级联外键约束
  •   multi-primary mode部署方式不支持在不同节点上对同一个数据库对象并发执行DDL(在不同节点上对同一行并发进行RW事务,后发起的事务会失败)
  转载由:http://blog.csdn.net/d6619309/article/details/53691352



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-620222-1-1.html 上篇帖子: MySQL5.7配置参数 下篇帖子: mysql之having与where-java学习
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表