一、前言
搭建一主两从的架构是为了将数据库的读写操作分离开来,master数据库写数据,slave数据库查数据,以此来提升数据库的性能
主从工作流程
1.master节点接收到写入操作,执行该操作后会将该操作写入到binlog日志中
2.salve节点通过io线程同步master节点中的binlog日志,并且将同步的日志写入到relaylog日志中,master节点会通过log dump线程将binlog日志传输给slave的io线程
3.slave节点通过sql线程执行relaylog日志中的操作
通过以上的工作流程会发现主从同步是一个异步同步

此处使用了三台主机,主机配置信息如下表所示
名称 | ip |
master | 10.1.60.80 |
slave1 | 10.1.60.114 |
slave2 | 10.1.60.115 |
二、配置
三台主机均关闭防火墙
systemctl stop firewalld
三台主机均关闭selinux
setenforce 0
三台主机均安装数据库,搭建过程参考我下面的博客
yum安装mysql 5.7_yum安装mysql5.7_Apex Predator的博客-优快云博客
三台主机均在数据库配置文件末尾加上以下配置,开启binlog
server_id=1 #三台主机不能配置相同的数字
log_bin=mysql_bin
binlog_format=mixed
max_binlog_size=1g
expire_logs_days=7
三台主机均重启数据库服务
systemctl restart mysqld
三台主机均查看binlog是否启动
mysql -uroot -p
show variables like 'log_%';

master数据库上创建slave数据库用于同步的账户
mysql -uroot -p
grant replication slave on *.* to 'test'@'%' identified by 'Qwe@1234'; #(replication slave是专门配置复制用户的权限)
flush privileges;
查看master数据库上的binlog文件与pos点(slave配置需要用到)
show master status;

配置两台slave数据库,开启同步功能,并设置只读模式
mysql -uroot -p
change master to
master_host='10.1.60.80',
master_user='test',
master_password='Qwe@1234',
master_log_file='mysql-bin.000001',
master_log_pos=589;
start slave;
set global read_only=1;
查看read_only状态
SELECT @@global.read_only;
查看两台slave数据库同步是否正常启动(slave_IO_Running和slave_SQL_Running状态都为yes)
show slave status\G

测试主从功能是否生效
master数据库创建数据
mysql -uroot -p
create database test;
use test;
create talbe student (
id int,
name varchar(20)
);
insert into student values(1,'xiaoming'),(2,'xiaohong'),(3,'xiaolin');
查看master数据库binlog日志状态
show master status;

查看slave数据库是否有同步生成test库与student表
mysql -uroot -p
show databases;
use test;
show tables;
select * from student;

查看slave库主从同步状态
show slave status\G

将三台主机地址转交给开发的时候,注明master主机只接收写请求,slave主机只接收读请求,以实现读写分离的操作(也可以通过配置一个中间件去代理区分读写请求,区分后将请求转发到与之相对应的主机上,可使用的中间件例如使用myproxy、mycat等)