Heim  >  Artikel  >  Datenbank  >  Lassen Sie uns darüber sprechen, wie GitHub MySQL hochverfügbar macht

Lassen Sie uns darüber sprechen, wie GitHub MySQL hochverfügbar macht

青灯夜游
青灯夜游nach vorne
2022-10-26 19:19:302373Durchsuche

Lassen Sie uns darüber sprechen, wie GitHub MySQL hochverfügbar macht

Github verwendet eine MySQL-Datenbank als Datenspeicher für alle Nicht-git-Transaktionen. Die Verfügbarkeit der Datenbank ist entscheidend für das ordnungsgemäße Funktionieren von Github. Sowohl die Github-Website selbst als auch die Github-API, der Authentifizierungsdienst usw. müssen alle auf die Datenbank zugreifen. Github führt mehrere Datenbankcluster aus, um verschiedene Serviceaufgaben zu unterstützen. Die Datenbankarchitektur übernimmt eine traditionelle Master-Slave-Struktur. Ein Knoten (Master-Datenbank) im Cluster unterstützt den Schreibzugriff, und die übrigen Knoten (Slave-Datenbanken) synchronisieren Änderungen an der Master-Datenbank und unterstützen Lesedienste. git 事务的数据存储。数据库的可用性对 Github 的正常运行而言至关重要。无论是 Github 网站本身,还是 Github API,身份验证服务等都需要访问数据库。Github 运行了多个数据库集群用于支撑不同的服务于任务。数据库的架构采用的是传统的主从结构,集群中一个节点(主库)支持写访问,其余的节点(从库)同步主库的变更,支持读服务。

主库的可用性至关重要。一旦主库宕机,集群将不能够支持数据写入服务:任何需要保存的数据都无法写入到数据库保存。最终导致 Github 上任何变更,例如代码提交,提问,用户创建,代码 review,创建仓库等操作都无法完成。

为了保证业务的正常运行,我们自然需要在集群中有一个可用的支持写入的数据库节点。同时,我们也必须能够快速的发现可用的可写入服务数据库节点。

就是说,在异常情况下,假如主库宕机的场景,我们必须确保新的主库能够立刻上线支持服务,同时保证集群中其他节点能够快速识别到新的主库。故障检测,主库迁移以及集群其他数据节点识别新主库的总时间构成了服务中断的总时间。

这篇文章说明了 GitHub 的 MySQL 高可用性和主库服务发现解决方案,该解决方案使我们能够可靠地运行跨数据中心的操作,能够容忍数据中心的隔离,并缩短在出现故障时停机时间。

高可用性的实现

本篇文章描述的解决方案是在以前 Github 高可用方案上的改进版本。正如前面说到的一样,MySQL 的高可用策略必须适应业务的变化。我们期望 MySQL 以及 GitHub 上其他的服务都有能够应对变化的高可用解决方案。

当设计高可用以及服务发现系统方案的时候,从下面几个问题出发,也许能够帮助我们快速找到合适的解决方案:

  • 最大允许的服务中断的时间是多少?
  • 服务中断检测的准确性怎么样?是否能够允许服务中断检测误报(会导致过早故障转移)?
  • 故障转移的可靠性怎么样?什么情况会导致故障转移失败?
  • 这个方案能否在跨数据中心实现,以及如何实现的? 在不同的网络状况下会怎么样,延迟高,或延迟低的情况会怎么样?
  • 这个解决方案能否承受整个数据中心(DC)的故障 或者网络隔离的情况?
  • 有什么机制防止 HA 集群脑裂情况(在一个整体的系统,联系着的两个节点分裂为两个独立节点,这两个节点争抢共享资源写入数据的情况)?
  • 能否容忍数据丢失?容忍丢失程度是多少?

为了说明上面的几个问题,我们先来看一下我们之前的高可用方案,以及我们为什么要改进它。

摒弃基于 VIP 和 DNS 的发现机制

在之前的方案中,应用了下面的技术方案:

  • 使用 orchestrator 作为故障检测迁移方案。
  • 采用 VIP 和 DNS 方式作为主节点发现方案。

客户端通过节点名称,例如 mysql-writer-1.github.net,解析成主节点的虚拟 IP 地址 (VIP),从而找到主节点。

因此,正常情况下,客户端可以通过对节点名称的解析,连接到对应 IP 的主节点上。

考虑夸三个数据中心的拓扑结构的情况:

Lassen Sie uns darüber sprechen, wie GitHub MySQL hochverfügbar macht

一旦主库异常,必须将其中的一个数据副本服务器更新为主库服务器。

orchestratorDie Verfügbarkeit der Hauptbibliothek ist entscheidend. Sobald die Hauptdatenbank ausfällt, kann der Cluster keine Datenschreibdienste mehr unterstützen: Daten, die gespeichert werden müssen, können nicht zur Speicherung in die Datenbank geschrieben werden. Infolgedessen können alle Änderungen an Github, wie z. B. Code-Übermittlung, Fragen, Benutzererstellung, Codeüberprüfung, Warehouse-Erstellung usw., nicht abgeschlossen werden.

