亚马逊AWS官方博客
如何缩减 EBS 卷容量以降低存储成本
Amazon EBS提供了块级存储卷以用于 EC2 实例,EBS具备弹性的特点,可以动态的增加容量、更改卷类型以及修改预配置的IOPS值。但是EBS不能动态的减少容量,如果用户在初始创建EC2或者创建EBS时选择了大于实际需求的容量,当EBS数量很多时,则每个月在EBS上因容量浪费的花费相当可观。
建议用户在初始创建EC2或者创建EBS时选择较小的EBS容量,在需要扩容的时候动态的增加容量。在实际用户场景中,对于Linux 系统卷,通常会选择几十GB的大小,而对于数据卷,很多用户在初始创建时会设置几百GB以上的容量。为了减少AWS上运行的成本,用户可能会希望减少数据卷的容量,在AWS文档中并没有提供如何减少EBS容量的步骤。以下举例说明如何通过rsync工具将大容量的EBS数据卷替换成小容量EBS卷:
- $ rsync –help测试rsync工具是否已安装。如果未安装,可以通过命令 “sudo apt-get install rsync”(Ubuntu) 或者“yum install rsync”(RedHat)来安装。
- 查看数据卷的设备名:
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 10G 0 disk
└─xvda1 202:1 0 10G 0 part /
xvdb 202:16 0 10G 0 disk /source
- 查看磁盘文件系统的空间占用,新的EBS卷应不小于数据所占用的空间,此处为7920MB:
$ df -m
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/xvda1 10229 971 9258 10% /
devtmpfs 473 0 473 0% /dev
tmpfs 495 0 495 0% /dev/shm
tmpfs 495 13 482 3% /run
tmpfs 495 0 495 0% /sys/fs/cgroup
tmpfs 99 0 99 0% /run/user/1000
tmpfs 99 0 99 0% /run/user/0
/dev/xvdb 9952 7920 1525 84% /source
- 创建一个9GB的EBS,在AWS Console上将此卷连接到EC2。
- 查看EC2已识别到新卷:
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 10G 0 disk
└─xvda1 202:1 0 10G 0 part /
xvdb 202:16 0 10G 0 disk /source
xvdf 202:80 0 9G 0 disk
- 对新卷创建文件系统:
$ sudo mkfs.ext4 /dev/xvdf
- 创建目录/target,并将新卷mount到/target上:
$ sudo mount /dev/xvdf /target
- 查看新文件系统:
$ df -m
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/xvda1 10229 972 9258 10% /
devtmpfs 473 0 473 0% /dev
tmpfs 495 0 495 0% /dev/shm
tmpfs 495 13 482 3% /run
tmpfs 495 0 495 0% /sys/fs/cgroup
tmpfs 99 0 99 0% /run/user/1000
tmpfs 99 0 99 0% /run/user/0
/dev/xvdb 9952 7920 1525 84% /source
/dev/xvdf 8944 37 8431 1% /target
- 复制文件系统:
$ sudo rsync -ax /source/ /target(注意/source后面有/)
- 查看两个文件系统,所有数据文件应该完全相同:
$ ls -l /source
$ ls -l /target
$ df -m
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/xvda1 10229 972 9258 10% /
devtmpfs 473 0 473 0% /dev
tmpfs 495 0 495 0% /dev/shm
tmpfs 495 13 482 3% /run
tmpfs 495 0 495 0% /sys/fs/cgroup
tmpfs 99 0 99 0% /run/user/1000
tmpfs 99 0 99 0% /run/user/0
/dev/xvdb 9952 7920 1525 84% /source
/dev/xvdf 8944 7920 548 94% /target
- umount 两个文件系统:
$ sudo umount /source
$ sudo umount /target
- 在AWS Console上将两个EBS卷从EC2 分离。
- 在AWS Console上将9GB EBS新卷连接到EC2,设备名选项中输入 /dev/xvdb。
- 查看新卷在EC2上挂载为/dev/xvdb:
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 10G 0 disk
└─xvda1 202:1 0 10G 0 part /
xvdb 202:16 0 9G 0 disk
- $ sudo mount /dev/xvdb /source
- 检查新卷上的文件系统
$ df -m
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/xvda1 10229 972 9258 10% /
devtmpfs 473 0 473 0% /dev
tmpfs 495 0 495 0% /dev/shm
tmpfs 495 13 482 3% /run
tmpfs 495 0 495 0% /sys/fs/cgroup
tmpfs 99 0 99 0% /run/user/1000
/dev/xvdb 8944 7920 548 94% /source
- 启动应用,缩容操作完成。
在这篇博客中,我演示了如何通过rsync工具将大容量的EBS数据卷替换成小容量EBS卷。以下是一些注意点:
- 此操作仅适用于文件系统的数据卷,不适用于作为裸设备使用的数据卷。
- 在时间充裕的情况下,可以在关闭应用之后对原数据卷做一个快照,以预防出现误操作导致数据丢失。
- 为避免在detach volume操作时选错卷,建议在AWS console上通过修改Name对数据卷做标记,例如old data。