Projekt Django i status replikacji mysql slave

Data publikacji: 2015-08-25 | Tagi:

W przypadku projektów Django pracuję głównie z trzema bazami - jeden master, a za nim dwa slave, replikujące go tak szybko, jak się da. Jednak czasem nie jest to dość szybko i trzeba zgłosić administratorom problem z replikacją.

Pytanie tylko jak określić, że problem tkwi właśnie w replikacji?

Czytając manual MySQL mamy jak na dłoni komendę SHOW SLAVE STATUS, którą wykonujemy na maszynach slave. Między innymi zwraca nam ona wartość Seconds_Behind_Master, która mówi nam o tym, jak daleko w czasie slave (czyli odczyt) jest za masterem (czyli zapisem). W skrócie - jest to czas, po którym zapisane dane będą możliwe do odczytania.

Wartość tego parametru powinna być jak najmniejsza, ale to my decydujemy, kiedy należy "coś z tym zrobić", w zależności od tego, czy dany zapis jest krytyczny czasowo, czy nie.

Jeśli czas zwracany przez Seconds_Behind_Master niebezpiecznie rośnie, to znaczy, że należy się temu bezwzględnie przyjrzeć.

W przypadku dwóch slave zwykle jest tak, że trzeba się zalogować do jednego, sprawdzić status, a następnie zalogować do drugiego i również sprawdzić status. Jeśli mają inne dane logowania, albo jest ich więcej, to sprawa zaczyna być po prostu uciążliwa.

Możemy proces nieco zautomatyzować poprzez dodanie do settings.py dodatkowych definicji baz danych:


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'master',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': 'localhost',
        'PORT': '',
    },
    'slave-a': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'slave-a',
        'USER': 'root-slave-a',
        'PASSWORD': 'root-slave-a',
        'HOST': 'localhost',
        'PORT': '',
    },
    'slave-b': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'slave-b',
        'USER': 'root-slave-b',
        'PASSWORD': 'root-slave-b',
        'HOST': 'localhost',
        'PORT': '',
    },
}

Pierwszy element to standardowa definicja bazy danych w projekcie django. Dwa pozostałe to nasze dodatkowe dwa slave.

Teraz wystarczy wydać dwie komendy:

echo "SHOW_SLAVE_STATUS\G" | python manage.py dbshell --database=slave-a
echo "SHOW_SLAVE_STATUS\G" | python manage.py dbshell --database=slave-b

Wykonanie ich powoduje wyświetlenie statusu dla obu slave. Całość można zamknąć w jakimś bashowym skrypcie by po przeczesaniu awkiem oddać obsługę do monita, nagiosa lub czegoś jeszcze innego.


Oceń ten post:
Podziel się:

comments powered by Disqus

IT w obrazkach: