如图,原本一个一主多从的服务是这样子的
主备切换后的结果
基于位点的主备切换
把节点B设置成节点A’的从库的时候,需要执行一条change master命令,这条命令有以下6个参数:
- MASTER_HOST、MASTER_PORT、MASTER_USER和MASTER_PASSWORD四个参数,分别代表了主库A’的IP、端口、用户名和密码。
- 最后两个参数MASTER_LOG_FILE和MASTER_LOG_POS表示,要从主库的master_log_name文件的master_log_pos这个位置的日志继续同步。而这个位置就是我们所说的同步位点,也就是主库对应的文件名和日志偏移量。
原来节点B是A的从库,本地记录的也是A的位点。但是相同的日志,A的位点和A’的位点是不同的。因此,从库B要切换的时候,就需要先经过“找同步位点”这个逻辑。这个点很难精确到,只能取一个大概的位置。考虑到切换过程中不能丢数据,所以我们找位点的时候,总是要找一个“稍微往前”的,然后再通过判断跳过那些在从库B上已经执行过的事务。
一种取同步位点的方法是这样的:
1. 等待新主库A’把中转日志(relay log)全部同步完成;
2. 在A’上执行