...

Replikacja bazy danych w hostingu: master-slave vs. multi-master

Replikacja bazy danych W hostingu określa, jak dobrze aplikacje pozostają dostępne, gdy obciążenie wzrasta i jak szybko mogą ponownie pisać i czytać po zakłóceniach. Wyraźnie pokazuję różnicę między master-slave i multi-master, w tym strojenie, strategie przełączania awaryjnego i odpowiednie scenariusze wdrażania.

Punkty centralne

Poniższe kluczowe aspekty pomagają mi wybrać odpowiednią strategię replikacji.

  • Master-SlaveProste zapisy, skalowalne odczyty, jasno określone obowiązki.
  • Multi-MasterRozproszony zapis, wyższa dostępność, ale zarządzanie konfliktami.
  • GTID & Failover: Szybsze przełączanie i czystsze ścieżki replikacji.
  • Rzeczywistość hostinguOpóźnienia, pamięć masowa i sieć wpływają na spójność.
  • Monitoring & Tuning: Metryki, czasy nadrabiania zaległości i ustawienia binloga na pierwszy rzut oka.

Co robi replikacja w hostingu

Używam replikacji do Dostępność aby zwiększyć wydajność odczytu, rozłożyć obciążenia odczytu i umożliwić okna konserwacji bez awarii. Topologie master-slave centralizują zapisy, podczas gdy wiele replik obsługuje masę odczytów, a tym samym skraca czas odpowiedzi. Warianty multi-master umożliwiają rozproszone zapisy, co zmniejsza opóźnienia w konfiguracjach globalnych i ułatwia radzenie sobie z utratą węzła. W przypadku stosów internetowych WordPress, silników sklepowych lub interfejsów API oznacza to większe buforowanie przed szczytami ruchu i szybsze odzyskiwanie po incydentach. Jeśli planujesz horyzontalny wzrost poza czystą replikację, połącz go krok po kroku z Sharding i replikacja, szerzej dystrybuować dane i obciążenia oraz Skalowanie aby można było to zaplanować.

Master-slave: funkcjonalność i mocne strony

W konfiguracji master-slave konsekwentnie piszę tylko do Mistrz, podczas gdy niewolnicy przejmują dostęp do odczytu i śledzą binlogi. Jasny podział ról pozwala uniknąć konfliktów zapisu i zachować przejrzystość modelu. Jest to idealne rozwiązanie dla wielu scenariuszy hostingowych z wysokim odsetkiem odczytów, takich jak katalogi produktów, portale treści lub pulpity raportowania. W razie potrzeby dodaję więcej serwerów slave bez zmiany ścieżki zapisu. Planuję bufory dla opóźnień replikacji, aby raporty lub pamięci podręczne mogły być synchronizowane pomimo krótkich opóźnień. Wyniki dostarczyć.

MySQL Master-Slave krok po kroku

Zaczynam od mastera z binarnym logowaniem i unikalnym server-id, aby urządzenia podrzędne mogły pójść w ich ślady: W my.cnf ustawiłem server-id=1, log_bin=mysql-bin, opcjonalnie binlog_do_db dla filtrowanej replikacji. Następnie tworzę dedykowanego użytkownika replikacji i ograniczam jego uprawnienia do absolutnego minimum. Na potrzeby początkowej synchronizacji tworzę zrzut z rozszerzeniem --master-data, Importuję to do urządzenia podrzędnego i zapamiętuję plik dziennika oraz pozycję. Na urządzeniu slave definiuję server-id=2, aktywować logi przekaźnika i podłączyć go do ZMIENIĆ MASTER NA ...a następnie START SLAVE. Z SHOW SLAVE STATUS\G Myślę, że Seconds_Behind_Master i zareagować, jeśli opóźnienie wzrośnie.

Optymalizacje dla środowisk hostingowych

