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归档:
ALTER SYSTEM SET LOG_RESTORE_SOURCE ='location=file:///data/1/sh_archive' TENANT = standby_tenant;
- 主库使用OSS归档:`
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
):
- 创建访问系统视图的用户。
由于备租户是只读的,需要在主租户上面创建并授权用户。
--主租户是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;
- 获取主租户或源端的备租户的访问入口信息。
使用管理员用户登录主租户或级联的上游源端的备租户。
获取访问入口信息(OBServer节点的IP地址及其端口号):
--SYS租户
SELECT * FROM oceanbase.CDB_OB_ACCESS_POINT;--主租户是MySQL模式
SELECT * FROM oceanbase.DBA_OB_ACCESS_POINT;--主租户是Oracle模式
SELECT * FROM SYS.DBA_OB_ACCESS_POINT;
- 检查主租户设置。
在当前主备架构下,当主租户进行缩容、Transfer等操作后,容易出现主租户的日志流被删除、日志被回收从而导致备租户日志同步卡住的问题。为了解决该问题,需要在主租户上开启归档模式、或者为主租户设置租户级配置项ls_gc_delay_time
。
- 检查主租户是否开启归档模式:
ARCHIVELOG
表示主租户已开启归档模式,NOARCHIVELOG
表示未开启归档模式。
SELECT LOG_MODE FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME='tenant_name';
- 检查主租户上配置项
ls_gc_delay_time
的值是否大于0s:
SHOW PARAMETERS LIKE '%ls_gc_delay_time%';
租户级配置项
ls_gc_delay_time
用于配置日志流的延迟删除时间,默认值为0s
,表示未开启日志流延迟删除功能。当设置了配置项ls_gc_delay_time
并且未开启归档时,一个日志流在满足被删除的条件后会等待一定的时间才会被回收。
- 设置日志恢复源。
使用管理员用户登录备租户或备租户所在集群的sys租户。
执行以下命令,设置日志恢复源:
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中创建的访问视图的专用用户口令。
示例:
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
视图,确认日志恢复源是否修改成功。
select * from oceanbase.CDB_OB_LOG_RESTORE_SOURCE;
⭐️ sys租户下检查备租户的日志恢复源是基于归档还是基于网络:
TYPE
列为LOCATION,表示备租户是通过主租户或源端的备租户的日志归档来同步日志。TYPE
列为SERVICE,表示备租户是通过网络连接主租户或源端的备租户来同步日志。
SELECT * FROM oceanbase.CDB_OB_LOG_RESTORE_SOURCE;
配置日志恢复终点
使用管理员用户登录备租户或备租户所在集群的sys租户。
使用sys租户执行RECOVER命令,设置备租户的日志恢复终点。
ALTER SYSTEM RECOVER STANDBY TENANT = standby_tenant_name UNTIL UNLIMITED;
执行该语句后,备租户会进入持续同步模式。
查看日志恢复源信息
CDB_OB_LOG_RESTORE_SOURCE
视图和DBA_OB_LOG_RESTORE_SOURCE
视图中记录了日志恢复源信息。
登录备租户所在集群的SYS租户。
查看日志恢复源信息:
--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
,表示备租户是通过网络连接主租户或源端的备租户来同步日志。
查看日志链路信息:
--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租户。
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)
列显示了备租户当前的同步进度。将该时间与实际时间进行对比,如果相差较多,则表示备租户的同步进度落后于主租户。
确认备租户同步进度较慢之后,可以执行以下命令,进一步查询同步进最慢的日志流。
SELECT LS_ID, SCN_TO_TIMESTAMP(END_SCN) FROM oceanbase.GV$OB_LOG_STAT WHERE TENANT_ID = 1008 AND ROLE = 'LEADER';
备租户也可以看自己的日志同步进度:
--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租户。
暂停日志同步:
ALTER SYSTEM RECOVER STANDBY [TENANT = tenant_name] CANCEL ;
仅在使用sys租户执行命令时,才需要在语句中添加TENANT=tenant_name
参数指定备租户名。
暂停日志同步后,备租户不会再从主租户同步任何日志。需要尽量避免因暂停日志同步而导致的备租户日志断流。
暂停同步后,可以分别查询DBA_OB_TENANTS
和GV$OB_LOG_STAT
视图,发现此时日志流的同步进度会停留在命令执行的时间点。
开启日志同步
暂停日志同步后,可以通过更改备租户恢复终点的方式再次开启日志同步。
登录备租户所在集群的SYS租户。
ALTER SYSTEM RECOVER STANDBY [TENANT = tenant_name] UNTIL UNLIMITED;
仅在使用sys租户执行命令时,才需要在语句中添加TENANT=tenant_name
参数指定备租户名。
开启日志同步压缩
在备租户的日志同步过程中,可以开启日志同步压缩,以便减少日志传输过程中所使用的带宽。
⭐️ 租户级配置项
log_transport_compress_all
用于设置日志传输是否开启压缩,默认值为False,表示日志传输不开启压缩。
登录备租户所在集群的SYS租户。
系统租户下指定备租户开启日志同步压缩:
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
。
系统租户下修改指定备租户的压缩算法:
ALTER SYSTEM SET log_transport_compress_func = 'zstd_1.0' TENANT = beizuhu;
References
【1】https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000003379237