MariaDB
 sql >> база данни >  >> RDS >> MariaDB

Моят DBA е болен - Съвети за отказване на база данни за SysAdmins

Най-добрият сценарий е, че в случай на повреда на базата данни, имате добър план за възстановяване след бедствие (DRP) и високодостъпна среда с автоматичен процес на отказ, но... какво се случва, ако не успее за някаква неочаквана причина? Ами ако трябва да извършите ръчно преминаване при отказ? В този блог ще споделим някои препоръки, които да следвате, в случай че се наложи да преминете при отказ на вашата база данни.

Проверки за проверка

Преди да извършите каквато и да е промяна, трябва да проверите някои основни неща, за да избегнете нови проблеми след процеса на отказ.

Състояние на репликация

Възможно е в момента на отказ подчинения възел да не е актуален поради повреда в мрежата, голямо натоварване или друг проблем, така че трябва да се уверите, че slave разполага с цялата (или почти цялата) информация. Ако имате повече от един подчинен възел, трябва също да проверите кой е най-напредналият възел и да го изберете за превключване при отказ.

напр.:Нека проверим състоянието на репликация в сървър на MariaDB.

MariaDB [(none)]> SHOW SLAVE STATUS\G

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.100.110

Master_User: rpl_user

Master_Port: 3306

Connect_Retry: 10

Master_Log_File: binlog.000014

Read_Master_Log_Pos: 339

Relay_Log_File: relay-bin.000002

Relay_Log_Pos: 635

Relay_Master_Log_File: binlog.000014

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Last_Errno: 0

Skip_Counter: 0

Exec_Master_Log_Pos: 339

Relay_Log_Space: 938

Until_Condition: None

Until_Log_Pos: 0

Master_SSL_Allowed: No

Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno: 0

Last_SQL_Errno: 0

Replicate_Ignore_Server_Ids:

Master_Server_Id: 3001

Using_Gtid: Slave_Pos

Gtid_IO_Pos: 0-3001-20

Parallel_Mode: conservative

SQL_Delay: 0

SQL_Remaining_Delay: NULL

Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

Slave_DDL_Groups: 0

Slave_Non_Transactional_Groups: 0

Slave_Transactional_Groups: 0

1 row in set (0.000 sec)

В случай на PostgreSQL е малко по-различно, тъй като трябва да проверите състоянието на WAL и да сравните приложените с извлечените.

postgres=# SELECT CASE WHEN pg_last_wal_receive_lsn()=pg_last_wal_replay_lsn()

postgres-# THEN 0

postgres-# ELSE EXTRACT (EPOCH FROM now() - pg_last_xact_replay_timestamp())

postgres-# END AS log_delay;

 log_delay

-----------

         0

(1 row)

Идентификационни данни

Преди да стартирате отказоустойчивостта, трябва да проверите дали вашето приложение/потребители ще имат достъп до новия ви главен файл с текущите идентификационни данни. Ако не копирате потребителите на вашата база данни, може би идентификационните данни са били променени, така че ще трябва да ги актуализирате в подчинените възли преди каквито и да било промени.

напр.:Можете да потърсите потребителската таблица в базата данни mysql, за да проверите потребителските идентификационни данни в MariaDB/MySQL сървър:

MariaDB [(none)]> SELECT Host,User,Password FROM mysql.user;

+-----------------+--------------+-------------------------------------------+

| Host            | User | Password                                  |

+-----------------+--------------+-------------------------------------------+

| localhost       | root | *CD7EC70C2F7DCE88643C97381CB42633118AF8A8 |

| localhost       | mysql | invalid                                   |

| 127.0.0.1       | backupuser | *AC01ED53FA8443BFD3FC7C448F78A6F2C26C3C38 |

| 192.168.100.100 | cmon         | *F80B5EE41D1FB1FA67D83E96FCB1638ABCFB86E2 |

| 127.0.0.1       | root | *CD7EC70C2F7DCE88643C97381CB42633118AF8A8 |

| ::1             | root | *CD7EC70C2F7DCE88643C97381CB42633118AF8A8 |

| localhost       | backupuser | *AC01ED53FA8443BFD3FC7C448F78A6F2C26C3C38 |

| 192.168.100.112 | user1        | *CD7EC70C2F7DCE88643C97381CB42633118AF8A8 |