Dla czystego przełączania awaryjnego aktywuję GTID a tym samym uprościć przełączanie bez żmudnego ponownego dostosowywania pozycji dziennika. Odczyty kieruję specjalnie przez warstwy proxy, takie jak ProxySQL lub logika aplikacji, aby uniknąć hotspotów i zwiększyć współczynnik trafień pamięci podręcznej. Z sync_binlog=1 Zabezpieczam binlogi przed awariami, podczas gdy umiarkowane wartości dla sync_relay_log Zmniejsz narzut zapisu, nie pozwalając, by opóźnienie wymknęło się spod kontroli. Zwracam uwagę na przepustowość we/wy, ponieważ wolne dyski SSD lub współdzielone pule pamięci masowej zwiększają zaległości. Na potrzeby audytów i zgodności szyfruję kanały replikacji za pomocą TLS i oddzielić klucze od ścieżki danych.

Multi-Master: Kiedy ma to sens

Używam Multi-Master, gdy muszę rozdzielić zapisy geograficznie lub gdy pojedynczy serwer Węzeł nie może już przenosić obciążenia zapisu. Wszystkie węzły akceptują zmiany, propagują je wzajemnie, a tym samym łatwiej kompensują awarie. Ceną jest zarządzanie konfliktami: jednoczesne aktualizacje tego samego wiersza wymagają reguł, takich jak wygrana ostatniego zapisującego, scalanie po stronie aplikacji lub sekwencje transakcji. W przypadku obciążeń wrażliwych na opóźnienia, takich jak bramki płatności lub globalne backendy SaaS, konfiguracja może znacznie skrócić czas odpowiedzi. Z wyprzedzeniem oceniam, czy moja aplikacja toleruje konflikty i czy mam jasne Strategie dla rozdzielczości.

MySQL Multi-Master w praktyce

Polegam na replikacji opartej na GTID, ponieważ upraszcza ona kanały i przełączanie awaryjne oraz Błąd dzięki czemu są szybciej widoczne. Replikacja wieloźródłowa pozwala mi na zasilanie kilku masterów do jednego węzła, na przykład w celu centralnej analizy lub agregacji. W przypadku rzeczywistych topologii peer definiuję strategie kluczy o niskim poziomie konfliktu, sprawdzam przesunięcia automatycznego zwiększania i redukuję dryfujące znaczniki czasu. Monitoruję szczyty opóźnień, ponieważ równoległe zapisy w różnych regionach zwiększają wysiłek koordynacyjny i mogą kosztować przepustowość. Bez odpowiedniego monitorowania i jasnych reguł operatora nie mógłbym produktywnie korzystać z multi-master. Przełącznik.

Tabela porównawcza: Master-slave vs. multi-master

Poniższa tabela podsumowuje najważniejsze różnice i ułatwia mi Decyzja w codziennym hostingu.

Kryterium Master-Slave Multi-Master
Writes Urządzenie główne przetwarza wszystkie Operacje zapisu Wszystkie węzły akceptują zapisy
Spójność Rygorystyczne, konflikty mało prawdopodobne Łagodniejsze, możliwe konflikty
Skalowanie Bardzo dobrze się czyta z możliwością rozbudowy Odczyt i zapis z możliwością rozbudowy
Wysiłek związany z konfiguracją Łatwy w zarządzaniu i kontroli Więcej wysiłku i więcej zasad
Typowe przypadki użycia Blogi, sklepy, raportowanie Aplikacje globalne, interfejsy API o krytycznym opóźnieniu

Wysoka dostępność, RTO/RPO i bezpieczeństwo

Definiuję jasno RTO/RPO-Cele i dostosowanie do nich replikacji: Jak długo może trwać odzyskiwanie, ile danych mogę stracić. Replikacja synchroniczna lub półsynchroniczna może zmniejszyć straty, ale wiąże się z kosztami opóźnień i przepustowości. Kopie zapasowe nie zastępują replikacji, ale uzupełniają ją w zakresie odzyskiwania danych w czasie i stanów historycznych. Regularnie sprawdzam testy przywracania, ponieważ w praktyce liczy się tylko przetestowana kopia zapasowa. Aby właściwie zaplanować, zapoznaj się z moim przewodnikiem po RTO/RPO w hostingu, tak, aby kluczowe liczby odpowiadały rzeczywistości operacyjnej oraz Ryzyko dopasowanie.

