如何设计用于数据查询和数据更新的系统

时间:2013-10-20 14:05:28

标签: php proxy system thrift

目标很简单:客户发布http请求以查询数据并通过某些键更新记录。最高请求:500 /秒(越高越好,但最好是满足此要求,同时使系统易于实现和使用较少的mashines)

我做了什么:nginx + php-cgi(使用php)来提供http请求,php使用thrift RPC从DB代理中检索数据,该代理仅用于查询和更新DB(mysql)。 DB代理使用mysql连接池和thrift的TNonblockingServer。 (在我的国家,有2个ISP,DB Proxy将部署在多个isp机器上,因此是db,web服务器可以根据经验部署在单个isp mashine上)

什么麻烦我:当我做压力测试(当> 500 /秒)时,我发现“TSocket:无法连接到172.19.122.32:9090(连接拒绝[111]”来自php日志。我想它可能是由于端口耗尽(可能是不正确的结论)。所以我设计使用thrift连接bool来减少thrift连接。但是php中没有连接池(似乎有一些数据库连接池技术)而且php没有支持该功能。

所以我想也许这个项目从一开始就是以错误的方式设计的(比如使用php,thrift)。根据我所做的事情,有没有一种好方法可以解决这个问题?我想大多数人会怀疑我的尴尬计划。那么,你的新计划将有很多帮助

感谢。

1 个答案:

答案 0 :(得分:0)

“TSocket:无法连接到172.19.122.32:9090(连接被拒绝[111])”从php日志显示由于短时间内连接过多而导致端口耗尽。所以我使用以下命令将tcp TIME_WAIT状态配置为及时回收端口: sysctl -w net.ipv4.tcp_timestamps = 1 sysctl -w net.ipv4.tcp_tw_recycle = 1

它有效! 令我烦恼的是解决了,但改变核心参数会影响NAT。这不是一个完美的解决方案。我认为这个系统的新设计可以继续讨论。