🏆今日学习目标:
🍀MySql是如何保证主备一致的
✅创作者:林在闪闪发光
⏰预计时间:30分钟
🎉个人主页:林在闪闪发光的个人主页
🍁林在闪闪发光的个人社区,欢迎你的加入: 林在闪闪发光的社区
目录
一 什么叫主备同步
主备同步,也叫主从复制,是MySQL提供的一种高可用的解决方案,保证主备数据一致性的解决方案。在生产环境中,会有很多不可控因素,例如数据库服务挂了。为了保证应用的高可用,数据库也必须要是高可用的。因此在生产环境中,都会采用主备同步。在应用的规模不大的情况下,一般会采用一主一备。
二 主备同步的好处
除了上面提到的数据库服务挂了,能够快速切换到备库,避免应用的不可用外,采用主备同步还有以下好处:
提升数据库的读并发性,大多数应用都是读比写要多,采用主备同步方案,当使用规模越来越大的时候,可以扩展备库来提升读能力。
备份,主备同步可以得到一份实时的完整的备份数据库。
快速恢复,当主库出错了(比如误删表),通过备库来快速恢复数据。对于规模很大的应用,对于数据恢复速度的容忍性很低的情况,通过配置一台与主库的数据快照相隔半小时的备库,当主库误删表,就可以通过备库和binlog来快速恢复,最多等待半小时。
三 主备同步的实现原理
如下图展示的是基本的主备切换流程
在状态1中,主库是A,备库是B,所以客户端的读写都直接方法节点A。由于节点B是节点A的备库,所以备库B只是将A的更新都同步过来,本地执行,这样可以保证节点B和节点A的数据一致性。
如果发生主备切换,就会从状态1变成状态2,节点A成为备库,节点B成为主库。
在状态1中,虽然节点B没有被客户端直接方法,但是还是建议将节点B(备库)设置成只读(readonly)模式,主要有以下几个理由:
避免某些服务访问了备库,造成误操作;
防止切换逻辑有bug,比如切换过程中出现双写,造成主备不一致;
可以用readonly状态,来判断节点的角色;
注意:readonly对于超级管理员是无效的,而用于同步更新的线程,就拥有超级权限,所以是可以修改备库的。
接下来我们看下节点A到节点B的流程图:
实际上备库B和主库A之间维持了个长连接,主库A中有一个线程(dump_thread),专门用于服务和备