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):

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

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

--主租户是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地址及其端口号):

--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表示未开启归档模式。
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并且未开启归档时,一个日志流在满足被删除的条件后会等待一定的时间才会被回收。

  1. 设置日志恢复源

使用管理员用户登录备租户或备租户所在集群的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_TENANTSGV$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.0zstd_1.0zstd_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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GottdesKrieges

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值