我快速浏览了其他类似标题的问题,没有一个与我当前遇到的问题特别相似。
基本上,我们已经运行了一个多节点 memcached 环两年多了,而且大部分时间都没有问题。memcache 安装最近被转移到专用服务器上,容量增加了三倍(2x 1GB 到 2x3GB)。起初我们遇到了麻烦,我认为是 php 库与服务器通信的方式存在问题,要么是服务器列表的排序问题,要么是它们启动不正确。
服务器“似乎”运行正常,但密钥似乎被存储在多台服务器上,并且过期不会使该值的所有实例都过期。
基本上,我们将散列机制从标准更改为一致,并且密钥查找(以及过期/获取)的问题以及一切似乎都恢复正常。
然而,过去几周我一直在监控,发现第一台服务器似乎比第二台服务器被访问的次数多得多(PHP memcache 监控工具报告平均1,200 次点击一秒钟,而第二个只是500)。
谁能解释一下:
- 首先,你知道上面发生了什么吗?为什么一台服务器在“分布式”环境中会得到如此多的点击量
- 其次,分布式情况下 memcache 客户端的推荐设置是什么
- 我使用一致性哈希做对了吗
- 我应该使用故障转移吗?
- 二进制存储?;
- 或压缩?
- 重置/移动实时 memcache 环的正确步骤是什么
我发现 memcached 是一款非常棒的工具,非常适合其用途,但实际的最佳实践指南和有用的文档(很少有详细描述它的内容)却很少。如果我能对发生的事情有所了解,我一定会将其作为技术文章发布给所有人(以备将来使用),但我现在遇到了麻烦!
提前致谢
答案1
如果您的键具有不平等的访问模式,那么您将看到每个 memcached 节点的流量不平等。例如,如果您有 2 个键,其中一个a
每秒获取/设置 500 次,另一个b
每秒获取/设置 250 次,那么包含的节点的a
流量将是包含的节点的两倍b
。
在我的例子中,我们有 8 个 memcached 节点,每个节点有几千个键。其中一个键在高峰流量时每秒执行大约 800 次获取,而几乎所有其他键的获取次数都少于每秒 1 次。拥有繁忙键的 memcached 节点的流量明显高于其他节点。
如果您想要均衡每个 memcached 节点的流量,那么您需要:
- 玩弄你的按键游戏以确保你的繁忙按键分布正确。
- 切换到使用 repcached 或 Membase 在多个节点之间复制密钥
答案2
您确定与 Memcached 通信的前端已正确同步您的池的配置条目吗?
所有服务器是否都可以与存在低连接问题的 Memcached 节点建立干净的连接?
确保您也已打开 Memcached::OPT_LIBKETAMA_COMPATIBLE。
关于配置;如果您存储的是大型对象,则压缩/igbinary 将加快网络 I/O 端的速度,显然可能会有一个缺点,因此每种情况都不同。基准测试是关键。