分布式存储系统之Ceph集群存储池、PG 与 CRUSH

前文我们了解了ceph集群状态获取常用命令以及通过ceph daemon、ceph tell动态配置ceph组件、ceph.conf配置文件相关格式的说明等,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16727820.html;今天我们来聊一聊ceph的存储池、PG以及CRUSH相关话题;
一、关于存储池
我们知道ceph客户端存储对象数据到RADOS集群上,不是客户端直接存储到osd上;首先客户端会根据ceph集群的配置,将客户端存储的对象数据切分多个固定大小的对象数据,然后再将这些固定大小的数据对象通过一致性hash算法将对象数据映射至存储池里的PG,然后由CRUSH算法计算以后,再将PG映射至对应osd,然后由mon返回osd的ID给客户端,客户端拿着mon给的osd相关信息主动联系对应osd所在节点osd进程,进行数据存储操作;
什么是存储池呢?在ceph上,所谓存储池是ceph以“存储池(pool)”的方式,将RADOS存储集群提供的存储服务逻辑分割一个或多个存储区域;我们可以理解为数据对象的名称空间;实践中,管理员可以为特定应用程序存储不同类型数据的需求分别创建专用的存储池,例如rbd存储池、rgw存储池等,也可以为某个项目或某个用户创建专有的存储池;当然,如果我们在一个存储池里存储的数据过多,为了方便管理,存储池还可以进一步细分为一至多个名称空间(namespace);客户端(包括rbd和rgw等)存取数据时,需要事先指定存储池名称、用户名和密钥等信息完成认证,而后将一直维持与其指定的存储池的连接,于是也可以把存储池看作是客户端的IO接口;
Ceph存储池类型
在ceph上,存储池有两种类型;默认情况下,我们不指定什么类型的存储池就是副本池(replicated pool);所谓副本池就是存储在该存储之上的对象数据,都会由RADOS集群将每个对象数据在集群中存储为多个副本,其中存储于主OSD的为主副本,副本数量在创建存储池时 由管理员指定;默认情况下不指定副本数量,对应副本数量为3个,即1主2从;从上面的描述可以看到,当我们存储一份对象数据时,为了冗余备份,我们需要将数据存储3分,即有两份冗余;这也意味着,我们磁盘利用率也只有1/3;于是,为了提高磁盘的利用率的同时,又能保证冗余,ceph还支持纠删码池(erasure code);纠删码池就是把个对象存储为 N=K+M 个块,其中,K为数据块数量,M为编码块数量,因此存储池的尺寸为 K+M ;纠删码是一种前向纠错(FEC)代码通过将K块的数据转换为N块,假设N=K+M,则其中的M代表纠删码算法添加的额外或冗余的块数量以提供冗余机制(即编码块),而N则表示在纠删码编码之后要创建的块的总数,其可以故障的总块数为M(即N-K)个;类似RAID5;纠删码池减少了确保数据持久性所需的磁盘空间量,但计算量上却比副本存储池要更贵一些;但我们在使用纠删码池的时候需要注意不是所有的应用都支持纠删码池,比如,RGW可以使用纠删码存储池,但RBD就不支持纠删码池,它只支持副本池;
副本池IO

分布式存储系统之Ceph集群存储池、PG 与 CRUSH

文章插图
提示:在ceph上,副本池会将一个数据对象存储为多个副本;为此,在写入操作时,ceph客户端使用crush算法来计算对象的PG ID和Primary OSD,然后客户端将数据写入主OSD,主OSD根据设定的副本数、对象的名称、存储池名称和集群运行图(Cluster Map)计算出PG的各辅助OSD,而后由主OSD将数据同步给这些辅助OSD,只有在其他辅助osd和主osd都将对应数据存储好以后,主osd收到对应辅助osd的确认以后,才会给客户端确认;
纠删码池IO
分布式存储系统之Ceph集群存储池、PG 与 CRUSH

经验总结扩展阅读