亚马逊AWS官方博客

如何缩减 EBS 卷容量以降低存储成本

Amazon EBS提供了块级存储卷以用于 EC2 实例,EBS具备弹性的特点,可以动态的增加容量、更改卷类型以及修改预配置的IOPS值。但是EBS不能动态的减少容量,如果用户在初始创建EC2或者创建EBS时选择了大于实际需求的容量,当EBS数量很多时,则每个月在EBS上因容量浪费的花费相当可观。

建议用户在初始创建EC2或者创建EBS时选择较小的EBS容量,在需要扩容的时候动态的增加容量。在实际用户场景中,对于Linux 系统卷,通常会选择几十GB的大小,而对于数据卷,很多用户在初始创建时会设置几百GB以上的容量。为了减少AWS上运行的成本,用户可能会希望减少数据卷的容量,在AWS文档中并没有提供如何减少EBS容量的步骤。以下举例说明如何通过rsync工具将大容量的EBS数据卷替换成小容量EBS卷:

 

  1. $ rsync –help测试rsync工具是否已安装。如果未安装,可以通过命令 “sudo apt-get install rsync”(Ubuntu) 或者“yum install rsync”(RedHat)来安装。
  2. 查看数据卷的设备名:

$ 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

  1. 查看磁盘文件系统的空间占用,新的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

  1. 创建一个9GB的EBS,在AWS Console上将此卷连接到EC2。
  2. 查看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

  1. 对新卷创建文件系统:

$ sudo mkfs.ext4 /dev/xvdf

  1. 创建目录/target,并将新卷mount到/target上:

$ sudo mount /dev/xvdf /target

  1. 查看新文件系统:

$ 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

  1. 复制文件系统:

$ sudo rsync -ax /source/ /target(注意/source后面有/)

  1. 查看两个文件系统,所有数据文件应该完全相同:

$ 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

  1. umount 两个文件系统:

$ sudo umount /source

$ sudo umount /target

  1. 在AWS Console上将两个EBS卷从EC2 分离。
  2. 在AWS Console上将9GB EBS新卷连接到EC2,设备名选项中输入 /dev/xvdb。
  3. 查看新卷在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

  1. $ sudo mount /dev/xvdb /source
  2. 检查新卷上的文件系统

$ 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

  1. 启动应用,缩容操作完成。

 

在这篇博客中,我演示了如何通过rsync工具将大容量的EBS数据卷替换成小容量EBS卷。以下是一些注意点:

  • 此操作仅适用于文件系统的数据卷,不适用于作为裸设备使用的数据卷。
  • 在时间充裕的情况下,可以在关闭应用之后对原数据卷做一个快照,以预防出现误操作导致数据丢失。
  • 为避免在detach volume操作时选错卷,建议在AWS console上通过修改Name对数据卷做标记,例如old data。

 

本篇作者

夏卫东

AWS 解决方案架构师,有20年IT从业经验,加入AWS之前在IBM和EMC从事售前工作。在IT基础架构设计方面,尤其是数据存储相关领域有丰富的实践经验。目前专注于企业整体上云方面的架构规划,设计和实施,同时也是AWS存储社区专家成员