Chapter 6. Replication in MySQL
6.1. Introduction to Replication
Mysql 3.23以上版本支持单向复制,一个服务器作为主服务器,一个或者多个其他的服务器作为从服务器。
主服务器写更新到二进制的日志文件,日志循环纪录,保持一个索引。从服务器通知主服务器它最后成功更新的日志点,取得这点之后的所有更新并同步,然后等待主服务器通知新的更新。
从服务器也可以作为主服务器,如果你建立链状的复制。注意,如果你使用复制,则所有的更新应该在主服务器上执行,否则会出现主从之间的数据冲突。
单向复制特点:
² 如果主服务器有问题,可以切换到从服务器
² 可以在从服务器上执行查询操作,降低主服务器的负载。
² 可以在从服务器上执行备份,以避免影响主服务器。
6.2. Replication Implementation Overview
复制是基于主服务器的二进制日志,所以必须打开二进制日志。(这里和oracle的归档机制很类似)
从服务器接受主服务器的日志并更新以保持和主服务器的同步。
从服务器必须在主服务器启动二进制日志以后开始建立,否则不能同步。
可以使用LOAD DATA FROM MASTER语法拷贝主数据库德数据,这个命令在4.0.0以后提供,而且只可以针对MYISAM类型的表。这个命令执行的时候,在表上建立一个全局的读锁,所以在数据传输到从服务器时,不能执行更新操作。
推荐在传输的数据集比较小或者主数据库可以接受比较长时间的锁定的前提下使用这个语法。
LOAD DATA FROM MASTER的速度随系统的不同而不同,但是粗略统计是1秒钟1M数据,如果你的主从服务器操作系统大致等同于700M奔腾100M网卡,则应该接近于这个值。
在从服务器按照主服务器建立以后,从服务器会连接到主服务器并等待更新,如果和主服务器的连接出现问题,会周期性的重试,重试的时间间隔由参数--master-connect-retry设置,默认是60秒。
当前需要更新那个日志以及更新了哪些日志都记录在从服务器中,不会记录在主服务器中。
6.3. Replication Implementation Details
复制通过三个进程来实现,一个在主服务器上执行,两个在从服务器上执行。当执行了START SLAVE命令以后,从服务器创建了一个I/O线程,这个线程连接到主服务器,请求二进制的日志文件。主服务器创建一个线程发送文件到从服务器,如果你在主服务器上使用SHOW PROCESSLIST显示进程,则Binlog Dump就是这个线程。从服务器读主服务器的Binlog Dump线程发送的内容,拷贝到一个叫relay logs的目录。第三个线程是sql线程,是在从服务器上读relay logs并且更新内容的。
一个主服务器可以对应多个从服务器,在主服务器上启动一个线程对应从服务器,每个从服务器上都启动自己的I/O和sql线程。
在4.0.2之前的版本中,复制只包括两个线程,在主从服务器上各一个,从服务器上的拷贝和执行是一个线程,不需要写relay logs。
那么把拷贝和执行拆成两个单独得任务的好处是拷贝和执行的速度是不同的,这和oracle是类似的,拷贝和执行的进程是分开的,互相没有影响。
我们可以在主服务器上看到的进程:
mysql> show processlist G
*************************** 1. row ***************************
Id: 19
User: root
Host: localhost
db: lisa_db
Command: Query
Time: 0
State: NULL
Info: show processlist
*************************** 2. row ***************************
Id: 23
User: repl
Host: *:32796
db: NULL
Command: Binlog Dump
Time: 449
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
2 rows in set (0.00 sec)
我们可以在从服务器上看到的进程:
mysql> show processlist G
*************************** 1. row ***************************
Id: 8
User: root
Host: localhost
db: NULL
Command: Query
Time: 0
State: NULL
Info: show processlist
*************************** 2. row ***************************
Id: 9
User: system user
Host:
db: NULL
Command: Connect
Time: 486
State: Waiting for master to send event
Info: NULL
*************************** 3. row ***************************
Id: 10
User: system user
Host:
db: NULL
Command: Connect
Time: 486
State: Has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
3 rows in set (0.00 sec)
6.3.1. Replication Master Thread States
以下列出的是常见的主服务器Binlog Dump线程的状态,如果看不到这个进程,则复制没有执行。
• Sending binlog event to slave
• Finished reading one binlog; switching to next binlog
• Has sent all binlog to slave; waiting for binlog to be updated
• Waiting to finalize termination
6.3.2. Replication Slave I/O Thread States
以下列出的是常见的从服务器I/O线程的状态,从4.1.1开始,这个状态也可以通过SHOW SLAVE STATUS命令的Slave_IO_State列显示。
• Connecting to master
• Checking master version
• Registering slave on master
• Requesting binlog dump
• Waiting to reconnect after a failed binlog dump request
• Reconnecting after a failed binlog dump request
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/51862/viewspace-180646/ ,如需转载,请注明出处,否则将追究法律责任。