sql >> Database >  >> RDS >> MariaDB

Mijn DBA is ziek - Tips voor databasefailover voor systeembeheerders

Het beste scenario is dat je, in het geval van een databasefout, een goed Disaster Recovery Plan (DRP) hebt en een omgeving met hoge beschikbaarheid met een automatisch failoverproces, maar... wat gebeurt er als het niet lukt voor een onverwachte reden? Wat als u een handmatige failover moet uitvoeren? In deze blog delen we enkele aanbevelingen die u kunt volgen voor het geval u een failover van uw database moet uitvoeren.

Verificatiecontroles

Voordat u een wijziging uitvoert, moet u enkele basiszaken verifiëren om nieuwe problemen na het failoverproces te voorkomen.

Replicatiestatus

Het kan zijn dat het slave-knooppunt op het moment van de storing niet up-to-date is vanwege een netwerkstoring, hoge belasting of een ander probleem, dus u moet ervoor zorgen dat uw slaaf heeft alle (of bijna alle) informatie. Als je meer dan één slave-node hebt, moet je ook controleren welke de meest geavanceerde node is en deze kiezen voor failover.

bijv.:Laten we de replicatiestatus in een MariaDB-server controleren.

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)

In het geval van PostgreSQL is het een beetje anders, omdat je de WAL-status moet controleren en de toegepaste met de opgehaalde moet vergelijken.

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)

Inloggegevens

Voordat u de failover uitvoert, moet u controleren of uw toepassing/gebruikers toegang hebben tot uw nieuwe master met de huidige inloggegevens. Als u uw databasegebruikers niet repliceert, zijn de inloggegevens misschien gewijzigd, dus moet u ze bijwerken in de slave-knooppunten voordat er wijzigingen worden aangebracht.

e.g.:U kunt de gebruikerstabel in de mysql-database opvragen om de gebruikersreferenties in een MariaDB/MySQL-server te controleren:

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)

In het geval van PostgreSQL kunt u de opdracht '\du' gebruiken om de rollen te kennen, en u moet ook het configuratiebestand pg_hba.conf controleren om de gebruikerstoegang te beheren (geen inloggegevens). Dus:

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                          | {}

En 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

Netwerk-/firewalltoegang

De inloggegevens zijn niet het enige mogelijke probleem om toegang te krijgen tot je nieuwe master. Als het knooppunt zich in een ander datacenter bevindt, of als u een lokale firewall hebt om verkeer te filteren, moet u controleren of u er toegang toe hebt of zelfs of u de netwerkroute heeft om het nieuwe hoofdknooppunt te bereiken.

bijvoorbeeld:iptables. Laten we het verkeer van het netwerk 167.124.57.0/24 toestaan ​​en de huidige regels controleren nadat we het hebben toegevoegd:

$ 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

bijvoorbeeld:routes. Laten we aannemen dat uw nieuwe hoofdknooppunt zich in het netwerk 10.0.0.0/24 bevindt, uw toepassingsserver zich in 192.168.100.0/24 bevindt en dat u het externe netwerk kunt bereiken via 192.168.100.100, dus voeg in uw toepassingsserver de bijbehorende route toe:

$ 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

Actiepunten

Na het controleren van alle genoemde punten, zou u klaar moeten zijn om de acties uit te voeren om uw database te failoveren.

Nieuw IP-adres

Omdat je een slave-node gaat promoten, zal het master-IP-adres veranderen, dus je zult het in je applicatie of clienttoegang moeten veranderen.

Het gebruik van een Load Balancer is een uitstekende manier om dit probleem/deze wijziging te voorkomen. Na het failoverproces zal de Load Balancer de oude master als offline detecteren en (afhankelijk van de configuratie) het verkeer naar de nieuwe sturen om erop te schrijven, dus je hoeft niets in je applicatie te veranderen.

e.g.:Laten we een voorbeeld bekijken voor een HAProxy-configuratie:

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

In dit geval, als één knooppunt niet beschikbaar is, zal HAProxy daar geen verkeer naartoe sturen en het verkeer alleen naar het beschikbare knooppunt sturen.

De Slave-knooppunten opnieuw configureren

Als je meer dan één slave-node hebt, moet je, nadat je er een hebt gepromoveerd, de rest van de slaves opnieuw configureren om verbinding te maken met de nieuwe master. Dit kan een tijdrovende taak zijn, afhankelijk van het aantal nodes.

