我已经配置了solr + zookeeper,现在我想在haystack中设置冗余。我的意思是如果haystack无法连接到主服务器,他应该选择slave ...
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',
]
我在想,通过以上配置,系统将能够选择正确的服务器。我关闭了“主”服务器,我发现干草堆仍然试图连接到“主”。为什么?我应该设置其他东西吗?
更新
所以,在我考虑了很多这个问题之后,我更新了我的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 :(得分:0)
那应该有用。但我认为不需要多余的haystack.routers.DefaultRouter
和apps.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获取有关查询和输出的帮助。