主从复制的优点:
- 主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为备份。
- 通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同步。如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。
- 使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续。
主从复制的工作原理:
主从复制的通过3个过程来实现,其中一个过程发生在主服务器上,另两个过程发生在从服务器。
- 主服务器将用户对数据库的更新操作以二进制的格式保存在Binary Log日志文件中,然后由Binlog Dump线程将Binary Log日志文件传输到从服务器。
- 从服务器通过一个I/O线程将主服务器上的Binary Log日志文件中的更新操作复制到一个叫做Relay Log的中继日志文件中。
- 从服务器通过另一个SQL线程将Relay Log中继日志文件中的操作依次在本地执行,从而实现主从服务器之间的数据同步。
主从复制的详细过程如图:
- Binlog Dump线程
Binlog Dump线程运行在主服务器上,主要工作是把Binary Log日志文件的数据发送给从服务器。
使用show processlist语句可以查看该线程是否在运行。
- I/O线程
从服务器执行start slave语句后,创建一个I/O线程。此线程运行在从服务器上,与主服务器建立连接,然后向主服务器发出更新请求,I/O线程将主服务器发送的更新操作复制到本地Relay Log中继日志文件中。
使用show slave status语句可以查看I/O线程的状态。
- SQL线程
SQL线程运行在从服务器上,主要工作是读取Relay Log中继日志文件中的更新操作,并将这些操作以此执行,从而使主从数据得到同步。
主从复制的配置:
- 确认主从服务器MySQL版本
MySQL不同版本的BinLog格式可能不一样,最好采用相同的版本。至少要保证主服务器的版本不高于从服务器。
- 在主服务器上为从服务器设置一个链接账户,授予replication salve权限
mysql> grant replication slave on *.* to 'slave1'@'192.168.2.11' identified by '123456';
配置主服务器:
打开主服务器上MySQL的配置文件(my.cnf),加入下面两行:
log-bin=mysql-bin server-id= 1
注:我的MySQL服务器版本是5.5.16-log,上面两行本来就有。
重启主服务器的MySQL,进入mysql终端
运行下面的命令,会输出如图的结果:
show master status;
File表示主服务器上正在使用的二进制文件;
Position的值表示下一个被记录事件的位置。
Binlog_Do_DB和Binlog_Ignore是主服务器控制写日binlog文件内容的过滤选项。默认为空,表示不过滤。
File和Position两个字段指明从服务器将从主服务器的哪个binlog文件复制,以及复制的开始位置。
配置从服务器
环境:
CentOS 5.6 + MySQL 5.5.16-log
主服务器IP:192.168.2.10
从服务器一IP:192.168.2.11;
从服务器二IP:192.168.2.12;
打开从服务器上MySQL的配置文件(my.cnf),加入下面两行:
log-bin=mysql-bin server-id= 2
重启从服务器的mysql。进入mysql终端
输入下面的命令:
change master to master_host="192.168.2.10", master_user="slave1", master_port=3306, master_password="123456", master_log_file="mysql-bin.000002", master_log_pos=107 ;
连接主从服务器
在从服务器上,进入mysql终端,输入下面命令,开始复制。
mysql> start slave;
用下面的命令查看salve的状态:
mysql> show slave status\G;
如果看到上面图上的两个都为Yes,说明从服务上的I/O线程和SQL线程都已经开始运行了。这时如果在服务器上进行修改,可以在从服务器上看到各种日志位置的变化,以及数据库中数据的变化。
测试
在主服务器上执行下面的几条命令
mysql> use test; mysql> create table test(id int not null); mysql> insert into test values(1),(2),(3);
在从服务器上,可以用下面的语句查看从服务器数据的变化
mysql> select * from test.test;
如果不出意外的话,从库的test数据库中已经多了一个test表,并且插入了三条数据。
如果我们的主从运行了一段时间后,我们想再加一台从服务器。可以在主服务器上赋予这台从服务器权限。
mysql> grant replication slave on *.* to 'slave2'@'192.168.2.12' identified by '654321';
在从服务器二上,修改mysql的配置文件(my.cnf):
log-bin=mysql-bin server-id= 3
重启从服务器二。进入mysql终端,输入下面命令:
change master to master_host="192.168.2.10", master_user="slave2", master_port=3306, master_password="654321", master_log_file="mysql-bin.000002", master_log_pos=0 ;
此处master_log_pos=0表示从开始从日志的开始位置开始读。
启动服务器二mysql的slave,在mysql终端输入:
mysql> start slave;
查看slave的状态
mysql> show slave status\G;
如果出现的是Salve_I/O_Running : Yes 和 Salve_SQL_Running : Yes ,这说明服务器二配置成功了,
这是在从服务器二上,查看test数据库。
mysql> select * from test.test;
发现test数据库里的test表也同步过来了。