一、MySQL读写分离概述
当今MySQL使用相当广泛,随着用户的增多以及数据量的增大,高并发随之而来;然而我们有很多办法可以缓解数据库的压力,分布式数据库集群、负载均衡、读写分离、增加缓存服务器等等。采用读写分离技术缓解数据库的压力是一种不错的方式。
二、 MySQL读写分离的好处
- 物理服务器增加,机器处理能力提升,拿硬件换性能。
- 主从只负责各自的读和写,极大程度缓解X锁和S锁争用。
- slave可以配置myiasm引擎,提升查询性能以及节约系统开销。
- slave可以单独设置一些参数来提升其读的性能。
- master的写是并发,slave通过主库发送来的binlog同步数据。
- 增加冗余,提高可用性。
三、 读写分离实现方式
- 代码封装
- 在代码层面抽出一个中间层,由中间层来实现读写分离和数据库连接。通过代理类代码,对外暴露正常的读写接口,里面封装了逻辑,将读操作指向从库的数据源,写操作指向主库的数据源。
- 优点:简单(开发写代码实现),并且可以根据业务定制化变化,随心所欲。
- 缺点:如果数据库宕机了,发生主从切换了之后,就得修改配置重启。如果系统是多语言的话,需要为每个语言都实现一个中间层代码,重复开发。
- 中间件
- 一般而言是独立部署的系统,客户端与这个中间件的交互是通过 SQL 协议的。所以在客户端看来连接的就是一个数据库,通过SQL协议交互也可以屏蔽多语言的差异。
- 缺点:就是整体架构多了一个系统需要维护,并且可能成为性能瓶颈,毕竟交互都需要经过它中转。
常见的开源数据库中间件有:官方的MySQL-Proxy、360的Atlas、Mycat、ProxySQL等。
四、MySQL读写分离原理
读写分离的基本原理是让主数据库处理事务性的增、删、改操作(INSERT、DELETE、UPDATE),而从数据库处理SELECT查询操作。MySQL主从复制将事务性的增、删、改操作同步到集群中的从数据库。
五、 读写分离架构图
在应用和数据库之间增加代理层(中间件),代理层接收应用对数据库的请求,根据不同请求类型转发到不同的实例,在实现读写分离的同时可以实现负载均衡。
六、MySQLproxy实现读写分离
1、关于MySQLproxy的简介:
MySQL Proxy是MySQL官方提供的数据库代理工具;MySQL Proxy实际上是在客户端请求与MySQLServer之间建立了一个连接池,所有客户端请求都是发向MySQL Proxy,然后经由MySQL Proxy进行相应的分析,判断出是读操作还是写操作,分发至对应的MySQLServer上;对于多节点Slave集群,可以实现负载均衡的效果。
2、实验拓扑图:
3、配置环境:
配置项 | 主服务器 | 从服务器 | 代理服务器 |
IP地址 | 192.168.206.11 | 192.168.206.13 | 192.168.206.14 |
主机名 | master | slave | proxy |
系统版本 | centos8 | centos8 | centos8 |
Server_ID | 200 | 201 | 无 |
1、在master和slave上配置主从复制
相关操作可参照:https://blog.csdn.net/liujun2986230069/article/details/129866284
2、在proxy上的准备操作
第一步:永久修改主机名
[root@localhost ~]# hostnamectl set-hostname proxy
[root@localhost ~]# bash
[root@proxy ~]#
第二步:永久关闭防火墙
[root@proxy ~]# systemctl stop firewalld.service
[root@proxy ~]# systemctl disable firewalld.service
[root@proxy ~]# vim /etc/selinux/config
#进来之后按字母i进行数据修改
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing \\将这里的enforcing改为disabled
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.19 | SELINUXTYPE=targeted
#修改完之后按键盘上的ESC键,输入 :wq(保存并退出)
[root@master ~]# setenforce 0 \\刷新配置文件
第三步:下载lua解析器
[root@proxy ~]# dnf -y install lua*
3、下载mysql-proxy安装包
[root@proxy ~]# wget https://cdn.mysql.com/archives/mysql-proxy/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
[root@proxy ~]# ls \\查看安装包是否下载好了
公共 视频 文档 音乐 anaconda-ks.cfg mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
模板 图片 下载 桌面 initial-setup-ks.cfg
4、解压mysql-proxy安装包
[root@proxy ~]# tar -zxvf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
[root@proxy ~]# ls \\查看是否解压完成
公共 视频 文档 音乐 anaconda-ks.cfg mysql-proxy-0.8.5-linux-el6-x86-64bit
模板 图片 下载 桌面 initial-setup-ks.cfg mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
5、将mysql-proxy的解压之后的安装包进行移动到新的位置并重名
[root@proxy ~]# mv mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy
6、在proxy上配置环境变量
[root@proxy ~]# export PATH=$PATH:$HOME/bin:/usr/local/mysql-proxy/bin
7、在proxy上的mysql-proxy的安装目录中创建mysql-proxy.conf
[root@proxy ~]# cd /usr/local/mysql-proxy
[root@proxy mysql-proxy]# vim mysql-proxy.conf
#按字母i加入下面10行内容
[mysql-proxy]
plugins=proxy \\proxy插件
proxy-address=192.168.206.14:4040 \\监听本机中的IP地址和端口,默认端口是4040
proxy-backend-addresses=192.168.206.11:3306 \\进行写的数据库master
proxy-read-only-backend-addresses=192.168.206.13:3306 \\进行读的数据库slave
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua \\指定读写分离的脚本文件
log-file=/usr/local/mysql-proxy/mysql-proxy.log \\生成日志文件
log-level=debug \\日志等级为debug
keepalive=true \\心跳检测,崩溃时,尝试重启
daemon=true \\守护进程
#修改完之后按键盘上的ESC键,输入 :wq(保存并退出)
8、启动mysql-proxy服务
[root@proxy mysql-proxy]# chmod 0660 /usr/local/mysql-proxy/mysql-proxy.conf
[root@proxy mysql-proxy]# mysql-proxy --defaults-file=/usr/local/mysql-proxy/mysql-proxy.conf
[root@proxy mysql-proxy]# ss -antl \\查看是否有端口号
9、设置读写分离连接数量:rw-splitting.lua
[root@proxy mysql-proxy]# vim /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
#进入之后按字母i进入编辑模式,找到下面这行配置文件进行修改
if not proxy.global.config.rwsplit then
proxy.global.config.rwsplit = {
min_idle_connections = 1, \\默认超过4个连接数时,才开始读写分离,改为1
max_idle_connections = 8,
is_debug = false
}
end
#修改完之后按键盘上的ESC键,输入 :wq(保存并退出)
[root@proxy mysql-proxy]# pkill mysql-proxy \\因为前面启动这个服务,所以这里要暂停这个进程
[root@proxy mysql-proxy]# mysql-proxy --defaults-file=/usr/local/mysql-proxy/mysql-proxy.conf \\配置文件进行修改过所以要重新启动一下
[root@proxy mysql-proxy]# ss -antl \\查看是否有对应的端口号
10、在master与slave上的数据库对用户授权
主服务器:
[root@master]# mysql -u root -p1
grant all on *.* to 'mysqlproxy'@'%' identified by '123456';
flush privileges;
从服务器:
[root@slave]# mysql -u root -p2
grant all on *.* to 'mysqlproxy'@'%' identified by '123456';
flush privileges;
11、在proxy上安装mariadb.service服务
[root@proxy ~]# yum -y install mariadb*
[root@proxy ~]# systemctl start mariadb.service
[root@proxy ~]# ss -antl \\查看是否有数据库端口3306
12、测试读写分离效果
测试的相关命令可以参照:https://blog.csdn.net/liujun2986230069/article/details/129856213
写测试:
第一步:在master上查看主从效果 (如果查看不了,那就去slave数据库上输入:start slave;)
第二步:在proxy上登录数据库
mysql -u mysqlproxy -p -P4040 -h 192.168.206.14 \\这里的IP地址是proxy服务器的IP地址
第三步:在proxy上登录成功后能够查看主从复制的那个数据的信息
第四步:在proxy下的主从复制数据库中创建一个新的表格
第五步:在slave上停止同步
stop slave;
第六步:在proxy上刚创建的表格中插入数据
第七步:查看效果
master上可以查看到proxy创建的表格及其表格中的数据,slave上只能看见proxy上创建的表格无法查询其中的数据
读测试:
第一步:在proxy上对刚创建的表格再次插入数据
第二步:slave上开启主从同步
start slave;
第三步:分别在master、slave、proxy上查看刚刚在proxy上插入的数据
第四步:在slave上删除其中的一条数据
第五步:分别在master、slave、proxy上查询该表格中的数据