如何在Heroku上运行InfluxDB?

dsp*_*099 6 deployment heroku influxdb

是否可能,如果可能,怎么样?我希望能够从现有的Heroku基础设施中获取它.

我需要一个Procfile吗?据我所知,它只是一个用Go编写的独立二进制文件!因此,部署它不应该那么难,我只是好奇如何部署它,因为我不认为我理解Heroku部署的细节.

小智 7

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

Dynos是短暂的服务器.在dyno重启之间数据不会持续存在,并且无法与其他dynos共享.实际上,在dyno上部署的任何数据库应用程序基本上都是无用的.这就是为什么Heroku上的数据库(例如Postgres)都是附加组件.InfluxDB应该设置在不同的平台上(例如,AWS EC2或VPS),因为Heroku Add-on不可用.


也就是说,可以将InfluxDB部署到Heroku dyno.

要开始,重要的是要理解'slug'的概念.Slugs是容器(类似于Docker镜像),它包含在Heroku基础架构上运行程序所需的一切.要部署InfluxDB,需要创建InfluxDB slug.*有两种方法可以为Go库创建一个slug:

  1. 直接从描述一个围棋可执行文件创建一个塞在这里.**
  2. 使用Heroku Go构建包从源代码构建slug(如下所述).

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

echo 'web: ./influxd' > Procfile
Run Code Online (Sandbox Code Playgroud)

Go buildpack要求所有依赖项都包含在目录中.使用godep依赖工具将所有依赖项提供给目录.

go get github.com/tools/godep
godep save
Run Code Online (Sandbox Code Playgroud)

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

git add -A .
git commit -m dependencies
Run Code Online (Sandbox Code Playgroud)

最后,创建一个新的应用程序并告诉它使用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.
Run Code Online (Sandbox Code Playgroud)

Heroku将显示错误页面. 将显示错误,因为Heroku的"web"进程类型需要应用程序监听$PORT环境变量描述的端口上的传入请求,否则它将终止dyno.InfluxDB的API和管理面板分别在端口8086和端口上运行8083.

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

另一个问题是,Heroku只暴露每个dyno一个端口,因此API和管理面板不能同时暴露给互联网.智能反向代理可以使用Heroku的X-Forwarded-Port请求标头解决该问题.

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


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

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