如何在Heroku上运行InfluxDB?

时间:2015-02-23 10:09:36

标签: heroku deployment influxdb

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

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

2 个答案:

答案 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:

  1. 直接从Go可执行文件创建一个slug,如here所述。**
  2. 使用Heroku Go buildpack从源代码构建slug(如下所述)。

  3. 要使用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和管理面板分别在端口80868083上运行。

    不幸的是,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进行托管时需要考虑一些因素:

  • ops,例如备份,监控(是否需要安装额外的服务,打开额外的端口等 - Heroku可能会妨碍这里)
  • 效果,考虑dyno size
  • 如果您需要更大的动态,费用就成了问题。当你走IaaS路线时,你会得到更多的回报。
  • dyno的其他“特征”,例如disk ephemerality

我强烈推荐hosted InfluxDB或在VPS上启动自己的活动,所有这些都可以将现有的基于Heroku的应用指向。然后,它将有助于使这些实例尽可能靠近(即相同的区域,或者如果可能的话共同定位),假设需要DB和app堆栈之间的低延迟。