首页 » 计算机与 Internet » 用nginx实现按照用户标志hash拆分web server

用nginx实现按照用户标志hash拆分web server

大型网站的数据存储拆分中比较通用的一种方式是按照用户id的hash值进行水平拆分,这种做法可以有效的较低db的读写压力,增加数据IO处理能力。

为了满足稳定性的要求,一般的web server都不会只有一台,并且大部分的web server都是按照uri/url进行业务拆分,这样可以增加web server cpu,men等资源的使用效率。可是如果能在web server上可以进一步按照userid hash拆分的话,就可以适当的增加web server的内存级别的缓存,可以有效的利用web server的内存使用效率,并且提高访问数据,增加web server网络的io吞吐率。

HttpUpstreamConsistentHash 是基于nginx的一个模块,需要在编译的时候安装进去

./configure –prefix=/home/nginx   –with-pcre=/tmp/pcre-8.01 –with-http_stub_status_module –with-http_ssl_module –without-http_rewrite_module –add-module=/tmp/nginx_upstream_hash-0.3 –add-module=/tmp/replay-ngx_http_consistent_hash-77b6940
make && make install

这个模块的作用是根据的uri或cookie等信息的hash code 对后端的机器进行分发请求:

upstream somestream {
consistent_hash $request_uri;
server 10.50.1.3:11211;
server 10.50.1.4:11211;
server 10.50.1.5:11211;
}

上面是nginx doc上的例子,根据uri进行负载均衡。
如果需要根据用户的身份进行负载可以根据“身份cookie”这个元素写到配置文件中,绝大部分的大型网站都不会使用session这个功能去保存用户登陆状态,而是利用cookie中的kv存储去记录用户信息。我们则可以利用这个用户身份的COOKIE去完成我们的需求。

upstream somestream {
consistent_hash $COOKIE_ticket;
server 10.50.1.3:8080;
server 10.50.1.4:8081;
server 10.50.1.5:8082;
}

虽然我们不知道用户散到了哪台web server上面,但是我们运行一段时间,就可以把访问这台机器的用户信息cache到内存中,这样之后用户再次访问时就减少了部分的rpc调用,增加了我们的运行效率。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google photo

You are commenting using your Google account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s