有时候我们的业务需要数据库的读写分离,但是读写分离是基于MySQL的主从复制的基础上实现的,并且MySQL的主从复制可以实现将数据从一台数据库服务器(master)复制到一台或多台数据库服务器(slave)上,进而可以保证数据有多份冗余,这篇文章就简单的实现以下MySQL的主从复制搭建流程。
一、环境
Linux version 3.10.0-957.el7.x86_64
mysql-5.7.30-linux-glibc2.12-x86_64.tar
首先我们需要准备两台服务器,安装好MySQL数据库,大家可以用docker或者直接安装即可,可以参考我这篇教程:Linux安装MySQL5.7完整版流程。
注意:若是第二台服务器是直接copy第一台的话,需要去删除数据存放目录下的auto.cnf文件,因为auto.cnf文件里保存的是每个数据库实例的UUID信息,代表数据库的唯一标识,直接复制的话会冲突。
我这里准备的是两台机,如下:
角色 | ip | user | passed |
---|---|---|---|
master(主) | 192.168.157.6 | root | 123456 |
slave(备) | 192.168.157.7 | root | 123456 |
二、MySQL主从复制原理
1、 主节点 log dump 线程
当从节点连接主节点时,主节点会创建一个log dump 线程,用于发送bin-log的内容。在读取bin-log中的操作时,此线程会对主节点上的bin-log加锁,当读取完成,甚至在发动给从节点之前,锁会被释放。
2、从节点I/O线程
当从节点上执行start slave
命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-log。I/O线程接收到主节点binlog dump 进程发来的更新之后,保存在本地relay-log中。
3、从节点SQL线程
SQL线程负责读取relay log中的内容,解析成具体的操作并执行,最终保证主从数据的一致性。
这里不展开说明,后续用一个专门的章节来分析原理。
三、Master搭建
master需要开启二进制日志
1、修改MySQL配置文件
vi /etc/my/cnf
加入如下配置即可:
[mysqld]
server-id=1
log_bin=mysql-bin
- server-id: 服务器唯一标识。
- log_bin: 启动MySQL二进制日志,即数据同步语句,从数据库会一条一条的执行这些语句。
- binlog_do_db: 指定记录二进制日志的数据库,即需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可,若是不设置,则默认同步所有数据库,这里未配置。
- binlog_ignore_db: 指定不记录二进制日志的数据库,即不需要复制的数据库名,如果有多个数据库,重复设置这个选项即可。
- 其中需要注意的是,binlog_do_db和binlog_ignore_db为互斥选项,一般只需要一个即可
2、重启MySQL
service mysql restart
3、创建从服务器权限
登录
./mysql -u root -p #在mysql的bin目录下执行。
创建从数据库的masterbackup用户和权限
grant replication slave on *.* to masterbackup@'192.168.157.%' identified by '123456';
192.168.157.%通配符,表示0-255的IP都可访问主服务器,正式环境请配置指定从服务器IP
若将 192.168.157.% 改为 %,则任何ip均可作为其从数据库来访问主服务器
刷新系统权限
flush privileges;
记录日志文件名字和pos 位置
show master status;
这里是mysql-bin.000001和601
四、Slave搭建
slave需要开启中继日志
1、修改MySQL配置文件
vi /etc/my/cnf
加入如下配置即可:
[mysqld]
server-id=2
relay-log=slave-relay-bin
2、重启MySQL
service mysql restart
3、启动同步
登录
./mysql -u root -p #在mysql的bin目录下执行
从站设置
change master to master_host='192.168.157.6',master_port=3306,master_user='masterbackup',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=601;
开启从线程
start slave;
查看状态是否正常
show slave status\G; #加上\G显示会比较友好。
可以看到Slave_IO_Running和Slave_SQL_Running都是YES,假如我们关闭从线程。
stop slave;
那么将都会变成NO.
五、测试主从复制
1、登录Master,建立数据库,表,插入数据。
./mysql -u root -p #登录
create database test; #建库
use test;#使用库
create table user(name varchar(50),passwd varchar(20)); #建表
insert into user(name,passwd) values('suibibk.com','123456'); #插入数据
select * from user; #查询结果
+-------------+--------+
| name | passwd |
+-------------+--------+
| suibibk.com | 123456 |
+-------------+--------+
2、登录从库,发现test库已存在,user表也已存在,数据也已存在。
mysql> select * from user;
+-------------+--------+
| name | passwd |
+-------------+--------+
| suibibk.com | 123456 |
+-------------+--------+
3、Master修改数据
update user set passwd='23456';
4、查看Slave记录
mysql> select * from user;
+-------------+--------+
| name | passwd |
+-------------+--------+
| suibibk.com | 23456 |
+-------------+--------+
到这里,主从搭建成功。