联系我们
18591797788
hubin@rlctech.com
北京市海淀区中关村南大街乙12号院天作国际B座1708室
18681942657
lvyuan@rlctech.com
上海市浦东新区商城路660号乐凯大厦26c-1
18049488781
xieyi@rlctech.com
广州市越秀区东风东路华宫大厦808号1608房
029-81109312
service@rlctech.com
西安市高新区天谷七路996号西安国家数字出版基地C座501
在 OceanBase 数据库中,自 4.1.0 版本起将主备管理方式下放到租户级别,集群级不再有主备角色概念。为了实现租户级主备的自动路由,OceanBase 引入了 服务(Service) 的概念——一个服务下可以有多个同集群或跨集群的租户,用户通过 ODP 使用指定服务名连接数据库时,可自动路由到主租户。
ODP 自 V4.3.3 起支持对主备租户进行读写分离,开启后 ODP 会将非事务内的 读请求路由到备租户,其他请求(写请求、事务内请求)则 路由到主租户。
| 组件 | 版本要求 |
|---|---|
| OCP | V4.3.1 或之后版本 |
| ODP | V4.3.1 或之后版本(读写分离需 V4.3.3+) |
| OceanBase 数据库 | V4.2.4 或之后的 V4.2.x 系列版本 |
注意: 主备租户路由功能需 OCP、ODP、OceanBase 数据库三者配合使用,缺一不可。
| 项目 | 值 |
|---|---|
| 主租户 | test_mysql( tenant_id: 1004) |
| 备租户 | mysql_bak(tenant_id: 1010) |
| 服务名 | (Service Name) mysql |
| ODP 地址 | 192.168.5.73:2883 |
| 备集群名称 | ob4421 |
| ODP MetaDB 连接 | obclient -h192.168.5.73 -P2883 -uproot@proxysys -paaAA11__ |
需要主备租户的服务名称相同,在OCP上进行配置

主备租户读写分离的前提是主备租户具有 相同的服务名。登录系统租户(sys),查询指定服务名下关联的所有租户:
SELECT t.tenant_id, t.tenant_name
FROM oceanbase.CDB_OB_SERVICES AS s
JOIN DBA_OB_TENANTS AS t
ON s.tenant_id = t.tenant_id
WHERE s.service_name = 'mysql';
预期输出:
+-----------+-------------+
| tenant_id | tenant_name |
+-----------+-------------+
| 1004 | test_mysql |
| 1010 | mysql_bak |
+-----------+-------------+
确认主租户 test_mysql 和备租户 mysql_bak 均已关联到服务名 mysql。
说明: 服务名在 OCP 白屏化创建主备租户时配置,详细介绍可参见 OCP 文档《管理服务名》。如果 OCP 管理了多个集群,每个集群都需要确认服务名配置正确。
确保以下两个条件满足:

说明: 本次测试环境中,主备租户在同一个集群内。
登录 ODP 的 MetaDB,配置 rootservice_cluster_name 参数,指定读写分离时优先路由的备集群。
-- 登录 ODP 的 MetaDB
-- obclient -h -P -uproot@proxysys -p
REPLACE INTO proxy_config(cluster_name, tenant_name, name, value, config_level)
VALUES ('', 'service:mysql', 'rootservice_cluster_name', 'ob4421', 'LEVEL_TENANT');
参数说明:
| 参数 | 说明 |
|---|---|
| cluster_name | 为空字符串 |
| tenant_name | 格式为 service:,本例为 service:mysql |
| name | 配置项名称 rootservice_cluster_name |
| value | 备租户所在的集群名称,本例为 ob4421 |
| config_level | 配置级别 LEVEL_TENANT |
作用:
读写分离时,优先将读请求路由到指定备集群(ob4421)上的备租户
如果不配置此参数,ODP 默认将读请求发给缓存中的第一个备租户
继续在 ODP 的 MetaDB 中执行,开启主备租户读写分离功能:
REPLACE INTO proxy_config(cluster_name, tenant_name, name, value, config_level)
VALUES ('', 'service:mysql', 'enable_standby_read_write_split', 'true', 'LEVEL_TENANT');
注意:
通过 SERVICE: 关键字指定服务名连接 ODP:
obclient -h192.168.5.73 -P2883 -uroot@service:mysql -paaAA11__ -A
说明: 连接串中 SERVICE: 为关键字(不区分大小写),后接服务名称。也支持以下格式:
执行 SELECT 查询,验证读请求是否路由到备租户:
-- 执行查询
SELECT * FROM t1 LIMIT 1;
预期输出:
+------+
| id |
+------+
| 1 |
+------+
获取 trace_id 并查看路由详情:
-- 获取上次执行的 trace_id
SELECT last_trace_id();
+-----------------------------------+
| last_trace_id() |
+-----------------------------------+
| YB42C0A8054B-00065500AB0CE52A-0-0 |
+-----------------------------------+
-- 通过 sql_audit 查看路由详情
SELECT * FROM oceanbase.gv$ob_sql_audit
WHERE trace_id = 'YB42C0A8054B-00065500AB0CE52A-0-0'\G;
关键字段确认:
TENANT_ID: 1010 -- 备租户 ID
TENANT_NAME: mysql_bak -- 备租户名称
TENANT_NAME 显示为 mysql_bak,说明读请求已成功路由到备租户。
执行写操作:
-- 写操作应路由到主租户 test_mysql
INSERT INTO t1 VALUES (2);
通过 gv$ob_sql_audit 查看,查询sql_audit信息为空,但是根据trace_id查看日志发现确实是路由到了主租户执行。

登录 ODP 的 MetaDB,查看当前主备租户读写分离的配置:
SELECT cluster_name, tenant_name, name, value, config_level
FROM proxy_config
WHERE tenant_name LIKE 'service:%';
预期输出:
+--------------+---------------+---------------------------------+--------+--------------+
| cluster_name | tenant_name | name | value | config_level |
+--------------+---------------+---------------------------------+--------+--------------+
| | service:mysql | rootservice_cluster_name | ob4421 | LEVEL_TENANT |
| | service:mysql | enable_standby_read_write_split | true | LEVEL_TENANT |
+--------------+---------------+---------------------------------+--------+--------------+