0

solr+zookeeper を構成しましたが、干し草の山に冗長性を設定したいと考えています。つまり、haystack がマスター サーバーに接続できない場合は、スレーブを選択する必要があります ...

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

これは良いアプローチですか?

4

1 に答える 1