Nginx+Swoole 负载均衡方案.

1. 前言

Nginx 提供了许多种负载均衡方案,比如轮询、ip_hash、等等。 基本上能满足大部分场合,在最新的项目中、根据项目特点、后期业务负载扩展考虑。提供一种Nginx+Swoole的新的负载均衡方案。

2. 项目特点

  1. Swoole 常驻内存、商家的订单、需要在内存中计算、并实时推送订单状态信息。比如成交、退款、等。因此要求每个商家都必须绑定到固定的计算节点。
  2. 商家有私有数据、用户数据全局。

3. 解决方案

  1. 登录网关采用 PHP-FPM + Nginx 实现.
  2. 1台服务器分配一个ID 从0 开始。
  3. 为每一台服务器等每一个进程计算节点进程分配一个id。从0 开始.
  4. 为商户创建一个商户+服务器ID+计算节点ID的绑定表。商户登录成功后。返回计算节点信息。后续业务在该计算节点完成。

3.1 商户+计算节点绑定表

例如: server_id = 1 node_id = 0 为1号服务器等0号进程. server_id=2 node=0 为2号服务器等0号进程.

字段名 字段类型 说明
mid bigint(20) 商户ID
server_id int(11) 服务器ID
node_id int(11) 计算节点ID

3.2 nginx 配置

全剧建立一个 host 到 服务器等映射表.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
map $http_host $s_backend {
s-0..exti.cc 192.168.1.100;
s-1..exti.cc 192.168.1.101;
s-2..exti.cc 192.168.1.102;
s-3..exti.cc 192.168.1.103;
}

server {
listen 443 ssl;
server_name ~^s-(\d+).exti.cc$;
include ssl.conf;
root /data/wwwroot/netbarfee/public;

location / {
if ($uri ~* "^/n-(\d+)/(.*)$" ) {
proxy_pass http://$s_backend:$1;
}
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_http_version 1.1;
proxy_read_timeout 300s;
}
}

3.3 访问方法

1
2
3
4
5
# 假定 0号服务器等3个计算节点监听的端口分别是 3000~3002
# 则 访问0号服务器等 0~10号计算节点等地址为:
$url = 'https://s-0.exti.cc/n-3000/';
$url = 'https://s-0.exti.cc/n-3001/';
$url = 'https://s-0.exti.cc/n-3002/';

3.4 扩容升级

后续部署了新的服务器, 我们只需要在 map中增加一行 然后 执行 nginx -s reload 即可。

Nginx+Swoole 负载均衡方案.

https://doc.exti.cc/2021/11/30/ngix-with-swoole/

作者

bywayboy

发布于

2021-11-30

更新于

2021-11-30

许可协议