客户的一个磁盘组空间快满,需要添加一下磁盘,磁盘组的冗余模式为normal,本来觉得是一件不难的事情,在添加过程中还是遇到了一些问题。
本来为2个500G的磁盘组成的normal模式磁盘组,目前可用空间只剩下170G左右的空间(通过Usable_file_MB查看),本次新增两个500G磁盘,准备添加到磁盘组中
这个磁盘组有2个failgroup,一开始按照我的理解,分别在每个磁盘组的failgroup中添加一个磁盘就行了,这样可用空间Usable_file_MB应该就是增加了500GB,
但是通过我的实际操作之后发现,添加完成之后Usable_file_MB只增加到了345698MB,也就是只增加了170G左右
首先搜索了一些文档,总结一下asmcmd lsdg中空间大小的含义:
FREE_MB:磁盘组中没有被使用的空间。
REQUIRED_MIRROR_FREE_MB:如果ASM磁盘或ASM磁盘组出现故障后,要重新满足冗余度的定义,要求有多少的空闲空间。
USABLE_FILE_MB:在满足冗余度之后,还有多少的剩余空间可以用。
计算公式:USABLE_FILE_MB = (FREE_MB - REQUIRED_MIRROR_FREE_MB) / 磁盘冗余度
a) 在磁盘组为Normal冗余模式下,实际剩余可用空间为FREE_MB / 冗余度,也就是FREE_MB的一半,这是因为根据Normal冗余,数据会存在一份相同的镜像,所以实际占用的空间也会多出一倍。
b) USABLE_FILE_MB可以变为负值,表示ASM并不会强制留出REQUIRED_MIRROR_FREE_MB的空间,但是这意味着如果遭遇了ASM磁盘组故障,有可能会没有足够的剩余空间来重新满足冗余度的要求。如果USABLE_FILE_MB为负数,就应该增加磁盘组的空间或者释放出一些空间来。
验证一下上面的结论,下面是我的实战操作,2个failgroup的情况下:
1.首先创建一个normal磁盘组,空间大小2G,两个failgroup,每个failgroup中一个1G的磁盘:
2.在磁盘组中创建一个表空间,大小设置为100M,创建完成之后查看空间大小
3.在磁盘组中新增一个500M的文件
4.在磁盘组原failgroup中添加两块1G磁盘
alter diskgroup testdg add
failgroup TESTDG_0001 disk '/dev/asm-diskg'
failgroup TESTDG_0000 disk '/dev/asm-diskh'
rebalance power 10;
添加完成之后查看磁盘组空间:
添加完成之后,实际的usable_file_mb并不是原来想象中的增加了1GB,而是只增加了500M
这是因为当前的冗余度为2,磁盘组为了保证当asm出现故障后,剩下的空间能继续保持normal冗余,需要保留Req_mir_free_MB的空间,但是这个并不是必须的,因此Usable_file_MB可以为负数,当为负数的时候说明当前的磁盘组已经不能满足normal冗余需求了。
5.测试一下,当前还能写多少数据
按照需求,应该还可以再写入1G多的数据,测试一下是否真的如此:
测试发现确实还能继续写入1G多的空间,当写入的空间超过上面的800多M的时候,usable_file_mb变成了负数
因此上面的结论是正确的。