传统的数据同步方式
传统的mysql数据库同步是使用二进制日志进行主从同步也就是semi-sync,这种同步也只是一种半同步,并不是完全的实时同步,在mysql 5.7.17中推出了MySQL Group Replication,这种实现方式与Galera cluster基本完全一样,不过MGR比Galera的优势在于
- Mysql官方出品,能得到后续技术支持,Galera是芬兰的一家叫codership的公司开发的。
- MGR使用Paxos协议,性能比Galera好,并且性能稳定,Galera实际只能使用三个节点,有性能和稳定性问题。
- Galera目前只支持linux,MGR支持多个平台。
mysql 5.6下semi-sync数据同步方式
master的dump进程需要发送binlog日志到slave,master要等待至少一个slave通知,slave将已经接收到传过来的events并写入relay log,salve发送ack信息到master,这个事务才能提交。
5.6版semi-sync的缺陷,dump thread要承但两份任务,传送binlog给slave还要等slave的返回,并且这两个任务是串行的,也就是说,dump thread要先传送binlog给slave,并还要slave返回才能传送下一个events事务,这样的dump thread成为性能瓶径。
mysql 5.7下semi-sync数据同步方式
5.7.4为解决上述的问题,在master端增加了ack进程。这样事务写发送binlog与接收ack可以并行进行,提高semi-sync的效率。
Galera
Galera cluster是可以实现mariadb多主集群的软件,它目前只能用于linux和只支持XtraDB和Innodb存储引擎 ,mariadb和perconna提供了原生的Galera cluster的支持,所以可以直接使用Galera cluster,mysql要使用Galera cluster需要使用Galera cluster提供的插件。传统主从只能有一个数据库进行写服务,Galera集群,每个节点都可读可写,在Galera上层部署负载均衡软件如lvs和haproxy进行流量分担是常用做法。
原理
各个节点的数据同步由wsrep接口实现。
client发起一个commit命令时,所有本事务内对数据库的操作和primary_key都会打包写入到write-set,write-set随后会复制到其他节点,各个节点接收后,会根据write-set传送的primary key进行检验,检查是否与本地事务种read-write或write-write锁冲突,冲突则回滚,没有冲突就执行,完成后返回success。如果其他节点没有执行成功则存放在队列种,稍后会重新尝式。
Galera集群的优点
- 支持多个节点的数据写入,能保证数据的强一致性。
- 同步复制,各个节点无延迟,不会因为一台宕机导致数据丢失。
- 故障节点将自动从集群中移除
- 基于行级的并行复制
缺点
- 只支持Innodb存储引擎
- 只支持linux平台,
- 集群写入的tps由最弱节点限制,如果一个节点变慢,整的集群就是缓慢的,所以一般情况下部署,要求统一的硬件配置。
- 会因为网络抖动造成性能和稳定性问题。
参考链接:
http://www.oschina.net/news/79983/galera-will-die-mysql-group-replication-realease
http://www.itbaofeng.com/?p=236