数据库教程FGMT80:国产数据库-TDSQL数据库工程师培训实战教程(腾讯金融级分布式数据库)
数据库教程FGMT81:国产数据库-华为高斯GaussDB数据库培训(openGauss)
一、前言与本套风哥教程大纲介绍
在信创替代全面推进的背景下,金融、政务、运营商、能源、交通等关键行业的核心系统正在加速从国外商业数据库向国产数据库迁移。华为高斯体系包含三条产品线:面向私有化部署的开源内核 openGauss、面向公有云与私有云托管的 GaussDB 企业版管理平台 TPOPS、面向 PB 级数据仓库的 GaussDB(DWS)。本套风哥教程聚焦开源内核 openGauss,它是华为 2019 年开源、基于 PostgreSQL 内核深度增强的关系型数据库,支持 x86 与鲲鹏 ARM 双架构,具备高可用、高安全、高并发与事务强一致能力,是国产替代项目中落地最广的内核之一。
风哥教程本文面向已经具备 Linux 基础与关系型数据库通用概念的运维工程师、DBA 与开发人员,目标是让学习者在一套两台物理机(或虚拟机)环境中,完整走完 openGauss 的单机安装、参数规划、用户权限管理、逻辑与物理备份恢复、一主一备流复制搭建、主备切换、安全加固、监控与性能优化的全流程。本套风哥教程所有配置参数均按 64GB 内存、8 颗 CPU 的生产规格给出,所有命令均可在 RHEL/CentOS/openEuler/麒麟 Linux 上直接套用,所有路径统一规划为 /fgedudb,数据库名与实例名统一为 fgedudb,业务用户名统一为 fgedu,避免学习者在实验中被命名差异干扰。
本套风哥教程的实验环境规划如下:主节点 fgedu-net-cn1(IP 地址 192.168.10.11),备节点 fgedu-net-cn2(IP 地址 192.168.10.12),两台机器均为 64GB 内存、8 vCPU,操作系统为 Linux 内核 4.18 以上(RHEL 9.3 / openEuler 22.03 / 麒麟 V10 均可),软件版本统一为 openGauss 5.0.5 LTS x86_64。主节点承担初始化、备份、主备搭建等全部实操,备节点用于流复制与切换演练。
本套风哥教程的内容结构分为四个部分:第一部分即前言与大纲介绍;第二部分为理论篇,讲解 openGauss 的起源与版本体系、进程与内存体系结构、事务与 MVCC、流复制高可用原理、备份恢复原理、安全体系与性能基础;第三部分为实战篇,按操作系统准备、单机安装初始化、基础管理、逻辑备份恢复、物理备份与时间点恢复、一主一备流复制与切换、安全加固、监控优化、故障诊断九个实验逐项给出步骤与命令;第四部分为风哥针对本文总结。学习时建议先通读理论篇建立心智模型,再对照实战篇逐条敲命令,理论与命令的比例约为三成与六成,其余一成用于承上启下,结尾为风哥针对本文总结。
本套风哥教程涉及的核心术语中英文对照先在此统一列出,后文不再重复解释:WAL(Write-Ahead Logging,预写日志)、MVCC(Multi-Version Concurrency Control,多版本并发控制)、PITR(Point-In-Time Recovery,时间点恢复)、LSN(Log Sequence Number,日志序列号)、CM(Cluster Manager,集群管理器)、DMS(Distributed Memory Service,分布式内存服务)、DSS(Distributed Storage Service,分布式存储服务)、GUC(Grand Unified Configuration,数据库统一配置参数)、SGA(s-hared Memory,共享内存区)、bgwriter(后台写盘进程)、checkpoint(检查点)、vacuum(垃圾回收)。
二、理论篇
2.1 openGauss 的起源、版本体系与产品边界
openGauss 是华为 2019 年 6 月在开发者大会上开源的关系型数据库内核,其技术血缘来自 PostgreSQL,华为在其之上做了大量内核级增强:自研的多核 NUMA 感知优化、无锁化线程池、行列共存存储、安全认证与审计增强、资源池化与一写多读架构等。理解 openGauss 与商业产品的边界是学习的第一步:openGauss 是开源内核,社区版本可免费使用,主备流复制、物理备份、审计等能力均在内核中;GaussDB 企业版(TPOPS 形态)是华为基于同一内核封装的商业托管产品,增加了可视化管理平台、自动运维、弹性扩缩容等云服务能力;GaussDB(DWS) 是 MPP 分布式数据仓库,面向分析型负载,与本套风哥教程的事务型内核不是同一套部署形态。
版本选择上,生产环境建议选用 LTS 长期支持版本,本套风哥教程采用 5.0.5。版本演进上,1.0 系列完成开源奠基,2.x/3.x 完善主备与备份工具链,5.x 引入资源池化、oGRAC 多写、向量引擎等特性,6.x/7.x 进一步强化云原生与 AI 能力。学习者需要知道:openGauss 的大版本号必须在主备两端、备份与恢复两端保持一致,跨大版本只能通过逻辑迁移或升级工具完成,不能直接用物理备份还原。
与 PostgreSQL 的差异也要心中有数:openGauss 默认采用线程模型而非每会话一进程,管理工具统一以 gs_ 前缀命名(gs_ctl、gs_initdb、gs_dump、gs_probackup、gs_guc、gs_checkperf),认证默认使用 s-ha256 与 md5 双模式,配置文件仍为 postgresql.conf 与 pg_hba.conf,SQL 语法高度兼容 PostgreSQL,这使得有 PostgreSQL 经验的 DBA 迁移成本很低。
2.2 进程体系与内存结构
openGauss 实例由一个 gaussdb 主进程与若干后台线程组成。主节点上的关键后台线程包括:walwriter 负责把事务提交产生的 WAL 记录从内存缓冲区刷写到日志文件;bgwriter 负责把共享缓冲区中的脏页异步批量写回数据文件,避免 checkpoint 瞬间 IO 尖峰;checkpointer 周期性触发检查点,把已提交事务对应的脏页与 WAL 落盘并推进检查点位置;walwriter 之外还有 walsender 线程,主节点通过它把 WAL 日志流推送给备节点;备节点对应运行 walreceiver 线程接收日志并回放;autovacuum launcher 负责调度各库的 autovacuum worker 清理死元组;统计收集线程维护 pg_stat_* 统计视图。此外还有死锁检测线程、页回放线程、线程池管理线程等。
内存结构分为共享内存与本地内存两部分。共享内存中的核心区域是数据缓冲区(由 s-hared_buffers 控制),缓存表与索引的数据页;WAL 缓冲区(wal_buffers)暂存待落盘的日志记录;还有锁表、会话哈希、事务状态数组等。本地内存是每个会话私有、按需分配的工作区,work_mem 控制排序与哈希连接可用的内存,maintenance_work_mem 控制建索引、vacuum 等维护操作可用的内存。按 64GB 内存规划时,s-hared_buffers 取物理内存的四分之一即 16GB,effective_cache_size 取四分之三即 48GB 作为操作系统页缓存的预估,work_mem 取 64MB,maintenance_work_mem 取 2GB,这一组比例是 OLTP 场景的稳妥基线。
存储结构上,一个 openGauss 实例下可以创建多个数据库(本套风哥教程使用 fgedudb),数据库内按模式(schema)组织表、视图、函数等对象,表空间(tablespace)映射到文件系统目录。数据以堆表形式存储,每一行元组带系统列 xmin/xmax 与版本指针,配合 WAL 实现崩溃恢复;索引支持 B 树、哈希、GIN、GiST、BRIN,列存表面向大宽表分析场景。WAL 日志是高可用与恢复的基石:任何修改先写日志再改数据页,日志按段文件(segment)滚动,检查点推进后旧日志段才可被回收或归档。
openGauss 默认采用线程池模型替代 PostgreSQL 的每会话一进程:所有会话复用一组常驻工作线程,避免高并发下进程创建与上下文切换的开销,线程池大小由 thread_pool_group_num 与 thread_pool_size 控制。在 NUMA 多路服务器上,数据库可通过 numactl 绑定节点,让内存访问尽量本地命中,减少跨节点访存延迟;本套风哥教程的 8 CPU 单路实验不强制绑定,但学习者在多路生产机上应理解 NUMA 亲和性对尾延迟的影响。共享缓冲区采用时钟扫描(clock-sweep)算法淘汰脏页,bgwriter 与 checkpointer 分工:前者持续小批量写盘平滑 IO,后者周期性整体推进检查点,二者参数配合决定了突发写入时的 IO 峰值形态。
2.3 事务、MVCC 与并发控制
openGauss 实现了完整的 ACID 事务与 MVCC 多版本并发控制。读操作不阻塞写、写操作不阻塞读的原理是:每行保存多个版本,读会话按事务开始时的快照(snaps-hot)挑选可见版本,旧版本由 vacuum 回收。隔离级别支持读已提交(read committed,默认)、可重复读(repeatable read)与串行化。锁的层次分为表级锁(ACCESS s-hARE、ROW s-hARE、ROW EXCLUSIVE、s-hARE、s-hARE ROW EXCLUSIVE、EXCLUSIVE 等)与行级锁(行锁仅锁元组版本,不锁物理行位置),此外还有咨询锁(advisory lock)供应用层自定义协调。
需要重点理解的是死元组与膨胀:UPDATE/DELETE 并不物理删除旧行,而是标记为死元组,vacuum 扫描并回收可复用空间,autovacuum 自动触发但受统计信息阈值控制。长期不 vacuum 会导致表与索引膨胀、查询变慢、事务 ID 回绕(wraparound)强制停机。运维中要养成定期查看 pg_stat_user_tables 的 n_dead_tup、last_autovacuum 的习惯。
隔离级别上,读已提交(read committed)每条语句都取一次新快照,语句之间能看到其他事务的新提交;可重复读(repeatable read)整个事务共用一个快照,事务内多次读取结果一致,但无法看到事务开始后的新提交;串行化通过谓词锁检测写偏序冲突,冲突时回滚其中一方。MVCC 的代价是旧版本长期堆积,因此快照不能无限老:长事务即使只执行 SELECT,也会阻止 vacuum 回收它仍能看到的死元组,这是生产库"明明没写数据却越来越大"的常见原因,对应实战八中的 idle_in_transaction_session_timeout 治理。锁的兼容性矩阵要记住:读不阻塞写、写不阻塞读,但写与写在同一行上排队,DDL(如 ALTER TABLE)会持有 ACCESS EXCLUSIVE 表锁,阻塞所有访问,必须放在低峰执行。
2.4 流复制高可用原理
openGauss 的一主一备(或一主多备)基于物理流复制:主节点产生的 WAL 日志通过 walsender 实时推送到备节点的 walreceiver,备节点在回放日志的同时保持只读对外服务。复制模式分异步与同步:异步模式下主节点提交无需等待备节点确认,性能高但主节点宕机可能丢失少量已提交事务;同步模式下主节点提交需等待至少一个备节点写入 WAL 并返回确认,数据零丢失但写延迟略增,由 synchronous_standby_names 指定参与同步的备节点名单。
复制槽(replication slot)是保证 WAL 不被误删的机制:主节点为每个备节点保留一个槽,槽记录备节点已回放的位置,未被槽消费的 WAL 段不会被回收,代价是备节点长期断连会造成主节点磁盘膨胀,需要定期监控槽的延迟。主备切换有两种路径:计划内维护使用 switchover 优雅切换,主节点降级为备、指定备节点提升为主;故障场景下主节点失联,人工或 CM 组件执行 promote 把备节点提升为主,原主恢复后必须以新备节点身份重新 build 加入集群,不能直接旧主回切。
脑裂是高可用设计必须规避的风险:当网络分区导致主节点与备节点失联,而外部仲裁仍认为原主存活时,可能出现两个主同时接受写,造成数据分叉。一主一备的人工切换流程要求在 promote 前确认原主确实不可写,恢复旧主时必须重新拉取新主备份而非直接启动旧数据目录,正是为了从流程上杜绝双主。引入 CM 自动仲裁时,仲裁多数派(多数节点存活)才允许提升,单节点分区不会触发切换。同步复制在故障切换时的取舍是:同步模式下若同步备失联,主节点提交会被阻塞,需要预先配置备库兜底或临时降级为异步,这是预案设计的一部分。
2.5 备份与恢复原理
备份分逻辑备份与物理备份两条路线。逻辑备份工具为 gs_dump(单库)与 gs_dumpall(全库含角色与表空间定义),导出为 SQL 文本或自定义压缩格式,适合跨版本迁移与小批量数据导出,恢复用 gsql 执行 SQL 或 gs_restore 导入自定义格式。物理备份工具为 gs_probackup,基于数据文件级别的全量(FULL)与 PTRACK 增量备份,配合 WAL 归档实现 PITR:先还原全量备份的数据目录,再通过 restore_command 重放归档 WAL 到指定时间点、事务 ID 或 LSN。生产环境的标准组合是:每日一次全量、每小时 PTRACK 增量、WAL 实时归档,恢复时按备份集加归档日志回退到故障前最近一致点。
两条路线的选型边界要分清:逻辑备份与数据库版本、字符集兼容范围宽,导出的是可阅读的 SQL,适合版本升级前的兜底与单表误删恢复,但数据量大时导出导入耗时长,且无法恢复到任意时间点;物理备份是文件级快照,恢复速度快、支持 PITR,但备份集只能在同版本、同架构上还原,且必须配合连续的 WAL 归档才能覆盖两次备份之间的变更。实际项目中两者并存:物理备份承担灾难恢复主线,逻辑备份承担迁移与精细恢复兜底,不能用一种替代另一种。PITR 的本质是"还原全量基线 + 重放 WAL 到目标点",因此归档目录的连续性比备份集本身更关键,归档断档则断点之后不可恢复。
2.6 安全体系
openGauss 的安全模型以 pg_hba.conf 的认证规则为入口,按连接来源(本地套接字、TCP)、目标库、用户、来源网段、认证方法逐行匹配,认证方法包括 trust(免密,仅限本机)、md5、s-ha256、cert(证书)等。password_encryption_type 控制密码哈希算法。数据库内通过角色(role)与权限(GRANT/REVOKE)实现最小权限,支持模式级、表级、列级权限与行级安全策略。审计由 audit_enabled 开关控制,记录登录、权限变更、DDL 等操作到审计日志,等保场景下必须开启。生产环境还应配置 SSL 加密传输、密码复杂度策略、连接数限制与登录失败锁定。
2.7 性能优化基础
openGauss 的优化器基于代价(cost-based),EXPLAIN 展示执行计划,EXPLAIN ANALYZE 实际执行并输出每一步真实耗时。常见计划节点包括顺序扫描 Seq Scan、索引扫描 Index Scan、位图扫描 Bitmap Scan、嵌套循环 Nested Loop、哈希连接 Has-h Join、合并连接 Merge Join。优化的抓手包括:让统计信息保持新鲜(ANALYZE)、为高频过滤列建合适索引、避免 SELECT * 与隐式类型转换、控制 work_mem 让排序走内存而非落盘、用资源池(resource pool)限制大查询抢占资源。慢查询通过 log_min_duration_statement 记录,是优化的第一手线索。
代价估算的依据是统计信息中的行数、宽度、直方图与常见值列表:优化器假设谓词命中比例由统计信息推算,一旦统计信息过期,估算行数与真实行数偏差可达几个数量级,优化器就会选错连接方式与扫描方式,这是绝大多数"同样的 SQL 换个环境就变慢"的根因。因此 ANALYZE 不是一次性动作,而是随数据变化持续维护的例行工作。排序与聚合消耗的内存由 work_mem 决定,单个会话的每个排序节点独立申请一份 work_mem,并发量大时 work_mem 不是越大越好,过大反而会在并发下把内存打爆;maintenance_work_mem 只服务于建索引与 vacuum,与会话并发无关,可以给得相对宽裕。
2.8 资源池化与集群组件简述
单机之外,openGauss 的高可用与弹性形态依赖几个核心组件理解即可,本套风哥教程不展开部署:CM(Cluster Manager)是集群管理器,负责节点状态探测、故障判定与自动切换,对外提供 cm_ctl 命令完成集群启停、节点增删与切换;DMS(Distributed Memory Service)在资源池化架构中管理共享内存池与全局锁;DSS(Distributed Storage Service)提供共享存储层,多实例共享一份数据文件实现一写多读。本套风哥教程实战六采用的是最经典的一主一备物理流复制,不依赖 CM,切换由人工命令完成,学习者先掌握这条主线,再去理解 CM 自动仲裁时不会被概念淹没。
2.9 安装形态与工具链边界
openGauss 提供三种部署路径:OM 工具(openGauss-om)一键部署、gs_install 脚本部署、gs_initdb 手动初始化。OM 工具默认以 omm 用户运行并自动完成参数调优与集群编排,适合生产批量交付;手动初始化路线由学习者自己控制用户、目录与参数,适合教学与定制环境,本套风哥教程采用手动路线。所有运维命令统一带 gs_ 前缀:gs_ctl 负责实例启停、切换、日志查看;gs_initdb 负责初始化;gs_guc 负责参数与认证配置的 set、reload、check;gs_dump/gs_dumpall/gs_restore 负责逻辑备份;gs_probackup 负责物理备份;gsql 是命令行客户端;gs_checkperf 与 gs_collector 负责性能采集;gs_expansion 负责在线扩容备节点。学习者记住这个前缀家族,遇到陌生命令先查 --help 即可。
三、实战篇
实战一:两台节点操作系统环境准备(fgedu-net-cn1 与 fgedu-net-cn2)
- 点赞
- 收藏
- 关注作者
评论(0)