1. 介绍
MySQL数据库支持单向、双向、链式级联、环状等不同业务场景的复制。在复制过程中,一台服务器充当主服务器(Master),接收来自用户的内容更新,而一个或多个其他的服务器充当从服务器(Slave),接收来自主服务器binlog文件的日志内容,解析出SQL,重新更新到从数据库,使得主从服务器的数据达到一致。
如果设置了链式级联复制,那么从服务器本身除了充当从服务器外,也会同时充当其下面从服务器的主服务器,链式级联复制类似A—>B—>C的复制形式
。
MySQL的主从复制的主要场景有以下几个:
- 从服务器作为主服务器的实时数据备份
- 主从服务器实现读写分离(主写从读),从服务器实现负载均衡
- 把多个从服务器根据业务重要性进行拆分访问(从服务器根据业务进行拆分)
1.1 原理
MySQL的主从复制是一个异步
的复制过程(一般情况下感觉是实时的),数据将从一个MySQL数据库(Master)复制到另外一个MySQL数据库(Slave),在Master与Slave之间实现整个主从复制的过程是由三个线程参与完成的。其中有两个线程(SQL线程和I/O线程)在Slave端,另外一个线程(I/O线程)在Master端。
要实现MySQL的主从复制,首先必须打开Master端的binlog记录
功能,否则就无法实现。因为整个复制过程实际上就是Slave端从Master端获取binlog日志,然后再在Slave上以相同的顺序执行获取的binlog日志中所记录的各种SQL操作。
2. 配置
2.1 配置主服务器
-
更改配置文件,首先检查你的主服务器上的my.cnf的位置(
whereis my.conf
)并编辑(vim /etc/my.cnf
)
-
查看文件中是否已经在[mysqld]模块下配置了log-bin和server-id文件中是否已经在[mysqld]模块下
[mysqld] log-bin=mysql-bin //将mysql二进制日志取名为mysql-bin server-id=1 //为服务器设置一个独一无二的id便于区分,这里使用ip地址的最后一位充当server-id
保存后并退出(wq
),完后重启mysql服务(service mysqld restart
)
-
登陆主服务器(
mysql -uroot -pXXXXX
),分别输入show variables like 'server_id';
和show variables like 'log_bin';
来查看是否已经配置好server_id,和开启日志功能.
-
配置具有复制权限的用户
slave
,操作命令是:grant replication slave on *.* to 'slave'@'%.%' identified by '111111';
-
最后查看主服务器的日志(
show master status;
)请记住
File和Position
的信息,后面从服务器的配置会用到!!!
2.2 配置从服务器
我们的从服务器用的是本地虚拟环境配置的(phpStudy + Navicat for MySQL
)
- 配置本地my.cnf,设置
server_id=10
,切记不可和主服务器相同.
- 关闭slave(如果你以前配置过主从的话,一定要先关闭,没有的话忽略此步骤)命令:
stop slave;
- 完后登陆从服务器的mysql,执行命令:
MASTER_HOST : 设置要连接的主服务器的ip地址change master to master_host='118.24.205.235',master_port=3306,master_user='slave',master_password='111111',master_log_file='mysql-bin.000014',master_log_pos=252;
MASTER_USER : 设置要连接的主服务器的用户名
MASTER_PASSWORD : 设置要连接的主服务器的密码
MASTER_LOG_FILE : 设置要连接的主服务器的bin日志的日志名称,即上面第5步得到的信息
MASTER_LOG_POS : 设置要连接的主服务器的bin日志的记录位置,即上面第5步得到的信息,(这里注意,最后一项不需要加引号。否则配置失败) - 最后启动服务:
start slave;
并查询服务是否开启(show slave status\G;
);
2.3 异常处理
一般的异常只需要跳过一步即可恢复
mysql> stop slave;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;