Skip to content

Commit 1df39b5

Browse files
committed
进阶教程增加日志盘 / 数据盘写满小节
1 parent 5d68e4d commit 1df39b5

File tree

2 files changed

+268
-21
lines changed

2 files changed

+268
-21
lines changed

docs/user_manual/operation_and_maintenance/emergency_handbook/01_emergency_overview.md

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ weight: 1
1111

1212
同时考虑到用户意见收集中的 @oceanvoice 、@张雨齐 等老师的建议,准备《进阶教程》的这个章节中,为大家提供一份儿相对比较成体系,也更加全面的《故障应急手册》。
1313

14-
在《故障应急手册》中,会把用户在使用 OceanBase 的过程中可能遇到的问题,以及对应的解决方案进行汇总,目录大致会是:
14+
在《故障应急手册》中,会把用户在使用 OceanBase 的过程中可能遇到的问题,以及对应的解决方案进行汇总。**<font color="red">问题肯定并不常见,但会是相对严重,且需要 DBA 同学进行初步分析和止血操作的。</font>** 目录大致会是:
15+
16+
* 故障应急手册概述
1517

1618
* 系统响应时间不符合预期
1719

@@ -21,47 +23,48 @@ weight: 1
2123

2224
* 硬件 & 基础环境故障应急处理
2325

24-
* 负载变化导致的问题
26+
* 网络抖动
2527

26-
* 集群内部其他问题
28+
* 磁盘故障
2729

28-
* 租户转储阻塞
30+
* 负载变化导致的问题
2931

30-
* 集群合并阻塞
32+
* 日志盘 / 数据盘写满
3133

32-
* SYS 租户/ RS 服务问题
34+
* ……
3335

34-
* 磁盘泄漏
36+
## What's more ?
3537

36-
* 内存泄漏
38+
这一小节只有手册的内容介绍,没啥干货,有点儿过意不去。那就在最后附送一个 **<font color="red">针对 OceanBase 严重故障(尤其是业务停服场景),进行快速止血恢复的通用方法</font>** ,简单来说就是:切主 -> 隔离 -> 重启 -> 切备集群。
3739

38-
* 长事务
40+
- 如果集群中只有一个租户有问题,那就切这个租户的主(通过 set tenant primary_zone 修改租户的 primary_zone)。
3941

40-
* 悬挂事务
42+
- 如果集群中只有一个节点有问题,那就 stop or isolate 这个节点。
4143

42-
* coredump
44+
- 如果整个集群都有问题,那就轮流重启集群中的各个节点。
4345

44-
* 无主
46+
- 如果轮流重启之后还有问题,那就进行 failover 操作,切换备集群。
4547

46-
* 未完待续……
48+
- 分析问题永远放在止血和恢复之后。
4749

4850

49-
手册的更新频率大概是一周一次,因为这个章节的内容较多,所以预计会分成三到四次完成手册内容的更新。希望大家能够持续关注。
51+
## 未完待续
5052

53+
集群内部其他问题,一般都需要联系社区论坛的值班人员进行协助,可能并不需要运维同学深入了解。所以优先级放的低些,预计会在进阶教程完结之后,继续在 OceanBase 的社区论坛中的 “官方精选” 板块内进行更新。
5154

52-
## What's more ?
55+
* SYS 租户/ RS 服务问题
5356

54-
这一小节只有手册的内容介绍,没啥干货,有点儿过意不去。那就在最后附送一个 **<font color="red">针对 OceanBase 严重故障(尤其是业务停服场景),进行快速止血恢复的通用方法</font>** ,简单来说就是:切主 -> 隔离 -> 重启 -> 切备集群。
57+
* 内存泄漏
5558

56-
- 如果集群中只有一个租户有问题,那就切这个租户的主(通过 set tenant primary_zone 修改租户的 primary_zone)。
59+
* 磁盘泄漏
5760

58-
- 如果集群中只有一个节点有问题,那就 stop or isolate 这个节点。
61+
* 长事务
5962

60-
- 如果整个集群都有问题,那就轮流重启集群中的各个节点。
63+
* 悬挂事务
6164

62-
- 如果轮流重启之后还有问题,那就进行 failover 操作,切换备集群。
65+
* coredump
6366

