集群并发请求限制
1.功能描述
-
能够对njet 集群实现 http请求速率限制
-
实现可认为是limit_req_zone 以及limit_req指令的集合体,两个指令合在一起的功能,也就是说zone的配置和连接数的设置在同一个指令完成
-
限制功能与limit req功能一致
2.依赖模块
njet.conf:
load_module modules/njt_http_cluster_limit_req_module.so;
3.指令说明
3.1 cluster_limit_req_dry_run
- 功能: 如果配置为on,实际不限制,但是会仍然记录请求数; 如果配置为off,则会受limit_req限制
Syntax: | cluster_limit_req_dry_run on | off; |
---|---|
Default: | cluster_limit_req_dry_run off; |
Context: | http, server, location |
3.2 cluster_limit_req_log_level
- 功能: 达到限制时日志打印级别
Syntax: | cluster_limit_req_log_level info | notice | warn | error; |
---|---|
Default: | cluster_limit_req_log_level notice; |
Context: | http, server, location |
3.3 cluster_limit_req_status
- 功能: 达到限制后返回的状态码,默认是503
Syntax: | cluster_limit_req_status code; |
---|---|
Default: | cluster_limit_req_status 503; |
Context: | http, server, location |
3.4 cluster_limit_req
- 功能:http请求速率限制
Syntax: | cluster_limit_req $binary_remote_addr zone=cluster2:10m rate=100;; |
---|---|
Default: | — |
Context: | http, server, location |
4.配置样例
...
load_module modules/njt_http_cluster_limit_req_module.so;
...
stream {
server {
listen 238.255.253.254:5555 udp;
gossip zone=test:1m heartbeat_timeout=100ms nodeclean_timeout=1s;
}
}
http {
#http层
cluster_limit_req $binary_remote_addr zone=cluster_http_10:10m rate=10;
upstream back{
server 127.0.0.1:8008;
server 127.0.0.1:8009;
}
server {
#server层
cluster_limit_req $binary_remote_addr zone=cluster_server_25:10m rate=25;
listen 8186;
location / {
proxy_pass http://back;
}
}
server {
listen 9186;
location / {
#location层
cluster_limit_req $binary_remote_addr zone=cluster_location_66:10m rate=66;
proxy_pass http://back;
}
}
}
5.测试样例
1. 只测试单节点,节点请求速率为100r/s 左右,30s应该为3000个请求左右
[root@localhost clb]# ./wrk2 -t 1 -c 10 -d 30s -R 400 http://192.168.40.136:80/
Running 30s test @ http://192.168.40.136:80/
1 threads and 10 connections
Thread calibration: mean lat.: 1.299ms, rate sampling interval: 10ms
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.40ms 1.30ms 21.06ms 95.81%
Req/Sec 420.82 84.30 1.00k 81.75%
11996 requests in 30.00s, 5.74MB read
Non-2xx or 3xx responses: 8896
Requests/sec: 399.85
Transfer/sec: 195.91KB
[root@localhost clb]#
上面的测试中30s 内共发送11996个请求,8896个请求失败,成功数=(11996-8896)= 3100, 符合100r/s 设定
2.两个节点同时并发测试,设置请求速率为100r/s左右,30s两个节点一共请求应该为3000左右
- 136节点:
[root@localhost clb]# ./wrk2 -t 1 -c 10 -d 30s -R 400 http://192.168.40.136:80/
Running 30s test @ http://192.168.40.136:80/
1 threads and 10 connections
Thread calibration: mean lat.: 1.111ms, rate sampling interval: 10ms
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.17ms 1.05ms 12.83ms 94.79%
Req/Sec 426.90 80.14 0.89k 81.71%
11996 requests in 30.00s, 4.97MB read
Non-2xx or 3xx responses: 10514
Requests/sec: 399.85
Transfer/sec: 169.47KB
- 157节点:
[root@localhost clb]# ./wrk2 -t 1 -c 10 -d 30s -R 400 http://192.168.40.157:8003/
Running 30s test @ http://192.168.40.157:8003/
1 threads and 10 connections
Thread calibration: mean lat.: 1.156ms, rate sampling interval: 10ms
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.20ms 0.92ms 14.04ms 93.46%
Req/Sec 424.76 71.28 0.89k 82.15%
11996 requests in 30.00s, 5.04MB read
Non-2xx or 3xx responses: 10361
Requests/sec: 399.85
Transfer/sec: 171.92KB