Mysql replication(主从)配置
一、Mysql主从应用场景
- 原理是master上数据更新时会记录一个bin-log,slave会实时同步该bin-log然后slave根据bin-log的sql语句进行相应的操作
- Mysql主从可以实时备份,保证数据高安全性
- 可以应用在读写分离的场景中,用以降低单台Mysql服务器的I/O
- 可以实现Mysql服务的HA集群
- 可以是1主多从,也可以是互相主从(主主)
二、配置mysql服务
- MySQL Replication 又叫做AB复制或者主从复制。它主要用于MySQL的时时备份或者读写分离。在配置之前先做一下准备工作,配置两台mysql服务器
二、配置repication
把一个mysql作为主(master),另一个mysql作为从(slave). 为了让实验更加像生产环境,所以先在master上创建一个库db1,并且把mysql的库数据复制给它:
[[email protected] bin]# mysql -uroot -p #登陆进入mysql
mysql> create database db1;
Query OK, 1 row affected (0.01 sec)
mysql> quit
/usr/bin/mysqldump -uroot -p mysql > /home/123.sql #备份master的mysql库到/home/123.sql
mysql -uroot -p db1 < /home/123.sql #将/home/123.sql恢复到master的db1库
1. 设置master
修改配置文件:
vim /etc/my.cnf
在[mysqld]部分查看是否有以下内容,如果没有则添加:
server-id=1
log-bin=mysql-bin
除了这两行是必须的外,还有两个参数,你可以选择性的使用:
binlog-do-db=databasename1,databasename2 #设置需要同步的库名
binlog-ignore-db=databasename1,databasename2 #设置忽略不同步的库名
binlog-do-db=需要复制的数据库名,多个数据库名,使用逗号分隔。binlog-ignore-db=不需要复制的数据库库名,多个数据库名,使用逗号分隔。这两个参数其实用一个就可以啦。
如果修改过配置文件需要重启mysqld服务,否则不需要重启:
killall mysqld #停止mysql
/etc/init.d/mysqld start #启动mysql
mysql> grant replication slave on *.* to ‘repl‘@‘slave的IP‘ identified by ‘123123‘; #这里的repl是为slave端设置的访问master端mysql数据的用户,密码为123123,这里的127.0.0.1为slave的ip。
mysql> flush tables with read lock; #锁定数据库,此时不允许更改任何数据
mysql> show master status; #查看状态,这些数据是要记录的,一会要在slave端用到
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000006 | 474952 | | |
+------------------+----------+--------------+------------------+
2. 设置slave
先修改slave的配置文件my.cnf:
vim /etc/my.cnf
增加一行“server-id = 2” 总之不能让这个id和master一样,否则会报错,此项必须加在[mysqld]选项下方可生效,另外在slave上,你也可以选择性的增加如下两行,对应于master上增加的两行:
replicate-do-db=databasename1,databasename2
replicate-ignore-db=databasename1,databasename2
改完后,重启slave:
service mysqld restart
拷贝master上的db1库的数据到slave上
/usr/bin/mysqldump -uroot -p db1 > /home/db1.sql #备份master上的db1到/home/db1.sql
用scp或者用winscp将db1.sql拷贝到slave上并恢复到slave上的db1库
把数据拷贝过来后,就需要在slave上配置主从了:
[[email protected] ~]# mysql -uroot -pyourpassword
mysql> slave stop;
mysql> change master to master_host=‘masterIP‘, master_port=3307,
master_user=‘repl‘, master_password=‘123123‘,
master_log_file=‘mysql-bin.000006‘, master_log_pos=474952;
mysql> slave start;
相信聪明的你一定可以看懂上面的各个参数分别表示什么含义,其中master_log_file和master_log_pos是在上面使用 show master status 查到的数据。执行完这一步后,需要在master上执行一步:
mysql -uroot -p123456 -e "unlock tables" #解锁master上的表
然后查看slave的状态:
mysql> show slave status\G;
确认以下两项参数都为yes:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
测试Mysql主从
在master上执行如下命令:
[[email protected] ~]# mysql -uroot -p -e "use db1;select count(*) from db"
+----------+
| count(*) |
+----------+
| 2 |
+----------+
[[email protected] ~]# mysql -uroot -p -e "use db1;truncate table db"
[[email protected] ~]# mysql -uroot -p -e "use db1;select count(*) from db"
+----------+
| count(*) |
+----------+
| 0 |
+----------+
这样清空了db1.db表的数据,下面查看slave上的该表数据:
[[email protected] ~]# mysql -uroot -p -e "use db1; select count(*) from db"
+----------+
| count(*) |
+----------+
| 0 |
+----------+
slave上的该表也被清空了。这样好像不太明显,不妨继续把db表删除试试:
[[email protected] ~]# mysql -uroot -p -e "use db1; drop table db"
[[email protected] ~]# mysql -uroot -p -e "use db1; select count(*) from db"
ERROR 1146 (42S02) at line 1: Table ‘db1.db‘ doesn‘t exist
这次很明显了。
主从配置起来很简单,但是这种机制也是非常脆弱的,一旦我们不小心在从上写了数据,那么主从也就被破坏了。另外如果重启master,务必要先把slave停掉,也就是说需要在slave上去执行 slave stop 命令,然后再去重启master的mysql服务,否则很有可能就会中断了。当然重启完后,还需要把slave给开启 slave start.