Um den normalen Geschäftsbetrieb sicherzustellen, benötigen wir natürlich einen verfügbaren Datenbankknoten im Cluster, der das Schreiben unterstützt. Gleichzeitig müssen wir auch in der Lage sein, verfügbare beschreibbare Service-Datenbankknoten schnell zu erkennen.

Das heißt, unter ungewöhnlichen Umständen, wenn die Hauptdatenbank ausfällt, müssen wir sicherstellen, dass die neue Hauptdatenbank sofort online gehen kann, um Dienste zu unterstützen, und sicherstellen, dass andere Knoten im Cluster die neue Hauptdatenbank schnell identifizieren können. Die Gesamtzeit für die Fehlererkennung, die Master-Migration und andere Datenknoten im Cluster zur Identifizierung des neuen Masters stellt die Gesamtzeit der Dienstunterbrechung dar. 🎜🎜In diesem Artikel wird die MySQL-Lösung für Hochverfügbarkeit und Master-Service-Discovery von GitHub erläutert, die es uns ermöglicht, den Betrieb in mehreren Rechenzentren zuverlässig auszuführen, die Isolation von Rechenzentren zu tolerieren und Ausfallzeiten im Falle eines Ausfalls zu reduzieren. 🎜

Implementierung von Hochverfügbarkeit

🎜Die in diesem Artikel beschriebene Lösung ist eine verbesserte Version der vorherigen Github-Hochverfügbarkeitslösung. Wie bereits erwähnt, muss sich die Hochverfügbarkeitsstrategie von MySQL an geschäftliche Veränderungen anpassen. Wir gehen davon aus, dass MySQL und andere Dienste auf GitHub über hochverfügbare Lösungen verfügen, die mit Änderungen umgehen können. 🎜🎜Beim Entwurf einer Hochverfügbarkeits- und Service-Discovery-Systemlösung können uns die folgenden Fragen dabei helfen, schnell eine geeignete Lösung zu finden: 🎜
  • Was ist die maximal zulässige Dienstunterbrechungszeit?
  • Wie genau ist die Erkennung von Serviceausfällen? Kann die Dienstausfallerkennung Falschmeldungen erkennen (was zu einem vorzeitigen Failover führt)?
  • Wie zuverlässig ist Failover? Welche Bedingungen können dazu führen, dass ein Failover fehlschlägt?
  • Kann diese Lösung in allen Rechenzentren implementiert werden und wie wird sie implementiert? Was passiert unter unterschiedlichen Netzwerkbedingungen, hoher Latenz oder niedriger Latenz?
  • Kann diese Lösung einem Ausfall eines kompletten Rechenzentrums (DC) oder einer Netzwerkisolation standhalten?
  • Gibt es einen Mechanismus, um eine Split-Brain-Situation im HA-Cluster zu verhindern (in einem Gesamtsystem teilen sich zwei verbundene Knoten in zwei unabhängige Knoten auf, und die beiden Knoten konkurrieren um gemeinsame Ressourcen zum Schreiben von Daten)?
  • Kann Datenverlust toleriert werden? Welche Verlusthöhe wird toleriert?
🎜Um die oben genannten Probleme zu veranschaulichen, werfen wir zunächst einen Blick auf unsere bisherige Hochverfügbarkeitslösung und warum wir sie verbessern möchten. 🎜

Verlassen Sie den auf VIP und DNS basierenden Erkennungsmechanismus

🎜In der vorherigen Lösung wurde die folgende technische Lösung angewendet: 🎜
  • Verwenden orchestrator dient als Migrationslösung zur Fehlererkennung.
  • Verwenden Sie VIP- und DNS-Methoden als Master-Knoten-Erkennungslösung.
