背景
这周三我在日常手动上线的时候(对!我们还没有自动化部署!),发现线上一台 AWS EC2 机器的服务不再打印日志了。
这真是从来没遇到过的情况,我怀疑是磁盘满了,于是 `df`` 了一下:
[ec2-user@host /]$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.8G 0 3.8G 0% /dev/shm
tmpfs 3.8G 113M 3.7G 3% /run
tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup
/dev/nvme0n1p1 8.0G 8.0G 60M 100% / # 果然,根目录已经满了!!!
tmpfs 777M 0 777M 0% /run/user/1000
tmpfs 777M 0 777M 0% /run/user/0
果然,根目录已经满了。我们服务从 3 月份上线以来,一直没有转存过日志,5、6 月份业务开始起量,终于今天日志把磁盘写满了。。
参考链接
后来我上网搜了一下,找到一篇非常不错的文章,介绍如何扩容 AWS EC2 实例:
扩容步骤
步骤 1:在 AWS 后台进行扩容
扩容之前,lsblk
输出如下:
[ec2-user@host /]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 8G 0 disk
├─nvme0n1p1 259:1 0 8G 0 part /
└─nvme0n1p128 259:2 0 1M 0 part
下面在 AWS 控制台,进行如下操作:
- 在服务列表中选择
EC2
; - 在左侧菜单的
ELASTIC BLOCK STORE
栏下选择Volumes
; - 右键点击希望扩容的 volume,选择
Modify Volume
;
然后会弹出如下弹窗,选择希望扩容到的大小(我扩容到了 16G):
在确认弹窗中点击确定:
过一会儿,在机器上就能看到硬盘空间增加啦:
[ec2-user@host /]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 16G 0 disk # 硬盘空间已经增加到 16G 啦
├─nvme0n1p1 259:1 0 8G 0 part /
└─nvme0n1p128 259:2 0 1M 0 part
步骤 2:在机器上进行分区(partition)扩容
硬盘已经扩容到 16G 了,但根目录所在分区大小还是 8G,下面进行分区扩容。
growpart
命令第一个参数是硬盘名,第二个参数是分区编号:
[ec2-user@host /]$ sudo growpart /dev/nvme0n1 1
CHANGED: partition=1 start=4096 old: size=16773087 end=16777183 new: size=33550303 end=33554399
现在分区大小也是 16G 啦:
[ec2-user@host /]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 16G 0 disk
├─nvme0n1p1 259:1 0 16G 0 part /
└─nvme0n1p128 259:2 0 1M 0 part
步骤 3:在机器上进行文件系统(filesystem)扩容
分区扩容之后,还要把相应的文件系统也进行扩容。
具体用到的命令取决于文件系统类型,所以首先检查文件系统类型:
[ec2-user@host ~]$ lsblk -f # 检查文件系统类型
NAME FSTYPE LABEL UUID MOUNTPOINT
nvme0n1
├─nvme0n1p1 xfs / bc07e2f4-d5ff-494b-adf1-6f6da7608cd6 /
└─nvme0n1p128
看来是 xfs
类型,使用 xfs_growfs
命令进行扩容,参数为分区路径:
[ec2-user@host]$ sudo xfs_growfs /dev/nvme0n1p1
meta-data=/dev/nvme0n1p1 isize=512 agcount=4, agsize=524159 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1 spinodes=0
data = bsize=4096 blocks=2096635, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 2096635 to 4193787
根据参考文章,如果文件系统类型是 ext2、ext3 或者 ext4,使用如下命令:
sudo resize2fs /dev/nvme0n1p1
扩容成功!根目录所在文件系统的空间从 8G 扩容到了 16G:
[ec2-user@host]$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.8G 0 3.8G 0% /dev/shm
tmpfs 3.8G 113M 3.7G 3% /run
tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup
/dev/nvme0n1p1 16G 8.0G 8.1G 50% /
tmpfs 777M 0 777M 0% /run/user/1000
小结
没想到在云上扩容存储空间这么容易,背后的实现机制一定很有意思!有时间研究一下。