Ścieżka skalowania: od pojedynczego węzła do klastra

Często zaczynam od pojedynczego Mistrz, Dodaję replikę do odczytów i kopii zapasowych, a następnie skaluję krok po kroku. W miarę wzrostu udziału odczytu dodaję dodatkowe urządzenia podrzędne i uzupełniam konfigurację o buforowanie. Jeśli pojemność zapisu nie jest już wystarczająca, planuję ścieżki multi-master, sprawdzam ryzyko konfliktu i dodaję idempotencję do aplikacji. W przypadku większych konwersji migruję za pomocą strategii kroczących, faz niebieskich/zielonych lub podwójnego zapisu i utrzymuję rezerwy gotowe do wycofania. W przypadku konwersji bez przestojów używam przewodnika do Migracje bez przestojów, aby użytkownicy nie Przerwy czuć.

Dostrajanie wydajności: opóźnienia, wejścia/wyjścia i buforowanie

Monitoruję opóźnienia w sieci, IOPS w pamięci masowej i szczytowe wartości CPU w sieci. Węzeł, ponieważ wszystkie trzy czynniki kontrolują opóźnienie replikacji. Lokalna warstwa Redis lub Memcached pobiera odczyty ze stosu i utrzymuje niewolników bez obciążenia. Dzielę duże transakcje, aby uniknąć zalewu binlogów i zmniejszyć zatory commitów. W przypadku dużych obciążeń związanych z zapisem, umiarkowanie zwiększam bufory dziennika innodb i reguluję interwały spłukiwania bez osłabiania trwałości. Utrzymuję plany zapytań w czystości, ponieważ złe indeksy powodują kosztowne błędy zarówno na serwerach głównych, jak i podrzędnych. Skany.

Unikanie i rozwiązywanie konfliktów w Multi-Master

Unikam konfliktów poprzez logiczne rozdzielanie obszarów pisania, na przykład poprzez Klient, region lub przestrzeń kluczy. Automatycznie zwiększane przesunięcia (np. 1/2/3 dla trzech węzłów) zapobiegają kolizjom z kluczami głównymi. Tam, gdzie jednoczesne aktualizacje są nieuniknione, dokumentuję jasne zasady, na przykład wygrywa ostatni zapisujący lub scalanie po stronie aplikacji. Idempotentne zapisy i deduplikacja konsumentów chronią przed zduplikowanym przetwarzaniem. Rejestruję również informacje audytowe, aby w razie sporu można było szybko podjąć decyzję. rozumieć być w stanie.

Rozwiązywanie problemów: Co sprawdzam w pierwszej kolejności

W przypadku opóźnienia sprawdzam Seconds_Behind_Master, wątki I/O i SQL, a także rozmiary dzienników przekaźników. Patrzę na rozmiary i formaty binlogów, ponieważ STATEMENT vs ROW może znacznie zmienić objętość. Metryki pamięci masowej, takie jak czasy spłukiwania i kolejki, pokazują, czy dyski SSD osiągają maksimum lub są dławione. Jeśli GTID są aktywne, porównuję zastosowane i brakujące transakcje na kanał. W nagłych przypadkach zatrzymuję i uruchamiam replikator specjalnie w celu rozwiązania blokad, a dopiero potem poprawiam Konfiguracja.

Modele spójności i odczyt po zapisie

W przypadku replikacji asynchronicznej świadomie planuję Ostateczna spójność na. W przypadku działań użytkownika z bezpośrednią informacją zwrotną zapewniam Odczyt po zapisie, wiążąc sesje zapisu z urządzeniem nadrzędnym na krótki czas lub kierując odczyty w sposób uwzględniający opóźnienia. Używam flag aplikacji (np. „lepkość“ przez 2-5 sekund) i sprawdzam Seconds_Behind_Master, zanim zezwolę replice na krytyczne odczyty. Polegam na replikach read_only=ON oraz super_read_only=ON, dzięki czemu nie dochodzi do przypadkowych zapisów. Przy odpowiednio dobranych poziomach izolacji (POWTARZALNE CZYTANIE vs. READ COMMITTED) Zapobiega to spowalnianiu wątku Apply przez długie transakcje.