🎜Der Client findet den Masterknoten, indem er den Knotennamen, z. B. mysql-writer-1.github.net, in die virtuelle IP-Adresse (VIP) des Knotens analysiert Masterknoten. 🎜🎜Daher kann der Client unter normalen Umständen eine Verbindung zum Masterknoten der entsprechenden IP herstellen, indem er den Knotennamen analysiert. 🎜🎜Stellen Sie sich die Situation vor, in der Sie mit der Topologie von drei Rechenzentren prahlen: 🎜🎜Lassen Sie uns darüber sprechen, wie GitHub MySQL hochverfügbar macht🎜🎜Sobald die Hauptdatenbank abnormal ist, muss einer der Datenreplikatserver auf den Hauptdatenbankserver aktualisiert werden. 🎜🎜orchestrator erkennt Anomalien, wählt eine neue Masterdatenbank aus und weist dann den Datenbanknamen und die virtuelle IP (VIP) neu zu. Der Client selbst kennt die Änderungen an der Hauptbibliothek nicht. Die Informationen, über die der Client verfügt, sind nur der 🎜Name🎜 der Hauptbibliothek, daher muss dieser Name auf den neuen Hauptbibliotheksserver aufgelöst werden können. Bedenken Sie Folgendes: 🎜🎜VIP muss ausgehandelt werden: Die virtuelle IP wird von der Datenbank selbst gehalten. Der Server muss eine ARP-Anfrage senden, um die VIP zu belegen oder freizugeben. Bevor die neue Datenbank neue VIPs zuweisen kann, muss der alte Server zunächst die von ihm gehaltenen VIPs freigeben. Dieser Vorgang wird einige ungewöhnliche Probleme verursachen:🎜
  • Die Reihenfolge des Failovers besteht darin, zuerst den ausgefallenen Computer aufzufordern, VIP freizugeben, und dann den neuen Hauptdatenbankcomputer zu kontaktieren, um VIP zuzuweisen. Was aber, wenn auf die ausgefallene Maschine selbst kein Zugriff möglich ist oder die Freigabe des VIP verweigert? In Anbetracht des Szenarios eines Maschinenausfalls reagiert die ausgefallene Maschine nicht sofort oder überhaupt nicht auf die Anforderung, VIP freizugeben. Der gesamte Prozess weist die folgenden zwei Probleme auf:
    • Split-Brain-Situation: Wenn zwei Hosts denselben VIP besitzen In diesem Fall stellen verschiedene Clients basierend auf der kürzesten Netzwerkverbindung eine Verbindung zu unterschiedlichen Hosts her.
    • Der gesamte VIP-Neuzuweisungsprozess hängt von der Koordination zweier unabhängiger Server ab und der Einrichtungsprozess ist unzuverlässig.
  • Selbst wenn die defekte Maschine das VIP normal freigibt, ist der gesamte Vorgang sehr zeitaufwändig, da für den Umschaltvorgang auch eine Verbindung zur defekten Maschine erforderlich ist.
  • Selbst wenn die VIP neu zugewiesen wird, werden die bestehenden Verbindungen des Clients nicht automatisch von der alten ausgefallenen Maschine getrennt, was zu einer Split-Brain-Situation im gesamten System führt.

Wenn wir den VIP tatsächlich einrichten, ist der VIP auch an den tatsächlichen physischen Standort gebunden. Dies hängt hauptsächlich davon ab, wo sich der Switch oder Router befindet. Daher können wir die VIP nur auf demselben lokalen Server neu zuweisen. Insbesondere gibt es Fälle, in denen wir VIPs nicht Servern in anderen Rechenzentren zuweisen können und DNS-Änderungen vornehmen müssen.

  • Die Verbreitung von DNS-Änderungen dauert länger. Der Client speichert DNS-Namen zuerst mit der konfigurierten Zeit zwischen. Plattformübergreifendes Failover bedeutet mehr Ausfälle: Clients müssen mehr Zeit damit verbringen, den neuen Primärserver zu erkennen.

Diese Einschränkungen allein reichen aus, um uns dazu zu bewegen, neue Lösungen zu finden, aber hier sind die Dinge, die es zu beachten gilt:

  • Der Masterserver verwendet den pt-heartbeat-Dienst, um Zugriffs-Heartbeats selbst einzuspeisen zum Zweck der Latenzmessung und Drosselungskontrolle. Der Dienst muss auf dem neuen Primärserver gestartet werden. Wenn möglich, wird der Dienst des alten Primärservers beim Austausch des Primärservers heruntergefahren. pt-heartbeat 服务去自注入访问心跳,目的是延迟测量和节流控制。该服务必须在新的主服务器开始。如果可以,在更换主服务器的同时会关闭旧的主服务器这项服务。

  • 同样地,Pseudo-GTID 是由服务器自行管理的。它需要在新的主服务器开始,最好在旧的主服务器上停止。

  • 新的主服务器将设置为可写入。如果可以的话,旧的主服务器将设置为 read_only(只读)。

这些额外的步骤是导致总停机时间的一个因素,并引入了它们自己的故障和摩擦。

解决方案是有效的,GitHub 已经成功地进行了 MySQL 故障转移,但是我们希望 HA 在以下方面有所改进:

  • 与数据中心无关。
  • 容忍数据中心故障。
  • 删除不可靠的协作工作流。
  • 减少总停机时间。
  • 尽可能的,有无损的故障切换。

GitHub 的高可用解决方案:orchestrator ,Consul , GLB

新策略可以改进,解决或者优化上面提到的问题。现在高可用的组成如下:

  • orchestrator 执行检测和故障转移。如链接中描述的那样采用混合数据中心 orchestrator/raft 。
  • Hashicorp 的 Consul 作为服务发现。
  • GLB/HAProxy 作为客户端和写入节点之间的代理。 GLB 指导是开源的.
  • anycast 作为网络路由。

Lassen Sie uns darüber sprechen, wie GitHub MySQL hochverfügbar macht

新的结构移除了 VIP 和 DNS 。在引入更多的组件的同时,我们能够解藕这些组件,并且简化相关的任务,并易于利用可靠稳定的解决方案。详情如下。

正常过程

正常情况,应用通过 GLB/HAProxy 连接到写入节点。

