【问题标题】:Is redis on Heroku possible without an addon?Heroku 上的 redis 是否可以在没有插件的情况下使用?
【发布时间】:2013-02-02 11:03:21
【问题描述】:

我正在研究将 Heroku 用于使用 Redis 的 PHP 应用程序。我已经看到了各种 redis 插件。例如,使用 Redis To Go,您可以在 PHP 代码中使用环境变量 $_ENV['REDISTOGO_URL'] 作为 Redis 服务器的 URL。

这些附加组件中的大多数都有自己的定价方案,我想避免这些方案。我对heroku的工作方式有点困惑。有没有一种方法可以在我自己的 Dynos 上安装 Redis 而无需插件?

例如,有一个工作人员测功机充当服务器,另一个充当客户端?如果可能的话,我会怎么做:

  1. 在 Dyno 上安装和运行 redis 服务器?这是一样的吗 安装在任何其他 Unix 机器上?我可以 ssh 到它并安装我想要的任何东西吗?

  2. 让一台测功机连接到 另一个通过 TCP 的 IP/端口?工人测功机有自己的吗 我可以使用的可引用 IP 地址或命名 URL?我可以以某种方式从 PHP 动态获取它们吗?

redis 客户端的 php 代码假定您可以连接到主机和端口,但不知道会是什么?

$redis = new Predis\Client(array(
        "scheme" => "tcp",
        "host" => $host, //how do i get the host/port of a dyno? 
        "port" => $port));

【问题讨论】:

    标签: php heroku redis


    【解决方案1】:

    redis 具有客户端服务器架构,您可以将其安装在一台机器上(在您的情况下为 dyno)并从任何客户端访问它。

    有关库的更多帮助,您可以参考this link 或者您可以查看Redis documentaion,这是一个使用 Redis 广告数据库和 PHP 实现 twitter 克隆的简单案例研究

    【讨论】:

    • 谢谢,问题更多是关于如何在 heroku 上设置客户端/服务器。我想我理解 Redis 部分本身。
    • redis 的默认端口是 6379,您可以在 redis.conf 文件中找到它,主机 ip 是您的服务器的 ip(在您的情况下是 Dyno),即您运行“redis-server”的服务器的 ip二进制。
    【解决方案2】:

    在测功机上运行 redis 是一个有趣的想法。您可能需要创建一个 redis buildpack 以便您的 dynos 可以下载并运行 redis。作为"redis has no dependencies other than a working GCC compiler and libc",这在技术上应该是可行的。

    但是,您可能会遇到以下问题:

    1. Heroku dynos 没有静态 IP 地址

      "dynos don’t have static IP addresses .. you can never access a dyno directly by IP"

      即使您在 dyno 上设置和运行 Redis,我也不知道如何定位该 dyno 实例并向其发送 redis 请求。这意味着您的 Redis 服务器可能必须在与您的 Web 服务器/主应用程序相同的测功机上运行。

      意味着,如果您尝试通过创建更多 Web dyno 来扩展您的应用程序,您还将创建更多本地 redis 实例。他们之间不会共享数据。这并不是一个特别可扩展的设计,但如果您的应用程序小到只需要一个网络测功机,它可能会起作用。

    2. Heroku dynos 有一个临时文件系统

      "no files that are written are visible to processes in any other dyno and any files written will be discarded the moment the dyno is stopped or restarted"

      默认情况下,Redis 将其 RDB 文件和 AOF 日志写入磁盘。您需要定期在某处备份这些内容,以便在您的测功机重新启动后获取和恢复。请参阅documentation on Redis persistence

    3. Heroku dynos 经常重启

      "Dynos are cycled at least once per day, or whenever the dyno manifold detects a fault in the underlying hardware"

      您需要能够在每次 dyno 启动并恢复数据时启动您的 redis 服务器。

    4. Heroku dynos 有 512MB 的 RAM

      "Each dyno is allocated 512MB of memory to operate within"

      如果您的 Redis 服务器与您的 Web 服务器在同一台测功机上运行,​​请减去您的主应用所需的 RAM。你需要多少 Redis 内存?

      以下是一些试图估计和跟踪 Redis 内存使用的问题:

    --

    总体而言:我建议阅读12 Factor Apps 以进一步了解heroku 的预期应用程序模型。

    简短的版本是 dynos 旨在成为可以轻松创建和丢弃以满足需求的独立工作者,并且 dynos 访问各种资源以读取或写入数据并为您的应用程序提供服务。 redis 实例是资源的一个示例。正如您从上面的项目中看到的那样,通过使用 redis 插件,您将获得一些保证是静态的、稳定的和可访问的。

    阅读材料:

    1. http://www.12factor.net/ - 特别是 ProcessesServices
    2. The Heroku Process Model
    3. Heroku Blog - The Process Model

    【讨论】:

    • 感谢您提供的所有链接,这非常有帮助
    • @user1385729 很高兴它有帮助! :) 随时提出更多问题。
    • @user1385729 感谢您提出这个问题 - 这让我开始思考如何以几种不同的方式使用 heroku
    猜你喜欢
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2011-04-09
    • 2014-06-16
    • 2020-01-22
    相关资源
    最近更新 更多