有可能吗,如果有,怎么做?我希望能够从我现有的 Heroku 基础设施中访问它。
我需要一个Procfile
吗?据我了解,它只是一个用 Go 编写的独立二进制文件!所以部署它应该不难,我只是好奇如何部署它,因为我认为我不了解 Heroku 部署的来龙去脉。
有可能吗,如果有,怎么做?我希望能够从我现有的 Heroku 基础设施中访问它。
我需要一个Procfile
吗?据我了解,它只是一个用 Go 编写的独立二进制文件!所以部署它应该不难,我只是好奇如何部署它,因为我认为我不了解 Heroku 部署的来龙去脉。
Heroku Dynos不应该用于部署像 InfluxDB 这样的数据库应用程序。
Dynos 是临时服务器。数据不会在测功机重新启动之间保留,并且不能与其他测功机共享。实际上,任何部署在测功机上的数据库应用程序基本上都是无用的。这就是为什么 Heroku 上的数据库(例如 Postgres)都是附加组件的原因。InfluxDB 应该设置在不同的平台(如 AWS EC2 或 VPS)上,因为 Heroku 插件不可用。
也就是说,可以将 InfluxDB 部署到 Heroku 测功机。
要开始,重要的是要了解“蛞蝓”的概念。Slugs 是容器(类似于 Docker 镜像),它包含在 Heroku 基础设施上运行程序所需的一切。要部署 InfluxDB,需要创建 InfluxDB slug。* 有两种方法可以为 Go 库创建 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-Port
request header解决这个问题。
最重要的是,不要使用 Heroku dynos 来运行 InfluxDB。
* 这意味着在部署到 Heroku 时会失去独立 Go 可执行文件的好处,因为它需要为 Heroku 的堆栈重新编译。
** 直接从 InfluxDB 可执行文件创建一个 slug 不起作用,因为没有内置的方法来监听 Heroku 在$PORT
环境变量中给出的正确端口。
当使用自定义buildpack时,我喜欢认为 Heroku 节点上的任何事情都是可能的,但是在使用 Heroku 托管时有一些注意事项:
我强烈推荐托管 InfluxDB或在 VPS 上运行您自己的,所有这些您都可以将您现有的基于 Heroku 的应用程序指向。然后,它将有助于使这些实例尽可能靠近(即同一区域,或尽可能位于同一位置),假设需要在 DB 和应用程序堆栈之间实现低延迟。