是否可能实现,并且如果可能的话,如何实现? 我想从我现有的Heroku基础架构中访问它。
我需要一个Procfile
吗? 从我理解的内容来看,它只是用Go编写的独立二进制文件! 因此,部署它不应该很难,我只是好奇如何部署它,因为我不认为我理解Heroku部署的细节。
是否可能实现,并且如果可能的话,如何实现? 我想从我现有的Heroku基础架构中访问它。
我需要一个Procfile
吗? 从我理解的内容来看,它只是用Go编写的独立二进制文件! 因此,部署它不应该很难,我只是好奇如何部署它,因为我不认为我理解Heroku部署的细节。
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:
echo 'web: ./influxd' > Procfile
Go构建包要求所有依赖项都包含在目录中。使用godep依赖工具将所有依赖项打包到该目录中。
go get github.com/tools/godep
godep save
git add -A .
git commit -m dependencies
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
请求头解决这个问题。
总之,不要使用Heroku dynos来运行InfluxDB。
* 这意味着当部署到Heroku时,独立的Go可执行文件的好处将会丧失,因为它需要被重新编译以适应Heroku的堆栈。
** 直接从InfluxDB可执行文件创建slug是不起作用的,因为没有内置的方法来监听由Heroku在$PORT
环境变量中给出的正确端口。
我强烈推荐 hosted InfluxDB 或在 VPS 上启动自己的数据库,这些都可以指向您现有的基于 Heroku 的应用程序。然后,尽可能让这些实例彼此靠近(即相同区域或同一数据中心),以确保数据库与应用程序栈之间具有低延迟。