1.MySQL主从同步基本原理
MySQL主从同步的原理是建立在Binlog
日志上的,通过对Binlog的实时同步来实现主从数据的同步。
1. 主库打开Binlog日志(默认是关闭的),记录数据库的所有写操作,然后打开从库的Relaylog日志,目的是用来记录主库的Binlog日志。
1. 从库启动IO线程,负责和主库进行TCP连接,请求主库将Binlog日志也给从库发一份。
1. 主库的IO Dump线程将Binlog日志传输给从库,从库IO线程接收到数据后存入Relaylog日志中。
1. 从库的SQL线程对Relaylog的数据进行重演执行,达到主从同步。
1.1 异步复制
MySQL主从集群默认采用的就是异步复制方式,Master的事务提交后,写入binlog然后就给客户端返回成功的响应了。后台通过IO Dump线程来负责将Binlog数据传输给从节点,整体来说服务器反馈给客户端是不关心数据是否成功发送给从节点没有。这种方式速度快,但是有可能造成数据丢失。
1.2 半同步复制
相比于异步复制,半同步复制就是说事务的提交后binlog要保证至少将数据同步给一个从库才算完成,但是半同步复制并不保证从库对数据的提交是否成功。这种方式相比于异步复制来说效率上有所降低,但是数据安全上有一定的保证。
2.MySQL主从架构模式
MySQL主从架构模式有许多种:一主多从、多级主从、互为主从、多主多从等架构。
常见的MySQL集群方案有三种:MMM、MHA、MGR。
2.1 MMM
MMM(Master-Master replication manager for mysql)主主复制管理器。它需要2个Master,同一时刻只有1个Master对外提供服务,类似于主备模式。这种模式是基于VIP(虚拟IP)机制来保证集群的高可用,当一个Master发生故障后,通过虚拟IP转移到新的Master上来继续提供服务。
2.2 MHA
MHA(Master High Availability Manager and Tools for mysql),这种架构模式下当发现Master故障时,会选出拥有新数据的Slave节点成为新的master。MHA管理器需要单独部署,分为Manager节点和Node节点。Manager节点一般是独立部署一台机器,Node节点一般是部署在每台MySQL机器上的,Node节点通过解析MySQL的日志来进行工作。Manager节点通过监控Node节点来判断各个MySQL是否运行正常。
2.3 MGR
MGR(mysql group replication)是mysql5.7推出的一种组复制机制,解决传统异步复制和半同步复制的数据一致性问题。
它由若干个节点组成一个复制组,当一个事务提交后,必须经过超过半数节点的响应后才可以提交。MGR基于Paxos一致性协议的变体实现了数据的最终一致性。
3.分库分表常见组件
分库分表后会给业务带来一些问题:
- 分布式事务
- 跨库关联查询问题
- 跨库表的分页、排序问题
- 主键重复问题等
常见的分库分表手段有:客户端插件、数据库代理。
- ShardingSphere
- MyCat
- DBLE