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
命令确认主库的host
、user
、logfile
、log_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.