openresty-mysql-连接池,


openresty mysql 连接池

这两天压测公司的一个小项目,感觉并发能力很差,想给做一下提升。最要是优化数据库的操作。这个小项目的架构为 前端LVS做负载 + openresty-lua做业务处理 + mysql做数据保存及查询等,其他组件就暂时不一一罗列了。

压测工具

apache 自带的ab打量工具。
安装方法:yum -y install httpd-tools

测试平台

linux 平台

openresty版本

openresty/1.13.6.1

主要考虑从如下几个点进行提升

1.数据库连接池
2.针对数据库的打开句柄进行全局共享
3.针对常用数据使用共享内存
4.在mysql之上,搭建一层内存数据库

1 数据库连接池

查看了一下openresty.org官网及https://github.com/openresty/lua-nginx-module#tcpsockconnect中针对pool的介绍,发现pool_size及backlog等特性还没有引入到openresty现有版本中,而且查看了最新的版本,也没有包含最新的ngx-lua模块。
这就很犯难了,后来看到https://github.com/openresty/lua-nginx-module#tcpsocksetkeepalive 可以使用长连接的功能,在每个nginx worker中创建一个连接池,nginx配置:lua_socket_pool_size 2048; 在lua调用mysql时,每次使用完调用设置长连接的set_keepalive(db, 60000)。

1 结果

在使用ab打量并发效果有大概3倍左右的提升

2.针对数据库的打开句柄进行全局共享

主要的思路是采用lua中的表来保存已经打开的句柄。在init_by_lua_file阶段时,使用setmetatable({db = nil, valid = false}, mt)进行数据保存,此时保存的db都还是nil。
在每次使用的时候,优先判断self.db的值是否存在,当然你可以加一点自己的判断db有效性的逻辑,比如超时,是否可用等标志位。如果不可用在去进行和mysql建联,将建联后的db保存到self.db=db。

2 结果

该全局表中不能保存句柄类的数据,因为nginx每次请求结束后,会将该请求上的ctx全部释放掉,及时你保存了db也不能使用。但是该方法可以用于静态数据的保存

3.针对常用数据使用共享内存

考虑到将比较常用的数据放入到nginx的共享内存中,使用的时候优先从共享内存中获取,如果涉及到json格式的转换,可以考虑将方法2中的table机制在共享内存之上在加一层。

结果

考虑到如果这样修改,对目前现有架构改动较大,人力、时间成本不好考虑,可以后期在做定制优化

4.在mysql之上,搭建一层内存数据库

这个想法还没有好的验证方法,主要是不想大改现有的代码。 各位大神有什么好的意见么

相关内容

    暂无相关文章