概述
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之上,搭建一层内存数据库
这个想法还没有好的验证方法,主要是不想大改现有的代码。 各位大神有什么好的意见么
最后
以上就是大力铃铛为你收集整理的openresty-mysql-连接池openresty mysql 连接池的全部内容,希望文章能够帮你解决openresty-mysql-连接池openresty mysql 连接池所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复