跟着官方文档学Python——应用水平扩展:Tengine负载均衡
跟着官方文档学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
相关文章
- [Python Web]配置 nginx 遇到错误排查(初级)
- [Python]再学 socket 之非阻塞 Server
- [Python]peewee 使用经验
- [Python Web]部署完网站需要做的基本后续工作
- [Python]获取子线程异常信息
- Python2编码问题
- pip安装icu失败:Command "python setup.py egg_info" failed with error code 1 in
- CentOS 6下安装Python2.7
- [python]进阶学习之阅读代码
- Python Image Library fails with message “decoder JPEG not available” - PIL
- [python]使用virtualenvWrapper
- [python]初探socket
- [python]新手写爬虫v2.5(使用代理的异步爬虫)
- [python]爬代理ip v2.0(未完待续)
- [python]抽象方法
- [pyhton]python内建方法
- [python]非常小的下载图片脚本(非通用)
- [python]decimal常用操作和需要注意的地方
- [python实用代码片段]python获取当前时间的前一天,前一周,前一个月
- 5 分钟,教你用 Python 制作一个生日提醒!