为什么要研究这个? 因为rgw 没找到横向扩容的比较好的办法。有些人是在rgw 上层再加一个接入层,在上面加数据记录。比如一个“虚拟大bucket”,对应了下面多个集群的多个 bucket 。 无论哪一种办法,都要增加额外的元数据管理系统。 看到amazon 的这个 storage class 被ceph rgw (Nautilus)支持后 我打算研究一下利用这个新功能做到几件事 1 横向 在bucket 下扩pool 2 通过 bucket 下同时支持多个 pool,提高读写吞吐。 3 利用 生命周期。前置ssd pool 。达到时间后把对象迁移到后面的廉价 COLD pool 比如 大容量sata 。 ceph 官网文档 地址 https://docs.ceph.com/docs/master/radosgw/placement/ 这个功能 amazon s3 在 2018年推出 发布于: Nov 26, 2018 S3 智能分层是一种新的 Amazon S3 存储类,专为希望在数据访问模式发生变化时自动优化存储成本而不会影响性能或运营开销的客户而设计。S3 智能分层是第一个云对象存储类,通过在访问模式发生变化时在两个访问层(频繁访问层和不频繁访问层)之间移动数据来实现自动节省成本,非常适用于访问模式未知或不断变化的数据。 ceph 官方在rgw Nautilus 版本中引入 首先说说 palcement 和 storage class 的区别 placement 是指 bucket 的放置属性 ,storage class 是bucket 内每个对象的放置属性。 placement 下面默认有个标准层 STANDARD 他对应的pool 默认default.rgw.buckets.data (这个pool 可修改为你想存放的 pool,) "STANDARD": { "data_pool": “default.rgw.buckets.data” 每个 placemetn 都有个 STANDARD 你可以 添加自定义分层 比如 COLD 不只限于一个。可以多个。 上图是我测试的placement 加的2个class。 可以分别对应不同的pool 。 pool 可以根据你的需要新建在不同的设备上 比如 ssd sas sata 根据我们以前的测试结果 bucket ==> placement storage class ==>pool 创建bucket 通过指定 placement 制定了 放置池组 PUT 对象时候 可以制定 storage_class 指定具体的pool 下面说说具体做法 ,我就在默认 的 default-placement操作测试 根据官网命令 To add a new storage class named COLD to the default-placement target, start by adding it to the zonegroup 先在 zonegroup 加入 tag 1) $ radosgw-admin zonegroup placement add --rgw-zonegroup default --placement-id default-placement --storage-class COLD 2)zone 中加入 具体 pool 官网例子加上了压缩。这个可以根据需要配置是否加上 radosgw-admin zone placement add --rgw-zone default --placement-id default-placement --storage-class COLD --data-pool default.rgw.cold.data --compression lz4 结果如下 placement_pools": [ { "key": "default-placement”, "val": { "index_pool": “default.rgw.buckets.index”, "storage_classes": { 我们用 s3cmd 测试上传 对我的 测试placement 做put 文件测试 (这里我用自定义 的placemet 做测试 指定 -storage-class=TEMPCOLD s3cmd put cirros-0.3.5-x86_64-disk.img s3://bucket2/clodtest1 --storage-class=TEMPCOLD upload: "cirros-0.3.5-x86_64-disk.img" -> " s3://bucket2/clodtest1" [1 of 1] s3cmd info s3://bucket2/clodtest1 s3://bucket2/clodtest1 (object): File size: 13267968 Last mod: Sun, 29 Mar 2020 07:03:34 GMT MIME type: application/octet-stream Storage: TEMPCOLD MD5 sum: f8ab98ff5e73ebab884d80c9dc9c7290 如果不加参数 s3cmd put cirros-0.3.5-x86_64-disk.img s3://bucket2/clodtest3 upload: "cirros-0.3.5-x86_64-disk.img" -> " s3://bucket2/clodtest3" [1 of 1] 13267968 of 13267968 100% in 0s 27.25 MB/s done 数据会落在 STANDARD s3://bucket2/clodtest3 (object): File size: 13267968 Last mod: Sun, 29 Mar 2020 07:06:24 GMT MIME type: application/octet-stream Storage: STANDARD 经过测试 读数据不需要知道对象属于哪一个 Storage 。 ===== 官方说明 所有放置目标都有一个STANDARD存储类,默认情况下该存储类适用于新对象。用户可以使用覆盖此默认设置 default_storage_class。 要在非默认存储类中创建对象,请在请求的HTTP标头中提供该存储类名称。S3协议使用 X-Amz-Storage-Class标头,而Swift协议使用 X-Object-Storage-Class标头。 结论: 1 如果需要 提高性能。可以同时在一个placement 下加入多个 Storage 对应多个 pool。 客户端写数据的时候可以均衡指定 storage-class 具体可以参考s3 api . 或者可以在nginx 接入层做 灵活的指定 X-Amz-Storage-Class (对多个 storage-class 做自定义轮询或者打开关闭) 2 如果需要在pool 将近满了。可以新增一个 storage-class。 客户端读写 指定到新的 storage-class。 3 如果需要用ssd 加速。可以 用ssd pool 作为STANDARD 用 廉价 sata 作为 COLD 进行迁移。 具体要研究 Lifecycle 的设置 我这里就没时间做测试了。 目前我测试的 ceph 是 14.2.5. 不是最新。 感觉这个功能还有写莫名其妙的情况。 建议各位有需要的可以做大规模的测试。