MySQL支持单向、异步复制,复制过程中一个Linux服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护日志文件的一个索引以跟踪日志循环,当一个从服务器连接到主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知下一次更新,为什么使用主从复制?
1、主服务器/从服务器设置增加了健壮性,主服务器出现问题时,你可以切换到从服务器作为备份.
2、通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间,但是不要同时在主从服务器上进行更新,这样可能引起冲突
3、使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器,在备份过程中主服务器可以继续处理更新
下面来演示下MySQL主从复制的配置:
[root@server2 ~]# ifconfig eth0 |grep 'inet addr'|cut -d ':' -f 2 |cut -d ' ' -f 1
192.168.122.20 //主服务器IP
[root@server3 ~]# ifconfig eth0 |grep 'inet addr'|cut -d ':' -f 2 |cut -d ' ' -f 1
192.168.122.30 //从服务器IP
[root@server2 ~]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.36-log Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> grant replication slave on *.* to 'test'@'192.168.122.30' identified by '123456'; //建立一个test用户给slave服务器同步
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges; //刷新权限表
Query OK, 0 rows affected (0.00 sec)
mysql> create database yang;
Query OK, 1 row affected (0.00 sec)
[root@server3 ~]# mysql -u test -h 192.168.122.20 -p //slave服务器上的连接测试
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.36-log Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
[root@server2 ~]# grep -v '^#' /etc/my.cnf |grep -E '(server-id|binlog-do*|binlog-ignore*|log-bin)'
log-bin=mysql-bin //记录二进制日志
binlog-do-db=yang //同步数据库yang和cacti
binlog-do-db=cacti
binlog-ignore-db=mysql //不同步mysql和test数据库
binlog-ignore-db=test
server-id = 1 //server id为1
[root@server2 ~]# service mysqld start //重启数据库,需要注意的是在启动数据库前需要清除下已经存在的binlog,从服务器也是如此
Starting MySQL. SUCCESS!
[root@server2 ~]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.36-log Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show master status; //查看主服务器状态
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 106 | yang,cacti | mysql,test |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
[root@server3 ~]# grep -v '^#' /etc/my.cnf |grep -E '(server-id|replicate-do|master|log-bin+)'
log-bin=mysql-bin
server-id = 2
master-host = 192.168.122.20 //定义主服务器的ip,同步用的用户名,密码和端口
master-user = test
master-password = 123456
master-port = 3306
replicate-do-db=yang //定义yang和cacti两个数据库进行同步
replicate-do-db=cacti
[root@server3 ~]# service mysqld start
Starting MySQL. SUCCESS!
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.122.20
Master_User: test
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 106
Relay_Log_File: server3-relay-bin.000002
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes //这两个slave状态为OK表示正常
Slave_SQL_Running: Yes
Replicate_Do_DB: yang,cacti