【问题标题】:How can I implement solr redundancy on the haystack side?如何在 haystack 端实现 solr 冗余?
【发布时间】:2013-08-04 15:44:33
【问题描述】:

我已经配置了 solr+zookeeper,现在我想在 haystack 中设置冗余。我的意思是,如果 haystack 无法连接到主服务器,他应该选择从...

settings.py:

HAYSTACK_CONNECTIONS = {
    'master': {
        'ENGINE': 'haystack.backends.solr_backend.SolrEngine',
        'URL': 'http://127.0.0.1:8983/solr',
        'TIMEOUT': 10,
        'SILENTLY_FAIL': True,
        'EXCLUDED_INDEXES': [],
        'INCLUDE_SPELLING': True,
    },
    'slave': {
        'ENGINE': 'haystack.backends.solr_backend.SolrEngine',
        'URL': 'http://127.0.0.1:7574/solr',
        'TIMEOUT': 10,
        'SILENTLY_FAIL': True,
        'EXCLUDED_INDEXES': [],
        'INCLUDE_SPELLING': True
    },
}
HAYSTACK_CONNECTIONS['default'] = HAYSTACK_CONNECTIONS['master']
HAYSTACK_ROUTERS = [
    'apps.search.routers.MasterRouter',
    'apps.search.routers.SlaveRouter',
    'haystack.routers.DefaultRouter',
]

我在想,通过上面的配置,系统将能够选择正确的服务器。我关闭了“主”服务器,我看到 haystack 仍在尝试连接到“主”。为什么?我应该设置其他东西吗?

更新

所以,在我考虑了很多这个问题之后,我更新了我的 router.py 文件:

class MasterRouter(routers.BaseRouter):
    def for_write(self, **hints):
        return 'master'

    def for_read(self, **hints):
        if check_connection('master'):
          return 'master'
        elif check_connection('slave'):
          return 'slave'

        return None


class SlaveRouter(routers.BaseRouter):
    def for_write(self, **hints):
        return None

    def for_read(self, **hints):
        return 'slave'


def check_connection(type):
  url = settings.HAYSTACK_CONNECTIONS[type]['URL']
  try:
    urllib2.urlopen(url,timeout=1)
    return True
  except urllib2.URLError as err: pass
  return False

这是一个好方法吗?

【问题讨论】:

  • 您的apps.search.routers.MasterRouterapps.search.routers.SlaveRouter 中有什么内容?
  • 现在我在那里添加了一个特殊的代码来检查连接可用性。这是好方法吗?

标签: python solr django-haystack redundancy


【解决方案1】:

嗯,它应该工作。但我认为不需要多余的haystack.routers.DefaultRouterapps.search.routers.SlaveRouterMasterRouter 中的所有逻辑)。

至于check_connection() 那么更直接的版本是

def check_connection(type):
  url = settings.HAYSTACK_CONNECTIONS[type]['URL']
  try:
    urllib2.urlopen(url,timeout=1)
    return True
  except urllib2.URLError as err:
    return False

如果您想进一步改进它,您可以发送一些真实的查询并检查结果,例如。

def check_connection(type):
  url = "{}?{}".format(settings.HAYSTACK_CONNECTIONS[type]['URL'], 'q=test')
  try:
    res = urllib2.urlopen(url, timeout=1)
    # TODO: parse Solr output and decide what to return 
    return True
  except urllib2.URLError as err:
    return False

有关查询和输出的帮助,请参阅Solr docs

【讨论】:

    猜你喜欢
    • 2014-11-24
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多