应用感知不到 master 身份。之前,都是使用名称。例如 cluster1 的 master 是 mysql-writer-1.github.net。现在的结构中,这个名称被  anycast IP 取代。

通过 anycast,名称被相同的 IP 取代,但流量由客户端的位置来进行路由。特别的,当数据中心有 GLB 时,高可用负载均衡器部署在不同的盒子内。 通向 mysql-writer-1.github.net

🎜🎜In ähnlicher Weise wird Pseudo-GTID vom Server selbst verwaltet. Es muss auf dem neuen Master gestartet und vorzugsweise auf dem alten Master gestoppt werden. 🎜🎜🎜🎜Der neue Master wird so eingerichtet, dass er beschreibbar ist. Der alte Master wird nach Möglichkeit auf read_only gesetzt. 🎜🎜🎜🎜Diese zusätzlichen Schritte sind ein Faktor für die Gesamtausfallzeit und führen zu eigenen Störungen und Reibungen. 🎜🎜Die Lösung funktioniert, GitHub hat MySQL-Failover erfolgreich durchgeführt, aber wir möchten, dass HA in den folgenden Bereichen verbessert wird: 🎜🎜🎜Rechenzentrumsunabhängig. 🎜🎜Toleranz gegenüber Rechenzentrumsausfällen. 🎜🎜Entfernen Sie unzuverlässige Arbeitsabläufe bei der Zusammenarbeit. 🎜🎜Reduzieren Sie die Gesamtausfallzeit. 🎜🎜Wo immer möglich, sorgen Sie für einen verlustfreien Failover. 🎜🎜

GitHubs Hochverfügbarkeitslösungen: Orchestrator, Consul, GLB

🎜Neue Strategien können die oben genannten Probleme verbessern, lösen oder optimieren. Die aktuellen Hochverfügbarkeitskomponenten sind wie folgt: 🎜🎜🎜orchestrator führt Erkennung und Failover durch. Führen Sie ein Hybrid-Rechenzentrum ein, wie im Link orchestrator/raft beschrieben. a>. 🎜🎜Hashicorps Consul als Service Discovery. 🎜🎜GLB/HAProxy als Client und Schreibknoten zwischen Agenten . GLB Director ist Open Source.🎜🎜anycast als Netzwerk Router. 🎜🎜🎜Lassen Sie uns darüber sprechen, wie GitHub MySQL hochverfügbar macht🎜🎜 Die neue Struktur entfernt VIP und DNS. Wenn wir weitere Komponenten einführen, können wir diese entkoppeln, die damit verbundenen Aufgaben vereinfachen und die Nutzung einer zuverlässigen und stabilen Lösung erleichtern. Details weiter unten. 🎜

Normaler Prozess

🎜Unter normalen Umständen stellt die Anwendung über GLB/HAProxy eine Verbindung zum Schreibknoten her. 🎜🎜Die Anwendung kennt die Master-Identität nicht. Früher wurden Namen verwendet. Der Master von cluster1 ist beispielsweise mysql-writer-1.github.net. In der aktuellen Struktur wird dieser Name durch Anycast IP ersetzt. 🎜🎜Bei anycast wird der Name durch dieselbe IP ersetzt, der Datenverkehr wird jedoch über den Standort des Clients weitergeleitet. Insbesondere wenn das Rechenzentrum über GLB verfügt, wird der Hochverfügbarkeits-Load-Balancer in einer anderen Box bereitgestellt. Der Datenverkehr zu mysql-writer-1.github.net wird an den GLB-Cluster im lokalen Rechenzentrum weitergeleitet. Auf diese Weise werden alle Clients vom lokalen Proxy bedient. 🎜

Verwenden Sie GLB zusätzlich zu HAProxy. HAProxy verfügt über Schreibpools : einen für jeden MySQL-Cluster. Jeder Pool verfügt über einen Backend-Dienst: den Cluster-Masterknoten. Alle GLB/HAProxy-Boxen im Rechenzentrum verfügen über denselben Pool, was bedeutet, dass diese Pools denselben Backend-Diensten entsprechen. Wenn die Anwendung also erwartet, mysql-writer-1.github.net zu schreiben, ist es ihr egal, mit welchem ​​GLB-Dienst eine Verbindung hergestellt werden soll. Es führt zum eigentlichen Masterknoten cluster1. mysql-writer-1.github.net,不同关心连接哪个 GLB 服务。它会导向实际的 cluster1 master 节点。

就应用连接 GLB ,发现服务而言,不需要重新发现。GLB 负责全部流量导向正确的目的地。

GLB 是怎么知道哪些服务是后端,以及如何告知 GLB 变化的呢?

Discovery via Consul

Consul 以服务发现解决方案而闻名,也提供 DNS 服务。 然而,在我们的解决方案中,我们将其用作高度可用的键值 (KV) 存储。

在 Consul 的 KV 存储中,我们写入集群主节点的身份。 对于每个集群,都有一组 KV 条目指示集群的主设备 fqdn、端口、ipv4、ipv6。

