一.MySQL 主备的基本原理
主备切换流程:

- 客户端的读写直接访问节点A,而节点B是A备库,只是将A的更新都同步过来,到本地执行,这样保持节点B和A的数据时相同的
- 切换到状态2,客户端读写访问的都是节点B,而节点A是B的备库
将节点B(备库)设置成只读(readonly)模式
- 一些运营类的查询语句会被放到备库上去查,设置只读防止误操作;
- 防止切换逻辑有bug。切换过程中出现双写,造成主备不一致;
- readonly状态,来判断节点的角色
将备库设置成只读,跟主库保持同步更新:
因为 readonly 设置对超级 (super) 权限用户是无效的,而用于同步更新的线程,就拥有超级权限。
二.UPDATE语句在节点A执行同步到节点B上的步骤:

- 主库接收客户端的跟心请求后,执行内部事务的更新逻辑,同时写binlog
- 备库B跟主库A之间维持了一个长连接。主库A内部有专门线程来服务备库B的长连接
三.事务日志同步的完整过程:
- 在备库B上通过change master命令,设置主库A的IP。端口,用户名,密码以及哪个位置开始请求binlog,这个位置包含文件名和日志偏移量
- 在备库B上执行start slave命令,这时候备库会启动两个线程,就是图中的 io_thread 和 sql_thread。其中 io_thread 负责与主库建立连接
- 主库A校验完用户名,密码后,开始按照备库B传过来的位置,从本地读取binlog,发给B
- 备库B拿到binlog后,写到本地文件,称为中转日志(relay log)
- sql_thread读取中专日志,解析出日志中的命令,并执行。