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