前言:
我们知道oceanbase的日志盘是预分配的,这一点给Oracle类似,那么oceanbase是分布式数据库,该如何配置oceanbase日志盘空间大小呢?可以给不同的observer节点设置不同的值吗?答案是可以的。一、oceanbase可用日志盘大小:
1、配置项log_disk_size:
1.1、配置项含义:
log_disk_size 用于设置 Redo 日志磁盘的大小,即本 OBServer 可以使用的日志盘总空间大小,我们知道某个observer上可以有多个租户,每个租户都相当于是Oracle的一个实例,也就是说每个租户都需要有自己的独有的redo日志盘,但是这个observer上所有的租户的日志盘总大小不能大于log_disk_size的大小。
log_disk_size属性说明
- 该配置项的值为 0 时,会根据 log_disk_percentage 配置项设置的值分配日志盘空间。也就是说log_disk_size的优先级高于log_disk_percentage。
- OBServer 节点启动时,会预分配足够多的日志文件。例如:用户配置 log_disk_size = 100 G,那么 OBServer 节点第一次启动时,就会预分配 100 G 的日志文件作为日志文件池。
- OBServer 节点上创建租户 Unit 时,会为 Unit 预留足够多的日志盘空间,如果本地剩余日志盘空间(日志盘可用空间总大小 — 已分配空间)不满足 Unit 规格要求,则创建租户 Unit 失败。
- OceanBase 数据库 V4.0创建租户可以指定LOG_DISK_SIZE:租户的日志盘空间大小,OceanBase 数据库 V4.0 会按租户管理日志盘空间,系统为各个租户预留日志盘空间,实现按租户隔离。当用户没有指定时,LOG_DISK_SIZE 默认值是内存规格的 3 倍大小,LOG_DISK_SIZE值最小为 2G;
- 当log_disk_size需要降低的时候,减小后的值需要大于当前已经给所有租户分配redo大小之和,否则虽然命令执行成功,但是并没有生效。
1.2、查看配置项:
sys 租户和所有用户租户均可以使用 SHOW PARAMETERS 语句或视图 GV$OB_PARAMETERS 查询该配置项,
方式1:
root@10.18.92.150 : (none) 21:31:44>show parameters like 'log_disk_size';
+-------+----------+--------------+----------+---------------+-----------+-------+----------------------------------------------------------------+------------+---------+---------+-------------------+---------------+-----------+ | zone | svr_type | svr_ip | svr_port | name | data_type | value | info | section | scope | source | edit_level | default_value | isdefault | +-------+----------+--------------+----------+---------------+-----------+-------+----------------------------------------------------------------+------------+---------+---------+-------------------+---------------+-----------+ | zone1 | observer | 10.18.92.141 | 2882 | log_disk_size | CAPACITY | 10G | the size of disk space used by the log files. Range: [0, +∞) | LOGSERVICE | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE | 0M | 0 | | zone2 | observer | 10.18.92.142 | 2882 | log_disk_size | CAPACITY | 10G | the size of disk space used by the log files. Range: [0, +∞) | LOGSERVICE | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE | 0M | 0 | | zone3 | observer | 10.18.92.143 | 2882 | log_disk_size | CAPACITY | 10G | the size of disk space used by the log files. Range: [0, +∞) | LOGSERVICE | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE | 0M | 0 | +-------+----------+--------------+----------+---------------+-----------+-------+----------------------------------------------------------------+------------+---------+---------+-------------------+---------------+-----------+ 3 rows in set (0.01 sec)
方式2:
root@10.18.92.150 : oceanbase 21:34:21>select * from oceanbase.GV$OB_PARAMETERS where NAME='log_disk_size'\G
*************************** 1. row ***************************
SVR_IP: 10.18.92.141 SVR_PORT: 2882 ZONE: zone1 SCOPE: CLUSTER TENANT_ID: NULL NAME: log_disk_size DATA_TYPE: CAPACITY VALUE: 10G INFO: the size of disk space used by the log files. Range: [0, +∞) SECTION: LOGSERVICE EDIT_LEVEL: DYNAMIC_EFFECTIVE DEFAULT_VALUE: 0M ISDEFAULT: NO
备注:查询结果中可以看到SCOPE是cluster,表明该配置项是集群级别生效的,如果 scope 列对应的值为 TENANT,则表示该配置项为租户级别。动态生效:edit_level 为 dynamic_effective,重启生效:edit_level 为 static_effective。
1.3、修改配置项
修改 log_disk_size 配置项的示例如下集群的所有observer全部生效:
root@10.18.92.150 : oceanbase 22:17:50>ALTER SYSTEM SET log_disk_size = '20G';
Query OK, 0 rows affected (0.01 sec)
修改指定 Zone 的 log_disk_size 配置项的示例如下:
obclient> ALTER SYSTEM SET log_disk_size = '20G' ZONE='z1';
修改指定 OBServer 的 log_disk_size 配置项的示例如下:
obclient> ALTER SYSTEM SET log_disk_size='15G' SERVER='10.18.92.142:2882' ;
2、log_disk_percentage:
2.1、配置项含义:
log_disk_percentage 用于设置 Redo 日志占用其所在磁盘总空间的百分比 属性说明- log_disk_size 配置项取值为 0 时,该配置项才生效,若 log_disk_size 取值不为 0,则该配置项不生效。
- 该配置项的值为 0 时,系统会根据日志和数据是否共用同一磁盘来自动计算 Redo 日志占用其所在磁盘总空间的百分比:
- 共用时,Redo 日志占用其所在磁盘总空间的百分比为 30%,即分配磁盘总空间 30% 的日志文件。
- 独占时,Redo 日志占用其所在磁盘总空间的百分比为 90%,即分配磁盘总空间 90% 的日志文件。
3、log_disk_utilization_limit_threshold:
配置项含义:
log_disk_utilization_limit_threshold 用于设置租户日志盘利用率限制阈值。当租户日志盘使用量超过租户日志盘空间总量乘以该值时,不再允许日志写入。log_disk_utilization_limit_threshold 的取值应该大于 log_disk_utilization_threshold 的取值。oceanbase V4.0 以后,可以通过设置unit的日志盘大小,来实现控制租户在某个observer节点的日志盘的大小。
可以通过如下sql查看某个租户的日志盘的使用率:(登录sys租户查看)
root@10.18.92.150 : oceanbase 09:41:26>select a.svr_ip,a.svr_port,a.tenant_id,b.tenant_name, CAST(a.data_disk_in_use/1024/1024/1024 as DECIMAL(15,2)) data_disk_use_G, CAST(a.log_disk_size/1024/1024/1024 as DECIMAL(15,2)) log_disk_size, CAST(a.log_disk_in_use/1024/1024/1024 as DECIMAL(15,2)) log_disk_use_G, log_disk_in_use/log_disk_size 'usage%' from oceanbase.__all_virtual_unit a,dba_ob_tenants b where a.tenant_id=b.tenant_id and b.tenant_name='liuwenhe';
+--------------+----------+-----------+-------------+-----------------+---------------+----------------+--------+ | svr_ip | svr_port | tenant_id | tenant_name | data_disk_use_G | log_disk_size | log_disk_use_G | usage% | +--------------+----------+-----------+-------------+-----------------+---------------+----------------+--------+ | 10.18.92.143 | 2882 | 1002 | liuwenhe | 0.04 | 54.00 | 12.26 | 0.2270 | | 10.18.92.142 | 2882 | 1002 | liuwenhe | 0.05 | 54.00 | 12.26 | 0.2270 | | 10.18.92.141 | 2882 | 1002 | liuwenhe | 0.04 | 54.00 | 12.26 | 0.2270 | +--------------+----------+-----------+-------------+-----------------+---------------+----------------+--------+
4、log_disk_utilization_threshold:
配置项含义:
log_disk_utilization_threshold 用于设置租户日志盘利用率阈值,当租户日志盘使用量超过租户日志盘空间总量乘以该值时,进行日志文件重用。总结:
某个租户最大可用redo磁盘大小,在默认情况下,系统会根据日志和数据是否共用同一磁盘来自动计算 Redo 日志占用其所在磁盘总空间的百分比,日志和数据共用同一个磁盘时,Redo 日志占用其所在磁盘总空间的百分比为 30%,即分配磁盘总空间 30% 的日志文件,这个时候租户最大可用redo大小为:磁盘总空间×30%×95% ;日志独占一个磁盘时,Redo 日志占用其所在磁盘总空间的百分比为 90%,即分配磁盘总空间 90% 的日志文件,此时租户最大可用redo大小为:磁盘总空间×90%×95% 。可能会人疑问,明明超过log_disk_utilization_threshold的比例,就会触发日志盘复用,那为啥还会触发log_disk_utilization_limit_threshold的值,进而导致不可写日志?
如下场景可能导致:
1)由于有大事务的存在,导致redo日志无法被复用,进而导致日志盘一直增大,最终超过log_disk_utilization_threshold。2)当redo日志被截断后,redo空间就可以被复用了,但是当业务流量大,频发的事务导致日志增长的速度大于日志截断的速度,检查点无法快速推进,进而导致内存脏页过大。
3)数据库转储的速度太慢,导致数据库内存的脏页太多,内存中的脏页需要依靠redo来保护,进而导致redo无法被截断复用;4)多副本同步数据依靠redo来实现,在Paxos 组中,只有多数派副本确认持久化后,Leader 才能截断日志, 当日志同步太慢,也可能导致redo无法及时被截断,进而导致复用速度慢,最终导致redo日志越来越大。
二、日志盘性能相关配置项:
1、log_disk_throttling_maximum_duration:
配置项含义:
log_disk_throttling_maximum_duration 用于调整触发日志限速后,日志盘的最大可用时间。说明
该配置项从 V4.2.0 版本开始引入。2、log_disk_throttling_percentage:
log_disk_throttling_percentage用于触发日志写入限速的不可回收日志盘空间占比。 说明 该配置项从 V4.2.0 版本开始引入。具体来说就是当日志盘使用率超过log_disk_utilization_threshold,会触发redo文件的复用,但是并不是所有的redo文件都可以被复用,当不可复用的文件总大小占总可用磁盘大小的比例超过log_disk_throttling_percentage的时候,就会触发日志的写入限速。
3、log_archive_concurrency : 用于设置日志归档的并发度。
4、log_restore_concurrency:用于设置恢复日志的并发度;
5、log_storage_compress_func:用于设置 clog 存储压缩的压缩算法,默认值为:lz4_1.0,可选值为:zstd_1.0和zstd_1.3.8。
压缩算法对比
6、log_storage_compress_all:用于控制是否开启 clog 存储压缩功能。
7、log_transport_compress_func:用于日志传输的压缩器算法。
8、log_transport_compress_all:用于对日志传输是否使用压缩。默认值是false,表示不开启日志传输压缩,当遇到日志同步慢的问题,可以尝试开启传输压缩来缓解。