每个 GLB/HAProxy 节点都运行 consul-template:一个监听 Consul 数据变化的服务(在我们的例子中:集群主数据的变化)。 consul-template 生成一个有效的配置文件,并且能够在配置更改时重新加载 HAProxy。

因此,每个 GLB/HAProxy 机器都会观察到 Consul 对 master 身份的更改,然后它会重新配置自己,将新的 master 设置为集群后端池中的单个实体,并重新加载以反映这些更改。

在 GitHub,我们在每个数据中心都有一个 Consul 设置,并且每个设置都是高度可用的。 但是,这些设置彼此独立。 它们不会在彼此之间复制,也不会共享任何数据。

Consul 如何获知变化,信息如何跨 DC 分发?

orchestrator/raft

我们运行一个 orchestrator/raft 设置: orchestrator 节点通过 raft 机制相互通信。 每个数据中心有一个或两个 orchestrator 节点。

orchestrator 负责故障检测和 MySQL 故障切换,以及将 master 的变更传达给 Consul 。 故障切换由单个 orchestrator/raft leader 节点操作,但是集群现在拥有新 master 的消息通过 raft 机制传播到所有 orchestrator 节点。

orchestrator 节点收到 master 变更的消息时,它们各自与本地 Consul 设置通信:它们各自调用 KV 写入。 具有多个 orchestrator 代理的 DC 将多次(相同)写入 Consul

把流程组合起来

在 master 崩溃的情况下:

  • orchestrator 节点检测故障.
  • orchestrator/raft leader 节点开始恢复,一个数据服务器被更新为 master 。
  • orchestrator/raft 公告所有 raft 子集群节点变更了 master 。
  • 每个 orchestrator/raft 成员收到一个 leader 节点 变更的通知。它们每个成员都把新的 master 更新到本地 Consul KV 存储中。
  • 每个 GLB/HAProxy 都运行了 consul-template,该模版观察 Consul KV 存储中的更改,并重新配置和重新加载 HAProxy。
  • 客户端流量被重定向到新的 master 。

每个组件都有明确的责任归属,整个设计既是解耦的,又是简化的。orchestrator 不知道负载平衡器。 Consul 不需要知道消息的来源。代理只关心 Consul

Soweit die Anwendung eine Verbindung zu GLB herstellt und den Dienst erkennt, ist keine erneute Erkennung erforderlich. GLB ist dafür verantwortlich, den gesamten Verkehr zum richtigen Ziel zu leiten.

Woher weiß GLB, welche Dienste Backends sind, und wie benachrichtigt es GLB über Änderungen?

  • Discovery über Consul
  • Consul ist bekannt für Service-Discovery-Lösungen und bietet auch DNS-Dienste an. In unserer Lösung verwenden wir es jedoch als hochverfügbaren Schlüsselwertspeicher (KV).
  • Im KV-Store von Consul schreiben wir die Identität des Cluster-Masterknotens. Für jeden Cluster gibt es eine Reihe von KV-Einträgen, die den Master-fqdn, Port, IPv4, IPv6 des Clusters angeben.

Jeder GLB/HAProxy-Knoten führt consul-template aus: einen Dienst, der Consul-Datenänderungen überwacht (In unserem Fall: Änderungen der Cluster-Stammdaten). consul-template generiert eine gültige Konfigurationsdatei und die Möglichkeit, HAProxy neu zu laden, wenn sich die Konfiguration ändert.

Daher beobachtet jede GLB/HAProxy-Maschine Consul-Änderungen an der Master-Identität, konfiguriert sich dann selbst neu, legt den neuen Master als einzelne Entität im Cluster-Backend-Pool fest und lädt neu, um diese Änderungen widerzuspiegeln.

Bei GitHub haben wir in jedem Rechenzentrum ein Consul-Setup und jedes Setup ist hochverfügbar. Diese Einstellungen sind jedoch unabhängig voneinander. Sie kopieren nicht untereinander und geben keine Daten weiter. 🎜🎜Wie erfährt Consul von Änderungen und wie werden Informationen über die DCs verteilt? 🎜

🎜orchestrator/raft🎜raft🎜-Mechanismus. Jedes Rechenzentrum verfügt über einen oder zwei Orchestrator-Knoten. 🎜🎜orchestrator ist für die Fehlererkennung und den MySQL-Failover sowie für die Übermittlung von Änderungen von 🎜master🎜 an 🎜Consul🎜 verantwortlich. Failover wird von einem einzelnen Orchestrator/Raft-Leiterknoten durchgeführt, aber die Nachricht, dass der Cluster jetzt einen neuen 🎜Master🎜 hat, wird über den an alle <code>Orchestrator-Knoten weitergegeben Raft-Mechanismus. 🎜🎜Wenn die Orchestrator-Knoten die Nachricht der 🎜Master🎜-Änderung empfangen, kommunizieren sie jeweils mit dem lokalen 🎜Consul🎜-Setup: Sie rufen jeweils KV write auf. Ein DC mit mehreren Orchestrator-Agenten schreibt mehrmals (identisch) an 🎜Consul🎜. 🎜

