首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mysql读写分离

Mysql读写分离

作者头像
创译科技
发布2019-10-22 14:40:24
2.4K0
发布2019-10-22 14:40:24
举报
文章被收录于专栏:Node开发Node开发

在高并发的时候,如果所有的数据库操作都只通过一台数据库来操作,那数据库很大程度可能出现宕机,而宕机就有可能导致数据丢失,造成不良后果。所以在并发量高的情况下一般会使用主从同步来实现读写分离。上一篇针对主从同步做了具体的介绍,本篇主要针对读写分离做详细的介绍。

前言

上一篇文章对主从同步做了具体的部署工作了,但是却没有提到某些时候主从意外同步失败的情况的解决方案,Mysql主从同步时,如果中途出现异常同步失败,则主从同步就失效了,后续的所有数据都无法同步到从数据库。所以我们一般常用的方案是跳过这次无法同步的数据,连接上从数据库,停止主从同步,然后使用SET命令跳过错误,最后重新启动主从同步:

什么是读写分离?

Mysql中读写分离实际上就是让主数据库处理主动写操作,让从数据库处理主动读操作。我们可以使用mysql-proxy中间件实现Mysql的读写分离,mysql-proxy在这里是作为什么角色呢?实际上我们可以将mysql-proxy理解为一个主从数据库之间的代理,它负责接受客户端的请求,然后判断请求SQL是属于写操作还是读操作,如果属于读操作则转发给从数据库处理请求,如果处于写操作则转发给主数据库处理请求。

实现Mysql读写分离

其实实现Mysql读写分离最简单的方案就是开启主从同步,在后端配置主数据库的连接和从数据库的连接,如果需要处理更新数据操作,就是用主数据库连接完成更新操作,如果只是select查询数据,则使用从数据库连接从从数据库获取数据。但是通过代码来管理连接不同的主从数据库太过于繁琐了,所以Mysql提供了官方的中间件mysql-proxy实现代理,客户端只需要请求mysql-proxy的连接池取到一个连接,至于根据读写操作来选择不同的主从数据库这些工作就只需要交给mysql-proxy来处理就可以了。所以本篇文章重点介绍如何使用mysql-proxy来实现Mysql的读写分离。

lua安装

由于mysql-proxy读写分离主要通过rw-splitting.lua脚本去实现,所以需要先装一下lua

/*下载lua并且解压*/wget http://www.lua.org/ftp/lua-5.1.4.tar.gz && tar zxvf lua-5.1.4.tar.gz/*进入lua并且install*/cd lua-5.1.4 && make linux && make install/*导出*/export LUA_CFLAGS="-I/usr/local/include" LUA_LIBS="-L/usr/local/lib -llua -ldl" LDFLAGS="-lm"

mysql-proxy安装

/*下载mysql-proxy并且解压*/
wget mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz && tar -zxvf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.g

由于默认情况下。数据库连接数最少要达到4,才会开启读写分离。由于mysql-proxy读写分离主要通过rw-splitting.lua脚本去实现,所以需要先修改下rw-splitting.lua配置信息,rw-splitting.lua配置文件所处路径:

/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua

可以看到我将最小启动读写分离连接数改成1,然后下一步就可以启动mysql-proxy,启动时需要指定主从服务器:

./mysql-proxy \
--proxy-read-only-backend-addresses=49.232.154.38:3306 \
--proxy-backend-addresses=49.235.28.88:3306 \
--log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log \
--proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua 
&

接下来我们可以先看下几个配置参数的含义:

  • --proxy-read-only-backend-addresses:配置只读从数据库
  • --proxy-backend-addresses:配置主服务器
  • --proxy-lua-scriptrw-splitting.lua脚本路径
  • &:表示后台执行mysql-proxy
  • --log-file:日志文件存放路径

可以看到上面截图中,我们成功将mysql-proxy启动,接下来我们就需要测试下读写分离是否可以生效。首先我们需要保证主从同步已经成功配置,而这步操作上一篇我们测试完全没问题了。首先我们登录从数据库关闭主从同步并查看当前test1数据表中的现有数据:

mysql-proxy端口配置在4040,接下来使用昨天创建用于主从同步的root账号登录4040端口,插入几条数据:

接下来查看主数据库test1数据表的数据:

然后再查看从数据库test1数据表的数据:

所以可以发现我们写数据的时候是写入到主数据库中,也就是写操作已经成功分离了。

然后接着继续使用root账号查询test1数据表的数据:

可以看到查出来的数据是从数据库的数据,因为结果只有一条,如果来自于主数据库应该有我们刚才新插入的三条数据,所以可以证明我们的读操作分离也成功了,到这里我们主从同步和读写分离全部配置成功,我们在项目中就可以使用这个4040端口的root用户来代理数据库操作,如果是写操作则代理到主数据库去执行,如果属于读操作则代理到从数据库去执行,实现Mysql读写分离。

mysql-proxy执行流程简析

我们这里测试是为了方便采取一主一从的架构去测试,但是很多时候后端Mysql服务不止一个,我们最后来大致了解下mysql-proxy的工作流程:

  • 实际上客户端向mysql-proxy发起连接时会调用connect_server()函数,如果没有实现这个函数,则mysql-proxy默认使用轮询方式找到合适的客户端代理请求给客户端。
  • 用户进行账号权限验证时传递账号密码等信息,mysql-proxy会调用read_auth()函数,当后端mysql服务向mysql-proxy认证结果时,mysql-proxy则会调用read_auth_result()然后给客户端返回认证结果。
  • 认证成功。客户端每次发起请求mysql-proxy都会调用read_query()来处理中间具体转发的业务逻辑,然后在后端mysql服务向mysql-proxy传递查询结果时,调用read_query_result()对结果集进行一系列处理,最后将结果集返回给客户端。

所以说上面一系列操作,实际上我们都可以在lua脚本中实现对应方法,然后增加我们需要的一系列业务逻辑,就可以对mysql-proxy有更大的拓展性。到这里我们对于mysql读写分离的配置也成功解决了,在读取操作很多的情况下我们就可以采用主从同步 + 读写分离降低主数据库的负载提高并发的可能性。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿周先森 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档