2013-08-04 67 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以獲得有關查詢和輸出的幫助。