| localhost       | cmonexporter | *0F7AD3EAF21E28201D311384753810C5066B0964 |

| 127.0.0.1       | cmonexporter | *0F7AD3EAF21E28201D311384753810C5066B0964 |

| ::1             | cmonexporter | *0F7AD3EAF21E28201D311384753810C5066B0964 |

| 192.168.100.110 | rpl_user     | *EEA7B018B16E0201270B3CDC0AF8FC335048DC63 |

+-----------------+--------------+-------------------------------------------+

12 rows in set (0.001 sec)

В случай на PostgreSQL можете да използвате командата ‘\du’, за да знаете ролите, а също така трябва да проверите конфигурационния файл pg_hba.conf, за да управлявате потребителския достъп (не идентификационни данни). И така:

postgres=# \du

                                       List of roles

    Role name     |             Attributes         | Member of

------------------+------------------------------------------------------------+-----------

 admindb          | Superuser, Create role, Create DB                          | {}

 cmon_replication | Replication                                                | {}

 cmonexporter     |                                             | {}

 postgres         | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

 s9smysqlchk      | Superuser, Create role, Create DB                          | {}

И pg_hba.conf:

# TYPE DATABASE USER ADDRESS METHOD

host replication  cmon_replication  localhost  md5

host  replication  cmon_replication  127.0.0.1/32  md5

host  all  s9smysqlchk  localhost  md5

host  all  s9smysqlchk  127.0.0.1/32  md5

local   all            all                   trust

host    all            all 127.0.0.1/32 trust

Достъп до мрежа/защитна стена

Идентификационните данни не са единственият възможен проблем при достъпа до новия ви главен файл. Ако възелът е в друг център за данни или имате локална защитна стена за филтриране на трафика, трябва да проверите дали имате достъп до него или дори дали имате мрежов маршрут за достигане до новия главен възел.

например:iptables. Нека разрешим трафика от мрежата 167.124.57.0/24 и да проверим текущите правила, след като го добавим:

$ iptables -A INPUT  -s 167.124.57.0/24 -m state --state NEW  -j ACCEPT

$ iptables -L -n

Chain INPUT (policy ACCEPT)

target     prot opt source               destination

ACCEPT     all -- 167.124.57.0/24      0.0.0.0/0 state NEW

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination

напр.:маршрути. Да предположим, че вашият нов главен възел е в мрежата 10.0.0.0/24, вашият сървър на приложения е в 192.168.100.0/24 и можете да достигнете до отдалечената мрежа, като използвате 192.168.100.100, така че във вашия сървър на приложения добавете съответния маршрут:

$ route add -net 10.0.0.0/24 gw 192.168.100.100

$ route -n

Kernel IP routing table

Destination     Gateway Genmask         Flags Metric Ref Use Iface

0.0.0.0         192.168.100.1 0.0.0.0         UG 0 0 0 eth0

10.0.0.0        192.168.100.100 255.255.255.0   UG 0 0 0 eth0

169.254.0.0     0.0.0.0 255.255.0.0     U 1027 0 0 eth0

192.168.100.0   0.0.0.0 255.255.255.0   U 0 0 0 eth0

Точки за действие

След като проверите всички споменати точки, трябва да сте готови да извършите действията за преодоляване на вашата база данни.

Нов IP адрес

Тъй като ще популяризирате подчинен възел, главният IP адрес ще се промени, така че ще трябва да го промените във вашето приложение или клиентски достъп.

Използването на Load Balancer е отличен начин да избегнете този проблем/промяна. След процеса на отказ, Load Balancer ще открие стария главен файл като офлайн и (в зависимост от конфигурацията) ще изпрати трафика към новия, за да запише върху него, така че не е необходимо да променяте нищо в приложението си.

напр.:Нека да видим пример за конфигурация на HAProxy:

listen  haproxy_5433

        bind *:5433

        mode tcp

        timeout client  10800s

        timeout server  10800s

        balance leastconn

        option tcp-check

        server 192.168.100.119 192.168.100.119:5432 check

        server 192.168.100.120 192.168.100.120:5432 check

В този случай, ако един възел не работи, HAProxy няма да изпраща трафик там и ще изпраща трафика само до наличния възел.