🎜Kombinieren Sie die Prozesse🎜🎜🎜Im Falle eines Master-Absturzes:🎜🎜🎜orchestrator Knotenerkennungsfehler.🎜🎜orchestrator/raft Der Der Leader-Knoten beginnt mit der Wiederherstellung und ein Datenserver wird zum Master aktualisiert. 🎜🎜orchestrator/raft gibt bekannt, dass alle raft-Subcluster-Knoten den Master gewechselt haben. 🎜🎜Jedes Orchestrator/Raft-Mitglied erhält eine Benachrichtigung über den Wechsel des Führungsknotens. Jedes ihrer Mitglieder aktualisiert den neuen Master im lokalen Consul KV-Store. 🎜🎜Jeder GLB/HAProxy führt consul-template aus, das Änderungen im Consul KV-Speicher beobachtet und HAProxy neu konfiguriert und lädt. 🎜🎜Der Client-Verkehr wird an den neuen Master umgeleitet. 🎜🎜🎜Jede Komponente hat eine klare Verantwortung und das gesamte Design ist sowohl entkoppelt als auch vereinfacht. orchestrator kennt keine Load Balancer. Consul muss die Quelle der Nachricht nicht kennen. Der Agent kümmert sich nur um Consul. Der Kunde kümmert sich nur um den Proxy. 🎜🎜Außerdem: 🎜🎜🎜Keine zu verbreitenden DNS-Änderungen🎜🎜Kein TTL. 🎜🎜Der Stream kooperiert nicht mit dem ausgefallenen Master, er wird weitgehend ignoriert. 🎜🎜🎜🎜Zusätzliche Details🎜🎜🎜Um Ihren Datenverkehr weiter zu schützen, haben wir Folgendes: 🎜

我们将在以下部分进一步解决问题并追求 HA 目标。

Orchestrator/RAFT 故障检测

orchestrator 使用 整体方法 来检测故障,因此非常可靠。我们没有观察到误报:我们没有过早的故障转移,因此不会遭受不必要的停机时间。

orchestrator/raft 进一步解决了完整的 DC 网络隔离(又名 DC 围栏)的情况。 DC 网络隔离可能会导致混乱:该 DC 内的服务器可以相互通信。是它们与其他 DC 网络隔离,还是其他 DC 被网络隔离?

orchestrator/raft 设置中,raft 领导节点是运行故障转移的节点。领导者是获得组中大多数人(法定人数)支持的节点。我们的协调器节点部署是这样的,没有一个数据中心占多数,任何 n-1 数据中心都可以。

在 DC 网络完全隔离的情况下,该 DC 中的 orchestrator 节点会与其他 DC 中的对等节点断开连接。因此,孤立 DC 中的 orchestrator 节点不能成为 raft 集群的领导者。如果任何这样的节点恰好是领导者,它就会下台。将从任何其他 DC 中分配新的领导者。该领导者将得到所有其他能够相互通信的 DC 的支持。

因此,发号施令的 orchestrator 节点将是网络隔离数据中心之外的节点。如果一个独立的 DC 中有一个主控,orchestrator 将启动故障转移,用其中一个可用 DC 中的服务器替换它。我们通过将决策委托给非隔离 DC 中的法定人数来缓解 DC 隔离。

更快的广而告之

通过更快地公布主要更改可以进一步减少总停机时间。如何实现这一点?

orchestrator 开始故障转移时,它观察可用于提升的服务器队列。理解复制规则并遵守提示和限制,它能够对最佳操作过程做出有根据的决策。

它可能认识到,一个可用于促销的服务器也是一个理想的候选人,例如:

  • 没有什么可以阻止服务器的升级 (用户可能已经暗示这样的服务器是首选的升级) ,以及
  • 预计服务器能够将其所有兄弟服务器作为副本。

在这种情况下, orchestrator

Mit hard-stop-after benötigen wir nicht einmal die Mitarbeit des Kunden, was Split-Brain-Situationen lindert. Es ist erwähnenswert, dass dies nicht geschlossen wird und einige Zeit vergeht, bis wir die alte Verbindung beenden. Aber ab einem gewissen Punkt fühlen wir uns wohl und erwarten keine bösen Überraschungen mehr.

Wir verlangen nicht unbedingt, dass der Konsul ständig in Bereitschaft ist. Tatsächlich benötigen wir es nur, um bei einem Failover verfügbar zu sein. Sollte Consul ausfallen, wird GLB mit den letzten bekannten Werten weiterarbeiten und keine drastischen Maßnahmen ergreifen.

GLB ist eingerichtet, um die Identität des neu beförderten Masters zu überprüfen. Ähnlich wie unser Kontextsensitiver MySQL-Pool

, wird sich auf dem Backend-Server befinden Überprüfen Sie, ob es sich tatsächlich um den Writer-Knoten handelt. Wenn wir die Identität des Masters in Consul löschen, werden leere Einträge problemlos ignoriert. Wenn wir versehentlich einen Nicht-Master-Namen in Consul schreiben, verweigert GLB die Aktualisierung und läuft im letzten bekannten Status weiter. In den folgenden Abschnitten werden wir uns weiter mit dem Problem befassen und HA-Ziele verfolgen.

