主库(Primary)与备库(Standby)
这是Data Guard(DG 数据卫士)架构中的概念,用于高可用和灾难恢复。
┌─────────────────────────────────────────────┐ │ Oracle Data Guard 架构 │ │ │ │ ┌─────────────┐ ┌─────────────┐ │ │ │ 主库 │◄───────►│ 备库 │ │ │ │(Primary)│ 同步 │(Standby)│ │ │ │ │ 日志 │ │ │ │ │ • 读写操作 │ │ • 只读(可开)│ │ │ │ • 生产数据 │ │ • 实时同步 │ │ │ │ • 归档日志 │────────►│ • 故障切换 │ │ │ │ │ Redo │ • 灾备保护 │ │ │ └─────────────┘ └─────────────┘ │ │ │ │ 关系: │ │ • 主库是唯一的读写库,处理所有业务 │ │ • 备库通过 Redo 日志实时或异步复制主库数据 │ │ • 主库故障时,备库可切换为主库(Failover) │ │ • 主库恢复后,可作为备库重新加入 │ └─────────────────────────────────────────────┘核心理解:两套数据库,用DG做复制。(DG 是「数据复制技术」)
备库也有两种模式
物理备库
┌─────────────────────────────────────────────┐ │ 物理备库=主库的"克隆体"│ │ │ │ 主库 备库 │ │ ┌──────┐ ┌──────┐ │ │ │数据块A│ ────► │数据块A│ ← 完全相同的块 │ │ │数据块B│ ────► │数据块B│ │ │ │数据块C│ ────► │数据块C│ │ │ └──────┘ └──────┘ │ │ │ │ 同步方式:Redo 日志应用 │ │ • 主库产生 Redo 日志 │ │ • 通过网络传输到备库 │ │ • 备库直接"回放"日志到数据块 │ │ │ │ 特点: │ │ • 数据结构、索引、表空间完全一致 │ │ • 不能打开读写(可开只读 ADG) │ │ • 切换速度快(块级恢复) │ │ • 适用于:灾备、高可用切换 │ └─────────────────────────────────────────────┘物理备库:与主库完全一样,就是主库的备库
逻辑备库
┌─────────────────────────────────────────────┐ │ 逻辑备库=主库的"SQL 重放器"│ │ │ │ 主库操作 备库执行 │ │ INSERT INTO A... ──► INSERT INTO A... │ │ UPDATE B SET... ──► UPDATE B SET... │ │ DELETE FROM C... ──► DELETE FROM C... │ │ │ │ 同步方式:SQL 语句应用 │ │ • 主库产生 Redo 日志 │ │ • 日志被解析成原始 SQL 语句 │ │ • 备库执行这些 SQL │ │ │ │ 特点: │ │ • 数据结构可以不同(可添加本地索引、分区) │ │ • 可以打开读写,做报表、ETL │ │ • 可以只同步部分表(过滤) │ │ • 切换速度慢(需重建) │ │ • 适用于:数据分析、报表、部分数据同步 │ └─────────────────────────────────────────────┘逻辑备库:有从主库表、字段到备库表、字段的映射关系,只要从主库同步过来的表能够成功与主库保持一致就行,可以与主库不同的地方(可以存在主库没有而备库有的表),可以做自己的索引/分区等优化,可以成为不止主库的备库的数据库。
对比
| 对比项 | 物理备库 | 逻辑备库 |
|---|---|---|
| 复制粒度 | 数据块 | SQL 语句 |
| 数据结构 | 必须完全一致 | 可以不同 |
| 读写状态 | 通常只读(ADG 可只读) | 可读写 |
| 同步速度 | 快 | 稍慢(需解析 SQL) |
| 切换速度 | 快 | 慢 |
| 能否过滤表 | 不能 | 能 |
| 典型用途 | 灾备、高可用 | 报表、数据分析 |
主节点与备节点
这是Real Application Clusters(RAC 真正集群应用)架构中的概念,用于负载均衡和高可用。属于共享存储架构
┌─────────────────────────────────────────────┐ │ Oracle RAC 架构 │ │ │ │ ┌─────────┐ │ │ │ 共享存储 │ ← SAN/NAS,所有节点访问 │ │ │(ASM)│ 同一套数据文件 │ │ └────┬────┘ │ │ │ │ │ ┌─────────┼─────────┐ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────┐ ┌─────┐ ┌─────┐ │ │ │节点1 │ │节点2 │ │节点3 │ │ │ │(主)│ │(备)│ │(备)│ │ │ │Instance│ │Instance│ │Instance│ │ │ └─────┘ └─────┘ └─────┘ │ │ │ │ 关系: │ │ • 多个节点共享同一套数据库文件 │ │ • 所有节点可同时读写(Active-Active) │ │ • 客户端连接任意节点,自动负载均衡 │ │ • 某节点故障,其他节点接管,业务不中断 │ │ •"主节点"通常指当前处理特定请求的实例 │ │ RAC 中无严格主备,更多是"首选实例"概念 │ └─────────────────────────────────────────────┘核心对比
| 维度 | 主库/备库(Data Guard) | 主节点/备节点(RAC) |
|---|---|---|
| 架构 | 两套独立数据库 | 一套数据库,多个实例 |
| 数据存储 | 主备各有一套数据文件 | 共享存储,一份数据文件 |
| 读写能力 | 主库读写,备库只读(或关闭) | 所有节点可同时读写 |
| 距离 | 可跨机房、跨城市(灾备) | 通常同机房(低延迟要求) |
| 切换方式 | Switchover(计划)/ Failover(故障) | 自动故障转移(TAF) |
| 核心目的 | 灾难恢复(DR) | 高可用 + 负载均衡(HA) |
| 数据延迟 | 可能有秒级/分钟级延迟 | 实时一致 |
| 成本 | 较低(备库可低配) | 较高(共享存储 + 高速网络) |
数据库的存储节点与计算节点
计算节点:
- 负责 SQL 解析、执行计划、事务处理、语法分析、连接管理(连接池,会话管理)的无状态进程
- 不存数据,只"算"数据;可以弹性扩缩容
存储节点:
- 负责数据持久化、日志存储、副本管理的分布式存储层
- 存数据文件和日志;保证多副本一致性和高可用
关键理解:计算和存储是物理资源角色。一个计算节点可以访问多个存储节点;存储节点之间自己做副本(如 3 副本),对计算层透明。
单机架构、耦合架构、分离架构、共享存储架构
单机架构:
- 最简单的架构,其他架构的起点和基础,没有高可用,最简单
- 计算、存储都在一台机器上,单台机器、单个进程
- 与其他架构的演进历程:
数据库部署形态的演进 │ ├─ Standalone(单机) │ └── 一切的起源,最简单,无高可用 │ ├─ 在 Standalone 基础上 + 复制 │ └── 主从复制 / DG 架构 │ (一台主库 + 一台或多台备库) │ ├─ 在 Standalone 基础上 + 共享存储 + 多实例 │ └── RAC 架构 │ (多台机器 + 一套共享存储,同时读写) │ └─ 把 Standalone 彻底拆开 └── 分离架构(计算存储分离) (计算层无状态 + 存储层分布式)共享存储架构:(共享存储,多活集群)
- 多个计算实例共享 一套外部存储,每个实例都有自己的进程。
- 注意:外部存储不是一个独立的服务,是一块硬件设备(磁盘列阵/SAN),通过光纤/网络暴露给多台服务器。没有逻辑、没有事务、不处理SQL
- oracle中通过软件管理层访问该外部存储。是一个oracle实例(服务/进程)
- 可以理解,共享架构下,每个计算实例都是一个数据库实例,该实例即负责“计算”,也负责与“存储”,只不过不直接操作存储文件。
- 数据库实例(计算实例)、软件管理层、外部设备之间的关系:
RAC节点1: ┌─────────────────────────────────────┐ │ 数据库实例(RAC Instance1)│ ← 处理 SQL、事务 │ 进程: PMON, SMON, DBWn, LGWR... │ └──────────────┬──────────────────────┘ │ 通过 ASM 接口访问 ▼ ┌─────────────────────────────────────┐ │ ASM 实例(ASM Instance1)│ ← 存储管理层,是进程/服务(每个 RAC 节点上都跑一个 ASM 实例。)│ 进程: ASM1, RBAL, ARBn... │ └──────────────┬──────────────────────┘ │ 读写磁盘块 ▼ 外部存储(磁盘阵列)- 关键区别
| 层级 | 是什么 | 是不是进程/服务 |
|---|---|---|
| 外部存储(磁盘阵列) | 硬件设备 | ❌ 不是 |
| ASM 实例 | Oracle 的存储管理软件 | ✅ 是进程/服务 |
| 数据库实例 | 处理 SQL 和事务 | ✅ 是进程/服务 |
耦合架构:
- 计算+存储节点在同一台机器上,没有计算节点和存储节点概念;
- 只有一个数据库实例=计算 + 存储,绑在一台机器上,存储不共享
- 相当于把计算节点与存储节点的功能放到了一起。
分离架构:
- 计算节点和存储节点是不同的服务/不同的应用进程,通过网络协议交互,存储层自己管理多副本
架构组合关系
| 可能的命名 | 实际含义 |
|---|---|
| ALONE | 纯单机,无高可用 |
| ALONE_DG | 单机 + Data Guard 备库 |
| RAC | 多节点共享存储集群 |
| RAC_DG | RAC 集群 + Data Guard 备库 |
数据库存储的内容是什么
存储节点/共享存储 中实际存储的文件: ┌─────────────────────────────────────────────┐ │ Oracle 数据库文件 │ │ │ │1. 数据文件(Data Files) │ │ • .dbf 文件 │ │ • 实际存储表数据、索引数据 │ │ • 一个表空间对应一个或多个数据文件 │ │ │ │2. 控制文件(Control Files) │ │ • 记录数据库物理结构 │ │ • 数据文件位置、日志序列号等 │ │ │ │3. 重做日志文件(Redo Log Files) │ │ • 记录所有变更操作 │ │ • 用于恢复、备库同步 │ │ │ │4. 归档日志(Archive Logs) │ │ • Redo 日志的历史备份 │ │ • Data Guard 同步就靠它 │ │ │ │5. 参数文件(SPFILE/PFILE) │ │ • 数据库启动参数 │ │ │ │6. 临时文件(Temp Files) │ │ • 排序、哈希等临时数据 │ └─────────────────────────────────────────────┘一句话总结
主库/备库是 Data Guard 架构,两套独立数据库通过日志同步,用于灾难恢复;主节点/备节点是 RAC 架构,多个实例共享一份数据,用于高可用和负载均衡。前者是"数据复制",后者是"实例集群"。生产环境常两者结合:RAC 防单点,DG 防灾难。