首批通过分布式安全可靠测评,为关键业务系统打造
日志存储服务
更新时间:2025-10-21 14:32:59
日志存储服务为物理备库提供高可用、高可靠的日志存储和读写能力。日志存储服务既支持单副本,也支持多副本,并通过使用 Paxos 协议来实现高可用。
日志流的工作模式
主租户和备租户中的日志存储服务使用了两种不同的工作模式:
APPEND 模式
主租户上使用 APPEND 模式。在该模式下,主租户日志流的 Leader 会接收事务、DDL 等上层模块写入的数据,并将这些数据在主租户的多个副本之间使用 Paxos 协议进行同步并持久化。在数据同步过程中,如果发生故障,则写入的数据就可能会持久化失败,而日志存储服务可以自动处理各类失败场景,提供高可用能力。
在数据同步过程中,每一条日志都会在主租户上生成一组唯一的 LSN 和 SCN 值。其中,LSN 用于定位这条日志在存储服务中的物理位置信息;SCN 用于代表这条日志在存储服务中的时序关系,上层服务可以使用 SCN 值对多个日志流之间的日志进行定序。
RAW_WRITE 模式
备租户上使用 RAW_WRITE 模式。在该模式下,备租户日志流的 Leader 拒绝任何上层模块直接写入的数据,仅允许通过日志传输服务从主租户同步物理日志,且这些物理日志的内容、LSN、SCN 等信息均由主租户生成。
从主租户同步过来的物理日志会在备租户的日志存储服务的多个副本之间使用 Paxos 协议进行同步并持久化。
除了 APPEND 模式和 RAW_WRITE 模式以外,在执行 Failover 操作的过程中,日志流还可能存在 PREPARE_FLASHBACK 和 FLASHBACK 两种模式,这两种模式是 Failover 操作的中间状态,更多 Failover 操作的详细介绍,请参见 Failover。
查看主租户日志流的工作模式
使用管理员用户登录主租户或主租户所在集群的
sys租户。执行以下命令,获取主租户的
TENANT_ID。sys租户SELECT TENANT_ID,TENANT_NAME FROM oceanbase.DBA_OB_TENANTS;查询结果如下:
+-----------+-------------+ | TENANT_ID | TENANT_NAME | +-----------+-------------+ | 1 | sys | | 1001 | META$1002 | | 1002 | mysql | | 1003 | META$1004 | | 1004 | oracle | +-----------+-------------+ 5 rows in set主租户
MySQL 模式
SELECT TENANT_ID,TENANT_NAME FROM oceanbase.DBA_OB_TENANTS;查询结果如下:
+-----------+-------------+ | TENANT_ID | TENANT_NAME | +-----------+-------------+ | 1002 | mysql | +-----------+-------------+ 1 row in setOracle 模式
SELECT TENANT_ID,TENANT_NAME FROM SYS.DBA_OB_TENANTS;查询结果如下:
+-----------+-------------+ | TENANT_ID | TENANT_NAME | +-----------+-------------+ | 1004 | oracle | +-----------+-------------+ 1 row in set
执行以下命令,查询主租户日志流的工作模式。
MySQL 模式
SELECT TENANT_ID, LS_ID, SVR_IP, SVR_PORT, ROLE, ACCESS_MODE FROM oceanbase.GV$OB_LOG_STAT WHERE TENANT_ID = 1002;Oracle 模式
SELECT TENANT_ID, LS_ID, SVR_IP, SVR_PORT, ROLE, ACCESS_MODE FROM SYS.GV$OB_LOG_STAT WHERE TENANT_ID = 1004;
查询结果的示例如下:
注意
RAW_WRITE 是日志流工作模式的默认值,因此在主租户上,对于某些正在执行负载均衡任务的场景,其日志流副本的
ACCESS_MODE也会是RAW_WRITE。+-----------+-------+-------------+----------+----------+-------------+ | TENANT_ID | LS_ID | SVR_IP | SVR_PORT | ROLE | ACCESS_MODE | +-----------+-------+-------------+----------+----------+-------------+ | 1002 | 1 | xx.xx.xx.xx | 17854 | LEADER | APPEND | | 1002 | 1001 | xx.xx.xx.xx | 17854 | LEADER | APPEND | | 1002 | 1 | xx.xx.xx.xx | 17858 | FOLLOWER | APPEND | | 1002 | 1001 | xx.xx.xx.xx | 17858 | FOLLOWER | APPEND | | 1002 | 1 | xx.xx.xx.xx | 17856 | FOLLOWER | APPEND | | 1002 | 1001 | xx.xx.xx.xx | 17856 | FOLLOWER | APPEND | +-----------+-------+-------------+----------+----------+-------------+ 6 rows in set
查看备租户的日志流工作模式
使用管理员用户登录备租户或备租户所在集群的
sys租户。执行以下命令,获取备租户的
TENANT_ID。sys租户SELECT TENANT_ID,TENANT_NAME FROM oceanbase.DBA_OB_TENANTS;查询结果如下:
+-----------+-------------+ | TENANT_ID | TENANT_NAME | +-----------+-------------+ | 1 | sys | | 1003 | META$1002 | | 1004 | mysql | | 1005 | META$1004 | | 1006 | oracle | +-----------+-------------+ 5 rows in set备租户
MySQL 模式
SELECT TENANT_ID,TENANT_NAME FROM oceanbase.DBA_OB_TENANTS;查询结果如下:
+-----------+-------------+ | TENANT_ID | TENANT_NAME | +-----------+-------------+ | 1004 | mysql | +-----------+-------------+ 1 row in setOracle 模式
SELECT TENANT_ID,TENANT_NAME FROM SYS.DBA_OB_TENANTS;查询结果如下:
+-----------+-------------+ | TENANT_ID | TENANT_NAME | +-----------+-------------+ | 1006 | oracle | +-----------+-------------+ 1 row in set
执行以下命令,查询备租户日志流的工作模式。
MySQL 模式
SELECT TENANT_ID, LS_ID, SVR_IP, SVR_PORT, ROLE, ACCESS_MODE FROM oceanbase.GV$OB_LOG_STAT WHERE TENANT_ID = 1004;Oracle 模式
SELECT TENANT_ID, LS_ID, SVR_IP, SVR_PORT, ROLE, ACCESS_MODE FROM SYS.GV$OB_LOG_STAT WHERE TENANT_ID = 1006;
查询结果的示例如下:
+-----------+-------+-------------+----------+----------+-------------+ | TENANT_ID | LS_ID | SVR_IP | SVR_PORT | ROLE | ACCESS_MODE | +-----------+-------+-------------+----------+----------+-------------+ | 1004 | 1 | xx.xx.xx.xx | 17858 | FOLLOWER | RAW_WRITE | | 1004 | 1001 | xx.xx.xx.xx | 17858 | FOLLOWER | RAW_WRITE | | 1004 | 1 | xx.xx.xx.xx | 17854 | LEADER | RAW_WRITE | | 1004 | 1001 | xx.xx.xx.xx | 17854 | LEADER | RAW_WRITE | | 1004 | 1 | xx.xx.xx.xx | 17856 | FOLLOWER | RAW_WRITE | | 1004 | 1001 | xx.xx.xx.xx | 17856 | FOLLOWER | RAW_WRITE | +-----------+-------+-------------+----------+----------+-------------+ 6 rows in set
日志流副本角色
无论是主租户还是备租户,其 Paxos Group 中的多个副本都会有 LEADER 和 FOLLOWER 两种角色。通过查询视图 GV$OB_LOG_STAT 中的 ROLE 列可以确认日志流的副本角色是 LEADER 还是 FOLLOWER。
对于主租户,其业务数据是在日志流的 Leader 节点上写入,再同步给所有 Follower 节点;对于备租户,日志流的 Leader 节点主要负责通过日志传输服务从主租户同步日志,并将同步过来的日志再同步给 Paxos Group 中的 Follower 节点。
存储空间管理
无论是主租户还是备租户,日志存储服务均按照租户来管理存储空间。
在创建主租户或备租户的 Unit 规格时,可以通过 CREATE RESOURCE UNIT 命令中的 LOG_DISK_SIZE 参数指定日志盘的存储空间,如果创建时未指定 LOG_DISK_SIZE,则其默认值为内存规格的 3 倍大小,且日志盘的最小值为 2G。关于创建 Unit 规格的详细操作,请参见 创建租户。
可以通过 GV$OB_UNITS 视图,查询主备租户可使用的日志盘存储空间以及实际所使用的日志存储空间。
使用管理员用户登录主备租户或主备租户所在集群的
sys租户。执行以下命令,获取租户的
TENANT_ID。sys租户SELECT TENANT_ID,TENANT_NAME FROM oceanbase.DBA_OB_TENANTS;sys租户下的查询结果如下:+-----------+-------------+ | TENANT_ID | TENANT_NAME | +-----------+-------------+ | 1 | sys | | 1003 | META$1002 | | 1004 | mysql | | 1005 | META$1004 | | 1006 | oracle | +-----------+-------------+ 5 rows in set主租户或备租户
MySQL 模式
SELECT TENANT_ID,TENANT_NAME FROM oceanbase.DBA_OB_TENANTS;查询结果如下:
+-----------+-------------+ | TENANT_ID | TENANT_NAME | +-----------+-------------+ | 1004 | mysql | +-----------+-------------+ 1 row in setOracle 模式
SELECT TENANT_ID,TENANT_NAME FROM SYS.DBA_OB_TENANTS;查询结果如下:
+-----------+-------------+ | TENANT_ID | TENANT_NAME | +-----------+-------------+ | 1006 | oracle | +-----------+-------------+ 1 row in set
执行以下命令,查看主备租户允许使用的日志盘存储空间以及实际使用情况。
MySQL 模式
SELECT SVR_IP, SVR_PORT, TENANT_ID, LOG_DISK_SIZE, LOG_DISK_IN_USE FROM oceanbase.GV$OB_UNITS WHERE TENANT_ID = 1004;查询结果如下:
+----------------+----------+-----------+---------------+-----------------+ | SVR_IP | SVR_PORT | TENANT_ID | LOG_DISK_SIZE | LOG_DISK_IN_USE | +----------------+----------+-----------+---------------+-----------------+ | xx.xx.xx.xx | 2882 | 1004 | 17394617549 | 1029179660 | | xx.xx.xx.xx | 17856 | 1004 | 17394617549 | 1029177240 | | xx.xx.xx.xx | 17858 | 1004 | 17394617549 | 1029177966 | +----------------+----------+-----------+---------------+-----------------+ 3 rows in setOracle 模式
SELECT SVR_IP, SVR_PORT, TENANT_ID, LOG_DISK_SIZE, LOG_DISK_IN_USE FROM SYS.GV$OB_UNITS WHERE TENANT_ID = 1006;查询结果的示例如下:
+-------------+----------+-----------+---------------+-----------------+ | SVR_IP | SVR_PORT | TENANT_ID | LOG_DISK_SIZE | LOG_DISK_IN_USE | +-------------+----------+-----------+---------------+-----------------+ | xx.xx.xx.xx | 17854 | 1006 | 5798205850 | 1437200613 | | xx.xx.xx.xx | 17856 | 1006 | 5798205850 | 1437196109 | | xx.xx.xx.xx | 17858 | 1006 | 5798205850 | 1437196109 | +-------------+----------+-----------+---------------+-----------------+ 3 rows in set
此外,对于主租户和备租户,可以通过调整租户的 Unit 规格来实现日志盘存储空间的扩容和缩容,关于调整租户 Unit 规格的详细操作,请参见 通过调整资源规格实现租户扩缩容。