【问题标题】:Configuring Django Cache Machine on Heroku Memcachier?在 Heroku Memcachier 上配置 Django 缓存机?
【发布时间】:2013-07-13 20:16:10
【问题描述】:

我想在 Heroku 上通过 Memcachier 使用出色的 Cache Machine Django 应用 (https://github.com/jbalogh/django-cache-machine)。

据我了解,Cache Machine 不适用于 Memcachier,因为 Memcachier 需要 PyLibMC 和 SASL 身份验证(请参阅https://devcenter.heroku.com/articles/memcachier#django)。 Cache Machine 说它支持 PyLibMC——你所要做的就是将“caching.backends.memcached.PyLibMCCache”放到 CACHES 设置中。

但是,当您这样做时,您会收到以下错误:“来自 memcached_set 的错误 47:服务器已失败并且已禁用,直到定时重试”

我认为这是因为 caching.backends.memcached.PyLibMCCache 继承自 django.core.cache.backends.memcached.PyLibMC(参见https://github.com/jbalogh/django-cache-machine/blob/master/caching/backends/memcached.py),因为它应该从 django_pylibmc.memcached.PyLibMCCache 继承为了在 Heroku 上工作(但这有点像在黑暗中拍摄)。

我创建了自己的自定义缓存后端,该后端继承自 django_pylibmc.memcached.PyLibMCCache,但是现在当我检查 Heroku Memcachier 面板时,似乎我所做的任何事情都没有增加缓存——它停留在 50 mb ,尽管我希望它会随着每个查询集而增加。

有没有人在 Heroku 上成功设置缓存机?如果有,你是怎么做到的?

【问题讨论】:

    标签: django heroku memcached django-cache-machine


    【解决方案1】:

    我与 MemCachier 合作。我们之前没有直接处理过 Cache Machine,但我只是构建了一个小应用程序,然后确认它在 Heroku 和 MemCachier 上运行良好。

    如果您对 memcache 和 MemCachier 不是很熟悉,请提供快速背景知识。客户端和服务器之间有两种通信协议。一种是较旧的ascii 协议,另一种是较新的binary 协议。我们 MemCachier 仅支持 binary 协议,因为它支持身份验证,而 ascii 协议不支持。

    您犯的错误是使用caching.backends.memcached.PyLibMCCache 作为缓存后端。虽然pylibmc 是我们推荐的memcache 客户端,因为它支持binary 协议和sasl 身份验证,但遗憾的是,Django 附带的缓存接口不支持启用二进制协议。所以 pylibmc 只是使用它的默认值,即ascii 协议并且失败了。

    您可以查看 Django 关于此问题的票here

    因此,在 MemCachier,我们一直建议您使用替代的 django-pylibmc-sasl 包。这个包也使用了pylibmc,但是提供了一个不同于django提供的缓存接口,确实支持启用二进制协议和身份验证。这在我们的文档here 中进行了讨论。

    这里是我一般放在settings.py中的代码,用来配置Django的缓存用MemCachier:'

    ## MemCachier Settings
    ## ===================
    def get_cache():
      # We do this complicated cache defenition so that on a local machine (where
      # MEMCACHIER_SERVERS won't be defined), the try fails and so we use the
      # inbuilt local memory cache of django.
      try:
        os.environ['MEMCACHE_SERVERS'] = os.environ['MEMCACHIER_SERVERS'].replace(',', ';')
        os.environ['MEMCACHE_USERNAME'] = os.environ['MEMCACHIER_USERNAME']
        os.environ['MEMCACHE_PASSWORD'] = os.environ['MEMCACHIER_PASSWORD']
        return {
          'default': {
            'BACKEND': 'django_pylibmc.memcached.PyLibMCCache',
            'TIMEOUT': None,
            'BINARY': True,
            'OPTIONS': {
              'tcp_nodelay': True,
              'no_block': True,
              'tcp_keepalive': True,
              '_poll_timeout': 2000,
              'ketama': True,
              'connect_timeout': 2000,
              'remove_failed': 4,
              'retry_timeout': 2,
              'dead_timeout': 10
            }
          }
        }
      except:
        # Use django local development cache (for local development).
        return {
          'default': {
            'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'
          }
        }
    
    CACHES = get_cache()
    

    这也将使您在本地机器上的开发变得容易,因为当未定义 MEMCACHIER_SERVERS 时,它将回退到 django 的简单本地堆缓存,避免您在本地安装 memcache。

    希望这对杰克有帮助!

    【讨论】:

    • 非常感谢您指出问题所在——并将 get_cache 函数放在一起。唯一的问题是(我认为)要让 Cache Machine 之类的东西工作,您需要使用以“caching.backends ...”开头的自定义缓存后端我想知道我是否需要定义自己的利用 SASL 的后端?您对如何开始有任何指示吗?
    • “认为”是否意味着您尝试了上述方法但失败了?或者这是一个假设?如果缓存机器有这个限制,我会感到非常惊讶,这样做没有任何意义。此外,在我的测试中,我让缓存机器可以使用上述方法。因此,如果您的不工作,请您发布错误,以便我可以进一步诊断。
    • 感谢您再次与我们联系。当我尝试您的解决方案时(这类似于我在 SO 上发布之前第一次尝试的方法,并且现在再次尝试),我没有收到任何错误。但是,我认为它不起作用,因为我的 Memcachier 仪表板根本没有显示“当前使用情况”或“密钥数量”,而我原本期望它会增加。 (当我将“caching.backends.memcached.MemcachedCache”后端与 Elasticache / 我自己的缓存服务器一起使用时,正如预期的那样,使用该站点会导致缓存使用量增加。)
    • 我还没有深入研究 Cache Machine 源代码(而且我不确定我是否足够优秀的程序员这样做),但我的理解是他们已经编写了自定义 memcached 后端(即,“BACKEND”设置中的内容),并且必须使用它们的后端之一才能使其正常工作。但是,至少到目前为止,我认为他们的任何后端都不能与 SASL 一起使用——而且我也不确定是否有一个简单的解决方法。
    • 杰克,我针对 MemCachier 本身测试了这个解决方案,所以我知道它可以很好地与 SASL 身份验证配合使用。我相当有信心,肯定有其他事情是错的。可能只是我们的仪表板没有按预期工作,让您相信缓存在正常工作时没有工作。这种情况很少见,但有时我们的仪表板会认为您使用的集群与实际使用的集群不同,因此不会出现缓存使用情况。
    猜你喜欢
    • 1970-01-01
    • 2013-11-09
    • 2012-10-07
    • 1970-01-01
    • 2012-05-18
    • 2015-06-08
    • 2014-12-22
    • 2020-01-04
    • 2020-12-21
    相关资源
    最近更新 更多