mysql读写分离+高可用实现原理

假设我们有一台服务器Mysql作为主库,另外一台作为从库

主库设置为只可写入

从库设置为只读

假设此时主库宕机:从库必须顶上去,那么这是怎么实现的呢?

首先在Mysql前面有两台nginx负载均衡服务器,互相监控

nginx会有一个VIP(虚拟IP),DNS上绑定的域名一定是DNS的VIP虚拟IP,而不是真实IP

VIP的作用是,当一台机器挂了,另外一台nginx检测到宕机事件,那么就会把自己的IP变成虚拟IP,这个过程叫做 < 高可用 >

那么在Mysql 中,实现的原理和nginx类似,它把一个从库提升为主库,其他的从库指向这个被提升主库的mysql数据库,它用到的一个叫做MHA的软件。

在这里插入图片描述

MYSQL的主从原理
主库和从库都开启server_id ,主库和从库不能相同,从库和从库之间可以相同
创建一个主从复制用户,并且开启binlog
从库通过change master to命令确认主库的hostuserlogfilelog_position等信息,并且执行start slave,开启主从复制。
此时从库会开启两个线程io线程和sql线程,io线程的作用是连接主库的dump线程去取数据,把从log_pos取得的数据返回给IO线程,通常情况下slave 从库位置的master.info要比master主库的要落后。IO线程拿到数据,先放到TCP/IP缓存里,因为主从复制是异步的,master.info是记录上一次获取的数据区间,TCP缓存会把位置点数据放到relay-log中继日志里面,sql语句会根据relay-log执行sql语句,并且把已经执行的序号记录到relay-log里面,因为TCIP缓存会不停得向relay-log存数据,所以需要这样一个relay-log记录日志。
在这里插入图片描述
当主库宕机的时候,主库的binlog会被保存,对比从库的数据量,找到数据最新的从库(通过对比relay-log)对比那个slave最接近主库。因为数据库有一定的命中率,考虑到效率问题,通过slave上的slave-log将其他从库数据补全至salve01一样,然后将slave01提升为主库,再将保存下来的binlog数据恢复到slave01上,其他从库开启主从复制,MHA切换一般10s - 30s.

在这里插入图片描述

posted @ 2019-08-11 20:27  不会玩python  阅读(9)  评论(0编辑  收藏  举报