目录
读写分离
读写分离概述
读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操饰.数据库复制被用来 把事务性操作导致的变更同步到集群中的从数据库.
为什么要读写分离呢
-
因为数据库的"写"(写10000条数据可能要3分钟)操作是比较耗时的.
-
但是数据库的"读"(读10000条数据可能只要5秒钟).
-
所以读写分离,解决的是,数据库的写入,影响了查询的效率.
什么时候要读写分离
数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用.利用数据库主从同步,再通过读写分离可以分担数 据库压力,提高性能.
主从复制与读写分离
在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的.无论是在安全性、高可用性还是高并发等各个方面都 是完全不能满足实际需求的.因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力.有点类似于rsync,但是不同 的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据、语句做备份.
mysql支持的复制类型
(1)STATEMENT:基于语句的复制.在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高. (2)ROW:基于行的复制.把改变的内容复制过去,而不是把命令在从服务器上执行一遍. (3)MIXED:混合类型的复制.默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制.
MySQL的复制类型 ·基于语句的复制(STATEMENT,MySQL默认类型) ·基于行的复制(ROW) ·混合类型的复制(MIXED) ·MySQL主从复制的工作过程
主从复制的工作过程
保证主节点开启二进制日志文件,从节点开启中继日志文件
1.数据更新时,写入二进制日志文件当中
2.从节点发现主节点二进制日志文件更新时,通过io线程请求二进制事件
3.主节点会启动dump线程,向其发送二进制事件
4.保存到从节点的中继日志中
5.从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致
注:
中继日志通常会位于os缓存中,所以中继日志的开销很小. 复制过程有一个很重要的限制,即复制在Slave上是串行化的,也就是说Master上的并行更新操作不能在Slave上并行操作.
实际操作
初始环境
master 服务器:192.168.217.120
slave1 服务器:192.168.217.130
slave2 服务器:192.168.217.140
初始环境准备
systemctl stop firewalld
setenforce 0
搭建mysql主从复制
主服务器设置(搭建时间同步)
yum install ntp -y #安装时间同步服务器
vim /etc/ntp.conf #修改配置文件
--末尾添加-
server 127.127.217.0 #设置本地是时钟源,注意修改网段
fudge 127.127.217.0 stratum 8 #设置时间层级为8(限制在15内)
service ntpd start #开启服务
从服务器设置(搭建时间同步)
yum install ntp ntpdate -y #安装时间同步服务器、同步服务
service ntpd start
/usr/sbin/ntpdate 192.168.217.130 #进行时间同步
crontab -e #计划定时任务
*/30 * * * * /usr/sbin/ntpdate 192.168.80.130
主服务器的mysql配置
vim /etc/my.cnf
server-id=1
log-bin=mysql-bin #添加,主服务器开启二进制日志
binlog_format =MIXED #二进制日志格式
log-slave-updates=true #添加,允许slave从master复制数据时可以写入到自己的二进制日志
expire_logs_days = 7 #设置二进制日志文件过期时间,默认值为0,表示logs不过期
max_binlog_size=500M #设置二进制日志限制大小,如果超出给定值,日志就会发生滚动,默认值是1GB
systemctl restart mysqld
mysql -u root -p123123
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.217.%' IDENTIFIED BY '123123'; #给从服务器授权
FLUSH PRIVILEGES; #刷新权限
show master status; #查询二进制文件
从服务器的mysql配置(两个操作相同)
vim /etc/my.cnf
server-id = 2 #修改,注意id与Master的不同,两个slave的id也要不同
relay-log = relay-log-bin #添加,开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index = slave-relay-bin.index #添加,定义中继日志文件的位置和名称,一般和r