OceanBase主备库日志传输服务

OceanBase主备库日志传输服务

两种备库模式对比

📖根据主备库之间的日志传输服务,可以分为基于日志归档的物理备库和基于网络的物理备库:

  • 基于日志归档的物理备库 :物理备库的Redo日志来源于主租户或其他备租户的日志归档。因此主租户必须开启归档 ,并且备租户必须能够访问到主租户的归档日志(主租户使用NFS或OSS作为归档目的端)。
  • 基于网络的物理备库:备租户直接通过网络连接主租户或其他备租户读取日志。主库可以开启归档,也可以关闭归档。主库关闭归档时,备库读取的是主租户的在线日志。

⚠️ 注意事项:

  • OB主备租户可以位于同一集群 或者不同集群。
  • 同一套主备关系仅支持使用相同的同步方式。也就是说,如果是一主多备,要么所有备库都基于日志归档,要么所有备库都基于网络同步。
  • 基于日志归档的部署场景中,目前支持的存储介质有NFS (网络共享文件系统)和OSS对象存储。
  • 目前OB物理备库仅支持异步同步的模式。
功能项 基于日志归档的物理备库 基于网络的物理备库
是否支持Switchover 支持 支持
是否支持Failover 支持 支持
是否支持一个主库对接多个备库 支持 支持
是否支持级联备库 支持 支持
是否为异步同步 是 是
是否支持最大可用或最大保护模式 不支持 不支持
是否支持备库限速 不支持 支持,集群级限速
备库的数据源 归档日志 主库的在线日志或归档日志,支持自动切换
是否要求主库开启归档模式 要求(否则无法创建备租户) 不要求(但建议主库开启归档)
是否要求备库开启归档模式 要求(否则无法执行Switchover) 不要求(但建议备库开启归档)
实时性 秒级 ~ 分钟级 秒级
日志归档支持的存储介质 OSS/NFS 不涉及

配置日志恢复源

根据主备库之间的日志传输服务,可以分为基于日志归档的物理备库和基于网络的物理备库。前者要求主库必须开启归档。

无论是基于日志归档的物理备库,还是基于网络的物理备库,都需要为备租户设置日志恢复源。两种部署方式的日志恢复源支持随时按需动态修改,同时也支持从一种日志恢复源切换为另外一种日志恢复源。

⭐️ 根据主租户是否开启了归档、以及归档目的端来决定使用哪一种备库模式:

  • 主租户没有开启归档:备租户只能是基于网络的物理备库。
  • 主租户开启了归档,并且使用本地文件系统(仅限单机)作为归档目的端:备租户只能是基于网络的物理备库。
  • 主租户开启了归档,并且使用NFS或OSS等共享存储作为归档目的端:备租户既可以是基于网络的物理备库,也可以是基于归档的物理备库。

基于日志归档的物理备库

基于日志归档的物理备库中,物理备库的Redo日志来源于主租户或其他备租户的日志归档,类似于Oracle数据库的Far Sync。

  • 备租户仅与日志归档交互,而不会和上游的主租户或备租户有任何其他形式的交互。
  • 在该部署模式下,备租户与上游租户不需要网络联通,但其同步性能和可用性会受到日志归档介质的影响。
  • 主租户必须开启归档 ,并且备租户必须能够访问到主租户的归档日志(主租户使用NFS或OSS作为归档目的端)。

使用管理员用户登录备租户或备租户所在集群的sys租户。

🐘 配置备租户的恢复源指向主租户的归档目的端(假设备租户为standby_tenant):

  • 主库使用NFS归档:
