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

主库设置为只可写入

从库设置为只读

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

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

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

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

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

mysql 分批处理数据 是什么意思_数据库

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记录日志。

mysql 分批处理数据 是什么意思_数据库_02


当主库宕机的时候,主库的binlog会被保存,对比从库的数据量,找到数据最新的从库(通过对比relay-log)对比那个slave最接近主库。因为数据库有一定的命中率,考虑到效率问题,通过slave上的slave-log将其他从库数据补全至salve01一样,然后将slave01提升为主库,再将保存下来的binlog数据恢复到slave01上,其他从库开启主从复制,MHA切换一般10s - 30s.

mysql 分批处理数据 是什么意思_mysql 分批处理数据 是什么意思_03