17.2 Replication Implementation 复制是基于master server 跟踪所有改变到他的数据库(更新,删除等等)在它的binary log. binary log 作为些所有事件修改数据的结构或者内容从server 开始启动 典型的,SELECT 语句是不被记录的因为它们既不修改数据库也不修改内容 每个slave 连接到master 请求一个binary log的拷贝。 也就是说,它从master 拉数据,相比master 推数据到slave. slave也执行从binary log 执行events 。 这个重复原始的改变 就像它们在master上一样。 表时被创建或者它们的结果修改,数据被插入,删除,和更新根据改变发生在master上一样 因为每个slave 是独立的,replay master 的binary log的改变发生在每个slave (slave是连接到Master) 此外,因为每个slave 接收一份Binary log的拷贝只要通过从master 请求, slave 是可以读取和更新数据库的拷贝以自己的步伐可以启动和停止复制进程 不影响更新最新的数据库状态在主或者从一侧 master binary log 是些到一个本地的的relay log 在slave端在它被处理前。 Vsftp:/data01/mysql# ls -ltr *relay* -rw-rw---- 1 mysql mysql 120 Nov 14 10:27 Vsftp-relay-bin.000001 -rw-rw---- 1 mysql mysql 25 Nov 14 10:27 Vsftp-relay-bin.index -rw-rw---- 1 mysql mysql 221 Nov 14 21:59 mysqld-relay-bin.000006 -rw-rw---- 1 mysql mysql 52 Nov 14 21:59 mysqld-relay-bin.index -rw-rw---- 1 mysql mysql 198021585 Nov 15 09:14 mysqld-relay-bin.000007 slave 也记录信息关于当前的master binary log和local relay log的位置 17.2.1 Replication Implementation Details 复制实现细节: MySQL 复制功能是实现使用3个进程,一个在master server和2个在slave上。 1.Binlog dump thread,master 创建一个线程来发送binary log 内容到一个slave 当slave连接时。 这个线程可以是被在SHOW PROCESSLIST 的输出在master上 zabbix:/data01/mysql# mysql -uroot -p1234567 -e "SHOW PROCESSLIST" | 198968 | backup | 192.168.11.187:45976 | NULL | Binlog Dump | 46595 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL | | 204759 | root | localhost | NULL | Query | 0 | init | SHOW PROCESSLIST | binary log dump thread 需要一个lock 在master的binary log 对于读取每个event 发送到slave. 当event 被读取,lock是被释放,甚至在event被发送到slave之前 Slave I/O thread. 当一个START SLAVE 语句是执行在一个slave server,slave 创建一个I/O thread, 连接到master 和告诉master 发送更新记录在master的binary logs. slave I/O thread 读取更新 master的Binlog Dump thread 发送的 复制他们到本地的文件 slave的relay log thread 的状态是显示为Slave_IO_running 在SHOW SLAVE STATUS的输出 或者SHOW STATUS. 的 Slave_running Slave SQL thread slave创建一个SQL thread 来读取relay log 被 slave I/O thread写入的, 执行其中包含的事件 在先前的描述,有三个线程么每个master/slave 连接。一个master 有多个slaves 创建一个binary log dump thread 对于米格连接的slave, 每个slave 有它自己的I/O和SQL threads. 一个slave 使用2个threads 来分别的读取更新从master 和执行它们到单独的任务。 因此,读取任务的语句是不会减慢如果语句执行是慢的, 例如,如果slave server 没有运行一段时间,它的I/O thread 可以快速的获取binary log 内容从master 当slave 开始后, 即使SQL thread 远远落后,如果slave 停止 在SQL thread 已经执行所有取得的SQL之前, I/O thread 已经至少获取了一切这样一个安全的语句的拷贝是存储在本地的slave的relay logs里, 准备用于执行 等下次slave 启动的时候 SHOW PROCESSLIST 语句提供了信息高速你 Master上发生了什么,slave上关于复制 slave: mysql> SHOW PROCESSLIST ; +----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+------------------+ | 11 | system user | | NULL | Connect | 51213 | Waiting for master to send event | NULL | | 12 | system user | | NULL | Connect | -140 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL | | 14 | root | localhost | NULL | Query | 0 | init | SHOW PROCESSLIST | +----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+------------------+ 3 rows in set (0.00 sec) 下面的例子阐述3个线程在SHOW PROCESSLIST的输出 在master server上,SHOW PROCESSLIST 输出像这样: mysql> SHOW PROCESSLIST\G *************************** 1. row *************************** Id: 2 User: root Host: localhost:32931 db: NULL Command: Binlog Dump Time: 94 State: Has sent all binlog to slave; waiting for binlog to be updated Info: NULL 在这里, 线程2 是一个 Binlog Dump replication thread 服务一个连接的slave. 状态信息表明所有的更新已经发送到slave ,master是等待更多的更新发生。 如果你看到 no Binlog Dump threads 在master server上, 这意味着复制是没有被运行,没有slave 是当前连接的。 On a slave server, the output from SHOW PROCESSLIST looks like this: 在slave server上,SHOW PROCESSLIST 输出像这样: mysql> SHOW PROCESSLIST\G *************************** 1. row *************************** Id: 10 User: system user Host: db: NULL Command: Connect Time: 11 State: Waiting for master to send event Info: NULL *************************** 2. row *************************** Id: 11 User: system user Host: db: NULL Command: Connect Time: 11 State: Has read all relay log; waiting for the slave I/O thread to update it Info: NULL 状态信息表明 thread 10 是I/O thread 和master server通讯, 线程11是SQL thread 处理更新存储在relay logs.
17.2.1 Replication Implementation Details 复制实现细节:
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
上一篇:17.2.2 Replication Relay and Status Logs 复制Relay 和状态日志;
下一篇:17.1.4 Replication and Binary Logging Options and Variables 复制和Binary logging 选项和变量
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Spring的自动注入小细节
Spring的自动注入小细节
spring 自动注入 byName byType -
PostgreSQL复制(Replication)技术简述
1.Write Ahead Log(WAL)PostgreSQL提供数据持久保证的主要技术是通过其预写日志(Write Ahead Log(WAL))。所有事务数
PostgreSQL WAL replica stream slony -
17.2 Replication Implementation 复制实施
17.2 Replication Imple...
数据 数据库 更新数据 lua 数据库结构