本篇内容介绍了“MySQL中的主备、主从和读写分离的原理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
一、MySQL主备的基本原理
在状态1中,客户端的读写都直接访问节点A,而节点B是A的备库,只是将A的更新都同步过来,到本地执行。这样可以保持节点B和A的数据是相同的。当需要切换的时候,就切成状态2。这时候客户端读写访问的都是节点B,而节点A是B的备库。【相关推荐:mysql视频教程】
在状态1中,虽然节点B没有被直接访问,但是建议把备库节点B,设置成只读模式。有以下几个原因:
1.有时候一些运营类的查询语句会被放到备库上去查,设置为只读可以防止误操作
2.防止切换逻辑有bug
3.可以用readonly状态,来判断节点的角色
备库B和主库A之间维持了一个长连接。主库A内部有一个线程,专门用于服务备库B的这个长连接。一个事务日志同步的完整过程如下:
1.在备库B上通过change master命令,设置主库A的IP、端口、用户名、密码,以及要从哪个位置开始请求binlog,这个位置包含文件名和日志偏移量
2.在备库B上执行start slave命令,这时备库会启动两个线程,就是图中的io_thread和sql_thread。其中io_thread负责与主库建立连接
3.主库A校验完用户名、密码后,开始按照备库B传过来的位置,从本地读取binlog,发给B
4.备库B拿到binlog后,写到本地文件,称为中转日志
5.sql_thread读取中转日志,解析出日志里的命令,并执行
由于多线程复制方案的引入,sql_thread演化成了多个线程
二、循环复制问题
节点A和节点B互为主备关系。这样在切换的时候就不用再修改主备关系
双M结构有一个问题要解决,业务逻辑在节点A上更新了一条语句,然后再把生成的binlog发给节点B,节点B执行完这条更新语句后也会生成binlog。那么,如果节点A同时是节点B的备库,相当于又把节点B新生成的binlog拿过来执行了一次,然后节点A和B间,会不断地循环执行这个更新语句,也就是循环复制
MySQL在binlog中记录了这个命令第一次执行时所在实例的server id。因此,可以用下面的逻辑,来解决两个节点间的循环复制问题:
1.规定两个库的server id必须不同,如果相同,则它们之间不能设定为主备关系
2.一个备库接到binlog并在重放的过程中,生成与原binlog的server id相同的新的binlog
3.每个库在收到从自己的主库发过来的日志后,先判断server id,如果跟自己的相同,表示这个日志是自己生成的,就直接丢弃这个日志。
大型站长资讯类网站! https://www.0455zz.com