2013-08-04 33 views
0

我已经配置了solr + zookeeper,现在我想在干草堆中设置冗余。我的意思是,如果大海捞针无法连接到主服务器,他应该选择从...如何在干草堆一侧实施solr冗余?

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', 
] 

我在想,与上述系统配置将能够选择正确的服务器。我关闭了“主”服务器,我发现干草堆仍然尝试连接到“主”。为什么?我应该设置别的东西吗?

UPDATE

所以,我想了很多这个问题后,我更新了我的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 

这是一个好办法?

+0

什么在你的'apps.search.routers.MasterRouter'和'apps.search.routers.SlaveRouter'? – twil

+0

现在我添加了一个用于检查连接可用性的特殊代码。这是好方法吗? – user1119698

回答

0

那么它应该工作。但我没有看到需要多余的haystack.routers.DefaultRouterapps.search.routers.SlaveRouter(您的所有逻辑MasterRouter)。

至于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以获得有关查询和输出的帮助。