Добрый день!
OS Linux Centos 7x64
Django 1.11.6
Второй день бьюсь над задачей роутинга к 2м базам данных.
Есть pgsql1 и pgsql2. По ТЗ они идентичны, при падении любой из БД Django должен переключаться на живую БД.
Для реализации этой задачи я сделал так
setting.py
DATABASES = {
'default': {}, 'master': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'gunicorn',
'USER': 'gunicorn',
'PASSWORD': 'gunicorn',
'HOST': '10.230.40.194',
'PORT': '5432',
},
'slave': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'gunicorn',
'USER': 'gunicorn',
'PASSWORD': 'gunicorn',
'HOST': '10.230.40.195',
'PORT': '5432',
},
}
SLAVE_DATABASES = ['slave']
DATABASE_ROUTERS = ["db_router.MasterSlaveRouter"]
db_router.py
from django.conf import settings
import socket
def test_connection_to_db(database_name):
try:
db_definition = getattr(settings, 'DATABASES')[database_name]
s = socket.create_connection(
(db_definition['HOST'], db_definition['PORT']), 5)
s.close()
return True
except:
return False
class MasterSlaveRouter(object):
def db_for_read(self, model, **hints):
"""
Reads go to a randomly-chosen slave.
"""
if test_connection_to_db('master'):
return 'master'
return 'slave'
def db_for_write(self, model, **hints):
"""
Writes always go to master.
"""
if test_connection_to_db('master'):
return 'master'
return 'slave'
def allow_relation(self, obj1, obj2, **hints):
"""
Relations between objects are allowed if both objects are
in the master/slave pool.
"""
db_list = ('master', 'slave')
if obj1._state.db in db_list and obj2._state.db in db_list:
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
All non-auth models end up in this pool.
"""
return True
После запуска python manage.py migrate получаю следующее:
File "/var/www/env/lib64/python3.6/site-packages/django/db/backends/dummy/base.py", line 20, in complain
raise ImproperlyConfigured("settings.DATABASES is improperly configured. "
django.core.exceptions.ImproperlyConfigured: settings.DATABASES is improperly configured. Please supply the ENGINE value. Check settings documentation for more details.
Так же возможно ли обойтись без репликации БД на серверах pgsql?
На сколько я понимаю за это отвечают 2 последних блока роута
def allow_relation(self, obj1, obj2, **hints):
"""
Relations between objects are allowed if both objects are
in the master/slave pool.
"""
db_list = ('master', 'slave')
if obj1._state.db in db_list and obj2._state.db in db_list:
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
All non-auth models end up in this pool.
"""
return True
Поправьте меня если я не прав, с джанго знаком буквально несколько дней.
В общем подскажите пж, в правильном ли я направлении двигаюсь, если нет то как мне реализовать мою задачу 2 отказоустойчивых реплицируемых базы данных.
В моем ТЗ по 2 сервера на каждый нод. 2 Nginx 2 Gunicorn 2 memcached 2 Pgsql. Все настроил, кроме связи с Pgsql.
Updated 13 Oct. 2017, 13:44 by demolitionman.