mysql读写分离场景_mysql读写分离

本文详细介绍了如何在MySQL中实现读写分离,包括原理、实验环境配置、搭建步骤以及实战测试。通过搭建主从复制和mysql-proxy代理,优化读写性能,适用于高并发读取场景。
摘要由CSDN通过智能技术生成

一、什么是读写分离?

MySQL读写分离是指让master处理写操作,让slave处理读操作,非常适用于读操作量比较大的场景,可减轻master的压力。

使用mysql-proxy实现mysql的读写分离,mysql-proxy实际上是作为后端mysql主从服务器的代理,它直接接受客户端的请求,对SQL语句进行分析,判断出是读操作还是写操作,然后分发至对应的mysql服务器上。

二、为什么要读写分离?

因为数据库的写操作相对读操作是比较耗时的,所以数据库的读写分离,解决的是数据库的写入,影响了查询的效率。

三、实验环境:

rhel7.3 selinux and firewalld disabled

server1:172.25.79.1(master)

server2:172.25.79.2(slave)

server3:172.25.79.3(mysql-proxy)

四、搭建步骤

[server1和server2]: 实现主从复制

首先在server1(主)和server2(从)上搭建主从复制架构

这里我只将搭建成功的结果图附上,具体操作不再赘述

6d56a8d5f74a42ce6c97dd44b786d4d1.png

测试:主从复制

在server1(主)上创建库,进入库,创建表,插入表信息

1d7909bca485acf441907f6cc1296eef.png

server2(从)上可以看到表信息,则主从复制成功

88b01ff5d6cb6585d494e9abca9c8654.png

在master上授权(授予全部权限,但是仅仅是实验环境所与不太在意安全)

mysql> grant all privileges on *.* to 'root'@'%' identified by 'HUIyange+32';

Query OK, 0 rows affected, 1 warning (0.03 sec)

1

2

[server3]: 配置代理端

下载安装包并解压到指定目录

[root@server3 ~]# tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz

[root@server3 ~]# mv mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy

1

2

建立目录存放读写分离的配置文件和日志

[root@server3 ~]# cd /usr/local/mysql-proxy/

[root@server3 mysql-proxy]# ls

bin include lib libexec licenses share

[root@server3 mysql-proxy]# mkdir conf

[root@server3 mysql-proxy]# mkdir logs

1

2

3

4

5

将mysql-proxy的二进制命令放进系统环境变量中

[root@server3 mysql-proxy]# vim ~/.bash_profile

PATH=$PATH:$HOME/bin:/usr/local/mysql-proxy/bin

[root@server3 mysql-proxy]# source ~/.bash_profile

1

2

3

7d1ef5552e116455908a048751cee58b.png

4. 修改数据库发生读写分离时的最大最小值

[root@server3 ~]# cd /usr/local/mysql-proxy/share/doc/mysql-proxy

[root@server3 mysql-proxy]# vim rw-splitting.lua

40 min_idle_connections = 1, ##最小连接数

41 max_idle_connections = 2, ##最大连接数,最大连接数大于2时发生读写分离

1

2

3

4

实现读写分离是有lua脚本实现的,现在mysql-proxy里面已经集成,无需再安装

7b914e6e3c76a2abc9c649ace0d2607b.png

创建配置文件

[root@server3 ~]# cd /usr/local/mysql-proxy/conf/

[root@server3 conf]# vim mysql-proxy.conf

[mysql-proxy]

user=root ##运行mysql-proxy用户

proxy-address=0.0.0.0:3306 ##mysql-proxy运行ip和端口proxy-read-only-backend-addresses=172.25.79.2:3306 ##slave:只读

proxy-backend-addresses=172.25.79.1:3306 ##master:可读写

proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua ##lua脚本地址

log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log #日志位置

log-level=debug #定义log日志级别,由高到低分别有(error|warning|info|message|debug)

daemon=true ##打入后台

keepalive=true ##mysql-proxy崩溃时,尝试重启(持续连接)

1

2

3

4

5

6

7

8

9

10

11

给文件设置权限,再启动mysql-proxy(否则会启动失败)

[root@server3 conf]# chmod 660 /usr/local/mysql-proxy/conf/mysql-proxy.conf

启动:

[root@server3 conf]# mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf

1

2

3

4

此时查看端口3306打开

[root@server3 conf]# netstat -anltp

1

df1c90e1fdbf2a16589fb007fa2eb531.png

[测试]

在物理机上安装mysql客户端

[root@foundation79 ~]# yum install mysql -y

1

在物理机上打开三个shell,都通过server3连接数据库进行如下操作:

测试1:

master和slave状态都开启

在物理机上通过server3连接数据库,向数据库的表中插入新的数据信息

5cec57286da16783bdc8c7e08e13d91e.png

3.在server1(主)和server2(从)上都可以看到添加的信息

d5d6270e1b5105deeffa488576ff8ccc.png

注意:

在master端可以看到数据,说明写操作是在server1(master)上,而在server2上看到数据,是因为server1和server2是主从复制关系。(不能说明server2可以进行写操作)

测试2:

关闭server2(slave)

4cf466abb797bb86fe258a6824d08da5.png

在物理机添加新的信息,却不能select出来,而在master上可以查看到

e708633ec3e9ecaa6cb6bf73f412d27f.png

说明:读写分离了,读操作是在server2(slave)上

测试3:

关掉server1(master),开启server2的slave

Server1:

79b6f6b9558dfa1eceacfb16cd1d3b60.png

Server2:

1793a4f960df3efec52de2f726e47b31.png

在物理机上连接数据库,发现插入数据失败

9c8ade7f6061c372dc286db7918a3a21.png

说明:读写分离了,写操作在server1(master)上

测试4:

还可以通过tcpdump抓取数据读写分离

server3上安装tcpdump抓包工具

[root@server3 conf]# yum install -y tcpdump

1

server3上执行以下命令:可以看到客户端登陆mysql-proxy的操作

[root@server3 conf]# tcpdump -i eth0 port 3306

1

执行上一条命令后不要关掉,然后在物理机上连接数据库(连接3个),然后给表中插入一条新的信息后,在server3上看到相应的抓包信息

e1ea756c38ec0b8d35f91c4a5ea3b874.png

发现当连接3个物理机后,执行写操作是通过server3写入到server2(msater)中的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值