MariaDB Galera Cluster

Galera Cluster 架构

三个MySQL实例是对等的,互为主从,这被称为多主(multi-master)架构

MariaDB Galera 集群是 MariaDB 的一个实际上同步的多主集群。它只能在 Linux 上使用,并且只支持 InnoDB 存储引擎, 由wsrep插件和MariaDB server组成

当客户端读写数据时,可连接任一MySQL实例

  • 对于读操作,从每个节点读取到的数据都是相同的。
  • 对于写操作,当数据写入某一节点后,集群会将其同步到其它节点。
  • 这种架构不共享任何数据,是一种高冗余架构

特性

  • 多主架构:真正的多主多活群集,可随时对任何节点进行读写。
  • 同步复制:集群不同节点之间数据同步,某节点崩溃时没有数据丢失
  • 数据一致:所有节点保持相同状态,节点之间无数据分歧
  • 并行复制:重放支持多线程并行执行以获得更好的性能。
  • 自动控制,故障节点从集群中删除
  • 自动节点连接
  • 在行级别上进行真正的并行复制

Galera复制

同步复制 VS 异步复制

"同步"复制保证,如果在集群中的一个节点上发生了更改,那么更改将"同步"或同时发生在集群中的其他节点上

  • 同步复制协议通常使用两阶段提交或分布式锁协调不同节点的操作 会存在性能的问题

"异步"复制不能保证在"主"节点上应用更改和将更改传播到"从"节点之间的延迟。

  • 如果主节点在"异步"复制拓扑中崩溃,那么可能会丢失一些最新的更改

Galera复制

  • 组通信(Group Communication):定义了数据库节点间的通信模式,保证复制数据的一致性
  • 写集(Write-sets):将多个并发数据库写操作更新的数据,绑定到单个写集消息中,提高节点并行性
  • 数据库状态机:数据库站点本地处理只读事务。更新事务首先在本地的"影子拷贝(shallow copies)"上执行,然后作为读集广播到其它数据库站点进行验证并提交
  • 事务重排序:此操作在数据库提交事务并将其广播到其它站点之前重新排序事务,增加成功通过验证的事务数

同步复制比异步复制有许多优点

  • 利用同步复制的集群始终是高可用的。如果其中一个节点崩溃了,那么就不会有数据丢失。此外,所有集群节点始终保持一致
  • 利用同步复制的集群允许在所有节点上并行执行事务

同步 异步 半同步复制?

内部架构

Galera集群的内部架构包含四个组件:

  • 数据库管理系统(DBMS):在单个节点上运行的数据库服务器。Galera群集可以使用MySQL、Mariadb或Percona xtradb
  • wsrep api:Galera与数据库服务器的接口,为上层提供了丰富的状态信息和回调函数。
    • wsrep api由wsrep hooks、dlopen函数两部分组成。
    • wsrep hooks钩子程序用于与数据库服务器引擎集成。
    • dlopen函数使Galera插件中的复制程序对wsrep hooks可用
  • Galera复制插件:实现写集复制功能的核心模块
  • 组通信插件:Galera集群的组通信系统(Group Communication System,GCS),如GComm

wsrep api

wsrep api是数据库的通用复制插件接口,定义了一组应用程序回调和复制插件调用函数

工作流:

  1. 一个节点的数据库中发生状态更改。
  2. wsrep钩子将更改转换为写集。
  3. dlopen函数连接wsrep钩子与Galera复制插件。
  4. Galera复制插件处理写集验证,并将更改复制到集群中的其它节点

Generic Replication Library

Galera 复制功能是作为一个共享库实现的

Generic Replication Library 是一个协议栈,提供准备、复制和应用事务写集的功能

  • wsrep API DBMS和复制提供程序的职责
  • wsrep hooks
  • replication 复制管理复制协议并提供总排序功能
  • GCS framework GCS 框架为组通信系统提供了插件体系结构

全局事务ID(global transaction id,GTID)

  • MySQL社区中,GTID的概念并不新鲜,MySQL中的GTID由Master生成,是用于标记唯一事务并通过ID定位binlog位置的一种手段,从而有效解决了级联复制等场景中的各种问题。

  • 对Galera Cluster而言,复制不基于binlog,而是通过Galera复制插件来保障。Galera的GTID同样也标记事务唯一性,wsrep api使用GTID识别状态更改

Galera Slave Threads

写集 write set被放置在节点上集群节点的接收队列中,最终由集群节点的 Galera Slave Threads 去应用

当一个集群节点的状态(如 wsrep_local_state_comments 所示)为 JOINED 时,增加从线程的数量可能有助于集群节点更快地赶上集群。

在这种情况下,将线程的数量设置为系统上 CPU 数量的两倍可能是有用的。

Streaming Replication 流式复制

使用 Streaming 复制,节点将巨大的事务分解成更小、更易于管理的片段,然后在工作时将这些片段复制到集群中,而不是等待提交。

一旦经过认证,片段就不能再被冲突的事务中止。

由于这可能在执行期间和回滚事件中都会产生性能影响,因此建议您只在不太可能发生冲突的大型事务中使用它

Group Commits 组提交

## Galera复制工作原理

基于 验证的复制 使用 组通信 和 事务排序技术 实现同步复制

事务在本节点乐观执行,然后在提交时运行一个验证过程以保证全局数据一致性

  • 事务在一个节点提交时,被认为与其它节点上的事务没有冲突,首先在本地执行,
  • 然后再发送到所有节点做冲突检测,无冲突时在所有节点提交,否则在所有节点回滚
相关推荐
2401_857622666 小时前
SpringBoot框架下校园资料库的构建与优化
spring boot·后端·php
2402_857589366 小时前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
哎呦没7 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
_.Switch8 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
杨哥带你写代码9 小时前
足球青训俱乐部管理:Spring Boot技术驱动
java·spring boot·后端
AskHarries10 小时前
读《show your work》的一点感悟
后端
A尘埃10 小时前
SpringBoot的数据访问
java·spring boot·后端
yang-230710 小时前
端口冲突的解决方案以及SpringBoot自动检测可用端口demo
java·spring boot·后端
Marst Code10 小时前
(Django)初步使用
后端·python·django
代码之光_198010 小时前
SpringBoot校园资料分享平台:设计与实现
java·spring boot·后端