MySQL Group Replication(MGR)是MySQL官方在5.7.17版本引进的一个数据库高可用与高扩展的解决方案,以插件形式提供。MGR基于分布式paxos协议,实现组复制,保证数据一致性。内置故障检测和自动选主功能,只要不是集群中的大多数节点都宕机,就能够继续正常工做。提供单主模式与多主模式,多主模式支持多点写入。mysql
组复制是一种可用于实现容错系统的技术。复制组是一个经过消息传递相互交互的Server集群。复制组由多个Server成员组成,以下图的Master一、Master二、Master3,全部成员独立完成各自的事务。sql
当客户端发起一个更新事务时,该事务先在本地执行,执行完成以后就要发起对事务的提交操做。在尚未真正提交以前,须要将产生的复制写集广播出去,复制到其它成员。若是冲突检测成功,组内决定该事务能够提交,其它成员能够应用,不然就回滚。数据库
最终,全部组内成员以相同的顺序接收同一组事务。所以组内成员以相同的顺序应用相同的修改,保证组内数据强一致性。架构
为何须要使用innodb引擎呢?在MySQL Group Replication中,事务以乐观形式执行,可是在提交时检查冲突,若是存在冲突,则会在某些实例上回滚事务,保持各个实例的数据一致性,那么,这就须要使用到 事务存储引擎,同事Innodb提供一些额外的功能,能够更好的管理和处理冲突,因此建议 业务使用表格使用inndb存储引擎,相似于系统表格mysql.user使用MyISAM引擎的表格,由于极少修改及添加,极少出现冲突状况。分布式
每一个须要复制的表格都必须定义一个显式主键,注意跟隐式主键区分(使用Innodb引擎的表格,若是没有指定主键,默认选择第一个非空的惟一索引做为主键,若是没有,则自动建立一个6个字节的rowid隐式主键)。这个主键能在冲突发生时启动极其重要的做用,同时,可以有效提升relay log的执行效率。测试
官网建议使用READ COMMITTED级别,除非应用程序依赖于REPLEATABLE READ,RC模式下没有GAP LOCK,比较好支持Innodb自己的冲突检测机制何组复制的内部分布式检测机制一块儿协同工做。不支持SERIALIZABLE隔离级别。插件
不建议使用级联外键,若是旧库自己有外键,业务上没法去除而且使用的是多主模式,那么,请配置 group_replication_enforce_update_everywhere_check ,强制检查每一个组成员的级联检查,避免多主模式下执行级联操做形成的检测不到的冲突。code
因前期建立实例大多采起默认配置 致使开发,测试,生产等环境间数据库参数不一样 对程序运行有必定的影响。 之后建立实例将会参数规范化 对已有的实例后续也会慢慢修正 。cdn
下面简单解释下几个改动的参数server
sql_mode
去除了ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE等限制 采起了较为宽松的模式
lower_case_table_names
统一设置为1 即不区分大小写 有些实例还没更改 你们建表建库的时候不要大写
character-set-server
统一设置为utf8 不要用latin1字符集
wait_timeout
和interactive_timeout
参数控制空闲链接的时长 当链接空闲时间超过此参数则会被断开 之后会统一设置为1800s即30分钟
transaction_isolation
事务隔离级别 MySQL官方默认是可重复读(repeatable-read)目前单实例及主从架构的mysql采用了此级别,MGR集群将采起读已提交(read-committed)级别。Oracle默认是读已提交 。