2013-08-04 2 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.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 за помощью по запросам и выводам.