在PaaS服务上自动扩展Web dynos
项目描述
Autoscalebot有一个简单的目标:让扩展PaaS服务变得不再需要担心。目前,它只支持heroku和简单的基于请求时间的扩展。
下一个版本将支持其他PaaS堆栈,以及可配置的测量和决策后端。Autoscalebot也喜欢django,并且与之很好地协同工作。
安装
==========
如果您不是使用django
---------------------------
1. ```pip install autoscalebot```,并将其添加到您的`requirements.txt`中
2. 在您的`PYTHON_PATH`中的某个位置创建一个设置文件。我们通常将其命名为`autoscale_settings.py`,但您可以根据需要命名。
3. 为您的应用程序设置这些设置,以及任何可选的调整设置。请参阅autoscale_settings.py.dist中的示例。
```python
HEROKU_APP_NAME = "my-app-name"
HEROKU_API_KEY = "1234567890abcdef1234567890abcdef"
```
4. 将autoscale添加到您的`Procfile`中
```
autoscaleworker: autoscalebot --settings=autoscale_settings
```
如果您使用的是django
-----------------------
1. ```pip install autoscalebot```,并将其添加到您的`requirements.txt`中
2. 在您的`settings.py`中设置以下必需的设置,以及任何可选的调整设置。以下设置列表中所有名称的前缀都为`AUTOSCALE_`
```python
AUTOSCALE_HEROKU_APP_NAME = "my-app-name"
AUTOSCALE_HEROKU_API_KEY = "1234567890abcdef1234567890abcdef"
```
3. 如果您想使用内置测试视图
* settings.py
```python
INSTALLED_APPS += ("autoscalebot",)
```
* urls.py
```python
urlpatterns += patterns('',
url(r'^', include('autoscalebot.urls', app_name="autoscalebot", namespace="autoscalebot"), ),
)
```
4. 将它添加到您的Procfile
```
autoscaleworker: project/manage.py run_autoscalebot
```
用法
=====
它是如何工作的
------------
Autoscalebot 请求一个心跳 URL,并确保响应时间在您定义的范围内。如果连续多次超出这些范围,它将根据需要扩展或缩减您的应用。描述中的每一部分都可以通过设置进行配置。请注意,运行 autoscalebot 需要一个工作 dyno,所以如果您大部分时间都在运行一个 dyno,这不会为您节省任何费用。但它不必在 Heroku 上运行 - 任何互联网连接的计算机都可以。
可用设置
-------------------
Autoscalebot 有许多设置,因此您应该能够根据大多数需求进行调优。
* `HEROKU_APP_NAME`
* *必需*。您应用的名称,例如 "dancing-forest-1234"。
* `HEROKU_API_KEY`
* *必需*。您的 API 密钥 - 您可以在您的 [账户页面](https://api.heroku.com/account) 获取。
* `HEARTBEAT_INTERVAL_IN_SECONDS`
* 心跳检查之间的秒数。默认为 `30`。
* `HEARTBEAT_URL`
* Autoscale 应该击中的 URL,并期望在给定时间内收到响应。默认为 `/autoscalebot/heartbeat/`
* `MAX_RESPONSE_TIME_IN_MS`
* 响应的最大时间,在它被视为 "太慢" 之前。默认为 `1000`。
* `MIN_RESPONSE_TIME_IN_MS`
* 响应的最小时间,在它被视为 "太快" 之前。默认为 `200`。
* `NUMBER_OF_FAILS_TO_SCALE_UP_AFTER`
* 在自动扩展添加 dynos 之前连续失败的次数(超时或 500)。默认为 `3`。
* `NUMBER_OF_PASSES_TO_SCALE_DOWN_AFTER`
* 在自动扩展删除 dynos 之前连续通过的次数。默认为 `5`。
* `MAX_DYNOS`
* 绝对最大 dyno 数量。默认为 `3`。此值可以是整数,也可以是时间/最大值对的字典。例如。
```python
# 将绝对最大值设置为 5 个 dyno
MAX_DYNOS = 5
# 将最大值设置为从当地时间上午 9 点到下午 5 点为 5 个 dyno,其他时间为 2 个 dyno。
MAX_DYNOS = {
"0:00": 2,
"9:00": 5,
"17:00": 2
}
# 如果您使用基于时间的设置,请务必设置您的时间区域。对于 django,那就是
TIME_ZONE = 'America/Vancouver'
```
* `MIN_DYNOS`
* 绝对最小 dyno 数量。默认为 `1`。此值可以是整数,也可以是时间/最大值对的字典。例如。
```python
# 将绝对最小值设置为 2 个 dyno
MIN_DYNOS = 2
# 将最小值设置为从当地时间上午 8 点到下午 6 点为 3 个 dyno,其他时间为 1 个 dyno。
MIN_DYNOS = {
"0:00": 1,
"8:00": 3,
"18:00": 1
}
```
* `INCREMENT`
* 缩放时要添加或删除的 dyno 数量。默认为 `1`。
* `NOTIFICATION_BACKENDS`
* 所有通知请求的后端列表。默认为 `[]`
* `NOTIFY_IF_SCALE_DIFF_EXCEEDS_THRESHOLD`
* (v0.3) 与下面的设置配对,此设置将在给定时间段的缩放差异超过阈值时调用 `NOTIFICATION_BACKENDS`。例如,如果我在 30 分钟内看到超过 10 个 dyno 的缩放,网站可能发生了有趣的事情。我可能想知道。默认为 `None`,并且是禁用的。
* `NOTIFY_IF_SCALE_DIFF_EXCEEDS_PERIOD_IN_MINUTES`
* (v0.3) 计算差异的时间段。默认为 `None`。
* `NOTIFY_IF_NEEDS_EXCEED_MAX`
* 当应用达到 `MAX_DYNOS` 且响应太慢时,调用 `NOTIFICATION_BACKENDS`。这可能意味着 `MAX_DYNOS` 太低,但 autoscalebot 不会在没有您明确指令的情况下将其扩展。默认为 `True`。
* `NOTIFY_IF_NEEDS_BELOW_MIN`
* 当应用达到 `MIN_DYNOS` 且响应低于缩放下限(但高于一个)时,调用 `NOTIFICATION_BACKENDS`。这对于学习您是否将 `MIN_DYNOS` 设置得太低很有用。默认为 `False`。
* `NOTIFY_ON_SCALE_FAILS`
* 如果对缩放API的调用失败(任何原因),则调用`NOTIFICATION_BACKENDS`。请注意,缩放失败不会造成损害,下一次心跳将再次尝试缩放。默认为`False`。
* `NOTIFY_ON_EVERY_SCALE`
* 在每次缩放时调用`NOTIFICATION_BACKENDS`。默认为`False`。
* `NOTIFY_ON_EVERY_PING`
* 在每次ping时调用`NOTIFICATION_BACKENDS`。默认为`False`。
通知
------------
autoscalebot支持通知后端,因此您可以在缩放上下文发生时收到通知。它自带了一些后端。欢迎为其他后端提供pull requests!内置的有
* `ConsoleBackend`,将消息打印到控制台,
* `DjangoEmailBackend`,当在Django项目中使用时,会通过电子邮件发送给`ADMINS`,
* `LoggerBackend`,将消息发送到python日志器。
* `TestBackend`,将消息添加到列表中,用于单元测试。
要使用后端,只需在`NOTIFICATION_BACKENDS`中指定它们。例如
```python
NOTIFICATION_BACKENDS = [
'autoscalebot.backends.notification.DjangoEmailBackend',
'autoscalebot.backends.notification.ConsoleBackend',
]
```
制作一个优秀的心跳URL
---------------------------
最佳的心跳URL将针对您的应用在扩展时最有可能遇到的瓶颈进行测试。捆绑的Django应用提供了一个击中缓存、数据库和磁盘I/O的URL。为了使自动缩放适合您的应用,您最好编写一个自定义视图,模拟用户最常用的操作。
Django的staticfiles陷阱,以及自动缩放的令人愉快的副作用
----------------------------------------------------------------------------
关于Heroku以及大多数其他基于云的服务有一个事实:如果没有流量击中您的dyno,它们会安静地将它关闭,直到有请求进来。通常这不是什么大问题,但由于静态文件似乎在本地文件系统中查找唯一的文件名缓存,以及Heroku在dynos上的只读(类似)文件系统,在Heroku上处理静态文件的最明智方式通常是使用这样的Procfile
web: project/manage.py collectstatic --noinput;python project/manage.py run_gunicorn -b "0.0.0.0:$PORT" --workers=4
当然,问题是,一旦Heroku关闭了您的dyno,新的dyno必须重新运行collectstatic才能处理请求——这可能会花费一些时间。`autoscalebot`的心跳有一个非常好的副作用:如果您将其设置得足够低(小型站点每两分钟一次),并且您正确地以最小规模运行,每个dyno都将获得流量,Heroku永远不会将它们关闭。
路线图
------------------------------------
*3.0*
* 主要重写 - 切换到可插拔的后端用于监控、决策、缩放和通知。
* 基于时间的通知阈值
* 设置在缩放之间的最小冷却时间
最近更新(完整日志在CHANGES中)
------------------------------------
*2.0*
* 更好的Django集成包括心跳URL和视图
* 基于时间的MAX和MIN设置
* 通过NOTIFICATION_BACKENDS进行通知
*0.1*
* 初次发布
致谢
========
这个包不是由Heroku编写、维护或以任何方式与Heroku相关的。"Heroku"是Heroku的版权。
autoscalebot本身的代码致谢在AUTHORS文件中。
下一个版本将支持其他PaaS堆栈,以及可配置的测量和决策后端。Autoscalebot也喜欢django,并且与之很好地协同工作。
安装
==========
如果您不是使用django
---------------------------
1. ```pip install autoscalebot```,并将其添加到您的`requirements.txt`中
2. 在您的`PYTHON_PATH`中的某个位置创建一个设置文件。我们通常将其命名为`autoscale_settings.py`,但您可以根据需要命名。
3. 为您的应用程序设置这些设置,以及任何可选的调整设置。请参阅autoscale_settings.py.dist中的示例。
```python
HEROKU_APP_NAME = "my-app-name"
HEROKU_API_KEY = "1234567890abcdef1234567890abcdef"
```
4. 将autoscale添加到您的`Procfile`中
```
autoscaleworker: autoscalebot --settings=autoscale_settings
```
如果您使用的是django
-----------------------
1. ```pip install autoscalebot```,并将其添加到您的`requirements.txt`中
2. 在您的`settings.py`中设置以下必需的设置,以及任何可选的调整设置。以下设置列表中所有名称的前缀都为`AUTOSCALE_`
```python
AUTOSCALE_HEROKU_APP_NAME = "my-app-name"
AUTOSCALE_HEROKU_API_KEY = "1234567890abcdef1234567890abcdef"
```
3. 如果您想使用内置测试视图
* settings.py
```python
INSTALLED_APPS += ("autoscalebot",)
```
* urls.py
```python
urlpatterns += patterns('',
url(r'^', include('autoscalebot.urls', app_name="autoscalebot", namespace="autoscalebot"), ),
)
```
4. 将它添加到您的Procfile
```
autoscaleworker: project/manage.py run_autoscalebot
```
用法
=====
它是如何工作的
------------
Autoscalebot 请求一个心跳 URL,并确保响应时间在您定义的范围内。如果连续多次超出这些范围,它将根据需要扩展或缩减您的应用。描述中的每一部分都可以通过设置进行配置。请注意,运行 autoscalebot 需要一个工作 dyno,所以如果您大部分时间都在运行一个 dyno,这不会为您节省任何费用。但它不必在 Heroku 上运行 - 任何互联网连接的计算机都可以。
可用设置
-------------------
Autoscalebot 有许多设置,因此您应该能够根据大多数需求进行调优。
* `HEROKU_APP_NAME`
* *必需*。您应用的名称,例如 "dancing-forest-1234"。
* `HEROKU_API_KEY`
* *必需*。您的 API 密钥 - 您可以在您的 [账户页面](https://api.heroku.com/account) 获取。
* `HEARTBEAT_INTERVAL_IN_SECONDS`
* 心跳检查之间的秒数。默认为 `30`。
* `HEARTBEAT_URL`
* Autoscale 应该击中的 URL,并期望在给定时间内收到响应。默认为 `/autoscalebot/heartbeat/`
* `MAX_RESPONSE_TIME_IN_MS`
* 响应的最大时间,在它被视为 "太慢" 之前。默认为 `1000`。
* `MIN_RESPONSE_TIME_IN_MS`
* 响应的最小时间,在它被视为 "太快" 之前。默认为 `200`。
* `NUMBER_OF_FAILS_TO_SCALE_UP_AFTER`
* 在自动扩展添加 dynos 之前连续失败的次数(超时或 500)。默认为 `3`。
* `NUMBER_OF_PASSES_TO_SCALE_DOWN_AFTER`
* 在自动扩展删除 dynos 之前连续通过的次数。默认为 `5`。
* `MAX_DYNOS`
* 绝对最大 dyno 数量。默认为 `3`。此值可以是整数,也可以是时间/最大值对的字典。例如。
```python
# 将绝对最大值设置为 5 个 dyno
MAX_DYNOS = 5
# 将最大值设置为从当地时间上午 9 点到下午 5 点为 5 个 dyno,其他时间为 2 个 dyno。
MAX_DYNOS = {
"0:00": 2,
"9:00": 5,
"17:00": 2
}
# 如果您使用基于时间的设置,请务必设置您的时间区域。对于 django,那就是
TIME_ZONE = 'America/Vancouver'
```
* `MIN_DYNOS`
* 绝对最小 dyno 数量。默认为 `1`。此值可以是整数,也可以是时间/最大值对的字典。例如。
```python
# 将绝对最小值设置为 2 个 dyno
MIN_DYNOS = 2
# 将最小值设置为从当地时间上午 8 点到下午 6 点为 3 个 dyno,其他时间为 1 个 dyno。
MIN_DYNOS = {
"0:00": 1,
"8:00": 3,
"18:00": 1
}
```
* `INCREMENT`
* 缩放时要添加或删除的 dyno 数量。默认为 `1`。
* `NOTIFICATION_BACKENDS`
* 所有通知请求的后端列表。默认为 `[]`
* `NOTIFY_IF_SCALE_DIFF_EXCEEDS_THRESHOLD`
* (v0.3) 与下面的设置配对,此设置将在给定时间段的缩放差异超过阈值时调用 `NOTIFICATION_BACKENDS`。例如,如果我在 30 分钟内看到超过 10 个 dyno 的缩放,网站可能发生了有趣的事情。我可能想知道。默认为 `None`,并且是禁用的。
* `NOTIFY_IF_SCALE_DIFF_EXCEEDS_PERIOD_IN_MINUTES`
* (v0.3) 计算差异的时间段。默认为 `None`。
* `NOTIFY_IF_NEEDS_EXCEED_MAX`
* 当应用达到 `MAX_DYNOS` 且响应太慢时,调用 `NOTIFICATION_BACKENDS`。这可能意味着 `MAX_DYNOS` 太低,但 autoscalebot 不会在没有您明确指令的情况下将其扩展。默认为 `True`。
* `NOTIFY_IF_NEEDS_BELOW_MIN`
* 当应用达到 `MIN_DYNOS` 且响应低于缩放下限(但高于一个)时,调用 `NOTIFICATION_BACKENDS`。这对于学习您是否将 `MIN_DYNOS` 设置得太低很有用。默认为 `False`。
* `NOTIFY_ON_SCALE_FAILS`
* 如果对缩放API的调用失败(任何原因),则调用`NOTIFICATION_BACKENDS`。请注意,缩放失败不会造成损害,下一次心跳将再次尝试缩放。默认为`False`。
* `NOTIFY_ON_EVERY_SCALE`
* 在每次缩放时调用`NOTIFICATION_BACKENDS`。默认为`False`。
* `NOTIFY_ON_EVERY_PING`
* 在每次ping时调用`NOTIFICATION_BACKENDS`。默认为`False`。
通知
------------
autoscalebot支持通知后端,因此您可以在缩放上下文发生时收到通知。它自带了一些后端。欢迎为其他后端提供pull requests!内置的有
* `ConsoleBackend`,将消息打印到控制台,
* `DjangoEmailBackend`,当在Django项目中使用时,会通过电子邮件发送给`ADMINS`,
* `LoggerBackend`,将消息发送到python日志器。
* `TestBackend`,将消息添加到列表中,用于单元测试。
要使用后端,只需在`NOTIFICATION_BACKENDS`中指定它们。例如
```python
NOTIFICATION_BACKENDS = [
'autoscalebot.backends.notification.DjangoEmailBackend',
'autoscalebot.backends.notification.ConsoleBackend',
]
```
制作一个优秀的心跳URL
---------------------------
最佳的心跳URL将针对您的应用在扩展时最有可能遇到的瓶颈进行测试。捆绑的Django应用提供了一个击中缓存、数据库和磁盘I/O的URL。为了使自动缩放适合您的应用,您最好编写一个自定义视图,模拟用户最常用的操作。
Django的staticfiles陷阱,以及自动缩放的令人愉快的副作用
----------------------------------------------------------------------------
关于Heroku以及大多数其他基于云的服务有一个事实:如果没有流量击中您的dyno,它们会安静地将它关闭,直到有请求进来。通常这不是什么大问题,但由于静态文件似乎在本地文件系统中查找唯一的文件名缓存,以及Heroku在dynos上的只读(类似)文件系统,在Heroku上处理静态文件的最明智方式通常是使用这样的Procfile
web: project/manage.py collectstatic --noinput;python project/manage.py run_gunicorn -b "0.0.0.0:$PORT" --workers=4
当然,问题是,一旦Heroku关闭了您的dyno,新的dyno必须重新运行collectstatic才能处理请求——这可能会花费一些时间。`autoscalebot`的心跳有一个非常好的副作用:如果您将其设置得足够低(小型站点每两分钟一次),并且您正确地以最小规模运行,每个dyno都将获得流量,Heroku永远不会将它们关闭。
路线图
------------------------------------
*3.0*
* 主要重写 - 切换到可插拔的后端用于监控、决策、缩放和通知。
* 基于时间的通知阈值
* 设置在缩放之间的最小冷却时间
最近更新(完整日志在CHANGES中)
------------------------------------
*2.0*
* 更好的Django集成包括心跳URL和视图
* 基于时间的MAX和MIN设置
* 通过NOTIFICATION_BACKENDS进行通知
*0.1*
* 初次发布
致谢
========
这个包不是由Heroku编写、维护或以任何方式与Heroku相关的。"Heroku"是Heroku的版权。
autoscalebot本身的代码致谢在AUTHORS文件中。