这篇文章主要讨论下,对于分布式服务,站点如何平滑的上下线问题。
在分布式服务下,我们会用nginx做负载均衡, web站点访问某服务站点的时候, 统一走nginx, 然后nginx根据一定的轮询策略,将请求路由到后端的服务器上。
这样的架构是没问题的,但是我们这里考虑以下两个问题:
网站上下线问题:我们网站平时更新服务的时候是直接覆盖文件,然后重启,这样就会造成一些请求中断,如果是非核心逻辑还好, 但如果是核心逻辑,那请求中断将会影响一些数据一致性,比如资金、交易、订单等。
动态加减机器,比如某个站点访问量突然变大,要新增机器,那就需要修改nginx的配置,然后reload,这样会中断连接。虽然reload很快,但是还是会有一瞬间的请求中断。
为了解决以上问题,我们就需要动态管理upstream,这样就不需要修改和重启nginx来达到平滑上线的目的。
「nginx_http_dyups_module」是第三方开源软件,它提供API动态修改upstream的配置,我们通过示例来学习下
upstream test_upstream {
server 192.168.20.20:8000;
server 192.168.20.20:8001;
}
server {
listen 8888;
location / {
allow 127.0.0.1;
deny all;
dyups_interface;
}
}
server {
listen 80;
server_name localhost;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
set $ups test_upstream;
proxy_pass http://$ups;
}
}
dyups支持的接口说明表:
请求方法 | HTTP接口 | 用途 |
---|---|---|
GET | /detail | 获取所有upsteam清单明细 |
GET | /list | 获取所有upsteam的name |
GET | /upstream/name | 获取指定的upstream内的后端服务器的IP地址和端口 |
POST | /upstream/name | 覆盖指定的upstream的内容,包括IP地址、端口号、权重等信息 |
DELETE | /upstream/name | 删除指定的upstream |
获取upstream的详情
curl 127.0.0.1:8888/detail
#输出显示
server 127.0.0.1:8000 weight=1 max_fails=1 fail_timeout=10 backup=0 down=0
server 127.0.0.1:8001 weight=1 max_fails=1 fail_timeout=10 backup=0 down=0
动态添加upstream
#动态切换upstream到如下两个端口
curl -d "server 127.0.0.1:9000;server 127.0.0.1:9001;" 127.0.0.1:8888/upstream/test_upstream
这样我们后端服务有变化到时候就可以通过dyups动态更新upstream从而达到平滑上线。
让我们一起探索未知的世界~,如果对你有启发和帮助,帮忙点赞和转发。感谢~
想要学习更多干货,赶紧关注公众号噢~