如何在Heroku上运行InfluxDB?

7

是否可能实现,并且如果可能的话,如何实现? 我想从我现有的Heroku基础架构中访问它。

我需要一个Procfile吗? 从我理解的内容来看,它只是用Go编写的独立二进制文件! 因此,部署它不应该很难,我只是好奇如何部署它,因为我不认为我理解Heroku部署的细节。

2个回答

10

Heroku Dynos不应用于部署类似InfluxDB这样的数据库应用程序。

Dynos是短暂的服务器。数据在dyno重新启动之间不会持久化,也无法与其他dyno共享。实际上,部署在dyno上的任何数据库应用程序都基本无用。这就是为什么在Heroku上的数据库(例如Postgres)都是Add-ons的原因。由于没有Heroku Add-on,因此应将InfluxDB设置在不同的平台上(例如AWS EC2或VPS)。


话虽如此,将InfluxDB部署到Heroku dyno是可能的

要开始,了解“slug”的概念非常重要。Slug是容器(类似于Docker映像),它包含运行Heroku基础架构上程序所需的一切。要部署InfluxDB,需要创建一个InfluxDB slug。有两种方法可以为Go库创建slug:

  1. 按照此处中描述的直接从Go可执行文件创建slug。
  2. 使用Heroku Go buildpack从源代码构建slug(下面会讲到)。

使用构建包从源代码构建slug,首先克隆InfluxDB Github存储库。然后在存储库的根目录下添加Procfile,该文件告诉Heroku在dyno启动时要运行的命令。
echo 'web: ./influxd' > Procfile

Go构建包要求所有依赖项都包含在目录中。使用godep依赖工具将所有依赖项打包到该目录中。

go get github.com/tools/godep
godep save

下一步,将上述更改提交到git仓库中。
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环境变量描述的传入请求端口,否则它将终止dyno并显示错误。InfluxDB的API和管理面板分别在端口80868083上运行。

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

另一个问题是,Heroku每个dyno仅公开一个端口,因此API和管理面板不能同时暴露在互联网上。一个聪明的反向代理可以通过使用Heroku的X-Forwarded-Port请求头解决这个问题。

总之,不要使用Heroku dynos来运行InfluxDB。


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

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


2
我喜欢认为使用自定义 buildpack 在 Heroku 节点上可以实现任何可能性,但在使用 Heroku 进行托管时需要考虑以下几点:
  • 运维问题,例如备份、监控(是否需要安装额外服务、打开额外端口等 - Heroku 可能会成为障碍)
  • 性能问题,考虑 dyno 大小
  • 如果您需要更大的 dyno,则成本成为一个问题。当您选择 IaaS 路线时,您将获得更多的回报。
  • 其他 dyno 的 "特性",例如磁盘临时性

我强烈推荐 hosted InfluxDB 或在 VPS 上启动自己的数据库,这些都可以指向您现有的基于 Heroku 的应用程序。然后,尽可能让这些实例彼此靠近(即相同区域或同一数据中心),以确保数据库与应用程序栈之间具有低延迟。


是的,但会有很多疑问,性能会受到什么影响?我想除非VPS恰好在与Heroku相同的集群上,即在亚马逊上,否则不会有什么好处。我错了吗? - dsp_099
一些测试就足够了。例如,同一地区的Digital Ocean droplet与不同地区的Amazon实例进行比较。除此之外,dyno size也可能是一个考虑因素,例如,您认为您的InfluxDB实例需要多少RAM?如果答案超出了您的预期,我会选择一个Amazon实例(与您的Heroku实例在同一地区),纯粹是为了节省成本。我会更新答案以反映这些额外的考虑因素。 - opyate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接