Topologie: gwiazda, kaskada i fan-out

Oprócz klasycznej gwiazdy (wszystkie urządzenia podrzędne pobierają bezpośrednio z urządzenia nadrzędnego), polegam na Replikacja kaskadowa, jeśli wymaganych jest wiele replik lub łącza WAN są ograniczone. Aby to zrobić, aktywuję następujące elementy na węzłach pośrednich log_slave_updates=ON, aby służyły jako źródło dla replik niższego rzędu. Pozwala to na odciążenie głównego wejścia/wyjścia i lepszą dystrybucję przepustowości. Zwracam uwagę na dodatkowe poziomy opóźnień: Każda kaskada potencjalnie zwiększa opóźnienie i wymaga ścisłego monitorowania. W przypadku konfiguracji globalnych łączę regionalne węzły z niewielkimi odległościami i utrzymuję co najmniej dwie repliki na region w celu konserwacji i monitorowania. Przełączanie awaryjne gotowy.

Planowane i nieplanowane przełączanie awaryjne

Dokumentuję wyraźny Proces promocji1) Zatrzymanie zapisu na serwerze głównym lub przełączenie ruchu na tylko do odczytu, 2) Wybór repliki kandydującej (najniższe opóźnienie, kompletne GTID), 3) Awans repliki i tylko do odczytu dezaktywować, 4) wyrównać pozostałe węzły. Przeciw Rozszczepiony mózg Chronię się za pomocą przejrzystego routingu (np. przełączanie VIP/DNS z krótkimi TTL) i automatycznego blokowania. Narzędzia do orkiestracji pomagają, ale regularnie ćwiczę ręczne ścieżki. Przechowuję runbooki, alarmy i Wiertła gotowe, aby nikt nie musiał improwizować w sytuacji awaryjnej.

GTID w praktyce: przeszkody i poprawa sytuacji

Dla GTID aktywuję enforce_gtid_consistency=ON oraz gtid_mode=ON krok po kroku. Używam pozycja automatyczna, aby uprościć zmiany źródła i uniknąć filtrów replikacji na trasach GTID, ponieważ utrudniają one debugowanie. Krok błędne transakcje (transakcje, które istnieją na replice, ale nie na źródle), identyfikuję je za pomocą różnicy gtid_executed i źródło oraz czyszczenie w kontrolowany sposób - nie na ślepo z czystkami. Planuję retencję binlogów w taki sposób, aby odbudowa była możliwa bez luk i sprawdzam spójność gtid_purged.

Równoległość i przepustowość replik

Aby zmniejszyć opóźnienie, zwiększam replica_parallel_workers w zależności od liczby procesorów i wybierz replica_parallel_type=LOGICAL_CLOCK, aby powiązane transakcje pozostały zorganizowane. Z binlog_transaction_dependency_tracking=WRITESET Zwiększam równoległość, ponieważ niezależne zapisy mogą być stosowane jednocześnie. Monitoruję czasy oczekiwania na repliki: nadmierna równoległość może generować współbieżne aktualizacje. Dodatkowo pomaga Zobowiązanie grupowe w urządzeniu nadrzędnym (dołączone opóźnienia spłukiwania), aby powiązać powiązane transakcje bardziej efektywnie - bez przekraczania zakresu opóźnień P95.

Zmiany schematów bez przestojów

Wolę Online DDL z InnoDB (ALGORITHM=INPLACE/INSTANT, LOCK=NONE), aby przenosić zmiany w tabelach poprzez replikację bez blokowania zapytań. W przypadku bardzo dużych tabel wybieram metody oparte na fragmentach, dzielę indeksy i pilnuję obciążenia binlogów. W przypadku multi-masterów ściśle planuję okna DDL, ponieważ współbieżne zmiany schematu są trudne do wyleczenia. Testuję DDL na replice, mierzę ich wpływ na opóźnienia i promuję tylko wtedy, gdy ścieżka replikacji pozostaje stabilna.

