是否可能,如果可能,怎么样?我希望能够从现有的Heroku基础设施中获取它。
我需要Procfile
吗?据我所知,它只是一个用Go编写的独立二进制文件!所以部署它应该不难,我只是好奇如何部署它,因为我不认为我理解Heroku部署的细节。
答案 0 :(得分: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:
要使用buildpack从源代码构建slug,首先克隆InfluxDB Github repo。然后在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
环境变量描述的端口上的传入请求否则会杀死dyno。 InfluxDB的API和管理面板分别在端口8086
和8083
上运行。
不幸的是,InfluxDB不允许通过配置文件(/etc/config.toml
)从环境变量设置这些端口。在InfluxDB启动之前执行的一个小bash脚本可以在InfluxDB启动之前在配置文件中设置正确的端口。
另一个问题是,Heroku只为每个dyno公开一个端口,因此API和管理面板不能同时暴露给互联网。智能反向代理可以使用Heroku的X-Forwarded-Port
request header处理该问题。
最重要的是,不要使用Heroku dynos来运行InfluxDB。
*这意味着在部署到Heroku时,独立Go可执行文件的好处会丢失,因为它需要为Heroku的堆栈重新编译。
**直接从InfluxDB可执行文件创建一个slug不起作用,因为没有内置的方法来监听Heroku在$PORT
环境变量中给出的正确端口。
答案 1 :(得分:1)
我喜欢在使用自定义buildpack时认为在Heroku节点上可以做任何事情,但在使用Heroku进行托管时需要考虑一些因素:
我强烈推荐hosted InfluxDB或在VPS上启动自己的活动,所有这些都可以将现有的基于Heroku的应用指向。然后,它将有助于使这些实例尽可能靠近(即相同的区域,或者如果可能的话共同定位),假设需要DB和app堆栈之间的低延迟。