4

您如何处理生产应用程序中的替换/添加/删除 memcached 节点?由于每个客户都需要在同一个网络服务器上运行,我将有许多克隆和定制的应用程序,所以我猜总有一天会更改一些节点。

下面是正常填充 memcached 的方式:

$m = new Memcached();

$servers = array(
    array('mem1.domain.com', 11211, 33),
    array('mem2.domain.com', 11211, 67)
);
$m->addServers($servers);

我最初的想法是使 $servers 数组从数据库中填充,也被缓存,但基于文件,每天完成一次或其他东西,并可以选择在下次运行包含 $ 的函数时强制更新addservers 调用。但是,我猜这可能会增加一些额外的开销,因为磁盘的存储速度非常慢......

你怎么看?

4

5 回答 5

2

在源代码中定义类似的东西总是更好。当然,您可以使用parse_ini_file()或类似的东西来读取配置文件。但实际上,它属于源。但如果在 INI 文件中定义,则与在 PHP 中定义条目相比,没有太多安全问题,例如代码注入等。

由于有一些应用程序可能正在读取同一个 INI 文件,因此您可以将其放在所有应用程序都可以访问的公共位置(例如,使用组权限)。实际上不建议这样做。

于 2010-05-27T22:46:26.230 回答
2

使用配置文件 - 无论是来自 parse_ini_file 还是其他配置解析方案。如果您担心解析时间,可以将这些配置放在 php ini 加载路径http://brian.moonspot.net/using-ini-files-for-php-application-settings - 这会预先解析所有vars 您需要,但您需要重新启动 apache 以加载任何更改。

一旦文件被充分读取(只要你的机器上没有太多的抖动),配置文件无论如何都会在内存映射缓存中,所以它会非常快。您可以使用加载速度快的 php 序列化表单进行优化,甚至可以使用 APC 用户缓存进一步优化。

最后,使用最新的 memcache 客户端库——它们现在使用一致的哈希算法,这将有助于添加/删除单个服务器。

于 2010-06-03T04:41:38.137 回答
1

根据您的要求,如果您希望立即更新(主动模式),我将使用支持在某些 TTL(被动模式)或某种侦听器模式后自动驱逐的列表。只要在必要时可以访问并且您的 TTL 足够大(正如您在评论中提到的那样),无论您将主要来源(属性文件、数据库等)放在哪里都不是很重要。

对于被动方法,您可以通过将服务器列表放入某个已知键下的缓存中来重用其他一些支持 TTL 的本地缓存库(例如 Java 中的 EHCache)。例如,对于主动方法,Java 具有java.util.EventListener. 自从我在 PHP 中做过任何事情以来,已经(不)幸运很多年了,所以不能就此提出建议。

我强烈建议不要将配置数据放入代码中。在我生活的世界里,硬编码是一种严重的罪过。

您可能还想看看last.fm 如何使用一致的散列算法来向/从 memcached 池添加/删除服务器,而不会导致所有键的完整重新映射。

于 2010-06-02T13:36:10.400 回答
1

据我所知,这里的主要问题是如何缓存配置,使其在更改时保持最新。

好吧,这里最好的选择显然是将其存储在数据库中并从数据库中刷新,例如,每 15 秒。应用程序负载很大,每 15 秒查询一次数据库根本不会改变任何东西。从数据库本身加载数据非常快,因为您只需要几个字段。

另一个可能在这里工作的选项 - 使用单独的 memcached :) 说真的,只需缓存从数据库加载的配置,在配置更新时清除缓存键。

总而言之:任何基于时间的到期方案都可以工作。最简单的解决方案——自行维护(存储上次刷新时间并在每次函数调用时检查);更高级一点——使用 memcached 之类的东西。

更新:DB 是最好的解决方案,因为它可以很好地扩展:您不必在每次配置更新时跨 20 台服务器复制配置。

于 2010-06-07T06:02:01.863 回答
0
  • 使用像https://www.consul.io/这样的服务定位器。添加或删除服务,消费者从 consul 实时获取服务信息。
  • 如果 consul 在管理新软件方面产生了更多开销,请将信息移动到集中配置中。在更新时重新加载配置或触发更新事件。消费者监听事件并更新信息。
于 2015-06-26T06:13:02.600 回答