64-
- 分析问题永远放在止血和恢复之后。
67+
* ……
6568

6669

6770
## 参考资料
Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
---
2+
title: 日志盘 / 数据盘写满
3+
weight: 6
4+
---
5+
6+
## 业务及数据库表现
7+
8+
9+
### 数据盘满
10+
11+
收到 OCP 的数据盘告警,例如 [ob_host_data_path_disk_percent](https://www.oceanbase.com/docs/common-ocp-1000000001740702) 等。
12+
13+
业务报错,OBServer 可能无法转储、无法合并、内存无法释放,进而导致集群无法写入。
14+
15+
### 日志盘满
16+
17+
收到 OCP 的日志盘告警,例如 [ob_host_log_disk_percent_over_threshold](https://www.oceanbase.com/docs/common-ocp-1000000001740708) 等。
18+
19+
业务报错,OBServer 节点无法正常工作,影响选举。
20+
21+
> 上面两个官网链接的处理方法,前提是 “其它程序在 OceanBase 的 log 盘或者 data 盘产生了大量数据”。千万不要手动删除 OceanBase 的 log 文件和 data 文件,否则可能导致系统无法恢复。
22+
23+
## 排查方向
24+
25+
### 数据盘满
26+
27+
double check 一下 OCP 的告警是否属于误报:通过 sys 租户连 oceanbase 库,查看指定集群按节点统计数据盘的使用率情况,包含总分配大小、已使用大小、剩余可用大小等。
28+
29+
```
30+
SELECT b.zone, a.svr_ip, a.svr_port,
31+
ROUND(a.total_size/1024/1024/1024,3) total_size_GB,
32+
ROUND((a.total_size-a.free_size)/1024/1024/1024,3) used_size_GB,
33+
ROUND(a.free_size/1024/1024/1024,3) free_size_GB,
34+
ROUND((a.total_size-a.free_size)/total_size,2)*100 disk_used_percentage
35+
FROM __all_virtual_disk_stat a
36+
INNER JOIN __all_server b
37+
ON a.svr_ip=b.svr_ip AND a.svr_port=b.svr_port
38+
ORDER BY zone
39+
40+
*************************** 1. row ***************************
41+
zone: zone1
42+
svr_ip: 1.2.3.4
43+
svr_port: 22602
44+
total_size_GB: 8.000
45+
used_size_GB: 0.307
46+
free_size_GB: 7.693
47+
disk_used_percentage: 4.00
48+
```
49+
50+
如果 disk_used_percentage 的值已经超过 OCP 告警的默认阈值(97%),可以确认告警无误。
51+
52+
53+
### 日志盘满
54+
55+
> 因为过期日志会被回收,所以日志盘满的情况相对比较少见。
56+
57+
根据 OCP 告警中的集群和主机信息,在对应节点上进行 double check。
58+
59+
登录 sys 租户,连接 oceanbase 库,执行以下命令,查看是否存在某个租户的日志盘 usage 百分比出现异常。
60+
61+
```
62+
select a.svr_ip,a.svr_port,a.tenant_id,b.tenant_name,
63+
CAST(a.data_disk_in_use/1024/1024/1024 as DECIMAL(15,2)) data_disk_use_G,
64+
CAST(a.log_disk_size/1024/1024/1024 as DECIMAL(15,2)) log_disk_size,
65+
CAST(a.log_disk_in_use/1024/1024/1024 as DECIMAL(15,2)) log_disk_use_G,
66+
log_disk_in_use/log_disk_size 'usage%'
67+
from __all_virtual_unit a,dba_ob_tenants b
68+
where a.tenant_id=b.tenant_id\G
69+
70+
*************************** 1. row ***************************
71+
svr_ip: 1.2.3.4
72+
svr_port: 22602
73+
tenant_id: 1
74+
tenant_name: sys
75+
data_disk_use_G: 0.10
76+
log_disk_size: 2.00
77+
log_disk_use_G: 1.54
78+
usage%: 0.7693
79+
*************************** 2. row ***************************
80+
svr_ip: 1.2.3.4
81+
svr_port: 22602
82+
tenant_id: 1001
83+
tenant_name: META$1002
84+
data_disk_use_G: 0.07
85+
log_disk_size: 0.60
86+
log_disk_use_G: 0.43
87+
usage%: 0.7174
88+
*************************** 3. row ***************************
89+
svr_ip: 1.2.3.4
90+
svr_port: 22602
91+
tenant_id: 1002
92+
tenant_name: mysql
93+
data_disk_use_G: 0.05
94+
log_disk_size: 5.40
95+
log_disk_use_G: 3.13
96+
usage%: 0.5789
97+
```
98+
99+
100+
## 应急流程
101+
102+
### 数据盘满
103+
104+
#### 首先检查存放数据盘的操作系统磁盘,是否还有空间可以分配。
105+
106+
如果有空间可以分配,考虑修改集群级别的配置项 [datafile_size](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001576331) 或者 [datafile_disk_percentage](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001576341),增加数据库的数据盘可用空间大小。
107+
108+
通过如下命令确认 datafile_size 和 datafile_disk_percentage 的 value:
109+
110+
```
111+
show parameters like 'datafile_size'\G
112+
*************************** 1. row ***************************
113+
zone: zone1
114+
svr_type: observer
115+
svr_ip: 1.2.3.4
116+
svr_port: 22602
117+
name: datafile_size
118+
data_type: CAPACITY
119+
value: 2G
120+
info: size of the data file. Range: [0, +∞)
121+
section: SSTABLE
122+
scope: CLUSTER
123+
source: DEFAULT
124+
edit_level: DYNAMIC_EFFECTIVE
125+
default_value: 0M
126+
isdefault: 0
127+
1 row in set (0.006 sec)
128+
```
129+
130+
datafile_size 的默认值为 0M。当为默认值时,磁盘可用空间大小受 datafile_disk_percentage 配置项的影响。
131+
132+
```
133+
show parameters like 'datafile_disk_percentage'\G
134+
*************************** 1. row ***************************
135+
zone: zone1
136+
svr_type: observer
137+
svr_ip: 11.158.31.20
138+
svr_port: 22602
139+
name: datafile_disk_percentage
140+
data_type: INT
141+
value: 0
142+
info: the percentage of disk space used by the data files. Range: [0,99] in integer
143+
section: SSTABLE
144+
scope: CLUSTER
145+
source: DEFAULT
146+
edit_level: DYNAMIC_EFFECTIVE
147+
default_value: 0
148+
isdefault: 1
149+
1 row in set (0.006 sec)
150+
```
151+
datafile_disk_percentage 配置项的默认值也为 0。当为默认值时,系统会根据日志和数据是否共用同一磁盘来自动计算数据文件( SN 模式)或本地缓存空间(SS 模式)占用其所在磁盘总空间的百分比:
152+
- 共用时,数据文件或本地缓存空间占用其所在磁盘总空间的百分比为 60%。
153+
- 独占时,数据文件或本地缓存空间占用其所在磁盘总空间的百分比为 90%。
154+
该配置项与 datafile_size 同时配置时,以 datafile_size 设置的值为准。
155+
156+
通过以下命令调大配置项:
157+
158+
```
159+
-- 设置数据文件的大小为 80G。
160+
obclient> ALTER SYSTEM SET datafile_size = '80G';
161+
162+
-- 或者,设置数据文件占用其所在磁盘总空间的 95%。
163+
obclient> ALTER SYSTEM SET datafile_disk_percentage = 90;
164+
```
165+
166+
**<font color="red">OceanBase 数据库支持根据磁盘数据文件的实际使用情况来进行自动扩容,强烈推荐大家在部署集群时,通过 datafile_next 和 datafile_maxsize 这两个配置项来进行配置。详见官网文档中的[《配置磁盘数据文件的动态扩容》](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001574103),亲测好用。</font>**
167+
168+
**<font color="red">大家在部署生产环境的集群时,为避免出现 IO 性能问题,推荐将数据目录和日志目录分别挂载到不同的磁盘上,并建议日志盘空间为主机内存空间的三倍以及以上。</font>**
169+
170+
171+
#### 如果磁盘没有可用空间分配,则考虑在 zone 内添加新的节点,并通过迁移 Unit 的方式均衡节点间的数据分布。
172+
173+
在 zone 里添加节点,以及[迁移租户对应 unit](https://www.oceanbase.com/docs/common-ocp-1000000001739880) 的操作,都可以通过 OCP 白屏完成。
174+
175+
如果一个 OBServer 节点集中了多个租户的 unit,优先考虑通过手动迁移 Unit 的方式均衡数据。、
176+
177+
如果单节点内只有一个用户租户,则可以考虑通过清理回收站数据等方式,删除冗余数据。
178+
179+
180+
### 日志盘满
181+
182+
检查集群的 log_disk 磁盘空间是否已经分配完,如果 log_disk_free 为 0,则表示已分配完。
183+
```
184+
select zone,concat(SVR_IP,':',SVR_PORT) observer,
185+
cpu_capacity_max cpu_total,cpu_assigned_max cpu_assigned,
186+
cpu_capacity-cpu_assigned_max as cpu_free,
187+
round(memory_limit/1024/1024/1024,2) as memory_total,
188+
round((memory_limit-mem_capacity)/1024/1024/1024,2) as system_memory,
189+
round(mem_assigned/1024/1024/1024,2) as mem_assigned,
190+
round((mem_capacity-mem_assigned)/1024/1024/1024,2) as memory_free,
191+
round(log_disk_capacity/1024/1024/1024,2) as log_disk_capacity,
192+
round(log_disk_assigned/1024/1024/1024,2) as log_disk_assigned,
193+
round((log_disk_capacity-log_disk_assigned)/1024/1024/1024,2) as log_disk_free,
194+
round((data_disk_capacity/1024/1024/1024),2) as data_disk,
195+
round((data_disk_in_use/1024/1024/1024),2) as data_disk_used,
196+
round((data_disk_capacity-data_disk_in_use)/1024/1024/1024,2) as data_disk_free
197+
from gv$ob_servers\G
198+
*************************** 1. row ***************************
199+
zone: zone1
200+
observer: 11.158.31.20:22602
201+
cpu_total: 8
202+
cpu_assigned: 4
203+
cpu_free: 4
204+
memory_total: 8.00
205+
system_memory: 1.00
206+
mem_assigned: 3.00
207+
memory_free: 4.00
208+
log_disk_capacity: 21.00
209+
log_disk_assigned: 8.00
210+
log_disk_free: 13.00
211+
data_disk: 8.00
212+
data_disk_used: 0.27
213+
data_disk_free: 7.73
214+
1 row in set (0.006 sec)
215+
```
216+
217+
如果 log_disk_free 不为 0,表示日志盘还有剩余空间,可以直接扩容该租户对应 unit 的 log_disk 大小。
218+
```
219+
ALTER RESOURCE UNIT unit_name LOG_DISK_SIZE = '10G';
220+
```
221+
222+
如果 log_disk_free 为 0,说明为集群分配的日志盘已经用完。通过 ``df -h`` 等命令,检查节点上日志盘挂载的磁盘,是否已经全部分配给日志盘。
223+
224+
如果磁盘仍有剩余空间,可以修改集群级配置项 [log_disk_size](https://www.oceanbase.com/docs/community-observer-cn-10000000001879584) 或者 [log_disk_percentage](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001576237),增加集群的可用日志盘大小,然后再通过上面 ``ALTER RESOURCE UNIT`` 的命令,增加对应租户的日志盘大小。
225+
226+
```
227+
ALTER system SET log_disk_size = '40G';
228+
229+
ALTER system SET log_disk_percentage = 90;
230+
```
231+
232+
如果操作系统上的磁盘也已经被分配完,则主动停止问题租户的写入,防止 clog 盘临时腾挪的空间再次快速被业务写入打满。停写的同时,临时调大 clog 盘停写的阈值比例 [log_disk_utilization_limit_threshold](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001576167),由 95% 调整到 98%。
233+
```
234+
ALTER system SET log_disk_utilization_limit_threshold = 98;
235+
```
236+
237+
后续可以观察一段时间,clog 追上之后,空间会被数据库系统自动回收,集群可以自动恢复。
238+
239+
240+
## 参考
241+
242+
- 社区博客[《OceanBase 应急三板斧》](https://open.oceanbase.com/blog/13250502949)
243+
244+
- 官网文档中的[应急处理相关内容](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001573632)

0 commit comments

Comments
 (0)