首批通过分布式安全可靠测评,为关键业务系统打造
部署与使用列存副本
更新时间:2026-07-14 15:58:29
为支持 TP 与 AP 混合负载等场景,OceanBase 数据库支持列存副本(COLUMNSTORE,简称 C 副本)。C 副本可部署在独立 Zone 上;用户表(含复制表,不含索引表、内部表、系统表)在该副本中以列存格式存储。
本篇文档将介绍列存副本(C 副本)在租户 Locality 中完成部署的步骤,并介绍如何使用 C 副本。
说明
访问 C 副本依赖独立 ODP(ODP V4.3.2+)与弱读 + 列存路由配置。版本基线与架构选型见 典型 AP 架构部署指南 文首说明。
使用限制与注意事项
使用限制
- C 副本与 F 或 R 副本 不支持 互相转换。
- 物理恢复 不支持恢复 C 副本;租户的 Locality 若包含 C 副本,恢复将失败。
部署建议
- 从 V4.3.5 BP1 起支持部署多个 C 副本,建议最多 3 个。
- C 副本所在 Zone 要求只部署 C 副本;访问 C 副本的独立 ODP 需 ODP V4.3.2 及以上。
- 主库未部署 C 副本时,备库不建议 部署 C 副本。
运维注意事项
- 在部署 C 副本的集群中执行 DDL 操作时,系统资源消耗通常会有所增加。其主要原因是系统在处理行存数据的同时,还需要额外处理列存数据,且提交日志(clog)也需同步写入对应副本,因此会对 CPU、内存、磁盘和 I/O 等资源带来更高压力。
- C 副本 合并 通常慢于 F/R;上一轮合并未完成时,无法发起新一轮租户级合并。手动合并前建议查看 CDB_OB_ZONE_MAJOR_COMPACTION、DBA_OB_ZONE_MAJOR_COMPACTION,详见 查看合并信息。
部署列存副本
在租户 Locality 中指定 C 副本即可,常见两类操作:
- 场景 A:新建租户时即包含 C 副本。
- 场景 B:为已有租户增加 C 副本(新 Zone + 调整 Locality)。
以下 SQL 示例中的 CPU、内存、磁盘等数值仅为示例参考,请按实际负载与资源规划调整。
场景 A:新建包含 C 副本的租户
假设当前有一个已部署好的集群,且集群的部署模式为 2F1A(两副本 + 1 个仲裁服务)。集群中的 3 个 Zone 分别为 zone1、zone2、zone3,仲裁服务部署在 zone3 上。需要在该集群上创建一个含有 C 副本的租户,步骤如下:
说明
C 副本不能替代仲裁(A)。在 3 Zone 场景下,可直接配置 F@zone1,F@zone2,C@zone3,不要求必须新增第 4 个 Zone。
找到一台能够与当前集群网络互通的机器,并在该机器上部署 专用于访问 C 副本 的 ODP(部署与版本要求见上节)。
独立 ODP 可部署在任意与集群网络互通的主机上,并非必须使用独占物理服务器。为防止资源争抢,建议 ODP 单独部署在一台机器上。部署 ODP 时,要求其版本必须为 ODP V4.3.2 及以上版本。有关部署 ODP 的详细操作,参见 部署 ODP。
为租户创建资源单元
unit1。CREATE RESOURCE UNIT unit1, MAX_CPU=5, MIN_CPU=5, MEMORY_SIZE= '32G', MAX_IOPS=10000, MIN_IOPS=5000, LOG_DISK_SIZE=5301023539200;为租户创建资源池
pool1,指定资源单元为unit1。CREATE RESOURCE POOL pool1 UNIT='unit1', UNIT_NUM = 1, ZONE_LIST = ('zone1','zone2','zone3');创建一个租户
tenant_c,指定其 Locality 为F@zone1,F@zone2,C@zone3。CREATE TENANT tenant_c LOCALITY = 'F@zone1,F@zone2,C@zone3', PRIMARY_ZONE='zone1;zone2,zone3', RESOURCE_POOL_LIST=('pool1') SET ob_tcp_invited_nodes = '%';本示例中,创建的租户默认为 MySQL 兼容模式租户,如果需要创建 Oracle 兼容模式租户,需要通过系统变量 ob_compatibility_mode 显式指定
ob_compatibility_mode='oracle'。
场景 B:为已有租户增加 C 副本
假设当前集群中有一个名为 tenant_c 的租户,其 Locality 为 F@zone1,F@zone2,F@zone3,租户的资源池为 pool1,其 ZONE_LIST 范围为 'zone1','zone2','zone3'。现在需要为租户增加 C 副本,可以增加 zone4,然后修改租户的 Locality 为 F@zone1,F@zone2,F@zone3,C@zone4,步骤如下:
说明
新增第 4 个 Zone 仅适用于希望将 C 副本放在独立 Zone 的场景;不是部署 C 副本的前置条件。若 3 Zone 拓扑已满足隔离诉求,可直接在现有 Zone 上配置 C 副本(如 F@zone1,F@zone2,C@zone3)。
在集群中添加新的 Zone zone4。添加 Zone 的详细操作,参见 添加 Zone。
向 zone4 内增加节点。添加节点的详细操作,参见 添加节点。
创建资源单元
unit2。CREATE RESOURCE UNIT unit2, MAX_CPU=5, MIN_CPU=5, MEMORY_SIZE= '32G', MAX_IOPS=10000, MIN_IOPS=5000, LOG_DISK_SIZE=5301023539200;创建资源池
pool2,指定资源单元为unit2。CREATE RESOURCE POOL pool2 UNIT = 'unit2', UNIT_NUM = 1, ZONE_LIST = ('zone4');为租户增加资源池
pool2。ALTER TENANT tenant_c RESOURCE_POOL_LIST = ('pool1','pool2');注意
RESOURCE_POOL_LIST是整表替换语义:需要同时写出已有资源池与新增资源池。若只写('pool2'),会将原有资源池解绑。修改租户的 Locality 为
F@zone1,F@zone2,F@zone3,C@zone4。ALTER TENANT tenant_c LOCALITY = 'F@zone1,F@zone2,F@zone3,C@zone4';
使用列存副本
通过独立 ODP 访问 C 副本
访问 C 副本时,需要 单独部署一套 ODP(ODP V4.3.2+),业务经该 ODP 将请求发送到 C 副本:在其上配置弱读、路由与 init_sql(常见 ob_route_policy = COLUMN_STORE_ONLY 等),完整示例见下文。
多机房场景下,若同时需要机房亲和路由(LDC)与列存路由,请将其视为两个独立配置维度;相关通用问答见 AP FAQ。
部署 ODP
在可与集群互通的机器上部署 专用于访问 C 副本 的 ODP,版本 不低于 ODP V4.3.2。步骤见 部署 ODP。
配置路由转发策略及弱读
使用 root@proxysys 登录该 ODP,例如:
obclient -uroot@proxysys -h10.10.10.1 -P2883 -p
常用配置项说明
下表列出了与列存弱读访问相关的常用 ODP 配置项。
| 配置项 | 说明 |
|---|---|
obproxy_read_only |
是否仅转发只读请求等代理只读模式相关行为;与弱读、路由配合使用时请按实际 ODP 版本说明设置。 |
obproxy_read_consistency |
读一致性级别;示例中 = 1 常表示弱一致性读(以当前 ODP 文档为准),便于配合路由到从副本/C 副本。 |
proxy_primary_zone_name |
将请求优先路由到指定 Zone(常用于已知 C 副本所在 Zone、希望弱读流量按 Zone 收敛)。 |
init_sql |
连接建立后自动执行的 SQL;常用 set @@ob_route_policy = COLUMN_STORE_ONLY 使优化器生成列存路径。 |
route_target_replica_type |
按副本类型路由,例如 ColumnStore 表示选择列存副本(不依赖写死 Zone 名)。 |
proxy_route_policy |
路由策略枚举;例如 TARGET_REPLICA_TYPE_FOLLOWER_ONLY 表示弱读时仅选从副本类路由,从副本不可用时断开连接等(以 ODP 说明为准)。 |
场景组合
| 组合 | 适用场景 | proxy_primary_zone_name |
route_target_replica_type |
init_sql |
proxy_route_policy(可选) |
|---|---|---|---|---|---|
| 组合一 | 已明确 C 副本所在 Zone,希望弱读按 Zone 收敛 | 设为 C 副本所在 Zone,例如 'zone4' |
不依赖(可保持默认) | set @@ob_route_policy = COLUMN_STORE_ONLY |
按需,见下方「组合二」可选段 |
| 组合二 | 更希望按副本类型选列存,而不绑定固定 Zone 名 | 可不设置或按需 | 'ColumnStore' |
set @@ob_route_policy = COLUMN_STORE_ONLY |
若需「仅从副本、不可用则断连」等,可设 TARGET_REPLICA_TYPE_FOLLOWER_ONLY(见下) |
组合一:执行示例(弱读 + 按 Zone 指向 C 副本)
-- 配置只读与弱读相关项
obclient> ALTER PROXYCONFIG SET obproxy_read_only = 0;
obclient> ALTER PROXYCONFIG SET obproxy_read_consistency = 1;
-- 配置弱读情况下,ODP 所有请求仅路由到 C 副本所在的 Zone,同时生成 C 副本的查询计划。例如, C 副本所在的 Zone 为 zone4。
obclient> ALTER PROXYCONFIG SET proxy_primary_zone_name='zone4';
obclient> ALTER PROXYCONFIG SET init_sql='set @@ob_route_policy = COLUMN_STORE_ONLY';
组合二:执行示例(弱读 + 按副本类型 ColumnStore)
-- 配置只读与弱读相关项
obclient> ALTER PROXYCONFIG SET obproxy_read_only = 0;
obclient> ALTER PROXYCONFIG SET obproxy_read_consistency = 1;
-- 配置弱读情况下,所有请求仅路由到 C 副本,同时生成 C 副本的查询计划:
obclient> ALTER PROXYCONFIG SET route_target_replica_type = 'ColumnStore';
-- 配置弱读情况下,所有请求仅选择从副本,当从副本都不可用时,断开和客户端的连接:
obclient> ALTER PROXYCONFIG SET init_sql='set @@ob_route_policy = COLUMN_STORE_ONLY';
修改成功后,可用以下语句核对:
obclient> SHOW PROXYCONFIG ALL LIKE 'obproxy_read_only';
obclient> SHOW PROXYCONFIG ALL LIKE 'obproxy_read_consistency';
obclient> SHOW PROXYCONFIG ALL LIKE 'proxy_primary_zone_name';
obclient> SHOW PROXYCONFIG ALL LIKE 'init_sql';
obclient> SHOW PROXYCONFIG ALL LIKE 'route_target_replica_type';
obclient> SHOW PROXYCONFIG ALL LIKE 'proxy_route_policy';
配置成功后,OLAP 业务通过该 独立 ODP 接入,将查询定向到 C 副本。