作者简介:丁晨,瑞蓝创数据库工程师
原创内容未经授权不得随意使用,转载请联系小编并注明来源
一、概述
1.1 背景
在 OceanBase 数据库中,自 4.1.0 版本起将主备管理方式下放到租户级别,集群级不再有主备角色概念。为了实现租户级主备的自动路由,OceanBase 引入了服务(Service) 的概念——一个服务下可以有多个同集群或跨集群的租户,用户通过 ODP 使用指定服务名连接数据库时,可自动路由到主租户。
ODP 自 V4.3.3 起支持对主备租户进行读写分离,开启后 ODP 会将非事务内的 读请求路由到备租户,其他请求(写请求、事务内请求)则 路由到主租户。
1.2 前提条件
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
⚠️ 注意: 主备租户路由功能需 OCP、ODP、OceanBase 数据库三者配合使用,缺一不可。
1.3 测试环境信息
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
二、配置步骤
步骤一:配置主备租户服务名
需要主备租户的服务名称相同,在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 管理了多个集群,每个集群都需要确认服务名配置正确。
步骤二:确认 OCP 接管与 ODP 集群关联
确保以下两个条件满足:
-
主备租户所属的集群已被 OCP 接管
-
主备租户所属的集群均关联至相同的 ODP(OBProxy)集群
说明: 本次测试环境中,主备租户在同一个集群内。
步骤三:设置备集群优先路由
登录 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');
参数说明:
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
作用:
-
读写分离时,优先将读请求路由到指定备集群(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');
⚠️ 注意:
-
enable_standby_read_write_split 配置修改 仅对新建连接生效,对已存在的连接不生效。 -
若 ODP 无法获取备租户的 Service Name 信息,会将读写请求全部发送到主租户。
步骤五:通过 Service Name 连接验证
5.1 使用 Service Name 登录
通过 SERVICE: 关键字指定服务名连接 ODP:
obclient -h192.168.5.73 -P2883 -uroot@service:mysql -paaAA11__ -A
说明: 连接串中 SERVICE: 为关键字(不区分大小写),后接服务名称。也支持以下格式:
-
root@SERVICE#mysql -
mysql-SERVICE-root
5.2 验证读请求路由到备租户
执行 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,说明读请求已成功路由到备租户。
5.3 验证写请求路由到主租户
执行写操作:
-- 写操作应路由到主租户 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 |
+--------------+---------------+---------------------------------+--------+--------------+
三、参考资料
-
OceanBase ODP官方文档-主备租户自动路由与读写分离:https://www.oceanbase.com/docs/common-odp-doc-cn-1000000006242264
-
OCP文档 - 管理服务名:https://www.oceanbase.com/docs/common-ocp-1000000006010578
-
rootservice_cluster_name 配置项说明:https://www.oceanbase.com/docs/common-odp-doc-cn-1000000006242563
-
enable_standby_read_write_split 配置项说明:https://www.oceanbase.com/docs/common-odp-doc-cn-1000000006242565
END
瑞蓝创 OceanBase OBCP V4 精英训练营
点击下方图片立即了解详情


▼ 点击「阅读原文」,了解更多产品技术文章


