首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何创建一个比物理空间大的卷 ,聊聊自动精简配置

本节介绍一下存储系统精简配置相关的内容。从标题乍一看,好像是介绍管理平面的内容,实际上精简配置是数据平面非常重要的特性。我们在配置存储系统的,逻辑卷的大小通常需要根据业务情况来做评估,比如A业务比较厉害,我们给他分配1TB的存储空间;B业务很小众,我们给他分配100GB的存储空间。

但问题是,业务都是动态变化的,其实我们是很难预估某个业务未来的存储需求。有可能B业务爆冷门,很快100GB的存储空间就不够用了,而A业务却发展缓慢,1TB的存储空间绝大多数都是空闲的。

虽然现在的逻辑卷管理可以实现动态的扩容和缩容,但操作起来还是稍显复杂。因为对于逻辑卷的扩容和缩容,不仅仅要动态修改逻辑卷的大小,其上的文件系统也得动态调整。所以,一方面有一定的操作复杂性,另外一方面是在线操作难免不会引入问题,对生产环境产生影响。

自动精简配置的出现很好的解决了上述问题。所谓自动精简配置其实是一种逻辑卷的类型,这种逻辑卷我们称为精简卷。精简卷的英文全称为thin provisioned volumes,与精简卷对应的称为厚卷(Thick Provisioning Volume),有时候精简卷也称为稀疏卷(Sparse Volume)。那么精简卷与厚卷的差异是什么呢?从用户使用的角度来说就是空间使用的差异。如下图所示,左侧为精简卷,右侧为厚卷,假设两者的容量都是100GB,使用容量是10GB。那么从底层空间的使用来看,精简卷使用多少空间才会占用多少物理空间,而厚卷在创建的时候就会占用物理空间。

目前精简卷已经是企业级存储系统的标配,应用非常广泛。开源存储软件也有很多实现的案例,比如Linux存储栈和ZFS等,都有对精简卷的支持。以ZFS的精简卷为例,我们可以很方便的创建一个精简卷,只需要在创建一个逻辑卷的时候添加一个选项“-s”即可。如下是一个具体的示例,我们创建一个10TB的精简卷(需要注意的是我们的存储池才2GB):

sudo zfs create -s -V 10TB pool/thin_vol

创建成功后,我们用命令“zfs list”查看一下卷的状态。可以看出,精简卷一共才占用的12KB的空间。

sunnyzhang@storagezhang:~$ zfs list

NAME            USED  AVAIL     REFER  MOUNTPOINT

pool            105M  1.65G     24.5K  /pool

pool/fs_test   24.5K  1.65G     24.5K  /pool/fs_test

pool/thin_vol    12K  1.65G       12K  -

pool/vol_test   105M  1.74G     6.40M  -

我们可以试着向该精简卷写入一些数据,比如我们在偏移为1TB的地方写入1MB的数据,具体命令如下。

sudo dd if=/dev/random of=/dev/zd16 seek=1073741824 bs=1KB count=1024

当数据写入成功后,再次查看一下卷的状态,可以看到此时精简卷thin_vol占用的空间变成了1MB。通过这个测试我们验证两个问题,一个是精简卷可以提供比实际物理空间大得多的空间供我们使用;另一个精简卷占用的空间与实际使用的空间相关,而与分配的空间无关。

sunnyzhang@storagezhang:~$ zfs list

NAME            USED  AVAIL     REFER  MOUNTPOINT

pool            106M  1.65G     24.5K  /pool

pool/fs_test   24.5K  1.65G     24.5K  /pool/fs_test

pool/thin_vol  1.00M  1.65G     1.00M  -

pool/vol_test   105M  1.74G     6.40M  -

基于Linux的LVM也可以创建精简卷,不过操作起来稍微复杂一点点。在创建精简卷之前,我们首先需要创建一个精简池。如下命令,我们首先在卷组vg0(关于卷组如何创建,请参考第二章的内容)创建一个空间大小为2GB的精简池sunny_thin_pool。

sudo lvcreate --thinpool sunny_thin_pool -L2GiB vg0

然后在精简池的基础上,我们就可以创建一个精简卷了。比如,我们依然可以像ZFS那样,在这个2GB的精简池上创建一个10TB的精简卷。  

sudo lvcreate -V 10T -T vg0/sunny_thin_pool -n thin_vol

精简卷创建成功后,我们可以通过lvs命令查看一下精简卷的信息。如下所示,可以看到精简卷的数据占比是0%。

我们依然向该精简卷1TB偏移的位置写入1MB的数据,写入完成后,我们再看一下精简卷的信息,此时可以看到精简卷的数据占比是0.01%。

从实现层面,在上一节介绍ZFS映射的时候曾经介绍过,逻辑卷底层实际上是由若干大小相等的数据块构成的。ZFS逻辑卷的数据是通过树型的间接块来管理的。这个模型我们可以进行简化,也就是逻辑卷的每一个逻辑块都有一个对应的物理数据块,而逻辑块对应的物理数据块是通过指针来定位的。有了这个理解,理解精简卷也就非常容易了。对于厚卷,在创建的时候每个逻辑卷块对应的物理数据块就已经分配了,也就是相应的指针就初始化了。而对于精简卷,在创建卷的时候,逻辑块并不分配物理数据块,而是在实际写入数据的时候才分配,而此时指针才会被初始化。  

虽然这样实现似乎挺合理,也很简单。但有一个问题,如果我们试图读取没有写入数据的位置时会发生什么?由于此时没有指针指向物理数据块,我们也无从读取数据,会不会出问题?当然不会,其实处理原则也非常简单,对于没有指针的位置,软件可以识别出来,直接返回全零的数据即可。  

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OizABCfddOcxcjMU-DgVjapA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券