Opóźniona replikacja jako zabezpieczenie

Przeciwko błędom logicznym (DROP/DELETE) uważam za opóźniona replika gotowy, na przykład z replica_sql_delay=3600. Pozwala mi to powrócić do czystego stanu w ciągu godziny bez natychmiastowego uruchamiania PITR z kopii zapasowych. Nigdy nie używam tej repliki do odczytów lub przełączania awaryjnego - jest to wyłącznie bufor bezpieczeństwa. Automatyzuję kopie z tego węzła, dzięki czemu mogę szybko pobrać świeży, aktualny węzeł odczytu w sytuacji awaryjnej.

Aktualizacje, kompatybilność i obsługa

Utrzymuję wersje źródłowe i docelowe blisko siebie i aktualizuję je zwijanienajpierw repliki, potem master. Krytycznie podchodzę do mieszanych środowisk z MySQL/MariaDB, ponieważ formaty i funkcje binlogów mogą się różnić. Używam binlog_row_image=MINIMAL gdzie sensowne jest zmniejszenie objętości binlogów i sprawdzenie zależności aplikacji dla wyzwalaczy lub procedur składowanych. Zmniejszam obciążenie WAN dla protokołu i kompresji binlogów, ale dbam o to, by nie przekroczyć budżetu CPU.

Obserwowalność i planowanie wydajności

Definiuję SLO dla Lag, czasy nadrabiania zaległości, wskaźniki błędów i przepustowość. Podstawowe zmienne obejmują zastosowane transakcje na sekundę, poziomy zapełnienia dziennika przekaźników, kolejki we/wy, czasy oczekiwania na blokadę i opóźnienia sieci. Rejestruję wzrost binlogów, planuję binlog_expire_logs_seconds i sprawdzam, czy odbudowy mieszczą się w okresach retencji. Na replikach ustawiam limity takie jak max_connections i monitorować anulacje, aby obciążenia odczytu nie były zerowe. Jeśli chodzi o koszty i rozmiar, obliczam poziomy wentylatorów, wymagania dotyczące pamięci masowej i Obciążenia szczytowe w stosunku do celów RPO/RTO.

Bezpieczeństwo i zgodność w operacjach replikacji

Uszczelniam połączenia end-to-end i ściśle oddzielają konta operatorów, aplikacji i replikacji. Regularne audyty uprawnień zapobiegają utrzymywaniu przez użytkowników replikacji niepotrzebnych autoryzacji DDL/DML. Chronię zewnętrzne kopie zapasowe za pomocą oddzielnego zarządzania kluczami i sprawdzam ścieżki dostępu pod kątem ruchów bocznych. W celu ochrony danych przestrzegam zasad usuwania i replikuję spseudonimizowane lub zminimalizowane rekordy danych, jeśli pozwala na to cel. Udostępniam logi i metryki zgodnie z zasadą najmniejszych uprawnień, aby dane telemetryczne nie były wykorzystywane bezmyślnie. Wyciek wyprodukowane.

Krótkie podsumowanie

W przypadku scenariuszy hostingu, Master-Slave zapewnia niezawodność Podstawa, ponieważ odczyty łatwo się skalują, a konflikty rzadko występują. Jeśli priorytetem są globalne zapisy, niskie opóźnienia i odporność na awarie, rozważam multi-master i planuję reguły rozwiązywania konfliktów. Łączę GTID, czyste monitorowanie i dobrze przemyślane kopie zapasowe, aby bezpiecznie osiągnąć cele odzyskiwania. Dostrajając binlog, pamięć masową i parametry zapytań, redukuję opóźnienia i utrzymuję wysoką przepustowość. Pozwala mi to wybrać odpowiednią topologię, skalować w kontrolowany sposób i minimalizować przestoje dla użytkowników. niewidoczny.

Artykuły bieżące