在django文档中它说:
...
Memcached的一个出色功能是它能够在多个服务器上共享缓存.这意味着您可以在多台计算机上运行Memcached守护程序,程序会将该组计算机视为单个缓存,而无需在每台计算机上复制缓存值.要利用此功能,请在LOCATION中包含所有服务器地址,以分号或列表分隔.
...
这究竟是如何工作的?我在这个网站上读到了一些答案,建议通过基于密钥的哈希来跨服务器进行分片来实现.
这很好,但我需要一个更具体和详细的答案.使用django和pylibmc或python-memcached这个分片是如何实际执行的?配置设置中的IP地址顺序是否重要?如果运行相同django应用程序的两个不同Web服务器具有两个不同的设置文件,其中memcached服务器的IP地址的顺序不同,该怎么办?这会导致每台机器使用不同的分片策略导致重复密钥和其他低效率吗?
如果特定机器在列表中出现两次怎么办?例如,如果我要做这样的事情,127.0.0.1实际上是与172.19.26.240相同的机器怎么办?
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': [
'127.0.0.1:11211',
'172.19.26.240:11211',
'172.19.26.242:11211',
]
}
}
Run Code Online (Sandbox Code Playgroud)
如果其中一个memcached服务器的容量大于其他服务器,该怎么办?如果机器1具有64MB memcached而机器2具有128MB,那么分片算法是否会考虑到这一点并为机器2提供更大比例的密钥?
我还读过,如果memcached服务器丢失,那么这些密钥就会丢失.当涉及分片时,这是显而易见的.更重要的是,如果memcached服务器出现故障并将其IP地址留在设置文件中会发生什么?django/memcached是否会无法获得任何已经分类到该故障服务器的密钥,或者它是否会意识到服务器已经失败并提出了新的分片策略?如果有一个新的分片策略,它是否会智能地获取最初用于故障服务器的密钥并将它们分配给其余服务器,或者它是否提出了一个全新的策略,就像第一个服务器不存在一样导致密钥重复?
我试着阅读python-memcached的源代码,但根本无法解决这个问题.我打算尝试阅读libmemcached和pylibmc的代码,但我想如果有人已经知道,这里要求会更容易.
我正在浏览文档,如果指定了多个服务器,我对memcache如何进行内部负载平衡感到有些困惑.例如:
import memcache
mc.set_servers(['127.0.0.1:11211','127.0.0.1:11212',])
mc.set("some_key", "Some value")
print mc.get("some_key")
Run Code Online (Sandbox Code Playgroud)
密钥"some_key"的设置和检索是否总是命中同一个服务器?备用密钥的设置和检索(例如"some_key_2"或"some_key_3")是否会自动分配到服务器池中?如果添加或删除服务器会发生什么?
同样,get_multi会发生什么:
import memcache
mc.set_servers(['127.0.0.1:11211','127.0.0.1:11212',])
mc.set_multi({42: 'adams', 46 : 'and of me'})
print mc.get_multi([46, 42])
Run Code Online (Sandbox Code Playgroud)
这会自动设置并从正确的服务器检索每个密钥吗?是否有必要编写包装类?
谢谢.
我想知道为什么有一个memcache.hash_strategy php.ini设置.手册说:
控制将密钥映射到服务器时使用的策略.将此值设置为一致以启用一致性散列,从而允许在池中添加或删除服务器,而不会导致重新映射密钥.将此值设置为标准会导致使用旧策略.
但是,程序员自己不是映射服务器的关键吗?这是一些伪代码:
$memcacheServerList = array('host1', 'host2', 'host3');
$key = 'my_key';
$memcacheServerIndex = crc32($key) % sizeof($memcacheServerList);
$memcache = new Memcache();
$memcache->connect($memcacheServerList[$memcacheServerIndex], 11211);
$memcache->add($key, 'this is value');
Run Code Online (Sandbox Code Playgroud)
$memcacheServerList = array('host1', 'host2', 'host3');
$key = 'my_key';
$memcacheServerIndex = crc32($key) % sizeof($memcacheServerList);
$memcache = new Memcache();
$memcache->connect($memcacheServerList[$memcacheServerIndex], 11211);
$memcache->add($key, 'this is value');
Run Code Online (Sandbox Code Playgroud)
我错过了什么?