Mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。
1 mysql支持的复制类型:
(1):基于语句的复制: 在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。
一旦发现没法精确复制时, 会自动选着基于行的复制。
(2):基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 从mysql5.0开始支持
(3):混合类型的复制: 默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
MySQL复制技术有以下一些特点:
(1) 数据分布 (Data distribution )
(2) 负载平衡(load balancing)
(3) 备份(Backups)
(4) 高可用性和容错行 High availability and failover
整体上来说,复制有3个步骤:
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,将改变反映它自己的数据。
下图描述了复制的过程:
该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程――I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制――复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。
有两台MySQL数据库服务器Master和slave,Master为主服务器,slave为从服务器,初始状态时,Master和slave中的数据信息相同,当Master中的数据发生变化时,slave也跟着发生相应的变化,使得master和slave的数据信息同步,达到备份的目的。
要点:
负责在主、从服务器传输各种修改动作的媒介是主服务器的二进制变更日志,这个日志记载着需要传输给从服务器的各种修改动作。因此,主服务器必须激活二进制日志功能。从服务器必须具备足以让它连接主服务器并请求主服务器把二进制变更日志传输给它的权限。
配置环境:
数据库版本:MySQL-5.5.16
操作系统: redhat 5.10
在搭建主从服务器时,主,从 服务器的数据库版本和数据库的初始环境必须一致,即主服务器的MySQL什么样从MySQL就得是什么样的。 主,从服务器MySQL服务搭建完成以后,在主服务器上
1、在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE权限。用户名的密码都会存储在文本文件master.info中
命令如下:
mysql > GRANT REPLICATION SLAVE ON *.* TO backup@’10.100.0.200’ IDENTIFIED BY ‘1234’;
建立一个帐户backup,并且只能允许从10.100.0.200这个地址上来登陆,密码是1234。只授权是从数据库服务器,不授权其他权限
接下来对master进行配置,包括打开二进制日志,指定唯一的servr ID。例如,在配置文件加入如下值:
vim /etv/my.cnf
[mysqld]
server-id=1
log-bin=mysql-bin
server-id=1 //为主服务器A的ID值唯一的ID号
log-bin=master-bin //二进制日志文件
log-bin-index=master-bin.index //二进制日志索引文件
innodb-file-per-table=1
datadir= //如果数据目录在其他分区这里需要指定
sync-binlog = on //用于事务安全,主服务器事务一提交马上写入二进制日志
启动服务器,查看二进制日志文件
MySQL> SHOW MASTER STATUS;
+------------------------+---------------+-----------------------+----------------------+
| file |position | binlog_do_db | binlog_ignore_db |
+------------------------+---------------+-----------------------+----------------------+
| master-bin.000001 | 399 | | |
+------------------------+----------------+-----------------------+----------------------+
1 row in set (0.00 sec)
二进制日志从399开始是因为主服务器做过授权,而从服务器不需要复制授权信息,所以要从399以后开始复制3.配
Slave的配置与master类似,你同样需要重启slave的MySQL。如下:
vim /etv/my.cnf
log_bin = slave-bin //如果不在做其他从服务器的主服务器的话,就不要记录二进制日志
server_id = 11 //尽量写的大一些方便以后改动
relay_log = slave-relay-bin
relay_log-index = slave-relay-bin.index
log_slave_updates = 1 //slave将复制事件写进自己的二进制日志
read_only = 1 //配置从服务器为只读的,为安全考虑,为中继日志
datadir= //数据存放目录
接下来就是让slave连接master,并开始重做master二进制日志中的事件。你不应该用配置文件进行该操作,而应该使用CHANGE MASTER TO语句,该语句可以完全取代对配置文件的修改,而且它可以为slave指定不同的master,而不需要停止服务器。如下:
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.100.0.100', //可以是主机名也可以是主服务器的IP地址
-> MASTER_USER='backup', //授权用户的用户账号
-> MASTER_PASSWORD='1234', //授权用户的用户密码
-> MASTER_LOG_FILE='master-bin.000001', //使用的二进制日志文件
-> MASTER_LOG_POS=399; //二进制日志的复制开始位置
mysql>show slave status;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host:10.100.0.100
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 399
Relay_Log_File: slave-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: master-bin.000001
Slave_IO_Running: No
Slave_SQL_Running: No
...omitted...
Seconds_Behind_Master: NULL
这俩项还是NO状态,说明还没有开始复制,这是要执行
MySQL>start slave;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host:10.100.0.100
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001 //当前读取的二进制日志文件
Read_Master_Log_Pos: 399 //读取二进制日志的位置
Relay_Log_File: slave-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: master-bin.000001
Slave_IO_Running: yes
Slave_SQL_Running:yes
...omitted...
Seconds_Behind_Master: NULL
slave的I/O和SQL线程都已经开始运行,而且Seconds_Behind_Master不再是NULL。日志的位置增加了,意味着一些事件被获取并执行了。如果你在master上进行修改,你可以在slave上看到各种日志文件的位置的变化,同样,你也可以看到数据库中数据的变化。
还可以单独启动或关闭slave_io 和slave_sql
mysql >start slave io_thread;
mysql >stop slave io_thread;
mysql >start slave sql_thread;
mysql >stop slave sql_thread;
可查看master和slave上线程的状态。在master上,你可以看到slave的I/O线程创建的连接:
在master和slave上输入show processlist\G;
MySQL>show processlist\G;
从服务器上俩个重要的文件 master.info 和 relay-log.info
master.info 记录了主服务的每次使用的二进制日志文件及位置 ,主服务器的IP ,端口号 用户名和密码等信息
relay-log.info记录了 realy-log正在使用的文件和主服务器二进制日志文件及事件位置