Varje stort projekt börjar med ett par servrar. Först fanns det en databasserver, sedan lades ytterligare slavar till för att skala lĂ€sningen. Och hĂ€r â stopp! Det finns en master och mĂ„nga slavar; om en av slavarna gĂ„r ner Ă€r det okej, men om mastern gĂ„r ner â dĂ„ blir det problem: driftstopp, administratörer stĂ„r med huvudet i hĂ€nderna för att Ă„terstĂ€lla servern. Vad ska vi göra? Reservkopiera mastern. Min kollega Pavel har redan skrivit om detta. , jag kommer inte att upprepa det. IstĂ€llet kommer jag att berĂ€tta varför du absolut behöver Orchestrator för MySQL!
LÄt oss börja med den viktigaste frÄgan: "Hur ska vi vÀxla koden till den nya maskinen nÀr mastern gÄr ner?".
- Schemat med VIP (Virtual IP) gillar jag mest, och det Àr det vi kommer att diskutera nedan. Det Àr det enklaste och mest uppenbara, Àven om det har en tydlig begrÀnsning: den master som vi ska reservkopiera mÄste ligga inom L2-segmentet med den nya maskinen, vilket innebÀr att den andra datacentret kan glömmas. Dessutom, om man ska vara Àrlig, om man följer regeln att stora L2 Àr ont, eftersom L2 bara Àr pÄ stativet, och mellan stativen L3, sÄ har detta schema Ànnu fler begrÀnsningar.
- Man kan ange DNS-namnet i koden och lösa det via /etc/hosts. I verkligheten kommer dock ingen lösning att ske. Fördel med schemat: det finns ingen av dessa begrÀnsningar som kÀnnetecknar den första metoden, sÄ man kan Àven skapa en cross-Datacenter lösning. Men dÄ uppkommer den uppenbara frÄgan, hur snabbt vi genom Puppet-Ansible kan leverera förÀndringen i /etc/hosts.
- Man kan Àndra den andra metoden lite: pÄ alla webbservrar installerar vi en cache-DNS, genom vilken koden ska gÄ till master-databasen. Man kan ange TTL 60 för denna post i DNS. Det verkar som en bra metod om den implementeras korrekt.
- Schemat med service discovery som involverar anvÀndningen av Consul och etcd.
- En intressant variant med . All trafik till MySQL behöver gÄ genom ProxySQL, som sjÀlv kan avgöra vem som för nÀrvarande Àr master. För övrigt, om en av anvÀndningarna av denna produkt kan lÀsas i min .
Författaren av Orchestrator, jobbade pÄ Github, implementerade först det första schemat med VIP, och sedan Àndrade han till schemat med Consul.
Typiskt schema för infrastruktur:

LÄt mig omedelbart beskriva uppenbara situationer som mÄste beaktas:
- VIP-adressen fÄr inte anges i konfigurationen pÄ nÄgon av servrarna. FörestÀll dig situationen: mastern startades om, och medan den bootar, har Orchestrator gÄtt över till failover-lÀge och gjort en av slavarna till master; sedan startar den gamla mastern igen, och nu har vi VIP pÄ tvÄ maskiner. Det Àr dÄligt.
- För orkestatorn behöver du skriva ett skript som kontaktar den gamla mastern och den nya mastern. PÄ den gamla mÄste ifdown köras, medan ifup vip ska köras pÄ den nya mastern. Det vore bra att ocksÄ inkludera i detta skript att, vid failover, porten pÄ switchen till den gamla mastern stÀngs för att undvika nÄgon splitbrain.
- Efter att Orchestrator har kallat ditt skript för att först ta bort VIP och/eller stÀnga porten pÄ switchen, och dÀrefter kalla skriptet för att aktivera VIP pÄ den nya mastern, glöm inte att anvÀnda kommandot arping för att informera alla om att den nya VIP nu Àr hÀr.
- Alla slavar ska ha read_only=1, och sÄ snart du gör en slav till master, ska den ha read_only=0.
- Kom ihÄg att vilken slav som helst som vi vÀljer för detta kan bli master (Orchestrator har en mekanism för att prioritera vilken slav som ska bli ny master först, vilken andra och vilken slav som under inga omstÀndigheter ska bli vald som master). Om en slav blir master, sÄ kommer den ha lasten av slaven och dessutom lagt till lasten av mastern, vilket mÄste beaktas.
Varför behöver du Orchestrator, om du inte har en?
- Orchestrator har ett mycket anvÀndarvÀnligt grÀnssnitt som visar hela topologin (se skÀrmdumpen nedan).
- Orchestrator kan övervaka vilka slavar som har fördröjning och var replikeringen har brutit samman (vi har skript anslutna till Orchestrator för att skicka SMS).
- Orchestrator informerar dig om vilka slavar som har ett fel GTID errant.
Orchestrator-grÀnssnittet:

