Heim >Datenbank >MySQL-Tutorial >Lassen Sie uns darüber sprechen, wie GitHub die hohe Verfügbarkeit von MySQL erreicht
Wie erreicht GitHub eine hohe Verfügbarkeit für MySQL? Ich werde den folgenden Artikel mit Ihnen teilen und hoffe, dass er für alle hilfreich ist.
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 verbleibenden 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 上其他的服务都有能够应对变化的高可用解决方案。
当设计高可用以及服务发现系统方案的时候,从下面几个问题出发,也许能够帮助我们快速找到合适的解决方案:
为了说明上面的几个问题,我们先来看一下我们之前的高可用方案,以及我们为什么要改进它。
在之前的方案中,应用了下面的技术方案:
客户端通过节点名称,例如 mysql-writer-1.github.net
,解析成主节点的虚拟 IP 地址 (VIP),从而找到主节点。
因此,正常情况下,客户端可以通过对节点名称的解析,连接到对应 IP 的主节点上。
考虑夸三个数据中心的拓扑结构的情况:
一旦主库异常,必须将其中的一个数据副本服务器更新为主库服务器。
orchestrator
Die 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.
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: 🎜🎜🎜🎜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:🎜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.
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 在以下方面有所改进:
新策略可以改进,解决或者优化上面提到的问题。现在高可用的组成如下:
anycast
作为网络路由。新的结构移除了 VIP 和 DNS 。在引入更多的组件的同时,我们能够解藕这些组件,并且简化相关的任务,并易于利用可靠稳定的解决方案。详情如下。
正常情况,应用通过 GLB/HAProxy 连接到写入节点。
应用感知不到 master 身份。之前,都是使用名称。例如 cluster1
的 master 是 mysql-writer-1.github.net
。现在的结构中,这个名称被 anycast IP 取代。
通过 anycast
,名称被相同的 IP 取代,但流量由客户端的位置来进行路由。特别的,当数据中心有 GLB 时,高可用负载均衡器部署在不同的盒子内。 通向 mysql-writer-1.github.net
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. 🎜🎜anycast
als Netzwerk Router. 🎜🎜🎜🎜🎜 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. 🎜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 变化的呢?
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
节点。
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 存储中。consul-template
,该模版观察 Consul
KV 存储中的更改,并重新配置和重新加载 HAProxy。每个组件都有明确的责任归属,整个设计既是解耦的,又是简化的。orchestrator
不知道负载平衡器。 Consul
不需要知道消息的来源。代理只关心 Consul
fqdn
, Port, IPv4, IPv6 des Clusters angeben. consul-template
generiert eine gültige Konfigurationsdatei und die Möglichkeit, HAProxy neu zu laden, wenn sich die Konfiguration ändert.
orchestrator/raft
-Setup aus: orchestrator
-Knoten über raft🎜 Mechanismen kommunizieren miteinander. 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🎜. 🎜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: 🎜Hard-Stop-After
konfiguriert. Wenn der neue Backend-Server im Writer-Pool neu geladen wird, werden alle bestehenden Verbindungen zum alten Master-Server automatisch beendet. hard-stop-after
。当它重新加载写入器池中的新后端服务器时,它会自动终止与旧主服务器的任何现有连接。hard-stop-after
,我们甚至不需要客户的合作,这减轻了脑裂的情况。值得注意的是,这不是封闭的,并且在我们终止旧连接之前一段时间过去了。但是在某个时间点之后,我们会感到很舒服,并且不会期待任何令人讨厌的惊喜。我们将在以下部分进一步解决问题并追求 HA 目标。
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
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-Poolorchestrator
mit Ganzheitlicher Ansatz
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. 🎜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:
read_only
。在所有的新 master 的基础上,这减少了摩擦。一个刚刚被提升的 master 显然应该是有生命力,并且可以被接受的,否则我们不会提升它。因此,让 orchestrator
直接讲更改应用于提升的 msater 是有意义的。
我们进一步 orchestrator:
read_only
。在所有的新 master 的基础上,这减少了摩擦。一个刚刚被提升的 master 显然应该是有活力,并且可以被接受的,否则我们不会提升它。因此,让 orchestrator
Inject Heartbeat
Wir verwalten das Starten/Herunterfahren despt-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
read_only
. Orchestrator
direkt über die Änderung des MSATERS sprechen zu lassen, der auf den Boost angewendet werden soll.
read_only
. Orchestrator
die Änderungen direkt auf den hochgestuften MSATER anwendet. 🎜🎜🎜Einschränkungen und Nachteile🎜🎜🎜Die Proxy-Schicht macht die Identität des Master-Servers für die Anwendung unbekannt, maskiert aber auch die Identität des Master-Servers für die Anwendung. Zu sehen ist in erster Linie nur die Verbindung, die von der Proxy-Schicht kommt, und wir verlieren Informationen über den tatsächlichen Ursprung der Verbindung. 🎜🎜Bei der Entwicklung verteilter Systeme sind wir immer noch mit ungelösten Szenarien konfrontiert. 🎜🎜Es ist erwähnenswert, dass in einem isolierten Rechenzentrumsszenario, vorausgesetzt, der Primärserver befindet sich in einem isolierten Domänencontroller, Anwendungen in diesem Domänencontroller immer noch in der Lage sind, auf den Primärserver zu schreiben. Dies kann zu einem inkonsistenten Zustand führen, sobald das Netzwerk wiederhergestellt ist. Wir arbeiten daran, diese Spaltung des Gehirns zu mildern, indem wir einen zuverlässigen 🎜STONITH🎜 implementieren, der vom Inneren des DC stark isoliert ist. Wie zuvor wird es eine Weile dauern, bis die Vorwahlen zerstört sind, und es kann zu einer kurzen Phase der Gehirnspaltung kommen. Die operativen Kosten zur Vermeidung von Brain Splitting sind sehr hoch. 🎜🎜Es gibt noch viele weitere Fälle: Stoppen des Consul-Dienstes bei Failover; andere Fälle. Wir wissen, dass es unmöglich ist, alle Schwachstellen in einem verteilten System dieser Art zu schließen, deshalb konzentrieren wir uns auf die wichtigsten Fälle. 🎜🎜🎜Fazit🎜🎜🎜Unser Koordinator/GLB/Konsul hat uns Folgendes zur Verfügung gestellt:🎜10 und 13 Sekunden
. 10 and 13 seconds
之间。20 seconds
的总停机时间,在极端情况下则可以看到最多 25 seconds
20 Sekunden
und in extremen Fällen eine Ausfallzeit von bis zu 25 Sekunden
feststellen. Originaladresse: https://github.blog/2018-06-20-mysql-high-availability-at-github/Übersetzungsadresse: https://learnku.com/mysql/t/36820
【Verwandte Empfehlungen: MySQL-Video-Tutorial
】🎜Das obige ist der detaillierte Inhalt vonLassen Sie uns darüber sprechen, wie GitHub die hohe Verfügbarkeit von MySQL erreicht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!