Bootstrap

MySQL数据库读写分离

一、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.11192.168.206.13192.168.206.14
主机名masterslaveproxy
系统版本centos8centos8centos8
Server_ID200201

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上查询该表格中的数据


;