基于Résumé的WSGI负载均衡器
项目描述
本软件包提供了一个WSGI应用的负载均衡器,该负载均衡器将请求分类到请求类别中,并将给定类别的请求分配给相同的工人。
如果您有以下情况,负载均衡器可以为您提供帮助:
单个进程无法处理过多的负载(或速度太慢),
工作集太大,无法适应您进程使用的缓存,
并且存在一种方法来分类请求,以便各种类别的各种工作集之间重叠很少。
如果上述内容适用于您(或者如果您很好奇),请继续阅读。
架构
使用负载均衡器部署的应用程序包括一个或多个负载均衡器和多个工人。Web请求进入负载均衡器,转换为WSGI环境和请求,请求以环境形式通过长连接多路复用传递给工人。
工人计算Résumé,这些Résumé是映射请求类别到得分的字典,这些得分是每秒平均请求。工人定期向负载均衡器发送他们的Résumé,并且当负载均衡器连接到他们时。
可以使用多个负载均衡器来实现冗余或负载分配。Résumé由工人管理,以确保负载均衡器拥有相同的关于工人技能的信息。
状态
负载均衡器的当前版本应被视为实验性。我们目前正在生产环境中对其进行测试。
文档比较简略,但有广泛的doctests。
请求分类
您需要提供一个请求分类函数,该函数接受一个WSGI环境并返回一个请求类别字符串。
内置了两个分类器
- 主机
主机分类器使用HTTP Host头值,如果有,会通过去除前缀“www.”进行标准化。
- re_classifier
一个通用分类器(工厂),将正则表达式与一个class组应用于环境值。
例如,要使用请求URL路径的第一步,您可以使用以下请求分类器选项之一,用于以下所述的负载均衡器脚本:
-r 'zc.resumelb.lb:re_classifier("PATH_INFO",r"/(?P<class>[^/]+)")'
部署
部署负载均衡器需要部署每个工作进程,以及部署负载均衡器本身。工作进程的部署方式与任何WSGI堆栈类似。尽管它们不直接接受HTTP请求,但工作进程充当WSGI服务器。
根据您是否愿意尝试一些ZooKeeper的“cool-aid”(比喻),有两种内置的应用程序部署策略。
如果您使用ZooKeeper,工作进程可以绑定到临时端口并将它们注册到ZooKeeper。负载均衡器监视ZooKeeper,并在工作进程启动和停止时将它们添加到或从其池中删除。
基本部署
基本部署是最容易快速启动的。
基本工人部署
在基本部署中,您会像任何WSGI应用程序一样部署每个工作进程。由paste.server_runner main 入口点提供Paste部署服务器运行器。运行器接受参数:
- use egg:zc.resumelb
这会选择基本工作进程运行器。
- address HOST:PORT
要监听的地址,形式为HOST:PORT
- history SIZE
大致上,在计算工作进程的简历时考虑的请求数量。默认为9999。
- max_skill_age SIZE
在没有请求请求类之前,请求类从工作进程的简历中删除之前,请求类中可以没有请求的最大请求数量。
如果没有指定,则默认为history的10倍。
- threads NTHREADS
如果指定了一个大于零的数字,则使用给定大小的线程池调用底层WSGI堆栈。
- resume_file PATH
简历文件的路径。定期,工作进程的简历会保存到此文件,并在启动时读取该文件以初始化工作进程的简历。
- tracelog LOGGER
请求跟踪日志并指定要使用的Python记录器名称。
基本负载均衡器部署
负载均衡器是一个应该用daemonizer(如zdaemon或supervisor)运行的程序。它通过命令行参数获取其配置。使用-h 运行它以获取选项列表。
基本负载均衡器由包提供的resumelb脚本提供。
基本示例
这是一个定义WSGI堆栈的示例paste.ini文件
[app:main] use = egg:bobo bobo_resources = zc.resumelb.tests [server:main] use = egg:zc.resumelb address = 127.0.0.1:8000
以下是与此工作进程一起使用的负载均衡器命令
resumelb -LINFO -a :8080 127.0.0.1:8000
在此示例中,负载均衡器监听8080端口并连接到8000端口上的工作进程。
基于ZooKeeper的部署
在基于ZooKeeper的部署中,工作进程注册到ZooKeeper,负载均衡器从ZooKeeper获取工作进程地址。随着工作进程的启动和停止,它们将自动添加到和从负载均衡器池中删除。此外,大多数配置参数都是从ZooKeeper中读取的,并且在ZooKeeper中更改时在运行时更新。有关ZooKeeper的更多信息以及如何构建和维护ZooKeeper树,请参阅http://pypi.python.org/pypi/zc.zk。
基于ZooKeeper的工人部署
与基本部署一样,您将基于ZooKeeper的工作进程作为WSGI堆栈中的服务器进行部署。由paste.server_runner zk 入口点提供Paste部署服务器运行器。运行器接受参数:
- use egg:zc.resumelb#zk
这会选择基于ZooKeeper的工作进程运行器。
- zookeeper CONNECTION
一个ZooKeeper连接字符串。
- path PATH
工人在此获取配置并注册其地址的ZooKeeper节点路径。该节点应具有一个名为 providers 的子节点,其中发布地址。
- address HOST:PORT
要监听的地址,形式为HOST:PORT
- threads NTHREADS
如果指定了一个大于零的数字,则使用给定大小的线程池调用底层WSGI堆栈。
- resume_file PATH
简历文件的路径。定期,工作进程的简历会保存到此文件,并在启动时读取该文件以初始化工作进程的简历。
- tracelog LOGGER
请求跟踪日志并指定要使用的Python记录器名称。
基于ZooKeeper的负载均衡器部署
负载均衡器是一个应该用daemonizer(如zdaemon或supervisor)运行的程序。它通过命令行参数获取其配置。使用-h 运行它以获取选项列表。
ZooKeeper示例
这是一个定义WSGI堆栈的示例paste.ini文件
[app:main] use = egg:bobo bobo_resources = zc.resumelb.tests [server:main] use = egg:zc.resumelb#zk zookeeper = 127.0.0.1:2181 path = /lb/workers
以下是与此工作进程一起使用的负载均衡器命令
zkresumelb -LINFO 127.0.0.1:2181 /lb
以上示例假设您有一个运行在2181端口的ZooKeeper服务器,并且它包含一个看起来像的树
/lb /providers /workers /providers
有关构建和维护ZooKeeper树的更多信息,请参阅 http://pypi.python.org/pypi/zc.zk。
变更历史
1.0.2 (2015-03-11)
修复:当没有未决请求时,nagios监视器指标显示max request age为-1。这是愚蠢的。
修复了一个包装错误。
1.0.1 (2015-03-03)
修复:未捕获的应用程序异常在HEAD请求中被错误处理。
修复:在单版本模式下或使用替代池实现时,LB工人路径无法链接。
1.0.0 (2015-02-19)
Nagios监控插件。请参阅src/zc/resumelb/nagios.rst。
现在您可以提供替代池实现。
有一个新的池实现 zc.resumelb.classlesspool.ClasslessPool,它仅根据后备任务分配工作,忽略恢复。这对于没有大量驻留集或没有很好的请求隔离方式的小型应用程序很有用,但可以从ZooKeeper感知负载均衡中受益。
0.7.5 (2014-11-18)
修复:Tracelogs未包括启动和停止记录。
0.7.4 (2014-10-29)
修复:在返回迭代器之前未调用WSGI start_response函数的应用程序或中间件没有被适当处理。
修复:当负载均衡器从工人断开连接时,文件描述符泄漏。
0.7.3 (2014-06-04)
添加了一些优化以减少负载均衡器和工人之间的延迟。
0.7.2 (2014-06-02)
从负载均衡器到工人的keep-alive消息,以检测不干净地离去的工人。
(请注意,工人不需要更新。)
0.7.1 (2012-10-17)
修复:当与ZooKeeper一起使用时,由于ZooKeeper“跳动”,负载均衡器可能最终与同一工人有多个连接。(ZooKeeper可能会报告工人已离开并返回,而实际上工人并未离开。)
修复:在单版本模式下,版本之间的跳动可能导致工人和书后备任务计算不正确,从而导致断言错误。
在单版本模式下,记录版本更改。
0.7.0 (2012-07-05)
在负载均衡器中添加了对不能有多个工人版本的应用程序的支持。您可以逐步升级工人。具有新版本的工人将被忽略,直到它们成为多数,此时lb将停止使用旧版本的工人。
0.6.2 (2012-06-15)
修复:缺少套接字超时可能导致请求泄漏。
0.6.0 (2012-05-11)
添加了一个命令行脚本来检索lb状态数据,假设您正在使用ZooKeeper感知的负载均衡器脚本并已请求状态服务器。(还更新了状态输出,以显示请求开始时间作为整数秒。)
0.5.2 (2012-05-09)
修复:在负载均衡器中缓冲数据时创建的临时文件未明确关闭。通常,它们通过垃圾回收关闭,但在某些情况下,它们的数量可能会迅速增加,导致文件描述符耗尽。
修复:Tracelog的‘I’记录不总是包含输入长度信息。
修复:仅在使用线程池时包含Tracelog的‘I’记录。
0.5.1 (2012-05-07)
修复:当构造函数未传递参数或读取恢复文件时,工人恢复数据未正确初始化,导致恢复不更新。
修复:将工人错误写入标准输出而不是记录。
修复:表现不佳的WSGI应用程序未能捕获错误,导致请求挂起而不是返回500响应。
0.5.0 (2012-05-03)
更改了tracelog记录的标识方式,以反映lb请求编号。记录通过包含lb标识符作为前缀来消除歧义。例如,“1.22”表示来自lb 1的请求编号22。
在定义与ZooKeeper注册的工作者时,您现在可以在paste.ini文件中提供描述,该描述将在ZooKeeper中显示。虽然pid本身提供了足够的信息来找到工作者,但通常描述(例如实例名称或路径)可以使它更容易。
0.4.0 (2012-04-27)
将负载均衡算法更改为考虑未充分利用的工作者的队列,以便使用更低的方差参数,从而使新工作者得到更好的利用。
将负载均衡算法修改为在处理第一个未完成请求时不惩罚工作者,从而稍微增加难度以保持与有技能的工作者的工作。(换句话说,当调整工作者评分并检查最大队列长度时,如果工作者的队列不为零,则从工作者的队列中减去1。
使用ZooKeeper时提供的状态服务器现在监听Unix域套接字。
使用ZooKeeper时提供的状态服务器现在包括每个工作者的最老请求的开始时间,用于监控。
修复:工作者在内存中缓冲了大的请求体。现在大请求体被缓冲到磁盘。
内部优化,特别是处理大请求和响应体的方面。
0.3.0 (2012-03-28)
修改了zkresumelb(与ZooKeeper一起工作的负载均衡程序)处理访问日志的方式。现在,您传递一个Python日志记录器名称。如果不传递任何内容,则不会记录任何内容。
0.2.0 (2012-03-27)
有一个新的API用于获取工作者简历,通常用于监控代码
>>> import zc.resume.worker >>> print zc.resume.worker.get_resume(addr)
这对于获取工作者的简历以及确保工作者正在接受负载均衡连接都很有用。
还有这个脚本的版本
bin/get-worker-resume 192.168.24.60:33161
当使用ZooKeeper时,您可以请求lb状态服务器。地址被注册到ZooKeeper。当您连接到它时,您将获得一个包含整体lb队列长度以及每个工作者的地址和队列长度的JSON字符串。
将更新设置方法修改为在不提供时将设置还原为默认值。这对于与ZooKeeper一起使用尤为重要,这样您就可以查看树并知道设置而无需了解更改历史。
在SIGTERM上添加了优雅的负载均衡器和工作者关闭。
修复:在使用多个负载均衡器时,跟踪日志请求ID分配不正确。
添加了打包元数据,以帮助找到gevent 1.0b1(位于http://code.google.com/p/gevent/downloads/list)
更新了应用程序跟踪日志的API,以匹配zc.zservertracelog,主要是为了为ZTK应用程序获取数据库日志。
0.1.0 (2012-03-09)
初始发布。
项目详细信息
zc.resumelb-1.0.2.tar.gz的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | f56bacfd2fce35546b46a5ba3ca1f7c4cccd86a9f0bab88fd910f4d4aa2931ba |
|
MD5 | 22dacb3e01943c2fbea4feb5ffa9649d |
|
BLAKE2b-256 | d8073291e2f1c009b35cbcce52d176a2e95ae2e1bc363c5c6d56ac8ae871389b |