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_TENANTSGV$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.0zstd_1.0zstd_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

相关推荐
stark张宇2 小时前
VMware Workstation 17.5.1 网络故障排查:解决 NAT 模式无法访问外网问题
linux·centos
云动雨颤2 小时前
Linux运维必备:3个内存问题排查命令
linux·运维
铭哥的编程日记2 小时前
【Linux】Ext系列文件系统
linux·服务器
神秘人X7072 小时前
Keepalived 高可用配置文档
linux·keepalived·高可用
霖.242 小时前
四种常用SVC(service)及其与Ingress协作方式
linux·服务器·云原生·kubernetes·k8s
songyuc3 小时前
【Ubuntu】请问,『kill -9』跟『kill -15』有区别吗?
linux·ubuntu
iconball3 小时前
个人用云计算学习笔记 --15. (Linux 系统启动原理、Linux 防火墙管理))
linux·运维·笔记·学习·云计算
dragoooon343 小时前
[Linux基础——Lesson2.Linux的基本指令使用]
linux·运维·服务器
NiKo_W3 小时前
Linux 基础IO与系统IO
linux·io·文件系统