zl程序教程

您现在的位置是:首页 >  Python

当前栏目

跟着官方文档学Python——应用水平扩展:Tengine负载均衡

2023-02-18 16:23:10 时间

跟着官方文档学Python

Tengine——负载均衡

这周将会持续更新跟着官方文档学Python系列文章,主要是围绕Web框架以及其他后端组件的官方文档展开学习。日拱一卒,让我们开始吧!

在之前的文章《Django应用上线前有哪些注意事项?如何使用同步或异步容器启动Django应用?》中我们介绍了应用上线前需要做哪些准备,首先需要通过完备的单元测试,把开发环境的配置调整为线上环境的配置,之后选择合适的web容器,可以选择同步或者异步的,接下来部署到生产环境时web服务器可以有不同选择,可以使用Apache,也可以使用Nginx或者是Tengine。

Apache是比较传统的web服务器,用了许多年用途也很广泛;之后Nginx出来之后,大家基本上逐渐切到了Nginx或者Tengine上。Apache是多线程模型,每个用户请求过来都会使用一个独占的线程去处理,等到它处理完成后这个线程才可以去处理其它的请求。

Nginx是一个异步处理的模型,当一个用户请求过来之后它会去异步处理,异步处理的过程中,这个线程是会释放掉的,这个线程可以同时处理其他用户请求的连接,因此可以支持非常高的并发量,因此目前大多选用Nginx。

Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。官网文档链接:http://tengine.taobao.org/

比如说主动健康检查的功能,在Nginx上只能被动检查,就是说我访问一个页面,只有这个页面出错了,我才能知道它出错,才能判断后续的请求要不要往后台的服务器上去发。但在Tengine上,会另外有一个线程异步请求后端服务去检查它的端口和url是否正常,如果不正常,之后用户请求过来就不往后面发了。

再比如更强大的负载均衡能力,一致性hash模块和会话保持模块,对于一个用户的请求,尽可能落到一台服务器上去,保证它的请求具有延续性,它的session不需要跨机器。

安装Tengine

首先安装依赖pcre

wget https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz
sudo tar zxvf pcre-8.44.tar.gz
cd pcre-8.44/
./configure --prefix=/usr/local/pcre && make && make install

指定pcre源码目录安装Tengine

wget https://tengine.taobao.org/download/tengine-2.3.2.tar.gz

tar zxvf tengine-2.3.2.tar.gz && cd /data/tengine-2.3.0

./configure --prefix=/data/tengine/ --with-http_realip_module --
with-http_gzip_static_module --with-pcre=/data/pcre-8.44
# 启用realip模块,支持将用户的真实ip记录下来;启用gzip_static模块,启用gzip压缩指定pcre源代码的路径
make && make install

最简单配置(在tengine/nginx.conf中配置)

路由转发请求到Gunicorn/uWSGI 服务

使用Tengine负载均衡

  • 请求路由到两台后端服务器,两台后端服务器Upstream
  • 服务器运行Gunicorn/uWSGI
  • 单台服务器上运行有两个实例(web容器)各自开了8001和8002端口

Tengine 的流量分发策略

  • round-robin:轮询的方式平均分配流量
  • least-connected:最少连接优先,会优先发到请求最少的机器上去
  • ip-hash:根据客户端的ip地址的hash来计算分配服务器的IP
  • 带权重流量分配
  • 一致性哈希
  • 会话保持

最少连接优先和ip-hash配置方法:

least_conn和ip_hash任选其一。

带权重流量分配配置方法:

假设发来6个请求,有3个请求走第一个服务,其它3个服务上各落一个请求。

会话保持配置方法:

配置session_sticky尽可能保持同一个客户端访问的都是同一个后端服务器。

在Nginx上有被动的健康检查,在server后有max_fails参数,它控制检查在一定时间之内有多少次尝试失败了,如果失败了,下个周期的请求就不再发到这台服务器上去。

主动健康检查(Tengine)

http_upstream_check_module主动定时检查。

End