Я настроил 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
Является ли это хороший подход?
Что находится в вашем 'apps.search.routers.MasterRouter' и' apps.search.routers.SlaveRouter'? – twil
Теперь я добавил там специальный код для проверки доступности соединения. Это хороший подход? – user1119698