10

我正在研究将 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));
4

2 回答 2

12

在测功机上运行 redis 是一个有趣的想法。您可能需要创建一个 redis buildpack,以便您的 dynos 可以下载并运行 redis。由于“redis 除了工作的 GCC 编译器和 libc 之外没有其他依赖项”,这在技术上应该是可行的。

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

  1. Heroku dynos 没有静态 IP 地址

    “测功机没有静态 IP 地址……您永远无法通过 IP 直接访问测功机”

    即使您在测功机上设置并运行 Redis,我也不知道有一种方法可以找到该测功机实例并向其发送 redis 请求。这意味着您的 Redis 服务器可能必须在与您的 Web 服务器/主应用程序相同的测功机上运行。

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

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

    “任何其他测功机中的进程都看不到写入的文件,并且在测功机停止或重新启动时,写入的任何文件都将被丢弃”

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

  3. Heroku dynos 经常重启

    “测功机每天至少循环一次,或者每当测功机歧管检测到底层硬件出现故障时”

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

  4. Heroku dynos 有 512MB 的 RAM

    “每个测功机都分配了 512MB 的内存来运行”

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

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

--

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

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

阅读材料:

  1. http://www.12factor.net/ - 特别是流程服务
  2. Heroku 过程模型
  3. Heroku 博客 - 过程模型
于 2013-02-18T05:17:41.130 回答
-2

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

有关库的更多帮助,您可以参考此链接 ,或者您可以浏览此Redis 文档,这是一个使用 Redis 广告数据库和 PHP 实现 twitter 克隆的简单案例研究

于 2013-02-18T04:11:53.563 回答