MySQL的主从复制和读写分离
MySQL的主从复制和读写分离
什么是MySQL的主从复制
- MySQL数据库支持单向、双向、链式级联、环状等不同业务场景的复制。在复制过程中,一台服务器充当主服务器(Master),接收来自用户的内容更新,而一个或多个其他的服务器充当从服务器(Slave),接收来自主服务器binlog文件的日志内容,解析出SQL,重新更新到从数据库,使得主从服务器的数据达到一致。
- 如果设置了链式级联复制,那么从服务器本身除了充当从服务器外,也会同时充当其下面从服务器的主服务器,链式级联复制类似A—>B—>C的复制形式。在这里,只介绍主—>从形式的配置方案。至于互为主从,链式级联的以后有机会再讨论。
MySQL的主从复制的主要场景
- MySQL的主从复制的主要场景有以下几个:
-
1)从服务器作为主服务器的实时数据备份
-
2)主从服务器实现读写分离(主写从读),从服务器实现负载均衡
-
3)把多个从服务器根据业务重要性进行拆分访问(从服务器根据业务进行拆分)
-
MySQL主从复制原理
- 用户会在mysql主上面进行写的操作,二进制日志会记录用户在mysql主上写的记录,此时mysql主会开启IO线程并由IO线程读取二进制日志,并同步复制到中继日志当中,sql线程会读取缓存当中的中继日志并且对自己的从服务器重放,从而实现了从服务器和主服务器数据的一致。
- 用户在主服务器上进行写,二进制日志会记录用户在主服务器上写的操作并开启IO线程读取缓存中的二进制日志,并复制到中继日志,sql线程会读取中继日志正在缓存的信息并对自己服务器重放,实现主从一致
mysq支持的复制类型
- (1)STATEMENT:基于语句的复制。在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高。
- (2)ROw:基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
- (3) MIXED:混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
MySQL主从复制延迟
- 1、master服务器高并发,形成大量事务
- 2、网络延迟
- 3、主从硬件设备导致
- cpu主频、内存io、硬盘io
- 4、本来就不是同步复制、而是异步复制
- 从库优化Mysql参数。比如增大innodo buffer pool size,让更多操作在Mysql内存中完成,减少磁盘操作。
- 从库使用高性能主机。包括cpu强悍、内存加天。避免使用虚拟云主机,使用物理主机,这样提升了i/o方面性。
- 从库使用sSD磁盘
- 网络优化,避免跨机房实现同步
MySQL读写分离原理
- 读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性查询,而从数据库处理select查询。数据库复制被用来把主数据库上事务性查询导致的变更同步到集群中的从数据库。
目前较为常见的MySQL读写分离分为
目前较为常见的MySQL读写分离分为以下两种:
- 1)基于程序代码内部实现
- 在代码中根据select、 insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。
- 优点是性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支;缺点是需要开发人员来实现,运维人员无从下手
- 但是并不是所有的应用都适合在程序代码中实现读写分离,像—些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。
- 2)基于中间代理层实现
- 代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有以下代表性程序。
- (1) MySQL-Proxy。MySQL-Proxy为MySQL 开源项目,通过其自带的lua脚本进行SQL判断。
- (2) Atlas。是由奇虎360的Web平台部基础架构团队开发维护的一- 个基于MySQL协议的数据中间层项目。它是在mysql-proxy0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程。
- (3) Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。但是它不支持
事务和存储过程。 - 由于使用MySQL Proxy 需要写大量的Lua脚本, 这些Lua并不是现成的,而是需要自己去写。这对于并不熟悉MySQL Proxy内置变量和MySQLProtocol的人来说是非常困难的。
- Amoeba是一个非常容易使用、可移植性非常强的软件。因此它在生产环境中被广泛应用于数据库的代理层。
- 代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有以下代表性程序。
MySQL主从复制和读写分离实验部署
案例拓扑图
环境配置
主机 | 操作系统 | IP地址 | 所需工具/软件/安装包 |
---|---|---|---|
Master | CentOS7 | 192.168.239.101 | ntp 、 mysql-boost-5.7.20.tar.gz |
Amoeba | CentOS7 | 192.168.239.102 | jdk-6u14-linux-x64.bin、amoeba-mysql-binary-2.2.0.tar.gz |
Slave1 | CentOS7 | 192.168.239.103 | ntp 、ntpdate 、 mysql-boost-5.7.20.tar.gz |
Slave2 | CentOS7 | 192.168.239.104 | ntp 、ntpdate 、mysql-boost-5.7.20.tar.gz |
客户端 | CentOS7 | 192.168.239.105 | —— |
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
一、搭建 MySQL 主从复制
1、Mysql主从服务器时间同步
主服务器设置(192.168.239.101)
yum -y install ntp
vim /etc/ntp.conf
server 127.127.239.0 #设置本地是时钟源,注意修改网段
fudge 127.127.239.0 stratum 8 #设置时间层级为8(限制在15内)
service ntpd start
从服务器设置(192.168.239.103)、(192.168.239.104)
yum -y install ntp ntpdate
service ntpd start
/usr/sbin/ntpdate 192.168.239.101 #进行时间同步,指向Master服务器IP
crontab