读写分离概述
读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
主从复制与读写分离
在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于rsync,但是不同的是rsync是对磁盘文件做备份,而mysq1主从复制是对数据库中的数据、语句做备份。
mysql支持的复制类型
STATEMENT:基于语句的复制。在服务器上执行sq1语句,在从服务器上执行同样的语句,mysq1默认采用基于语句的复制,执行效率高。
ROW:基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
MIXED:混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
主从复制的工作过程
首先主节点开启二进制日志,从节点开启中继日志。
当客户端对mysql数据库进行增删改查时,则将其改变写入二进制日志中
从节点会在一定时间间隔内对主节点的二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/o线程请求主节点的二进制事件。
同时主节点为每个I/o线程启动一个dump线程,用于向其发送二进制事件,从节点会将其保存至s从节点本地的中继日志(Relaylog)中
最后从节点将启动sQL线程从中继日志中读取二进制日志,在本地重放,即解析成sql语句逐一执行,使得其数据和主节点的数据同步,最后I/o线程和sQL线程将进入睡眠状态,等待下一次被唤醒。
搭建Mysql主从复制
一主两从结构图
master 服务器:192.168.239.20 Mysql5.7
slave1 服务器: 192.168.239.30 Mysql5.7
slave2 服务器: 192.168.239.60 Mysql5.7
初始环境
#关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
Mysql主从服务器时间同步
主服务器设置
master 服务器:192.168.239.20
yum install ntp -y #安装ntp服务用来完成时间同步
vim /etc/ntp.conf #修改配置文件
#末行添加以下两行
server 127.127.239.0 #设置本地为时钟源,注意修改网段
fudge 127.127.239.0 stratum 8 #设置时间层级为8
service ntpd start #重启服务