Github는 git
이 아닌 모든 트랜잭션의 데이터 저장소로 MySQL 데이터베이스를 사용합니다. 데이터베이스 가용성은 Github가 제대로 작동하는 데 매우 중요합니다. Github 웹사이트 자체, Github API, 인증 서비스 등 모두 데이터베이스에 액세스해야 합니다. Github는 다양한 서비스 작업을 지원하기 위해 여러 데이터베이스 클러스터를 실행합니다. 데이터베이스 아키텍처는 전통적인 마스터-슬레이브 구조를 채택합니다. 클러스터의 한 노드(마스터 데이터베이스)는 쓰기 액세스를 지원하고 나머지 노드(슬레이브 데이터베이스)는 변경 사항을 마스터 데이터베이스에 동기화하고 읽기 서비스를 지원합니다. git
事务的数据存储。数据库的可用性对 Github 的正常运行而言至关重要。无论是 Github 网站本身,还是 Github API,身份验证服务等都需要访问数据库。Github 运行了多个数据库集群用于支撑不同的服务于任务。数据库的架构采用的是传统的主从结构,集群中一个节点(主库)支持写访问,其余的节点(从库)同步主库的变更,支持读服务。
主库的可用性至关重要。一旦主库宕机,集群将不能够支持数据写入服务:任何需要保存的数据都无法写入到数据库保存。最终导致 Github 上任何变更,例如代码提交,提问,用户创建,代码 review,创建仓库等操作都无法完成。
为了保证业务的正常运行,我们自然需要在集群中有一个可用的支持写入的数据库节点。同时,我们也必须能够快速的发现可用的可写入服务数据库节点。
就是说,在异常情况下,假如主库宕机的场景,我们必须确保新的主库能够立刻上线支持服务,同时保证集群中其他节点能够快速识别到新的主库。故障检测,主库迁移以及集群其他数据节点识别新主库的总时间构成了服务中断的总时间。
这篇文章说明了 GitHub 的 MySQL 高可用性和主库服务发现解决方案,该解决方案使我们能够可靠地运行跨数据中心的操作,能够容忍数据中心的隔离,并缩短在出现故障时停机时间。
本篇文章描述的解决方案是在以前 Github 高可用方案上的改进版本。正如前面说到的一样,MySQL 的高可用策略必须适应业务的变化。我们期望 MySQL 以及 GitHub 上其他的服务都有能够应对变化的高可用解决方案。
当设计高可用以及服务发现系统方案的时候,从下面几个问题出发,也许能够帮助我们快速找到合适的解决方案:
为了说明上面的几个问题,我们先来看一下我们之前的高可用方案,以及我们为什么要改进它。
在之前的方案中,应用了下面的技术方案:
客户端通过节点名称,例如 mysql-writer-1.github.net
,解析成主节点的虚拟 IP 地址 (VIP),从而找到主节点。
因此,正常情况下,客户端可以通过对节点名称的解析,连接到对应 IP 的主节点上。
考虑夸三个数据中心的拓扑结构的情况:
一旦主库异常,必须将其中的一个数据副本服务器更新为主库服务器。
orchestrator
메인 라이브러리의 가용성이 중요합니다. 기본 데이터베이스가 다운되면 클러스터는 데이터 쓰기 서비스를 지원할 수 없습니다. 저장해야 하는 데이터는 저장을 위해 데이터베이스에 쓸 수 없습니다. 결과적으로 코드 제출, 질문, 사용자 생성, 코드 검토, 웨어하우스 생성 등과 같은 Github의 모든 변경 사항을 완료할 수 없습니다.
mysql-writer-1.github.net
과 같은 노드 이름을 가상 IP 주소(VIP)로 구문 분석하여 마스터 노드를 찾습니다. 마스터 노드. 🎜🎜따라서 일반적인 상황에서 클라이언트는 노드 이름을 파싱하여 해당 IP의 마스터 노드에 연결할 수 있습니다. 🎜🎜3개 데이터 센터의 토폴로지를 자랑하는 상황을 생각해 보세요: 🎜🎜🎜🎜메인 데이터베이스에 이상이 생기면 데이터 복제 서버 중 하나를 메인 데이터베이스 서버로 업데이트해야 합니다. 🎜🎜조정자
는 이상 현상을 감지하고 새 마스터 데이터베이스를 선택한 다음 데이터베이스 이름과 가상 IP(VIP)를 다시 할당합니다. 클라이언트 자체는 메인 라이브러리의 변경 사항을 알지 못합니다. 클라이언트가 가지고 있는 정보는 메인 라이브러리의 🎜이름🎜뿐이므로 이 이름은 새 메인 라이브러리 서버에서 확인할 수 있어야 합니다. 다음을 고려하십시오. 🎜🎜VIP 협상이 필요합니다. 가상 IP는 데이터베이스 자체에서 보유합니다. 서버는 VIP를 점유하거나 해제하기 위해 ARP 요청을 보내야 합니다. 새 데이터베이스가 새 VIP를 할당하려면 먼저 기존 서버가 보유하고 있는 VIP를 해제해야 합니다. 이 프로세스는 몇 가지 특이한 문제를 일으킬 수 있습니다:🎜실제로 VIP를 설정할 때 VIP도 실제 물리적 위치에 구속됩니다. 이는 주로 스위치나 라우터의 위치에 따라 다릅니다. 따라서 동일한 로컬 서버에서만 VIP를 재할당할 수 있습니다. 특히, 다른 데이터센터의 서버에 VIP를 할당할 수 없어 DNS를 변경해야 하는 경우도 있습니다.
이러한 제한만으로도 새로운 솔루션을 찾을 수 있지만 고려해야 할 사항은 다음과 같습니다.
마스터 서버는 pt-heartbeat
서비스를 사용하여 액세스 하트비트를 자체 주입합니다. 지연 시간 측정 및 제한 제어를 목적으로 합니다. 서비스는 새 기본 서버에서 시작되어야 합니다. 가능한 경우, 주 서버가 교체되면 기존 주 서버의 서비스가 종료됩니다. 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
로 설정됩니다. 🎜🎜🎜🎜이러한 추가 단계는 전체 가동 중지 시간의 요인이 되며 자체적인 결함과 마찰을 초래합니다. 🎜🎜솔루션이 작동하고 GitHub는 MySQL 장애 조치를 성공적으로 수행했지만 HA가 다음 영역에서 개선되기를 바랍니다. 🎜🎜🎜데이터 센터에 구애받지 않습니다. 🎜🎜데이터 센터 오류에 대한 내성이 있습니다. 🎜🎜신뢰할 수 없는 공동작업 워크플로우를 제거하세요. 🎜🎜전체 가동 중지 시간을 줄입니다. 🎜🎜가능한 경우 무손실 장애 조치를 수행하세요. 🎜🎜anycast
는 네트워크입니다. 라우터. 🎜🎜🎜🎜🎜 새로운 구조에서는 VIP와 DNS가 제거됩니다. 더 많은 구성 요소를 도입함에 따라 구성 요소를 분리하고 관련 작업을 단순화하며 안정적이고 안정적인 솔루션을 더 쉽게 활용할 수 있습니다. 자세한 내용은 아래를 참조하세요. 🎜cluster1
의 마스터는 mysql-writer-1.github.net
입니다. 현재 구조에서는 이 이름이 anycast IP로 대체됩니다. 🎜🎜anycast
를 사용하면 이름은 동일한 IP로 대체되지만 트래픽은 클라이언트 위치에 따라 라우팅됩니다. 특히 데이터센터에 GLB가 있는 경우 고가용성 로드밸런서는 다른 박스에 배치된다. mysql-writer-1.github.net
에 대한 트래픽은 로컬 데이터 센터의 GLB 클러스터로 전달됩니다. 이렇게 하면 모든 클라이언트가 로컬 프록시에 의해 서비스됩니다. 🎜HAProxy 위에 GLB를 사용하세요. HAProxy에는 모든 MySQL 클러스터에 하나씩 쓰기 풀 이 있습니다. 각 풀에는 백엔드 서비스인 클러스터 마스터 노드가 있습니다. 데이터 센터의 모든 GLB/HAProxy 상자에는 동일한 풀이 있습니다. 이는 이러한 풀이 동일한 백엔드 서비스에 해당함을 의미합니다. 따라서 애플리케이션이 mysql-writer-1.github.net
을 작성할 것으로 예상하는 경우 어떤 GLB 서비스에 연결할지는 상관하지 않습니다. 실제 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
, 포트, ipv4, ipv6을 나타내는 KV 항목 집합이 있습니다. consul-template
은 유효한 구성 파일을 생성하고 구성이 변경되면 HAProxy를 다시 로드하는 기능을 생성합니다.
조정자
노드가 있습니다. 🎜🎜조정자
는 오류 감지 및 MySQL 장애 조치뿐 아니라 🎜master🎜에서 🎜Consul🎜로 변경 사항을 전달하는 역할도 담당합니다. 장애 조치는 단일 orchestrator/raft
리더 노드에 의해 작동되지만 클러스터에 이제 새로운 🎜master🎜가 있다는 메시지는 를 통해 모든 <code>orchestrator
노드에 전파됩니다. 뗏목 메커니즘 . 🎜🎜 Orchestrator
노드가 🎜master🎜 변경 메시지를 받으면 각각 로컬 🎜Consul🎜 설정과 통신합니다. 각각 KV write를 호출합니다. 여러 조정자
에이전트가 있는 DC는 🎜Consul🎜에 여러 번 (동일한) 쓰기를 수행합니다. 🎜orchestrator
노드 감지 실패.🎜🎜orchestrator/raft
리더 노드가 복구되기 시작하고 데이터 서버가 마스터로 업데이트됩니다. 🎜🎜orchestrator/raft
는 모든 raft
하위 클러스터 노드가 마스터를 변경했음을 알립니다. 🎜🎜각 오케스트레이터/뗏목
구성원은 리더 노드 변경 알림을 받습니다. 각 구성원은 새 마스터를 로컬 Consul
KV 스토어로 업데이트합니다. 🎜🎜각 GLB/HAProxy는 Consul
KV 저장소의 변경 사항을 관찰하고 HAProxy를 재구성하고 다시 로드하는 consul-template
을 실행합니다. 🎜🎜클라이언트 트래픽이 새 마스터로 리디렉션됩니다. 🎜🎜🎜각 구성 요소에는 명확한 책임이 있으며 전체 디자인은 분리되어 단순화되었습니다. 조정자
는 로드 밸런서를 인식하지 못합니다. Consul
은 메시지의 출처를 알 필요가 없습니다. 상담원은 Consul
에만 관심이 있습니다. 클라이언트는 프록시에만 관심이 있습니다. 🎜🎜또한: 🎜🎜🎜전파할 DNS 변경 사항이 없습니다.🎜🎜TTL이 없습니다. 🎜🎜스트림은 실패한 마스터와 협력하지 않으며 대부분 무시됩니다. 🎜🎜🎜🎜추가 세부정보🎜🎜🎜귀하의 트래픽을 더욱 보호하기 위해 다음과 같은 조치를 취하고 있습니다. 🎜hard-stop-after
로 구성됩니다. 작가 풀에서 새 백엔드 서버를 다시 로드하면 이전 마스터 서버에 대한 기존 연결이 자동으로 종료됩니다. 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
를 사용하면 고객의 협조도 필요하지 않아 두뇌 분할 상황이 완화됩니다. 이것이 닫히지 않았으며 이전 연결을 종료하기까지 약간의 시간이 걸린다는 점은 주목할 가치가 있습니다. 그러나 어느 시점이 지나면 우리는 편안함을 느끼고 불쾌한 놀라움을 기대하지 않습니다. Consul이 항상 대기할 것을 엄격하게 요구하지는 않습니다. 실제로 장애 조치 시에만 사용할 수 있어야 합니다. Consul이 실패하면 GLB는 마지막으로 알려진 값을 사용하여 계속 작동하며 과감한 조치를 취하지 않습니다.
GLB는 새로 승격된 마스터의 신원을 확인하기 위해 설정되었습니다. 컨텍스트 인식 MySQL 풀오케스트레이터
전체적인 접근 방식 🎜을 사용하여 오류를 감지하므로 매우 안정적입니다. . 우리는 거짓양성(false positive)을 관찰하지 못했습니다. 조기 장애 조치가 없었으므로 불필요한 가동 중지 시간이 발생하지 않았습니다. 🎜🎜orchestrator/raft
는 완전한 DC 네트워크 격리(DC 펜싱이라고도 함)의 경우를 추가로 다룹니다. DC 네트워크 격리는 혼란을 초래할 수 있습니다. 해당 DC 내의 서버는 서로 통신할 수 있습니다. 다른 DC는 네트워크가 다른 DC와 격리되어 있나요, 아니면 다른 DC는 네트워크가 격리되어 있나요? 🎜🎜orchestrator/raft
설정에서 raft
리더 노드는 장애 조치를 실행하는 노드입니다. 리더는 그룹의 다수(정족수)의 지원을 받는 노드입니다. 우리의 코디네이터 노드 배포는 어떤 데이터 센터도 과반수를 갖지 않으며 모든 n-1 데이터 센터가 과반수를 차지합니다. 🎜🎜DC 네트워크가 완전히 격리되면 DC의 Orchestrator
노드와 다른 DC의 피어 노드와의 연결이 끊어집니다. 따라서 고아 DC의 조정자
노드는 raft
클러스터의 리더가 될 수 없습니다. 그러한 노드가 리더가 되면 그 노드는 물러납니다. 새로운 리더는 다른 DC에서 할당됩니다. 이 리더는 서로 통신할 수 있는 다른 모든 DC의 지원을 받습니다. 🎜🎜따라서 명령을 내리는 조정자
노드는 네트워크 격리 데이터 센터 외부의 노드가 됩니다. 독립형 DC에 마스터가 있는 경우 조정자
는 장애 조치를 시작하고 이를 사용 가능한 DC 중 하나의 서버로 교체합니다. 격리되지 않은 DC의 쿼럼에 결정을 위임하여 DC 격리를 완화합니다. 🎜Orchestrator
는 장애 조치를 시작할 때 승격할 수 있는 서버의 대기열을 관찰합니다. 복제 규칙을 이해하고 팁과 제한 사항을 준수하면 최선의 조치에 대해 현명한 결정을 내릴 수 있습니다. 🎜🎜프로모션 가능한 서버도 이상적인 후보라고 인식될 수 있습니다. 예: 🎜🎜🎜서버 업그레이드를 막을 수 있는 것은 없습니다(사용자는 이러한 서버가 선호되는 업그레이드라고 암시했을 수 있음). 그리고 🎜서버는 모든 형제 서버를 복제본으로 가질 수 있을 것으로 예상됩니다. 🎜이 경우 Orchestrator
는 먼저 서버를 쓰기 가능으로 설정한 다음 즉시 서버 프로모션을 광고합니다(우리의 경우 Consul KV 스토어에 쓰기). 복제 트리 복구는 비동기적으로 시작됩니다. 이 작업은 일반적으로 몇 초 정도 걸립니다. 🎜🎜GLB 서버가 완전히 다시 로드되기 전에 복제 트리가 그대로 유지될 가능성이 높지만 반드시 필요한 것은 아닙니다. 서버는 쓰기를 매우 잘 받아들입니다! 🎜🎜🎜반동기 복제🎜🎜🎜MySQL의 🎜반동기 복제🎜에서 마스터 서버는 변경 사항이 하나 이상의 복제본으로 전송된 것으로 확인될 때까지 트랜잭션 커밋을 승인하지 않습니다. 이는 무손실 장애 조치를 달성하는 방법을 제공합니다. 기본 서버에 적용된 모든 변경 사항은 기본 서버에 적용되거나 복제본 중 하나에 적용될 때까지 기다립니다. 🎜일관성에는 비용이 발생합니다. 가용성 위험이 있습니다. 복제본이 변경 사항 수신을 확인하지 않으면 마스터는 쓰기를 차단하고 중지합니다. 다행스럽게도 마스터가 비동기 복제 모드로 되돌아가서 쓰기를 다시 사용할 수 있게 해주는 시간 초과 구성이 있습니다.
시간 초과를 합리적으로 낮은 값인 500ms
로 설정했습니다. 마스터 DC 복제본의 변경 내용을 로컬 DC 복제본과 원격 DC로 보내는 것으로 충분합니다. 이 시간 제한을 사용하면 완벽한 반동기 동작(비동기 복제로 대체 없음)을 관찰할 수 있으며 승인 실패 시 매우 짧은 차단 기간을 쉽게 사용할 수 있습니다. 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
우리는 업그레이드/다운그레이드된 호스트에서pt-heart
서비스의 시작/종료를 관리하지 않지만 어디에서나 수행하도록 선택합니다. 언제든지 실행하세요. pt-heart가 상황에 적응할 수 있도록 하려면 일부 패치 가 필요합니다. 서버가 read_only
(읽기 전용 상태)로 앞뒤로 변경되거나 완전히 충돌하는 경우. 현재 설정에서는 pt-heart
서비스가 마스터와 복제본에서 실행됩니다. 호스트에서는 하트비트 이벤트를 생성합니다. 복제본에서는 서버를 read_only
로 식별하고 주기적으로 상태를 다시 확인합니다. 서버가 마스터로 승격되면 해당 서버의 pt-heart
는 서버를 쓰기 가능한 것으로 식별하고 하트비트 이벤트 주입을 시작합니다.
오케스트레이터 소유권 위임
위 내용은 GitHub가 MySQL의 가용성을 높이는 방법에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!