Orchestrator/RAFT-Fehlererkennung

orchestrator Verwendet einen ganzheitlichen Ansatz 🎜 zur Fehlererkennung und ist daher sehr zuverlässig . Wir haben keine Fehlalarme beobachtet: Wir hatten keine vorzeitigen Failovers und mussten daher keine unnötigen Ausfallzeiten hinnehmen. 🎜🎜orchestrator/raft befasst sich außerdem mit dem Fall einer vollständigen DC-Netzwerkisolierung (auch DC-Zaunung genannt). Die Isolation des DC-Netzwerks kann zu Verwirrung führen: Server innerhalb dieses DC können miteinander kommunizieren. Sind sie Netzwerk von anderen DCs isoliert, oder sind andere DCs Netzwerk isoliert? 🎜🎜In einem Orchestrator/Raft-Setup ist der raft-Leiterknoten der Knoten, der das Failover ausführt. Der Anführer ist der Knoten, der die Unterstützung der Mehrheit (Quorum) der Gruppe hat. Die Bereitstellung unseres Koordinatorknotens ist so, dass kein einzelnes Rechenzentrum die Mehrheit hat, sondern alle n-1 Rechenzentren. 🎜🎜Wenn das DC-Netzwerk vollständig isoliert ist, wird der Orchestrator-Knoten im DC von den Peer-Knoten in anderen DCs getrennt. Daher kann der orchestrator-Knoten in einem verwaisten DC nicht zum Anführer des raft-Clusters werden. Wenn ein solcher Knoten zufällig der Anführer ist, tritt er zurück. Ein neuer Leiter wird von jedem anderen DC zugewiesen. Dieser Leiter wird von allen anderen DCs unterstützt, die miteinander kommunizieren können. 🎜🎜Daher ist der Orchestrator-Knoten, der die Befehle erteilt, ein Knoten außerhalb des Netzwerkisolations-Rechenzentrums. Wenn es in einem eigenständigen Domänencontroller einen Master gibt, initiiert orchestrator ein Failover und ersetzt ihn durch einen Server von einem der verfügbaren Domänencontroller. Wir mildern die DC-Isolation, indem wir Entscheidungen an ein Quorum in einem nicht isolierten DC delegieren. 🎜

🎜Schnellere Werbung🎜🎜🎜Kann die Gesamtausfallzeit weiter reduzieren, indem größere Änderungen schneller veröffentlicht werden. Wie erreicht man das? 🎜🎜Wenn orchestrator ein Failover startet, beobachtet es die Warteschlange der für die Hochstufung verfügbaren Server. Wenn Sie die Replikationsregeln verstehen und Tipps und Einschränkungen beachten, können Sie fundierte Entscheidungen über die beste Vorgehensweise treffen. 🎜🎜Es kann erkannt werden, dass ein zur Beförderung verfügbarer Server auch ein idealer Kandidat ist, zum Beispiel: 🎜🎜🎜Es gibt nichts, was dem Upgrade des Servers entgegensteht (der Benutzer hat möglicherweise angedeutet, dass ein solcher Server das bevorzugte Upgrade ist), und 🎜Von einem Server wird erwartet, dass er alle seine Geschwister als Replikate haben kann. 🎜In diesem Fall legt orchestrator den Server zunächst als beschreibbar fest und kündigt dann sofort die Heraufstufung des Servers an (in unserem Fall schreibt er an den Consul KV Store), auch wenn Da die Reparatur des Replikationsbaums asynchron beginnt, dauert dieser Vorgang normalerweise mehrere Sekunden. 🎜🎜Es ist wahrscheinlich, dass der Replikationsbaum intakt ist, bevor der GLB-Server vollständig neu geladen wird, dies ist jedoch nicht unbedingt erforderlich. Der Server ist sehr gut darin, Schreibvorgänge anzunehmen! 🎜🎜🎜Halbsynchrone Replikation🎜🎜🎜Bei der 🎜halbsynchronen Replikation🎜 von MySQL bestätigt der Master-Server Transaktions-Commits erst dann, wenn bekannt ist, dass die Änderungen an ein oder mehrere Replikate gesendet wurden. Es bietet eine Möglichkeit, ein verlustfreies Failover zu erreichen: Alle am Primärserver vorgenommenen Änderungen werden entweder auf den Primärserver angewendet oder warten darauf, auf eines der Replikate angewendet zu werden. 🎜

Konsistenz hat ihren Preis: das Risiko der Verfügbarkeit. Wenn kein Replikat den Empfang der Änderungen bestätigt, blockiert der Master und stoppt den Schreibvorgang. Glücklicherweise gibt es eine Timeout-Konfiguration, nach deren Ablauf der Master in den asynchronen Replikationsmodus zurückkehren kann, sodass Schreibvorgänge wieder verfügbar sind.