Vad Àr GTID errant?
Det finns tvÄ grundlÀggande krav för att Orchestrator ska fungera:
- Det mÄste vara aktiverat pseudo GTID pÄ alla maskiner i MySQL-klustret, och vi har GTID aktiverat.
- Det mÄste finnas en typ av binlogs överallt, gÀrna statement. Vi hade en sÄdan konfiguration dÀr mastern och de flesta slavar hade Row, medan tvÄ historiskt hade Mixed-lÀget. Som ett resultat ville Orchestrator helt enkelt inte ansluta dessa slavar till den nya mastern.
Kom ihÄg att det viktigaste pÄ en production-slav Àr dess konsistens med mastern! Om bÄde mastern och slaven har Global Transaction ID (GTID) aktiverat, kan man med funktionen gtid_subset ta reda pÄ om samma förÀndringsförfrÄgningar faktiskt har utförts pÄ dessa maskiner. Du kan lÀsa mer om detta. .
PÄ sÄ sÀtt visar Orchestrator genom GTID-felmeddelandet att det finns transaktioner pÄ slaven som inte finns pÄ mastern. Hur kan detta hÀnda?
- PÄ slaven Àr read_only=1 inte aktiverat, nÄgon har anslutit och utfört en databasÀndringsfrÄga.
- PÄ slaven Àr super_read_only=1 inte aktiverat, sÄ en administratör kan ha förvÀxlat servrar och utfört en frÄga dÀr.
- Om du har beaktat de tvÄ tidigare punkterna finns det en annan finess: i MySQL registreras ocksÄ frÄgan om att tömma binloggar i binloggen, sÄ vid första flush pÄ mastern och pÄ alla slavar kommer GTID-felmeddelandet att visas. Hur kan man undvika detta? I perona-5.7.25-28 introducerades instÀllningen binlog_skip_flush_commands=1, som förhindrar att flush skrivs i binloggar. PÄ mysql.com finns det en uppteckning. .
Sammanfattningsvis allt ovanstĂ„ende. Om du Ă€nnu inte vill anvĂ€nda Orchestrator i failover-lĂ€ge, sĂ€tt det dĂ„ i bevakningslĂ€ge. DĂ„ har du alltid en karta över interaktionen mellan MySQL-maskiner framför dig och tydlig information om vilken typ av replikering som finns pĂ„ varje maskin, om slavar ligger efter och viktigast av allt â hur konsistent de Ă€r med mastern!
En uppenbar frÄga: "Hur ska Orchestrator fungera?" Den ska vÀlja en ny master bland de nuvarande slavarna och sedan Äteransluta alla slavar till den (detta Àr anledningen till att GTID behövs; om man anvÀnder den gamla mekanismen med binlog_name och binlog_pos Àr det helt omöjligt att byta slav frÄn nuvarande master till en ny!). Före Orchestrators tid var jag tvungen att göra allt detta manuellt en gÄng. Den gamla mastern hÀngde sig pÄ grund av en buggig Adaptec-kontroll, och den hade cirka 10 slavar. Jag behövde flytta VIP frÄn mastern till en av slavarna och Äteransluta alla andra slavar dit. Hur mÄnga konsoler fick jag inte öppna, hur mÄnga kommandon fick jag inte skriva in samtidigt... Jag fick vÀnta till klockan 03:00, avlasta alla slavar utom tvÄ, göra den första maskinen till master av de tvÄ, koppla den andra direkt till den, sÄ att alla andra slavar Äteransluts till den nya mastern och belastningen ÄterstÀlls. I allmÀnhet, hemskt...
Hur fungerar Orchestrator nÀr den gÄr in i failover-lÀge? Det Àr enklast att visa med ett exempel dÀr vi vill göra en kraftfullare och modernare maskin till master Àn den vi har just nu.

PÄ bilden visas mitten av processen. Vad har redan gjorts fram till den hÀr punkten? Vi sa att vi ville göra en slavinspelare till den nya mÀstaren, Orchestrator började helt enkelt koppla om alla andra slavar till den, medan den nya mÀstaren fungerar som en transitmaskin. Med detta system uppstÄr inga fel, alla slavar fungerar, Orchestrator tar bort VIP frÄn den gamla mÀstaren, flyttar den till den nya, sÀtter read_only=0 och glömmer den gamla mÀstaren. Klart! Driftstoppet för vÄr tjÀnst Àr den tid det tar att flytta VIP, det Àr 2-3 sekunder.
Det var allt för idag, tack alla. Snart kommer den andra artikeln om Orchestrator. I den vÀlkÀnda sovjetiska filmen "Garaget" sa en karaktÀr: "Jag skulle inte gÄ med honom pÄ spaning!" SÄ, Orchestrator, jag skulle gÄ med dig pÄ spaning!
KĂ€lla: habr.com