Преконфигурирайте подчинените възли

Ако имате повече от един подчинен възел, след като повишите един от тях, трябва да преконфигурирате останалите подчинени, за да се свържат с новия главен. Това може да е отнемаща време задача, в зависимост от броя на възлите.

Проверете и конфигурирайте архивите

След като имате всичко на място (повишен нов главен, преконфигурирани подчинени устройства, писане на приложението в новия главен обект), важно е да предприемете необходимите действия, за да предотвратите нов проблем, така че архивирането е задължително тази стъпка. Най-вероятно сте имали правила за архивиране, работещи преди инцидента (ако не, трябва да го имате със сигурност), така че трябва да проверите дали архивите все още се изпълняват или ще работят в новата топология. Възможно е резервните копия да се изпълняват на стария главен възел или да използвате подчинения възел, който е главен сега, така че трябва да го проверите, за да се уверите, че вашата политика за архивиране ще продължи да работи след промените.

Наблюдение на базата данни

Когато изпълнявате процес на отказ, наблюдението е задължително преди, по време и след процеса. С това можете да предотвратите проблем, преди да се влоши, да откриете неочакван проблем по време на отказ или дори да разберете дали нещо се обърка след него. Например, трябва да наблюдавате дали приложението ви има достъп до новия ви главен файл, като проверите броя на активните връзки.

Ключови показатели за наблюдение

Нека видим някои от най-важните показатели, които трябва да вземете предвид:

  • Закъснение при репликация
  • Състояние на репликация
  • Брой връзки
  • Използване/грешки на мрежата
  • Натоварване на сървъра (CPU, памет, диск)
  • База данни и системни регистрационни файлове

Отмяна

Разбира се, ако нещо се обърка, трябва да можете да връщате назад. Блокирането на трафика към стария възел и поддържането му възможно най-изолирано може да бъде добра стратегия за това, така че в случай, че трябва да връщате назад, старият възел ще бъде наличен. Ако връщането е след няколко минути, в зависимост от трафика, вероятно ще трябва да вмъкнете данните за тези минути в стария главен възел, така че се уверете, че имате наличен и изолиран вашият временен главен възел, за да вземете тази информация и да я приложите обратно .

Автоматизиране на процеса на отказ с ClusterControl

Виждайки всички тези необходими задачи за извършване на отказ, най-вероятно искате да го автоматизирате и да избегнете цялата тази ръчна работа. За целта можете да се възползвате от някои от функциите, които ClusterControl може да ви предложи за различни технологии за бази данни, като автоматично възстановяване, архивиране, управление на потребителите, наблюдение, наред с други функции, всички от една и съща система.

С ClusterControl можете да проверите състоянието на репликация и неговото изоставане, да създавате или променяте идентификационни данни, да знаете състоянието на мрежата и хоста и дори повече проверки.

С помощта на ClusterControl можете също да извършвате различни действия за клъстери и възли, като популяризиране на подчинен , рестартирайте базата данни и сървъра, добавяйте или премахвайте възли на базата данни, добавяйте или премахвайте възли за балансиране на натоварването, изграждайте отново подчинен елемент за репликация и др.

С помощта на тези действия можете също да отмените възстановяването на срива, ако е необходимо, чрез повторно изграждане и популяризиране предишния господар.

ClusterControl има услуги за наблюдение и предупреждение, които ви помагат да разберете какво се случва или дори ако нещо се е случило преди.

Можете също да използвате секцията за табло, за да имате по-удобен за потребителя изглед относно състоянието на вашите системи.

Заключение

В случай на повреда на главната база данни, ще искате да разполагате с цялата информация, за да предприемете необходимите действия възможно най-скоро. Наличието на добър DRP е ключът към поддържането на вашата система да работи през цялото време (или почти през цялото време). Този DRP трябва да включва добре документиран процес на отказ, за ​​да има приемливо RTO (Цел за време за възстановяване) за компанията.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MariaDB JSON_REMOVE() Обяснено

  2. Издигнете се по-високо в облака с MariaDB SkySQL

  3. Използване на MariaDB Audit Plugin за сигурност на базата данни

  4. Подобряване на производителността на бекенда, част 2/3:Използване на индекси на база данни

  5. Как YEARWEEK() работи в MariaDB