一、背景:
在项目运行中单台数据库在数据存储、安全性和高并发方面都无法满足实际的需求,所以需要配置多台主从数据服务器,以实现主从复制,增加数据可靠性、安全性、稳定性,保证系统高可用性。
二、主从复制:
主从复制简单来说就是主数据库执行sql语句,从数据库就会执行相同的sql语句,达到在主数据库执行的操作在从数据库上产生相同的效果。
基本原理:
1、主服务器master进行增、删、改等操作,sql语句将会以二进制文件的形式存放至binlog日志文件中;
2、从服务器slave通过主服务器创建的账号开启I/O进程连接上master,请求读取binlog日志文件。
主数据master接收到从数据slave的请求,根据请求信息读取制定日志指定位置之后的日志信息,返回给Slave 的I/O进程;
3、Slave的I/O进程接收到信息后,将接收到的日志内容依次添加到Slave端的中继日志relaylog文件的最末端,并将读取到的Master端的binlog的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master;
4、Slave的Sql进程检测到relaylog中新增加了内容后,解析relaylog的新增内容(Master端的那些可执行的内容),并在自身执行。
作用:
- 数据容灾、备份;
- 缓解 MySQL 主服务的压力;
三、搭建过程:
数据库版本:5.7版本
首先主库和从库数据必须一致(重要),使用命令或者navicat同步都可以。
主数据库master配置
(1)创建从库同步账号
create user ‘slave‘@’从库IP’ identified by ‘密码’;
给从库账号只读权限
GRANT REPLICATION SLAVE ON *.* TO ‘slave’@’从库IP' IDENTIFIED BY 'XXXXXXX';
刷新权限
flush privileges;
(2)my.cnf的[mysqld]下增加配置
server-id=1 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
log-bin=mysql-bin //[必须]启用二进制日志
sync_binlog=1 //控制数据库的binlog刷到磁盘。0 不控制、性能最好;1 写入磁盘、性能最差、最安全
binlog-do-db=wordpress //[可选] 设置需要同步的数据库,如果不设置将同步所有数据库
binlog_ignore_db=mysql //[可选] 需要忽略的数据库名,多个忽略库可以用逗号拼接或者一个数据库配置一行
slave-skip-errors=all //跳过主从库错误
(3)保存配置重启mysql服务
sevice mysqld restart
(4)进入数据库或者通过Navicat登录查看主服务状态:show master status
从数据库slave配置
(1) my.cnf的[mysqld]下增加配置
server-id=2
log-bin=mysql-bin //如果从数据库,不需要再往其他数据库同步,可以注释掉
relay-log=slave-relay-bin #必须开启,从主数据库同步的binlog会写入到该目录下
relay-log-index=slave-relay-bin
(2)保存配置重启mysql服务
sevice mysqld restart
(3)从库关联主库(mysql上执行)
change master to master_host = 'IP', //主库IP
master_user = 'slave', //主从用户名
master_password = 'XXXXX', //主从用户密码
master_port = 3306, //端口
master_log_file = 'mysql-bin.000XXX’, //当前正在读取和执行的中继日志文件的名称
master_log_pos = xxx; //在当前的主服务器二进制日志中,I/O线程已经读取的位置
(4)开启主从复制
start slave;
(5)检查状态(mysql上执行)
show slave status/G
注意:# master_log_file 和 master_log_pos值为主库上面执行show slave status/G
如果 Slave_IO_Running 和 Slave_SQL_Running 都为 Yes,说明配置成功