Controleer en configureer de back-ups

Nadat je alles op zijn plaats hebt (nieuwe master gepromoveerd, slaves opnieuw geconfigureerd, applicatie schrijven in de nieuwe master), is het belangrijk om de nodige acties te ondernemen om een ​​nieuw probleem te voorkomen, dus back-ups zijn een must in deze stap. Hoogstwaarschijnlijk had u vóór het incident een back-upbeleid (zo niet, dan moet u het zeker hebben), dus u moet controleren of de back-ups nog steeds actief zijn of dat ze het zullen doen in de nieuwe topologie. Het kan zijn dat de back-ups op de oude master draaiden, of dat je de slave-node gebruikt die nu master is, dus je moet dit controleren om er zeker van te zijn dat je back-upbeleid nog steeds werkt na de wijzigingen.

Databasecontrole

Als je een failover-proces uitvoert, is monitoring een must voor, tijdens en na het proces. Hiermee kunt u een probleem voorkomen voordat het erger wordt, een onverwacht probleem detecteren tijdens de failover of zelfs weten of er daarna iets misgaat. U moet bijvoorbeeld controleren of uw toepassing toegang heeft tot uw nieuwe master door het aantal actieve verbindingen te controleren.

Belangrijke statistieken om te controleren

Laten we eens kijken naar enkele van de belangrijkste statistieken om rekening mee te houden:

  • Replicatievertraging
  • Replicatiestatus
  • Aantal verbindingen
  • Netwerkgebruik/fouten
  • Serverbelasting (CPU, geheugen, schijf)
  • Database- en systeemlogboeken

Terugdraaien

Als er iets mis is gegaan, moet je natuurlijk terug kunnen draaien. Het blokkeren van verkeer naar het oude knooppunt en het zo geïsoleerd mogelijk houden, kan hiervoor een goede strategie zijn, dus voor het geval u moet terugdraaien, heeft u het oude knooppunt beschikbaar. Als het terugdraaien na enkele minuten plaatsvindt, moet u, afhankelijk van het verkeer, waarschijnlijk de gegevens van deze minuten in de oude master invoeren, dus zorg ervoor dat u ook uw tijdelijke masternode beschikbaar en geïsoleerd hebt om deze informatie op te nemen en terug toe te passen .

Automatiseer het failoverproces met ClusterControl

Als je al deze noodzakelijke taken ziet om een ​​failover uit te voeren, wil je deze waarschijnlijk automatiseren en al dit handmatige werk vermijden. Hiervoor kunt u profiteren van enkele van de functies die ClusterControl u kan bieden voor verschillende databasetechnologieën, zoals automatisch herstel, back-ups, gebruikersbeheer, bewaking en andere functies, allemaal vanuit hetzelfde systeem.

Met ClusterControl kunt u de replicatiestatus en de vertraging ervan verifiëren, referenties maken of wijzigen, de netwerk- en hoststatus kennen en zelfs nog meer verificaties.

Met ClusterControl kunt u ook verschillende cluster- en knooppuntacties uitvoeren, zoals slaaf promoten , database en server opnieuw opstarten, databaseknooppunten toevoegen of verwijderen, load balancer-knooppunten toevoegen of verwijderen, een replicatieslave opnieuw opbouwen en meer.

Met deze acties kunt u indien nodig uw failover terugdraaien door opnieuw op te bouwen en te promoten de vorige meester.

ClusterControl heeft bewakings- en waarschuwingsservices die u helpen te weten wat er gebeurt of zelfs of er eerder iets is gebeurd.

U kunt ook het dashboardgedeelte gebruiken voor een gebruiksvriendelijkere weergave over de status van uw systemen.

Conclusie

In het geval van een storing in de masterdatabase, wil je dat alle informatie aanwezig is om zo snel mogelijk de nodige acties te ondernemen. Het hebben van een goede DRP is de sleutel om uw systeem de hele (of bijna altijd) aan de gang te houden. Deze DRP moet een goed gedocumenteerd failoverproces bevatten om een ​​acceptabele RTO (Recovery Time Objective) voor het bedrijf te hebben.


  1. Risico bij gebruik van dynamisch geheugen binnen Hyper-V

  2. Rijen dupliceren op basis van een kolomwaarde in elke rij

  3. Hoe rang in MySQL te berekenen

  4. Wat betekent een (+) teken in een Oracle SQL WHERE-clausule?