python - django 如何处理多个 memcached 服务器?

标签 python django memcached sharding

在 django 文档中是这样说的:

...

One excellent feature of Memcached is its ability to share cache over multiple servers. This means you can run Memcached daemons on multiple machines, and the program will treat the group of machines as a single cache, without the need to duplicate cache values on each machine. To take advantage of this feature, include all server addresses in LOCATION, either separated by semicolons or as a list.

...

Django's cache framework - Memcached

这究竟是如何工作的?我在这个站点上阅读了一些答案,这些答案表明这是通过基于键的散列在服务器之间进行分片来完成的。

Multiple memcached servers question

How does the MemCacheStore really work with multiple servers?

这很好,但我需要一个比这更具体和详细的​​答案。将 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',
        ]
    }
}

如果其中一个 memcached 服务器的容量比其他服务器大怎么办?如果机器 1 的内存缓存为 64MB,机器 2 的内存缓存为 128MB,分片算法是否会考虑这一点并给予机器 2 更大比例的 key ?

我还了解到,如果 memcached 服务器丢失,那么这些 key 也会丢失。当涉及分片时,这一点很明显。更重要的是,如果 memcached 服务器出现故障并且我将其 IP 地址留在设置文件中会发生什么? django/memcached 是否会简单地无法获取任何将被分片到该故障服务器的 key ,或者它会意识到该服务器已发生故障并提出新的分片策略?如果有一个新的分片策略,它是否会智能地获取原本用于故障服务器的 key 并将它们分配给剩余的服务器,或者它是否会提出一个全新的策略,就好像第一台服务器不存在一样?导致 key 重复?

我尝试阅读 python-memcached 的源代码,但完全无法理解。我打算尝试阅读 libmemcached 和 pylibmc 的代码,但我想如果有人已经知道,在这里问会更容易。

最佳答案

执行分片的是实际的 memcached 客户端。 Django 仅将配置从 settings.CACHES 传递给客户端。

服务器的顺序无关紧要*,但是(至少对于 python-memcached)您可以为每个服务器指定一个“权重”:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': [
                ('cache1.example.org:11211', 1),
                ('cache2.example.org:11211', 10),
            ],
}

我认为快速浏览一下 memcache.py(来自 python-memcached),尤其是 memcached.Client._get_server 应该可以回答您的其余问题:

def _get_server(self, key):
    if isinstance(key, tuple):
        serverhash, key = key
    else:
        serverhash = serverHashFunction(key)

    for i in range(Client._SERVER_RETRIES):
        server = self.buckets[serverhash % len(self.buckets)]
        if server.connect():
            #print "(using server %s)" % server,
            return server, key
        serverhash = serverHashFunction(str(serverhash) + str(i))
    return None, None

我希望其他 memcached 客户端以类似的方式实现。


@Apreche 的澄清:在一种情况下,服务器的顺序确实很重要。如果您有多个 Web 服务器,并且希望它们都将相同的 key 放在相同的 memcached 服务器上,则需要以相同的顺序使用相同的服务器列表和相同的权重配置它们

关于python - django 如何处理多个 memcached 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6876250/

相关文章:

sql - 根据动态组计算收件箱

python - 使用 Google App Engine 进行网站负载测试

python - CreateRemoteThread() 未按预期运行

python - 需要帮助理解 python 语法

Django REST 框架 : using TokenAuthentication with browsable API

Django国家:如何翻译?

python - 如何覆盖 django 中内联模型的删除方法?

python - 创建音乐 QWERTY 键盘。播放错误声音而不是声音

mysql - 使用memcached作为内存数据库?

python - 带有 flask 和 memcached 的 nginx 返回一些乱码