分布式存储ceph:加密和压缩

时间:2024-04-03 21:33:10

加密

加密是将用户的明文数据通过加密,变成加密数据,在数据被窃取的时候起到防护作用。对于Ceph来说,从应用程序到存储设备的数据链路上来看,根据对数据加密的位置,现阶段主要有以下几种加密方式。

· 客户端加密:这包括应用程序本身的加密,以及更为广泛的通用加密模块。如Linux内核的dmcrypt。这些加密都在客户端进行,意味着在网络上传送的都是加密数据,存储的也都是加密数据。

· 存储端加密:数据的加密与解密在存储端进行,存储设备负责管理**。在这种方法中,在网络上通过HTTP传递的都是明文数据,想要避免传递明文数据,需要使用HTTPS。

Ceph作为一个分布式存储系统,提供了存储端加密。根据用户数据在Ceph中的I/O路径,可以提供多种不同的加密方式。1.对象网关加密

这种方式是指客户端将数据传递到对象网关,网关将数据加密存储到Ceph集群。反之,密文数据从Ceph集群读取到对象网关,进行解密,然后传送到客户端。

对象网关加密支持以下模式的**管理。

  1. 用户提供**

在这种模式下,客户端将在每次I/O操作时将**一起传递给Ceph。客户端需要自己负责管理这些**,并且需要记录对象加密时所使用的对应**。这种模式的实现细节读者可以参照S3 Amazon SSE-C 文档。

2)**管理服务

这种模式下允许**保存在某个**管理服务中,Ceph对象网关在需要的时候会通过统一接口去读取**。具体实现读者可以参考S3 Amazon SSE-KMS 文档。理论上,任何符合这个文档的**管理服务都能用在Ceph中,但是现在只有Barbican的集成已经完成。

Barbican是OpenStack的一个子项目,为存储安全提供**密码及证书管理,通过RESTful接口提供服务。Ceph对象网关使用Barbican的过程为:首先,在需要时,对象网关向Keystone请求token;拿到token后,对象网关向Barbican请求**,Barbican确认token是否有效,如果有效,就把对应的**返回给对象网关;接下来,对象网关就可以使用**进行加密与解密了。

OSD端加密

这里所谓的OSD端加密,其实是对硬盘来进行加密的。基本原理是通过Linux内核dmcrypt模块,进行数据的加密与解密。

首先需要在创建OSD时,加入“--dmcrypt”选项,命令如下:

分布式存储ceph:加密和压缩

该命令除了具有创建OSD的功能,还会在硬盘驱动的上层加入dmcrypt模块,这意味着所有的数据在写入硬盘之前,会经过dmcrypt模块进行加密与解密。

接下来,定义CRUSH Map使所有具有加密功能的OSD服务位于同一个存储池中,该存储池即具有了加密与解密功能。用户存储在该存储池的数据是被加密存储在硬盘上的。

严格来说,dmcrypt的功能不在Ceph代码范围内,它可以被视为硬盘驱动的一部分。另外,如果使用FileStore,也可以在文件系统级别加入对数据的加密支持。

 

压缩

压缩的本质是用更小的数据量表示更多的数据,根据元数据是否完整分为有损压缩和无损压缩。无损压缩通常是通过对数据中的冗余信息进行处理来减小数据体积的,因此是可逆的。无损压缩实现的基础是现实世界的数据存在大量冗余,而通过对数据的编码,就能尽量减少这种冗余。

Ceph提供基于服务器端的无损压缩,当对象上传到Ceph时,对数据进行压缩,然后存储压缩数据。Ceph现在支持的压缩算法有snappy、zlib、zstd和lz4。根据用户数据在Ceph中的I/O路径,Ceph可以在下面这些位置提供压缩服务。1.对象网关

Ceph对象网关中,Zone用来表示一个独立的对象存储区域,Zone包含了桶,桶里依次存放了对象,Placement Target用于指定桶和对象的存储池,Placement Target可以让Zone同时拥有多组不同的存储池。如果不配置Placement Target,桶和对象将会存储到网关实例所在Zone配置的默认存储池中。

Ceph基于一个Zone的Placement Target来提供压缩功能。可以使用下列命令来启动压缩功能:

分布式存储ceph:加密和压缩

分布式存储ceph:加密和压缩

设置之后,所有上传到桶的新对象都会使用新的Placement Target,即使用新的压缩算法。需要注意的是,每个对象在写入时会记录自己对应的压缩算法和属性,改变Placement Target不会对现有对象的解压缩有影响,也不会导致现有对象重新压缩。

另外,对象网关还提供用于查看基于桶的数据统计信息的接口。下面的命令可以查看实际的存储空间及存储对象的大小,用户可以自己计算出压缩比例:

分布式存储ceph:加密和压缩

BlueStore

BlueStore支持在线的压缩方式,即在读或写I/O的路径中进行同步的压缩和解压缩。针对每个存储池,用户可以设置相应的压缩参数。

· 压缩算法:默认不进行设置,不使用压缩。其他可支持的压缩算法包括lz4、snappy、zlib与zstd。

· 压缩模式(Compression Mode):压缩模式和每个写操作自带的hint一起来决定是否对该请求进行压缩。现有模式包括None,不进行压缩;Passive,除非写请求自带压缩hint,否则不进行压缩;Aggressive,除非写请求中有不压缩的hint,否则全部进行压缩;Force,无视其他,对所有写请求全部进行压缩。压缩模式的存在,主要是为了让BlueStore中的压缩和对象网关中的压缩可以协同工作。同一份数据经过对象网关压缩后,就没有必要在BlueStore中进行二次压缩了。

· 压缩比例:数据块压缩之后的大小和原始数据大小的比例。只有压缩比等于或低于该比例,压缩才会进行。否则,如果一份数据经过压缩后没有达到一定的压缩比例,该数据不会进行压缩,而将直接存储原始数据。例如,该比例设置为0.7,则在写操作中,只有那些经过压缩后的数据是原始数据的70%,或者更少的数据才能被压缩后进行存储。

· 最小blob大小(Compression Min blob Size):如果需要压缩的数据块小于该值,则不进行压缩,原文存储。该值针对硬盘驱动器和固态硬盘可以设置不同大小。

· 最大blob大小(Compression Max blob Size):如果需要压缩的数据块大于该值,则会分成若干个数据块进行压缩。该值针对硬盘驱动器和固态硬盘可以设置不同大小。

针对存储的数据面处理,英特尔分别提供了基于硬件和软件的加速方案:QAT和ISA-L。ISA-L的支持在2016年已经实现,至于基于QAT的加密和压缩加速,最新的代码也已经支持。