Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP memcache::addServer,权重_Php_Memcached - Fatal编程技术网

PHP memcache::addServer,权重

PHP memcache::addServer,权重,php,memcached,Php,Memcached,我的问题与PHP Memcache扩展的addServer函数中的“weight”参数有关 在过去的几个月里,我一直在为所有服务器使用“weight=1”。我现在尝试应用下面的配置,以最终从旋转中删除“10.10.10.3”,并将数据丢失降至最低 有了新的权重值,我的PHP客户端就无法检索它过去能够获取的键的值。如果我恢复到“weight=1”,则可以毫无问题地获取所有密钥 为了正确使用“Memcache::addServer”的“weight”选项,我是否缺少配置或任何东西 谢谢你的帮助 $

我的问题与PHP Memcache扩展的addServer函数中的“weight”参数有关
在过去的几个月里,我一直在为所有服务器使用“weight=1”。我现在尝试应用下面的配置,以最终从旋转中删除“10.10.10.3”,并将数据丢失降至最低
有了新的权重值,我的PHP客户端就无法检索它过去能够获取的键的值。如果我恢复到“weight=1”,则可以毫无问题地获取所有密钥

为了正确使用“Memcache::addServer”的“weight”选项,我是否缺少配置或任何东西

谢谢你的帮助

 $hosts = array(
      array('ip' => '10.10.10.1', 'port' => 11211, 'weight' => 100),
      array('ip' => '10.10.10.2', 'port' => 11211, 'weight' => 100),
      array('ip' => '10.10.10.3', 'port' => 11211, 'weight' => 1),
      array('ip' => '10.10.10.4', 'port' => 11211, 'weight' => 100),
 );

 $memcache = new Memcache();
 foreach($hosts as $host) {
    $host['port'] = isset($host['port']) ? (int) $host['port'] : 11211;
    $host['weight'] = isset($host['weight']) ? (int) $host['weight'] : 1;
    $memcache->addserver($host['ip'], $host['port'], false, $host['weight'], 1, 15);
 }

PHP版本=5.3.10

Memcache PHP变量
-memcache支持=>已启用
-memcache.allow_failover=>1=>1
-memcache.chunk_size=>32768=>32768
-memcache.compress_阈值=>20000=>20000
-memcache.default_port=>11211=>11211
-memcache.hash_函数=>crc32=>crc32
-memcache.hash_策略=>一致=>一致
-memcache.lock_超时=>15=>15
-memcache.max\u故障转移\u尝试次数=>20=>20
-memcache.protocol=>ascii=>ascii
-memcache.redundancy=>1=>1
-memcache.session_冗余=>2=>2

Memcached版本
10.10.10.1/10.10.10.2/10.10.10.3正在运行1.4.5
10.10.10.4正在运行1.4.4

问题是您正在使用vs。Memcached是分布式的,这意味着添加到池中的所有服务器都充当一个缓存服务器。因此,如果server1关闭,您仍然可以检索键/值,因为它们分布在其他三台服务器上。而对于memcache(没有d),每个服务器基本上都是一个思洛存储器,这意味着存储在server1上的密钥/值不能保证存在于任何其他缓存服务器上

如果您想弃用有问题的缓存服务器,我建议在api调用中添加一些额外的逻辑,以从持久存储中提取值,然后将其存储在至少两个其他有效缓存服务器上。我见过一些项目,其中缓存值将在两个缓存服务器之间保存,以确保一个服务器不再响应,而另一个服务器可以恢复空闲

--更新--

无论使用哪种PHP memcache API,如果从池中删除服务器,将导致驻留在现在丢失的服务器上的密钥的缓存丢失。当
$cache->get()
失败并转到持久存储,并且调用
$cache->set()
时,缓存现在将存储在另一个活动服务器上。感谢Drew010对此的澄清


如果您绝对无法承受任何缓存未命中,您仍然可以编写应用程序将相同的缓存值写入多个服务器。

权重参数影响用于确定从哪个服务器读取/写入密钥的一致哈希。更改池中任意1台服务器的权重将导致某些缓存未命中。池中服务器的数量以及您更改权重的程度将取决于您可能遇到的未命中次数

您需要了解的是memcached是分布式的,这意味着因为您有4台服务器,所以密钥在这些服务器之间分布(尽可能接近均匀[权重将影响均匀分布])。如果一台服务器宕机,存储在该服务器上的数据将不再可访问,并且必须从数据库中获取,因为它在任何其他服务器上都不可用*请注意,PHP扩展
memcache
memcached
只是访问
memcached
集群的客户端(memcached是这两个集群中较新的一个,支持更多功能,但都与memcached集群中的服务器通信)

当您想要从缓存中存储或检索一个值时,将计算一个哈希值,该哈希值确定数据应该在集群中的何处放置或读取。说明这一点的常用方法是使用360度圆,如下所示。计算一个散列,并使用它在圆中“最接近”的节点。添加或删除服务器,或更改任何一台服务器的权重,都会影响哈希结果并导致未命中


资料来源:

如果您想慢慢地将服务器移出集群,我建议您逐渐降低其权重,直到它为0,然后您可以将服务器从列表中完全删除。请记住,权重的任何微小变化都可能/将导致缓存未命中,但权重变化的程度(以及您拥有的服务器数量)会影响您将经历的未命中次数

这里有一个来自的片段,可能也有助于解释其中的一些原因

前言是两个系统管理员设置了一个包含3台服务器的memcached集群,并告诉memcached在每台服务器上使用1GB

因此,他再次获取程序员使用的密钥并在上面查找它们 他的内存缓存服务器。”拿这个钥匙“拿那个钥匙”但每次他 这样做,他只能在一个memcached上找到每个键!你为什么要这么做 他想是这样吗?他整晚都在玩拼图游戏。那太傻了!不是吗 想要所有memcached上都有密钥吗

“等等,”他想,“我给每个内存缓存了1GB的内存,然后 这意味着,我总共可以缓存3 GB的数据库, 而不仅仅是一个!哦,伙计,这太棒了,”他想。“这会省钱的 给我一大笔钱。布拉德·菲茨帕特里克,我爱你的屁股!”

“但是,嗯,下一个问题,这是一个谜题,这个网络服务器 就在这里,这个运行memcached的是旧的,有病的,需要 升级。但是为了升级,我必须让它离线!什么 我可怜的memcache集群会怎么样?呃,让我们看看,”他说, 他关上了盒子。现在他看他的图表。“哦,不,是的 DB负载,它大步上升!负载不是一个,现在是两个。 嗯,但还是可以忍受。好吧