mysql 主从搭建原理
同步机制实现概念
MySQL同步机制基于master把所有对数据库的更新、删除等)都记录在二进制日志里。因此,想要启用同步机制,在master就必须启用二进制日志。每个slave接受来自master上在二进制日志中记录的更新操作,因此在slave上执行了这个操作的一个拷贝。
所有的slave必须在启用二进制日志时把master上已经存在的数据拷贝过来。如果运行同步时slave上的数据和master上启用二进制日志时的数据不一致的话,那么slave同步就会失败。(拷贝方法见后面)
slave上已经完整拷贝master数据后,就可以连接到master上然后等待处理更新了。如果master当机或者slave连接断开,slave会定期尝试连接到master上直到能重连并且等待更新。重试的时间间隔由--master-connect-retry选项来控制,它的默认值是60秒。
每个slave都记录了它关闭时的日志位置。msater是不知道有多少个slave连接上来或者哪个slave从什么时候开始更新。
注:启用同步后,所有要同步的更新操作都必须在master上执行。否则,必须注意不要造成用户在master上的更新和在slave上的更新引起冲突。
1、同步实现步骤
步骤一:MySQL同步功能由3个线程(master上1个,slave上2个)来实现。执行START SLAVE语句后,SLAVE就创建一个I/O线程。
步骤二:I/O线程连接到master上,并请求master发送二进制日志中的语句。
步骤三:master创建一个线程来把日志的内容发送到slave上。这个线程在master上执行SHOW PROCESSLIST 语句后的结果中的Binlog Dump线程便是。
步骤四:slave上的I/O线程读取master的Binlog Dump 线程发送的语句,并且把它们拷贝到其数据目录下的中继日志(relay logs)中。
步骤五:第三个是SQL线程,salve用它来读取中继日志,然后执行它们来更新数据。
可参见下图图示:
每个master/slave上都有三个进程,master有多个线程,他为每个slave连接都创建一个线程,而每个slave只有I/O和SQL线程。
slave有2个线程的好处:把读日志和执行分开成2个独立的任务。执行任务如果慢的话,读日志任务不会跟着慢下来。
如:slave停止了一段时间,那么I/O线程可以在slave启动后很快地从master上读取全部日志,尽管SQL线程可能落后I/O线程好几的小时。如果slave在SQL线程没全部执行完就停止了,但I/O线程却已经把所有的更新日志都读取并且保存在本地的中继日志中了,因此在slave再次启动后就会继续执行它们了。这就允许在master上清除二进制日志,因为slave已经无需去master读取更新日志了。


浙公网安备 33010602011771号