Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_02

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_03

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_04

redolog相关

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_05

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_06

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_07

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_08

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_09

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_10

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_11

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_12

这么一来,binlog 也可以组提交了。在执行图 5 中第 4 步把 binlog fsync 到磁盘时,如果有多个事务的 binlog 已经写完了,也是一起持久化的,这样也可以减少 IOPS 的消耗。

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_13

mysql的主从复制

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_14

binlog的statement模式,是unsafe的

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_15

你可以看到,当 binlog_format 使用 row 格式的时候,binlog 里面记录了真实删除行的主键 id,这样 binlog 传到备库去的时候,就肯定会删除 id=4 的行,不会有主备删除不同行的问题。

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_16

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_17

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_18

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_19

Mysql高可用

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_20

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_21

mysql备库并行复制

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_22

在官方的 5.6 版本之前,MySQL 只支持单线程复制,由此在主库并发高、TPS 高时就会出现严重的主备延迟问题。5.6推出了多线程复制

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_23

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_24

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_25

一主多从的主备切换

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_26

相比于一主一备的切换流程,一主多从结构在切换完成后,A’会成为新的主库,从库 B、C、D 也要改接到 A’。正是由于多了从库 B、C、D 重新指向的这个过程,所以主备切换的复杂性也相应增加了。

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_27

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_28

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_29

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_30

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_31

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_32

这跟基于位点的主备协议不同。基于位点的协议,是由备库决定的,备库指定哪个位点,主库就发哪个位点,不做日志的完整性判断。

Mysql读写分离

  更新主库数据后,立刻读从库,会读到事务提交前的数据

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_33

判断主备无延迟 方案 :

   1.先判断show slave status 结果里的 seconds_behind_master是否为0

   2.对比位点确保主备无延迟

   3.对比GTID集合确保主备无延迟 

 等主库位点方案 :

   Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_34

等GTID方案

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_35

查询内存的使用

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_36

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_37

因此,对于正常的线上业务来说,如果一个查询的返回结果不会很多的话,建议你使用 mysql_store_result 这个接口,直接把查询结果保存到本地内存。

   查询的结果是分段发给客户端的,因此扫描全表,查询返回大量的数据,并不会把内存打爆。

Mysql 运维知识  主备 && 复制 && 主从切换 && 读写分离_mysql_38