7

有可能吗,如果有,怎么做?我希望能够从我现有的 Heroku 基础设施中访问它。

我需要一个Procfile吗?据我了解,它只是一个用 Go 编写的独立二进制文件!所以部署它应该不难,我只是好奇如何部署它,因为我认为我不了解 Heroku 部署的来龙去脉。

4

2 回答 2

9

Heroku Dynos应该用于部署像 InfluxDB 这样的数据库应用程序。

Dynos 是临时服务器。数据不会在测功机重新启动之间保留,并且不能与其他测功机共享。实际上,任何部署在测功机上的数据库应用程序基本上都是无用的。这就是为什么 Heroku 上的数据库(例如 Postgres)都是附加组件的原因。InfluxDB 应该设置在不同的平台(如 AWS EC2 或 VPS)上,因为 Heroku 插件不可用。


也就是说,可以将 InfluxDB 部署到 Heroku 测功机。

要开始,重要的是要了解“蛞蝓”的概念。Slugs 是容器(类似于 Docker 镜像),它包含在 Heroku 基础设施上运行程序所需的一切。要部署 InfluxDB,需要创建 InfluxDB slug。* 有两种方法可以为 Go 库创建 slug:

  1. 如此处所述,直接从 Go 可执行文件创建 slug 。**
  2. 使用 Heroku Go buildpack 从源代码构建 slug(解释如下)。

要使用 buildpack 从源代码构建 slug,首先克隆 InfluxDB Github 存储库。然后在 repo 的根目录添加一个 Procfile,它告诉 Heroku 在 dyno 启动时要运行的命令。

echo 'web: ./influxd' > Procfile

Go buildpack 要求所有依赖项都包含在目录中。使用 godep 依赖工具将所有依赖项供应到目录中。

go get github.com/tools/godep
godep save

接下来,将上面所做的更改提交到 git repo。

git add -A .
git commit -m dependencies

最后,创建一个新应用程序并告诉它使用 Go buildpack 进行编译。

heroku create -b https://github.com/kr/heroku-buildpack-go.git
git push heroku master
heroku open    // Open the newly created InfluxDB instance in the browser.

Heroku 将显示一个错误页面。 将显示错误,因为 Heroku 的 'web' 进程类型要求应用程序在$PORT环境变量描述的端口上侦听传入请求,否则它将杀死测功机。InfluxDB 的 API 和管理面板分别在端口8086和上运行8083

不幸的是,InfluxDB 不允许从环境变量中设置这些端口,只能通过配置文件 ( /etc/config.toml)。在 InfluxDB 启动之前执行的一个小 bash 脚本可以在 InfluxDB 启动之前在配置文件中设置正确的端口。

另一个问题是,Heroku 每个测功机只公开一个端口,因此 API 和管理面板不能同时暴露在互联网上。智能反向代理可以使用 Heroku 的X-Forwarded-Portrequest header解决这个问题。

最重要的是,不要使用 Heroku dynos 来运行 InfluxDB。


* 这意味着在部署到 Heroku 时会失去独立 Go 可执行文件的好处,因为它需要为 Heroku 的堆栈重新编译。

** 直接从 InfluxDB 可执行文件创建一个 slug 不起作用,因为没有内置的方法来监听 Heroku 在$PORT环境变量中给出的正确端口。

于 2015-03-09T02:40:27.750 回答
2

当使用自定义buildpack时,我喜欢认为 Heroku 节点上的任何事情都是可能的,但是在使用 Heroku 托管时有一些注意事项:

  • 操作,例如备份、监控(它是否需要安装额外的服务、打开额外的端口等——Heroku 可能会在这里阻碍)
  • 性能,考虑测功机尺寸
  • 如果您需要更大的测功机,成本就会成为问题。当您走 IaaS 路线时,您将获得更多收益。
  • 测功机的其他“功能”,例如磁盘短暂性

我强烈推荐托管 InfluxDB或在 VPS 上运行您自己的,所有这些您都可以将您现有的基于 Heroku 的应用程序指向。然后,它将有助于使这些实例尽可能靠近(即同一区域,或尽可能位于同一位置),假设需要在 DB 和应用程序堆栈之间实现低延迟。

于 2015-03-05T17:56:27.240 回答