大家好,这里是公众号 DBA学习之路,分享一些学习国产数据库路上的知识和经验。
社群交流
为了给大家提供一些技术交流的平台,目前已成立的技术交流群:
- Oracle 数据库交流群
- 国产数据库交流群
- Linux 技术交流群
- ChatGPT 4o 免费体验群
需要进群(均已超过 200 人,需要邀请 )可以添加号主微信:Lucifer-0622,备注对应的群名即可。
@TOC
前言
深圳计算科学研究院拟于 2024 年 11 月 14 日在深圳五洲宾馆举办"2024 国产数据库创新生态大会"。本次大会以"核心替代 新质金融"为主题,汇聚数据管理领域院士专家、顶尖学者以及金融行业资深技术大咖超百位业内专业人士,围绕国产数据库系统产业变革的机遇与前景,深入探讨核心业务系统软件的国产化创新路径和发展趋势!
同天 YashanDB 发布了一个新的 LTS 版本 23.3,了解崖山的朋友都知道,这个数据库跟 Oracle 十分相似,兼容性极高。
我之前参加过崖山的 YCA/YCP 培训,体验过个人版的单机部署,总体来说还算不错。当时由于学习时间紧张,一直没有接触 YashanDB 共享集群(YAC),最近有时间正好可以学习一下,本文先了解一下 YAC 的概念。
介绍
YashanDB 共享集群(YAC)是一款单库多实例的多活数据库系统,所有节点之间以强一致性方式实现并发读写,为高端核心业务提供了应用透明的透明多写、高可用、高扩展、高性能的数据库能力。对等 Oracle RAC/DB2 的集群产品,基于国产中间件/芯片/服务器/存储,构建高端核心交易场景的完整全栈替代方案。
产品架构:
共享集群基于YashanDB内核持续演进,硬件上依赖共享存储实现shared-Disk的架构,同时引入了Cohesive Memory核心技术实现Shared-Cache能力,可在集群数据库多个实例之间协同数据页的读写访问以及各种非数据类资源的并发控制,主要特点包括:
- 共享集群是一个单库多实例的多活数据库系统,用户连接任意实例都可以访问同一个数据库,多个数据库实例可以并发读写同一份数据,且保证实例之间读写的强一致性,具备高可用、高扩展、高性能等特性。
- 共享集群的核心组件主要包括崖山集群内核 YCK (Yashan Cluster Kernel)、崖山集群服务 YCS (Yashan Cluster Service)和崖山文件系统 YFS(Yashan File System)。
- 共享集群支持在线故障自动切换和故障自动恢复,集群实例异常故障不影响剩余存活实例对外提供服务。
- 通过客户端 TAF 技术,客户端应用可以在故障时自动切换连接到存活的实例,故障对业务透明无感知。
YashanDB 在共享集群部署形态下,在硬件上需依赖共享存储,在软件上也引入新的基础设施,包括崖山集群服务 YCS 和崖山文件系统 YFS,分别提供集群管理和并行文件服务的能力。
YCK
YCK 通过聚合内存(Cohesive Memory)技术,聚合多实例对数据资源和非数据资源的并发访问。
- GRC(Global Resource Catalog):负责管理全局资源状态信息,例如一个数据块当前持有者是哪个实例、是以读/写哪种模式持有、哪些实例请求正在排队等。GRC 相关元数据采用了一致性哈希算法平均分配到所有实例,任一资源的元数据信息在集群内只有一份。由 GRC 线程组负责处理多实例对全局资源的并发访问控制,并提供排队服务。
- GCS(Global Cache Service):负责管理数据块类全局资源的调度,GCS 在 GRC 提供的能力基础上实现实例之间数据块请求的完整流程,包括路由请求消息、数据传输以及状态维护等,由 GCS 线程组提供相应的服务。
- GLS(Global Lock Service):负责管理非数据块类全局资源的调度,主要是各种类型的锁,GLS 在 GRC 提供的能力基础上实现实例之间申请全局锁的完整流程,由 GLS 线程组提供相应的服务。
YCS
崖山集群服务(后续简称 YCS)是 YashanDB 的一个集群管理组件,提供包括服务器管理、资源管理、集群监控、集群高可用等能力,支撑 YashanDB 共享集群从部署到启停的完整形态的稳定运行。
下图是集群数据库的物理部署示意图,硬件上包括两台服务器和一台共享存储,每台服务器视为集群的一个节点;其中 YFS 运行期无独立进程,由 YCS 进程看护,不同服务器之间的 YCS 通过网络互联;数据库实例运行期有独立进程,不同服务器之间的实例进程通过网络互联;在同一个服务器上,数据库实例使用 UDS 方式连接到 YCS 和 YFS。
崖山集群服务 YCS 采用客户端服务端架构,整体架构如下:
客户端命令行工具可执行配置、查询等命令,相关命令发送到服务端处理后返回结果给客户端。
YCS 负责管理共享集群数据库,包括集群服务器配置管理,集群资源配置管理,启停、监控服务器以及资源,提供查询服务器资源拓扑状态能力,在各种故障时负责投票仲裁并重组集群。
YCS 是高可用的关键部件,通过网络心跳和磁盘心跳来确认其他服务器以及服务器上运行的资源是否正常。监控任务感知到资源运行状态异常时,会进行投票仲裁决定允许留在集群中的幸存者列表,并通知所有服务器的所有资源采取必要的重组动作。
YCS 实例
YCS 实例采用单进程、多线程的服务架构(进程名为 yascs),包括负责监听、心跳、监控以及服务客户端的代理线程。在 YCS 进程中会以内嵌方式运行 YFS 实例,后者同样也包括一系列线程。
共享集群每台服务器上会部署 YCS 实例(一组为 YCS 服务的线程称为一个 YCS 实例)和数据库实例,同一集群中不同服务器上运行的 YCS 实例和数据库实例完全一样,并通过内网互联。
YCS 配置
在共享集群运行前,需要先完成集群服务配置,涉及以下三层概念:
- 集群:当我们要初始化安装一套共享集群数据库时,需要先使用YCS客户端工具完成集群的配置,包括指定集群名、参与集群的服务器以及服务器上的资源等。在同一个集群配置表磁盘上只能创建一套集群,如果以覆盖方式创建集群,则之前的集群配置会丢失。
- 服务器:一个集群应至少部署两台服务器,每台服务器分别运行YCS实例提供集群服务。有效保障发生单点故障时至少还有一台服务器提供服务,达到高可用的目标。每台服务器上需要运行配置一套YCS实例,除此之外还需要配置资源信息,包括数据库等。
- 资源 :每个服务器需要管理一系列的资源,通过对资源的管理(包括监控和启停),实现高可用的集群服务给上层应用使用。资源包括内嵌资源和外部资源,配置资源的启停脚本后,可以通过 YCS 的客户端工具来启停相关资源:
- YFS 是集群数据库运行时依赖的并行文件系统,作为内嵌资源随 YCS 启动,该资源对使用者透明。
- YashanDB 的数据库服务端作为外部资源由 YCS 进行管理。
集群共享文件
YCS 要求在共享存储上划分至少三块盘,是用作配置的 YCR File 和 Voting File,所有服务器上的 YCS 实例和数据库实例均可读写这三块盘。
集群共享文件分为以下两类:
- 集群配置表(YCR,Yashan Cluster Registry):保存集群服务的配置信息,包括服务器配置、资源配置等,YCR必须保存在共享存储上,所有YCS实例和数据库实例运行期需要能够正常访问YCR,以确保获得一致的集群服务配置信息。
- 集群投票文件(Voting file):是所有服务器运行期会周期性写入状态信息的磁盘文件。在故障发生时,需要在集群投票文件进行投票并决定哪些服务器幸存而哪些服务器被逐出集群,无法访问投票文件则无法获得最新集群状态信息,相关YCS实例和数据库实例无法正常运行。
YFS
崖山集群文件系统(后续简称 YFS)是 YashanDB 的一个用户态存储服务组件,提供了文件系统以及磁盘组管理能力,用于管理共享磁阵。
通过 YFS,用户可实现共享磁阵上基本的文件/文件夹的创建、删除、浏览等功能。此外,YFS 还提供了管理 diskgroup(磁盘组)、failuregroup(故障组)等重要特性,以支持共享集群的存储高可用。
崖山文件系统 YFS 是 YashanDB 的专用并行文件系统,提供存储设备管理、存储高可用、文件系统接口等功能。
共享集群中每一个服务器上运行的一组 YFS 相关线程称为一个 YFS 实例,YFS 实例与 YCS 实例运行在同一进程(YCS 进程)中。生产环境下,通常每台服务器只会运行一个 YFS 实例。
数据库服务端核心进程 YASDB 是 YFS 实例的客户端(Client),只与同服务器的 YFS 实例通信。YASDB 进程通过 Unix Domain Socket 向 YFS 实例发起元数据变更请求,YFS 实例更新共享内存中的元数据缓存,并将元数据变更持久化到共享存储。YASDB 进程读取共享内存中的元数据,直接对磁盘进行读写,无需通过 YFS 实例,IO 性能接近直接读写裸设备。
YFS实例管理全局存储元数据,通过事务保证操作的原子性,各YFS服务之间通过网络同步元数据,通过一致性协议保证全局一致性,确保YFS各实例看到的文件状态没有差别。
在共享集群部署中,必须依赖 YFS 进行所有文件操作,包括但不限于控制文件、数据文件、日志文件等的增删改操作。
与通用文件系统相比,YFS 的差异主要有:
- YFS 分配空间的最小单元较大,以确保文件分区表(FAT)信息占用空间较小,并能够常驻内存。此外,YFS 采用共享内存技术,以供数据库实例直连访问,从而降低时延。
- 并行文件系统对于元数据修改会在共享集群所有实例上实时同步,所有数据库实例能够访问到一致的目录文件元数据信息。
YFS 无独立进程,作为内嵌资源与 YCS 实例同进程运行,随 YCS 启动而启动,无需用户干预。
磁盘管理
YFS 具备磁盘管理能力,将磁盘裸设备(disk)划分为磁盘组、故障组等逻辑概念,以层级结构管理。
磁盘组(DiskGroup)
磁盘组(DiskGroup)是 YFS 管理磁盘设备的最顶层逻辑单元,一个 DiskGroup 应该至少包含 1 个 FailureGroup。
YFS 中可能存在多个 DiskGroup,各 DiskGroup 分别管理一些 disk,各 DiskGroup 之间资源隔离、故障隔离。不同 DiskGroup 可以执行差异化存储管理,指定不同规格,例如为不同 DiskGroup 配置不同的副本数。每个 DiskGroup 的属性在创建时指定,一旦创建不可更改。
DiskGroup 的主要属性包括冗余度(Redundancy Level,也叫冗余级别)和分配单元大小(AU size)。
故障组(FailureGroup)
YFS 将有可能同时故障的 disk 划分为故障组 FailureGroup,配合"多副本"实现数据(包括元数据以及文件数据)冗余,支持存储高可用。
每个 FailureGroup 包含一个或多个 disk,它们可能是:
- 同一磁阵中一些 LUN
- 同一机柜的磁盘
- 同一电源供电的多个存储设备
- 同一机房的多个存储设备
FailureGroup 没有绝对的划分标准,而是在特定的运维条件下根据各 disk 故障概率的相关性,将它们进行适当分组,确保不同的 FailureGroup(大概率)不会同时故障。
磁盘设备(Disk)
YFS 的所有数据都按指定策略保存在 disk 上,包括 YFS 自身的元数据、YFS 文件以及目录的元数据、用户数据等。
一个最小可用的 YFS 需要以下两个 disk:
- 1 个 BOOT_DISK:用于存储 YFS 自身元数据,建议容量 500MB 以上。YFS 依赖该 disk 完成启动和初始化,用户可在 YFS 配置中指定该磁盘。
- 1 个用户数据 disk:即 YFS 的数据盘,可以配置多个数据盘,用于保存用户数据,需在创建磁盘组时指定。
YFS 仅支持 Direct IO 模式读写,加入 YFS 的磁盘至少应支持块大小 512B~64MB 的 DIO 模式读写。同一个磁盘不能在 YFS 中复用,可能丢失数据。
存储高可用
在创建 DiskGroup 时,可以通过指定冗余度配置该 DiskGroup 的副本数。数据副本会保存在不同的 FailureGroup 中,只要至少一个副本完整,数据便可用。
不同 FailureGroup 下的 disk 之间故障是独立事件,同时故障的概率极低,因此数据损坏的概率极低,保证了数据高可用。
多副本
副本数指数据保存的份数,例如 1 副本表示 YFS 中只存在 1 份数据,3 副本表示 YFS 中存在 3 份相同的数据。
副本数具体可分为用户数据副本数和 YFS 元数据副本数。在 FailureGroup 数大于数据副本数时,系统会自动为元数据创建更多副本,进一步加强 YFS 的可靠性。
使用多副本保护数据的前提是正确规划 FailureGroup,确保数据副本之间故障概率独立:所有副本应分布在不同的 FailureGroup,因此需满足 FailureGroup 个数 >= 用户数据副本数。
各冗余级别下 YFS 元数据副本数是推荐值,如果 FailureGroup 数量小于元数据副本数要求,元数据副本数将被调整为与 FailureGroup 数量相同的值。
YFS 会妥善安排各副本数据的保存位置,保证各副本保存在不同 FailureGroup 的不同 disk。
注意:YFS 中数据的多副本不能跨越 DiskGroup,因为各 DiskGroup 的资源是完全隔离的。
冗余度(Redundancy)
YFS 支持 3 种冗余级别:
- EXTERNAL:该级别表示无数据冗余,用户数据副本数为 1,YFS 元数据副本数为 1。配置本级别的情况下,数据的可靠性依赖外部能力实现,例如 RAID。
- NORMAL:一般级别的数据冗余,用户数据副本数为 2,YFS 元数据副本最小为 2,最大为 3。
- HIGH:高级别的数据冗余,用户数据副本数为 3,YFS 元数据副本数最小为 3,最大为 5。
分配单元(Allocate Unit)
YFS 将 disk 划分为等大小的分配单元(AU,Allocate Unit)进行管理,AU size 是 YFS 分配磁盘空间的最小单元。
YFS 支持的 AU size 颗粒度有:1M(默认值)、4M、8M、16M、32M,用户可以在创建 DiskGroup 时指定该 DiskGroup 的 AU size,或使用默认的 AU size。
AU size 决定了 YFS 管理磁盘空间的颗粒度,更大的 AU size 可以使 YFS 创建更大的文件、获得更好的连续 IO 性能,但也会消耗更多内存,浪费一些磁盘空间。用户应根据业务特征选择合适的 AU size,不合适的 AU size 可能影响 YFS 的运行性能。
对 AU size 的配置建议如下:
- 系统中以小文件为主时,建议选择较小的 AU size。
- 系统中以大文件为主时,建议选择较大的 AU size。
- 当 AU size 大于等于绝大多数 IO size 时,可以获得更好的性能。
文件及目录管理
YFS 提供了一组文件操作 API,抽象底层存储管理细节,语义兼容大多数文件系统操作,具备文件、目录、路径等文件系统基本概念。
YFS 还提供专用的管理终端 yfscmd
,提供与 Linux Shell 类似的文件管理界面,例如常见的 cd、ls、mv、cp 等命令。
目录
YFS 以目录树的形式组织、管理文件。YFS 的路径构成为 +DG_NAME/DIR/PATH/file.name
。
YFS 的根是 +
,一级目录是磁盘组的名称,其他次级才是一般意义上的目录和文件名。磁盘组目录是虚拟目录,无法直接增/删/改,需通过增/删磁盘组间接修改。
可以通过绝对路径中的根识别文件系统类型,以 +
开头的是 YFS 路径,以 /
开头的是系统本地路径。yfscmd cp 指令通过根路径字符识别文件所在文件系统,实现YFS和本地文件系统的交叉复制。
文件
YFS 文件除用户数据外,还包含一些精简的属性信息,例如创建时间、文件大小等。由于 YFS 仅支持 Direct IO 读写,YFS 文件大小都是 512 字节的整倍数。
文件实际占据的磁盘空间可能大于文件大小,约为 Round(FileSize/AuSize) * Redundancy
,文件的元数据也会额外占据一些空间,但相对较少。
集群数据库高可用
集群数据库的高可用,表示在集群中任意一个服务器发生故障时,系统拥有故障转移和恢复的能力,连接到故障服务器的用户会被自动转移到其他活跃服务器,且用户不感知这种变化。
在共享集群中可能发生故障的场景有:
- YFS 自身故障,如磁盘损坏、数据损坏等。
- YCS 自身故障,如网络中断、进程异常等。
- 上述故障,以及数据库本身的故障,都将引起数据库实例故障,用户连接被断开。
YashanDB 建立了故障模式库,对各类故障进行检测,并在发生故障时进行自动处理:
- 文件系统高可用:实现了对 YFS 故障的自动处理和恢复能力。
- 集群服务高可用:实现了服务器自动选主和切换能力。
- 实例故障在线恢复:实现了对故障实例的数据恢复能力。
- 透明应用程序故障转移:实现了客户端自动切换到集群活跃实例的能力。
文件系统高可用
YFS 通过 diskgroup 和多副本技术实现数据的高可用,通过集群化部署实现服务的高可用。
数据高可用
YFS 通过 diskgroup 隔离内部资源,进行差异化管理。
diskgroup 内按磁盘故障率的相关性,划分为若干 failuregroup,多个 failuregroup 同时故障的概率极低。数据多副本分散在不同 failuregroup,当发生故障时,只要 YFS 中还存在 1 个有效副本,数据就依然可用。
如果 failuregroup 足够,YFS 特别对自身元数据做了加强保障,相比用户数据创建更多副本,进一步保障 YFS 自身的可用性。
服务高可用
以集群模式部署YFS,当服务器数量发生变化或某个服务器发生故障无法服务时,YFS自动重构,恢复服务。只要集群中至少还有1个可用服务器,YFS集群服务就可用。
另外,YFS利用redo和checkpoint机制确保了数据的一致性和可靠性,当发生极端故障时,重启YFS是通过回放redo日志恢复到有效状态。
主备复制
YFS 集群状态的一致性非常重要,YFS 主实例向所有备实例的实时数据复制,通过传送 redo 日志实现,如下图:
1、日志插入
YFS 集群至少包含 1 个主实例(Primary)和若干备实例(Standby)。主实例负责处理所有元数据变更,同时将产生对应的 redo log,插入 Log Cache。
2、日志刷盘
YFS 自身的 redo file 也由 YFS 管理,受 YFS 多副本技术保护。
redo log 被持久化到 redo file,这些数据保存在共享存储上,确保恢复时所有 YFS 实例都可以访问该文件。
3、日志发送
主实例将本机日志发送给所有备实例,由于 YFS 的元数据变更数据量很少,这里采用同步发送。
4、日志回放
备实例收到日志后,通过重演主实例 redo log 更新元数据页面,最终备实例状态与主实例状态同步一致。
集群服务高可用
集群服务高可用指的是当软件、硬件或者操作失误等原因导致集群中服务器发生故障时,该服务器将被踢出集群,服务器上承载的业务迁移到其他服务器,保证数据库服务能够正常进行。同时,当该服务器的故障恢复后,将其重新纳入集群中。
心跳机制
YCS 通过心跳机制来监控故障的发生与恢复,当检测到故障时,进入对应的故障处理流程;当检测到故障恢复时,将服务器或者资源重新纳入集群管理之中。
为确保及时感知服务器和资源的状态变化,YCS 建立了多种心跳机制,包括:
1、磁盘心跳
主服务器定时将心跳序号写入投票盘,其他服务器读取磁盘心跳,根据是否及时写入的情况判断主服务器是否异常。当主服务器发生异常时,其他存活服务器中将会仲裁出一个服务器来接管主服务器的工作。
配置参数 DISK_HB_KEEP_ALIVE 决定了其他服务器对主服务器进行探活的超时时间,一旦在 DISK_HB_KEEP_ALIVE 配置的时间内,主服务器都没有写入磁盘心跳,则接管主服务器成为新的主服务器。
2、网络心跳
包括网络心跳一和网络心跳二:
- 网络心跳一:所有 YCS 服务器,两两之间都会定时发送心跳,一旦不能及时收到心跳,会认为服务器异常。
- 网络心跳二:DB 通过 UDS 连接,定时发送心跳给 YCS 服务端,一旦不能及时收到心跳,会认为该资源异常。
配置参数 NETWORK_HB_TIMEOUT 决定了判定资源异常的等待时间,当资源在 NETWORK_HB_TIMEOUT 设置的时间之间内没有心跳,则认为该资源异常,并启动异常处理流程。
I/O Fence 功能
当集群服务器发生故障时,会进入投票仲裁流程,经过仲裁处理后,如果某个服务器被驱逐出集群,那么与它相关联的数据库会检测到这一信息,会阻断新的 IO 请求,并在旧的 IO 处理完成后退出集群。同时如果集群服务器在备升主的场景下,会等待被驱逐服务器退出集群且旧的 IO 处理完成,再执行备升主的动作,以防止双主错误。
投票仲裁
当集群无主或任意节点连续丢失网络心跳(由NETWORK_HB_TIMEOUT的配置决定)或者磁盘心跳(由DISK_HB_KEEP_ALIVE配置决定)直到超时,集群会进入投票仲裁流程,将故障服务器驱逐并决出最优子集群和集群的主节点。
投票流程会首先选出计票服务器,然后由计票服务器根据每个节点的网络可见列表及其他信息判断旧集群是否因为网络隔离被划分为多个子集群。若是,计票服务器会选择成员数最多或有旧主的子集群幸存并决出主节点,然后驱逐劣势子集群的节点;若否,仅集群内异常的节点会被驱逐,并在必要时选出新主。
实例故障在线恢复
共享集群部署中,一旦某个服务器上的数据库实例发生故障,登录到该故障实例的所有连接将被断开,该实例上的未提交事务被执行回滚。此时,其他活跃实例上的会话请求可以继续执行,但当会话请求涉及全局资源访问时,该会话请求将被阻塞,直到对全局资源进行恢复后方可继续执行;不涉及全局资源访问的会话请求则正常运行不会阻塞。无论哪种情况,集群中所有活跃实例上的会话请求最终都可以正常完成,保障业务不受影响。
YashanDB 的实例故障在线恢复用于处理实例故障发生时的全局资源恢复,该工作由集群中当前的主实例完成,主要的处理逻辑按顺序列示如下:
- 收集需要在线恢复的故障实例信息。
- 暂停访问全局资源的业务。
- 根据剩余的活跃实例,重新构建全局资源信息。
- 对故障实例的 redo 日志进行分析,锁定需要恢复的全局资源。
- 恢复全局资源访问的业务。
- 回放 redo 日志,相关全局资源恢复完毕,放开对该全局资源的访问。
- 结束在线恢复流程。
在线恢复在实例发生故障时自动触发,无须人工触发或干预,但如用户在此期间执行表空间 DDL 操作将无法成功。
透明应用程序故障转移
透明应用程序故障转移(TAF,Transparent Application Failover)是当数据库服务端发生故障时,应用程序能够自动重连或切换到活跃实例的一种技术。通过 TAF 功能,连接切换的过程无需人为介入和感知,但切换时的当前语句将会被终止且未提交事务将回滚。
TAF 属于客户端侧的功能,开发者可自由选择是否使用,通过 TAF 能最大程度保障业务的连续性和可用性,降低运维负担和等待人工干预引起的时延,提升应用程序最终用户的使用体验。
写在最后
下一篇写 YAC 的安装部署。
如果有遗漏或者不足的地方,欢迎评论区补充或者投稿,感谢阅读!
往期精彩文章
达梦数据库安装最详细教程
一招教你学会达梦数据库的免密登录
一文讲透达梦数据库的大小写敏感
效率翻倍!达梦数据库 disql 使用技巧全攻略 达梦数据库参数配置与一键优化指南 达梦 AWR 报告快速上手指南 金仓数据库 KingbaseES V9 单机安装指南
KingbaseES KSQL 免密登录的几种方式
KingbaseES 控制文件冗余与恢复秘籍
南大通用 GBASE 8s V8.8 数据库最全安装指南
GBase 8a MPP 集群部署最佳实践
GBase 8s GDCA 认证课后练习题大全(题库)
GBase 8s 数据库巡检报告及一键巡检脚本
YashanDB 一键生成 AWR 报告
YashanDB 数据库安装部署
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」