sql 复制代码
ALTER SYSTEM SET LOG_RESTORE_SOURCE ='location=file:///data/1/sh_archive' TENANT = standby_tenant;
  • 主库使用OSS归档:`
sql 复制代码
ALTER SYSTEM SET LOG_RESTORE_SOURCE ='location=oss://oceanbase-test-bucket/backup/archive?host=****.aliyun-inc.com&access_id=****&access_key=****' TENANT = standby_tenant;

基于网络的物理备库

基于网络的物理备库中,备租户直接通过网络连接主租户或其他备租户读取日志,类似于MySQL数据库的Replication。

  • 在该部署模式下,备租户和主租户的网络需要联通。备租户会通过网络发送RPC请求读取主租户集群中的Redo日志。
  • 备租户从主租户读取的日志,既可以是主租户的在线日志 ,也可以是主租户的归档日志(主租户开启了日志归档模式的前提下),两种日志来源支持自动切换,对备租户以及业务的使用者透明。

🐘 配置备租户的恢复源指向主租户的归档目的端(假设备租户为standby_tenant):

  1. 创建访问系统视图的用户。

由于备租户是只读的,需要在主租户上面创建并授权用户。

sql 复制代码
--主租户是MySQL模式
CREATE USER rep_user IDENTIFIED BY '******';
GRANT SELECT ON oceanbase.* TO rep_user;

--主租户是Oracle模式
CREATE USER rep_user IDENTIFIED BY ******;
GRANT STANDBY_REPLICATION TO rep_user;
  1. 获取主租户或源端的备租户的访问入口信息。

使用管理员用户登录主租户或级联的上游源端的备租户。

获取访问入口信息(OBServer节点的IP地址及其端口号):

sql 复制代码
--SYS租户
SELECT * FROM oceanbase.CDB_OB_ACCESS_POINT;

--主租户是MySQL模式
SELECT * FROM oceanbase.DBA_OB_ACCESS_POINT;

--主租户是Oracle模式
SELECT * FROM SYS.DBA_OB_ACCESS_POINT;
  1. 检查主租户设置。

在当前主备架构下,当主租户进行缩容、Transfer等操作后,容易出现主租户的日志流被删除、日志被回收从而导致备租户日志同步卡住的问题。为了解决该问题,需要在主租户上开启归档模式、或者为主租户设置租户级配置项ls_gc_delay_time。

  • 检查主租户是否开启归档模式:ARCHIVELOG表示主租户已开启归档模式,NOARCHIVELOG表示未开启归档模式。
sql 复制代码
SELECT LOG_MODE FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME='tenant_name';
  • 检查主租户上配置项ls_gc_delay_time的值是否大于0s:
sql 复制代码
SHOW PARAMETERS LIKE '%ls_gc_delay_time%';

租户级配置项ls_gc_delay_time用于配置日志流的延迟删除时间,默认值为0s,表示未开启日志流延迟删除功能。当设置了配置项ls_gc_delay_time并且未开启归档时,一个日志流在满足被删除的条件后会等待一定的时间才会被回收。

  1. 设置日志恢复源。

使用管理员用户登录备租户或备租户所在集群的sys租户。

执行以下命令,设置日志恢复源:

sql 复制代码
ALTER SYSTEM SET LOG_RESTORE_SOURCE ='SERVICE=$ip_list USER=$user_name@$tenant_name PASSWORD=$password' TENANT = standby_tenant_name;

其中:

  • $ip_list:主租户所在副本的OBServer节点的IP及SQL端口号(默认为2881)。此处填写步骤2中获取的访问入口信息。如果有多个OBServer节点信息,可以不用填写全部OBServer节点的信息。
  • $user_name:步骤1中创建的访问视图的专用用户。
  • $tenant_name:待连接的主租户名或级联的上游源端备租户名。
  • $password:步骤1中创建的访问视图的专用用户口令。

示例:

sql 复制代码
ALTER SYSTEM SET LOG_RESTORE_SOURCE = 'SERVICE=11.xx.xx.22:17855;11.xx.xx.23:17857;11.xx.xx.24:17859 USER=rep_user@mysql_tenant PASSWORD=******' TENANT = standby_tenant;

设置成功后,sys租户或用户租户可以分别通过CDB_OB_LOG_RESTORE_SOURCE视图和DBA_OB_LOG_RESTORE_SOURCE视图,确认日志恢复源是否修改成功。

sql 复制代码
select * from oceanbase.CDB_OB_LOG_RESTORE_SOURCE;

⭐️ sys租户下检查备租户的日志恢复源是基于归档 还是基于网络:

  • TYPE列为LOCATION,表示备租户是通过主租户或源端的备租户的日志归档来同步日志。
  • TYPE列为SERVICE,表示备租户是通过网络连接主租户或源端的备租户来同步日志。
sql 复制代码
SELECT * FROM oceanbase.CDB_OB_LOG_RESTORE_SOURCE;

配置日志恢复终点

使用管理员用户登录备租户或备租户所在集群的sys租户。

使用sys租户执行RECOVER命令,设置备租户的日志恢复终点。

sql 复制代码
ALTER SYSTEM RECOVER STANDBY TENANT = standby_tenant_name UNTIL UNLIMITED;

执行该语句后,备租户会进入持续同步模式。

查看日志恢复源信息

CDB_OB_LOG_RESTORE_SOURCE视图和DBA_OB_LOG_RESTORE_SOURCE视图中记录了日志恢复源信息。

登录备租户所在集群的SYS租户。

查看日志恢复源信息:

sql 复制代码
--SYS租户下
SELECT * FROM oceanbase.CDB_OB_LOG_RESTORE_SOURCE;

--MySQL租户下
SELECT * FROM oceanbase.DBA_OB_LOG_RESTORE_SOURCE;

--Oracle租户下
SELECT * FROM SYS.DBA_OB_LOG_RESTORE_SOURCE;

其中:

  • TYPE列为LOCATION,表示备租户是通过主租户或源端的备租户的日志归档来同步日志。
  • TYPE列为SERVICE,表示备租户是通过网络连接主租户或源端的备租户来同步日志。

查看日志链路信息:

sql 复制代码
--SYS租户下
SELECT * FROM oceanbase.GV$OB_LOG_TRANSPORT_DEST_STAT;

--MySQL租户下
SELECT * FROM oceanbase.GV$OB_LOG_TRANSPORT_DEST_STAT;

--Oracle租户下
SELECT * FROM SYS.GV$OB_LOG_TRANSPORT_DEST_STAT;

查看日志同步进度

对于主租户而言,每个主租户至少有两个日志流,即一个系统日志流,一个普通日志流。备租户与主租户的日志流数相同,也至少有两个日志流,其日志同步进度需要考虑多个日志流的总同步进度。

在同一个租户内,不同日志流之间的同步时间是可比较的,备租户总的同步进度为每个日志流同步进度的最小值。

登录备租户所在集群的SYS租户。

sql 复制代码
obclient(root@sys)[oceanbase]> SELECT TENANT_NAME, TENANT_ID, TENANT_ROLE, SCN_TO_TIMESTAMP(SYNC_SCN) 
FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'beizuhu';
+-------------+-----------+-------------+----------------------------+
| TENANT_NAME | TENANT_ID | TENANT_ROLE | SCN_TO_TIMESTAMP(SYNC_SCN) |
+-------------+-----------+-------------+----------------------------+
| beizuhu     |      1008 | STANDBY     | 2025-09-28 09:49:13.137952 |
+-------------+-----------+-------------+----------------------------+
1 row in set (0.011 sec)

查询结果中,SCN_TO_TIMESTAMP(SYNC_SCN)列显示了备租户当前的同步进度。将该时间与实际时间进行对比,如果相差较多,则表示备租户的同步进度落后于主租户。

确认备租户同步进度较慢之后,可以执行以下命令,进一步查询同步进最慢的日志流。

sql 复制代码
SELECT LS_ID, SCN_TO_TIMESTAMP(END_SCN) FROM oceanbase.GV$OB_LOG_STAT WHERE TENANT_ID = 1008 AND ROLE = 'LEADER';

备租户也可以看自己的日志同步进度:

sql 复制代码
--MySQL租户下
SELECT TENANT_NAME, TENANT_ROLE, SCN_TO_TIMESTAMP(SYNC_SCN) FROM oceanbase.DBA_OB_TENANTS;

--Oracle租户下
SELECT TENANT_NAME, TENANT_ROLE, SCN_TO_TIMESTAMP(SYNC_SCN) FROM SYS.DBA_OB_TENANTS;

暂停或开启日志同步

备租户在日志同步过程中,支持暂停日志同步以及暂停后重新开启日志同步。

暂停日志同步

登录备租户所在集群的SYS租户。

暂停日志同步:

sql 复制代码
ALTER SYSTEM RECOVER STANDBY [TENANT = tenant_name] CANCEL ;

仅在使用sys租户执行命令时,才需要在语句中添加TENANT=tenant_name参数指定备租户名。

暂停日志同步后,备租户不会再从主租户同步任何日志。需要尽量避免因暂停日志同步而导致的备租户日志断流。

暂停同步后,可以分别查询DBA_OB_TENANTS和GV$OB_LOG_STAT视图,发现此时日志流的同步进度会停留在命令执行的时间点。

开启日志同步

暂停日志同步后,可以通过更改备租户恢复终点的方式再次开启日志同步。

登录备租户所在集群的SYS租户。

sql 复制代码
ALTER SYSTEM RECOVER STANDBY [TENANT = tenant_name] UNTIL UNLIMITED;

仅在使用sys租户执行命令时,才需要在语句中添加TENANT=tenant_name参数指定备租户名。

开启日志同步压缩

在备租户的日志同步过程中,可以开启日志同步压缩,以便减少日志传输过程中所使用的带宽。

⭐️ 租户级配置项log_transport_compress_all用于设置日志传输是否开启压缩,默认值为False,表示日志传输不开启压缩。

登录备租户所在集群的SYS租户。

系统租户下指定备租户开启日志同步压缩:

sql 复制代码
ALTER SYSTEM SET log_transport_compress_all = True TENANT = beizuhu;

开启日志同步压缩后,系统默认会按照压缩算法lz4_1.0对日志进行压缩。

如果需要修改压缩算法,可修改配置项log_transport_compress_func的值。

⭐️ 租户级配置项log_transport_compress_func用于设置日志传输所使用的压缩算法,当前支持的压缩算法有lz4_1.0、zstd_1.0和zstd_1.3.8,默认为lz4_1.0。

系统租户下修改指定备租户的压缩算法:

sql 复制代码
ALTER SYSTEM SET log_transport_compress_func = 'zstd_1.0' TENANT = beizuhu;

References

【1】https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000003379237

相关推荐
BLUcoding2 小时前
接口服务公网超时排查记录:SecureRandom 阻塞问题分析与解决
java·linux·springboot·aes·securerandom
AIgorithmGEEK2 小时前
[Linux]从手写报头到内核套路:序列化、反序列化与自定义协议全链路
linux·运维·服务器·网络·序列化·反序列化
Nil2082 小时前
leetcode 139单词拆分
linux·运维·服务器
Starry-sky(jing)2 小时前
BUG: unable to handle kernel paging request 完整排查:dmesg 四要素与三路定罪
linux·运维·服务器·内核·排障
mounter6253 小时前
从硬件互连到操作系统变革:CXL 技术演进与 Linux 内核工程挑战
linux·运维·服务器
xh didida4 小时前
Linux -- 基础IO
linux·服务器·开发语言·c++
zly35005 小时前
centos7 mount设备挂载 /dev/sda1/硬盘挂载
linux·运维·服务器
工业一体机老司机5 小时前
工业一体机选购后的系统部署:Ubuntu下Docker容器化运行与GPIO配置
linux·ubuntu·docker·人机交互
哎呦,帅小伙哦6 小时前
进程监控工具——htop
linux·运维·服务器
夏虫不可与之言冰6 小时前
Windows WSL2 (Ubuntu) 搭建 ESP‑IDF 6.1 开发环境全过程演示
linux·windows·ubuntu·esp32·乐鑫科技·乐鑫eim·乐鑫代理商