如何在生产应用程序中处理替换/添加/删除memcached节点? 由于每个客户需要在同一个网络服务器上运行,我将会有许多克隆和自定义的应用程序,所以我猜想有一天会有一些节点被更改。
以下是memcached如何通过普通填充:
$m = new Memcached();
$servers = array(
array('mem1.domain.com', 11211, 33),
array('mem2.domain.com', 11211, 67)
);
$m->addServers($servers);
我最初的想法是让$ servers数组从数据库中填充,也可以缓存,但是基于文件,每天做一次或者其他什么,可以选择在下一次运行该函数时强制更新持有$ addservers调用。但是,我猜这可能会增加一些额外的开销,因为磁盘存储速度很慢......
您怎么看?
答案 0 :(得分:2)
在源代码中定义类似的东西总是更好。当然,您可以使用parse_ini_file()
或类似的东西来读取配置文件。真的,它属于源头。但是如果在INI文件中定义,则没有很多安全问题,例如代码注入等,而不是在PHP中定义条目。
由于有一些应用程序可能正在读取相同的INI文件,因此您可以将其放在所有应用程序都可以访问的公共位置(例如,使用组权限)。实际上并不是真的这样做。
答案 1 :(得分:2)
使用配置文件 - 无论是来自parse_ini_file还是其他配置解析方案。如果您担心解析时间,可以将这些配置放在php ini加载路径http://brian.moonspot.net/using-ini-files-for-php-application-settings中 - 这会预先解析您需要的所有变量,但是您需要重新启动apache来加载任何更改。 / p>
一旦文件被充分读取(只要你的机器上没有太多的颠簸),配置文件无论如何都将在内存映射缓存中,所以它会非常快。您可以使用快速加载的php序列化表单进行优化,甚至可以使用APC用户缓存进一步优化。
最后,使用最新的memcache客户端库 - 它们现在使用一致的散列算法,它将有助于添加/删除单个服务器。
答案 2 :(得分:1)
根据您的要求,如果您希望立即更新(活动模式),我会在一些TTL(被动模式)或某种侦听器模式之后使用支持自动驱逐的列表。无论您将主要来源(属性文件,数据库等)放在哪里,只要在必要时可以访问并且您的TTL足够大(正如您在评论中提到的那样),这一点并不重要。
对于被动方法,您可以通过将您的服务器列表放在某个已知密钥下的缓存中来重用其他一些支持TTL的本地缓存库(例如Java中的EHCache)。例如,对于主动方法,Java具有java.util.EventListener
。幸运的是,很多年以来,我已经用PHP完成了任何事情,因此无法就此提出建议。
我强烈建议不要将配置数据放入代码中。在世界上,我生活在硬编码中是一种严重的罪。
您可能还希望查看how last.fm is using consistent hashing algorithm,以便能够在memcached池中添加/删除服务器,而不会导致所有密钥的完全重新映射。
答案 3 :(得分:1)
据我所知,这里主要关注的是如何缓存配置,使其在更改时保持最新状态。
嗯,这里最好的选择显然是将它存储在数据库中并从数据库中刷新,比如每15秒刷新一次。在应用程序上负载很大,在15秒内查询一次DB不会改变任何东西。从数据库本身加载数据非常快,因为您只需要几个字段。
另一个可能在这里工作的选项 - 使用单独的memcached :)严重的是,只需缓存从DB加载的配置,在配置更新时清除该缓存键。
总结:任何基于时间的到期计划都可行。最简单的解决方案 - 自己维护(存储上次刷新时间并在每次函数调用时检查);更高级 - 使用像memcached这样的东西。
更新:数据库是最佳解决方案,因为它可以很好地扩展:在每次配置更新时,您不必在20台服务器上复制配置。
答案 4 :(得分:0)