Wir haben das Timeout auf einen relativ niedrigen Wert eingestellt: 500ms. Es reicht aus, Änderungen vom Master-DC-Replikat an das lokale DC-Replikat und auch an den Remote-DC zu senden. Mit dieser Zeitüberschreitung können wir ein perfektes halbsynchrones Verhalten beobachten (kein Rückgriff auf die asynchrone Replikation) und im Falle eines Bestätigungsfehlers problemlos sehr kurze Blockierungsperioden verwenden. 500ms。将更改从主 DC 副本发送到本地 DC 副本,通常也发送到远程 DC,这已经足够了。通过这个超时,我们可以观察到完美的半同步行为 (没有退回到异步复制) ,并且在确认失败的情况下可以很轻松地使用非常短的阻塞周期。

我们在本地 DC 副本上启用半同步,在主服务器死亡的情况下,我们期望 (尽管不严格执行) 无损故障转移。完全直流故障的无损故障转移是昂贵的,我们并不期望它。

在尝试半同步超时的同时,我们还观察到了一个对我们有利的行为:在主要失败的情况下,我们能够影响理想候选对象的身份。通过在指定的服务器上启用半同步,并将它们标记为候选服务器,我们能够通过影响故障的结果来减少总停机时间。在我们的实验中,我们观察到我们通常最终会得到理想的候选对象,从而快速地广而告之。

注入心跳

我们没有在升级 / 降级的主机上管理 pt-heart 服务的启动 / 关闭,而是选择在任何时候在任何地方运行它。这需要进行一些修补,以便使 pt-heart 能够适应服务器来回更改 read_only(只读状态) 或完全崩溃的情况。

在我们当前的设置中,pt-heart 服务在主服务器和副本上运行。在主机上,它们生成心跳事件。在副本上,他们识别服务器是 read_only(只读) 的,并定期重新检查它们的状态。一旦服务器被提升为主服务器,该服务器上的 pt-heart 就会将服务器标识为可写的,并开始注入心跳事件。

orchestrator 所有权委托

我们进一步 orchestrator:

  • 注入 Pseudo-GTID ,
  • 将提升的 master 设置为可写,清除其复制状态,以及,
  • 如果可能,将旧主服务器设置为 read_only

在所有的新 master 的基础上,这减少了摩擦。一个刚刚被提升的 master 显然应该是有生命力,并且可以被接受的,否则我们不会提升它。因此,让 orchestrator 直接讲更改应用于提升的 msater 是有意义的。

orchestrator 所有权委托

我们进一步 orchestrator:

  • Pseudo-GTID 注入,
  • 将提升的 master 设置为可写,清除其复制状态,以及,
  • 如果可能,将旧的 master 设置为 read_only

在所有的新 master 的基础上,这减少了摩擦。一个刚刚被提升的 master 显然应该是有活力,并且可以被接受的,否则我们不会提升它。因此,让 orchestrator

Wir aktivieren die Halbsynchronisierung auf dem lokalen DC-Replikat und im Falle des Ausfalls des Masters erwarten wir ein verlustfreies Failover (obwohl wir es nicht unbedingt erzwingen). Ein verlustfreies Failover eines kompletten DC-Fehlers ist teuer und wird auch nicht erwartet.

Beim Experimentieren mit semisynchronen Timeouts haben wir auch ein Verhalten beobachtet, das sich zu unseren Gunsten auswirkte: Im Falle eines primären Scheiterns konnten wir die Identität des idealen Kandidaten beeinflussen. Indem wir die Halbsynchronisierung auf bestimmten Servern aktivieren und diese als Kandidatenserver markieren, können wir die Gesamtausfallzeit reduzieren, indem wir das Ergebnis eines Ausfalls beeinflussen. In unseren Experimenten haben wir beobachtet, dass wir am Ende normalerweiseideale Kandidatenum die Nachricht schnell zu verbreiten.

Inject Heartbeat

Wir verwalten das Starten/Herunterfahren des pt-heart-Dienstes nicht auf dem hochgestuften/herabgestuften Host, sondern entscheiden uns dafür, dies an einem beliebigen Ort zu tun jederzeit ausführen. Dies erfordert einige Patches

, um pt-heart zu aktivieren. Passt auf Situationen auf, in denen Der Server wechselt hin und her in den Status read_only (schreibgeschützt) oder stürzt komplett ab. In unserem aktuellen Setup läuft der pt-heart-Dienst auf dem Master und den Replikaten. Auf dem Host generieren sie Heartbeat-Ereignisse. Auf Replikaten identifizieren sie Server als read_only und überprüfen regelmäßig ihren Status. Sobald ein Server zum Master befördert wird, identifiziert pt-heart auf diesem Server den Server als beschreibbar und beginnt mit der Injektion von Heartbeat-Ereignissen.

Orchestrator-Eigentumsdelegation

【Verwandte Empfehlungen: MySQL-Video-Tutorial

】🎜

Das obige ist der detaillierte Inhalt vonLassen Sie uns darüber sprechen, wie GitHub MySQL hochverfügbar macht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen