目录
(3)修改 Master、Slave1、Slave2 节点的 Mysql主配置文件/etc/my.cnf
主从复制
在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据、语句做备份。
主从复制的原理
就是基于二进制日志进行数据同步的。
主从复制的过程
主从复制有两个日志(二进制日志、中继日志)和三个线程(IO线程、DUMP线程、SQL线程)
注:严格来说是四个线程,还有一个是ACK线程
①当主库发生数据更新时,会将写入操作记录到二进制日志中
②从库会探测到主库发生数据更新,并开启IO线程向主库请求二进制日志事件
③主库会为每个从库的IO线程的请求开启DUMP线程,并向从库发送二进制日志事件
④从库会接收主库发送的二进制日志事件并保存到自己的中继日志中
(在半同步模式下,从库会向主库反馈确认信息,主库会使用ACK收集线程接收从库反馈的确认信息)
⑤从库还会开启SQL线程读取中继日志,并在本地进行重放,从而实现主库和从库的数据一致
主从复制的分类
statement 基于语句的复制 | 执行效率高,占用空间小;无法保证在高并发高负载时候的精确度 | |
row 基于行的复制 | 精确度高;执行效率低,占用空间大 | |
mixed 混合类型的复制 | 默认采用基于语句的复制,一旦发现基于语句无法保证精确复制时,就会采用基于行的复制 |
主从复制的作用
- 实现读写分离
- 实现数据备份——跨主机热备份数据
- 实现高可用——作为数据库高可用的基础
主从复制的同步模式
(1)异步复制
主库在执行完客户端提交的事务后就会立即响应给客户端
(2)半同步复制
主库在执行完客户端提交的事务后,只要等待一个从库返回响应给主库,才会响应给客户端
(3)全同步复制
主库在执行完客户端提交的事务后,要等待所有从库返回都响应给主库,才会响应给客户端
主从复制的配置步骤
- 主从服务器先做时间同步
- 修改主从数据库的配置文件,主库开启二进制日志,从库开启中继日志
- 在主库创建主从复制的用户,并授予主从复制的权限
- 在从库使用 change master to 对接主库,并 start slave 开启同步
- 在从库使用 show slave status\G 查看 IO线程和 SQL线程的状态是否都为 YES
主从复制的搭建
Master 服务器:192.168.80.10 mysql5.7
Slave1 服务器:192.168.80.20 mysql5.7
Slave2 服务器:192.168.80.30 mysql5.7
(1)初始化操作关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
(2)设置时间同步
vim /etc/chrony.conf
systemctl restart chronyd #重启chronyd服务
timedatectl #检查时间是否同步
设定以master服务器时间为准,slave1 和 slave2 服务器都设为
(3)修改 Master、Slave1、Slave2 节点的 Mysql主配置文件/etc/my.cnf
vim /etc/my.cnf
Master:
server-id = 1 #每个服务器的id都要设置为不同的
log_bin = mysql-bin
binlog_format = mixed
log-slave-updates = 1
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
Slave:
#slave1的配置
server-id = 2
log_bin = mysql-bin
binlog_format = mixed
log-slave-updates = 1
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
#slave2的配置
server-id = 3
log_bin = mysql-bin
binlog_format = mixed
log-slave-updates = 1
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
修改后全部重启mysql服务
systemctl restart mysqld
(4)配置主从复制,在主服务器上做
mysql -uroot -pabc123
grant replication slave on *.* to 'myslave'@'192.168.80.%' identified by '123456'; #给从服务器授权
flush privileges;
show master status;
(5)配置主从复制,在两个从服务器上做
mysql -u root -pabc123
change master to master_host='192.168.80.10',master_port=3306,master_user='myslave',master_password='myslave123',master_log_file='mysql-bin.000001',master_log_pos=1241;
change master to master_host='192.168.80.10',master_port=3306,master_user='myslave',master_password='123456';
start slave;
show slave status\G
注意:一般 Slave_IO_Running: No 的可能性
- 网络不通
- my.cnf配置有问题
- 密码、file文件名、pos偏移量不对
- 防火墙没有关闭
(6)验证主从复制效果
create database mydb;
show databases;
读写分离
原理
在主库上处理事务性操作(写入操作),在从库上处理查询操作(读操作),再通过主从复制将主库上的数据同步给从库。
作用
通过读写分离可以分担数据库单节点的负载压力,提高数据库的读写性能