一、mysql主从配置原理
1.master将操作记录写到二进制日志中(binary log)中;
2.slave IO 线程将master的binary log events读写到它的中继日志(relay log);
3.slave SQL线程读取中继日志,将日志中事件进行重放再从而保持与master数据同步;
二、配置流程
配置要点:
1.主服务器mysql必须打开二进制日志(bin-log)功能
2.从服务器具备请求从主服务器传输二进制日志文件的权限
3.主从服务器mysql版本保持一致
4.主从服务器在主从配置启动之前数据保持一致
配置环境:
节点 | IP | 操作系统 | mysql版本 |
---|---|---|---|
master | 192.168.1.197 | centos7.2 | 5.7.17 |
slave | 192.168.1.196 | centos7.2 | 5.7.17 |
配置步骤:
1.修改master配置
#vim /etc/my.cnf
[mysqld]下
log-bin=mysql-bin //【必须】启用二进制日志
server-id=197 //【必须】服务器唯一id,必须唯一,默认为1,这里为IP最后一段
2.修改slave配置
#vim /etc/my.cnf
[mysqld]下
log-bin=mysql-bin //【非必须】启用二进制日志
server-id=196 //【必须】master-id,必须唯一,默认为1,这里为IP最后一段
3.重启两台服务器mysql
service mysqld restart
4.在master上创建账号并赋予slave权限
a.master创建账号
mysql> create user 'admin'@'%' identified by 'xxx';
b.在master上为slave授权
MySQL [(none)]> GRANT REPLICATION SLAVE ON *.* to 'admin'@'%' identified by 'xxx';
5.登陆master,查看master状态
show master status;
注:做完此步骤后不要再对master做任何操作,以防master状态变化,记录下当前master状态
6.配置slave
mysql> change master to master_host='192.168.1.197',master_user='admin',master_password='xxx',master_log_file='mysql-bin.000004',master_log_pos=23907; //与master配置一致
7.查看slave状态
mysql> show slave status \G
看到Slave_IO_Running:YES,Slave_SQL_Running:YES,说明slave配置成功
8.主服务器测试
master中创建了同步测试数据库sysn_test_db,其中有表sysn_test_db,可对表操作后去slave库中查看是否同步成功。
三、mysql从节点切换主节点
目前配置是一主节点一从节点,当主节点发生故障时,将从节点切换为主节点,同时旧的主节点切换为从节点。首先确保从节点上开启了bin-log,操作流程如下;
1. 首先确保从节点已经执行了relay log 中的全部更新。在从库中执行stop slave io_thread,停止IO线程,然后检查show processlist的输出,看到输出中出现"Slave has read all log;waiting for the slave I/O thread to update it"代表更新完毕。
mysql> stop slave io_thread;
mysql> show processlist\G
*************************** 1. row ***************************
Id: 3
User: system user
Host:
db: NULL
Command: Connect
Time: 2601
State: Slave has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
*************************** 2. row ***************************
Id: 4
User: root
Host: localhost
db: NULL
Command: Query
Time: 0
State: NULL
Info: show processlist
2 rows in set (0.00 sec)
2.停止从库slave服务,并将其切换为master。并对旧master授权,使其能够有权限连接新master.
mysql> stop slave;
mysql> reset master;
mysql> grant replication slave on *.* to 'admin'@'%' identified by 'JKcloud123';
3.查看新master状态,看到以下状态说明切换成功
mysql> show processlist\G
*************************** 1. row ***************************
Id: 4
User: root
Host: localhost
db: NULL
Command: Query
Time: 0
State: NULL
Info: show processlist
*************************** 2. row ***************************
Id: 7
User: repl
Host: 192.168.0.100:60235
db: NULL
Command: Binlog Dump
Time: 184
State: Master has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
2 rows in set (0.00 sec)
4.按照二中的方法将旧master设置为slave.
5.为了避免新master重启后变成slave,删除新master上的master.info和relay-log.info文件。