跳转到主要内容

在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文件中。

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

autoscalebot-2.1.tar.gz (18.0 kB 查看散列)

上传

支持者