飞行的蜗牛

vuePress-theme-reco 极客学长    2013 - 2025
飞行的蜗牛 飞行的蜗牛

Choose mode

  • dark
  • auto
  • light
首页
分类
  • 技术杂谈
  • Database
  • Docker
  • PHP
  • 随笔杂谈
  • 前端开发
  • FunnyTools
  • Jekyll
  • 读书笔记
  • Java
  • SpringBoot
  • 区块链技术
  • IPFS
  • C/C++
  • Filecoin
  • Golang
  • Sharding-JDBC
  • 分布式存储
  • Lotus-源码系列
  • Lotus
  • 框架源码系列
  • Spring-源码系列
  • AI
  • ChatGPT
  • Stable Diffusion
  • DeepSeek-R1
  • DeepSeek-V3
标签
时间抽
关于作者
开源项目
GeekAI (opens new window)
author-avatar

极客学长

154

文章

151

标签

首页
分类
  • 技术杂谈
  • Database
  • Docker
  • PHP
  • 随笔杂谈
  • 前端开发
  • FunnyTools
  • Jekyll
  • 读书笔记
  • Java
  • SpringBoot
  • 区块链技术
  • IPFS
  • C/C++
  • Filecoin
  • Golang
  • Sharding-JDBC
  • 分布式存储
  • Lotus-源码系列
  • Lotus
  • 框架源码系列
  • Spring-源码系列
  • AI
  • ChatGPT
  • Stable Diffusion
  • DeepSeek-R1
  • DeepSeek-V3
标签
时间抽
关于作者
开源项目
GeekAI (opens new window)
  • Ceph-04 Ceph 存储池

    • 查看存储池列表
      • 创建存储池
        • 设置存储池配额
          • 获取/设置 pool 副本数
            • 调整存储池选项值
              • 删除存储池
                • 重命名存储池
                  • 查看存储池统计信息
                    • 创建/删除存储池快照
                      • 纠删码配置
                        • 纠删码存储池与缓存分级

                        Ceph-04 Ceph 存储池

                        vuePress-theme-reco 极客学长    2013 - 2025

                        Ceph-04 Ceph 存储池


                        极客学长 2020-02-14 0 Ceph

                        # 存储池介绍

                        Ceph 对集群中所有存储资源进行池化管理,pool 是一个逻辑上的概念,其表达的是一组数据存储和查找的约束条件。

                        Ceph 集群刚刚搭建成功之后会有系统内会默认创建一个 RBD 存储池(然而本人测试的 Luminous 版本却发现并没有默认的 RBD)。

                        Ceph 提供两种类型的存储池,多副本存储池(Replicated Pool) 和 纠删码存储池(Erasure Code Pool)。

                        存储池提供以下功能:

                        • 自恢复力: 你可以设置在不丢数据的前提下允许多少 OSD 失效,对多副本存储池来说,此值是一对象应达到的副本数。 典型配置存储一个对象和它的一个副本(即 size = 2 ), 但你可以更改副本数; 对纠删编码的存储池来说,此值是编码块数(即纠删码配置里的 m=2 )。
                        • 归置组: 你可以设置一个存储池的归置组数量。典型配置给每个 OSD 分配大约 100 个归置组, 这样,不用过多计算资源就能得到较优的均衡。配置了多个存储池时,要考虑到这些存储池和整个集群的归置组数量要合理。
                        • CRUSH 规则: 当你在存储池里存数据的时候,与此存储池相关联的 CRUSH 规则集可控制 CRUSH 算法, 并以此操纵集群内对象及其副本的复制(或纠删码编码的存储池里的数据块)。你可以自定义存储池的 CRUSH 规则。
                        • 快照: 用 ceph osd pool mksnap 创建快照的时候,实际上创建了某一特定存储池的快照。
                        • 设置所有者: 你可以设置一个用户 ID 为一个存储池的所有者。

                        要把数据组织到存储池里,你可以列出、创建、删除存储池,也可以查看每个存储池的利用率。

                        # 环境说明

                        • 操作系统: Ubuntu 18.04 LTS
                        • Ceph 版本: 12.2.12 Luminous (stable)
                        • 节点架构: 1 mon, 1 mgr, 3 osd

                        # 多副本存储池

                        所谓多副本存储池,就是把所有的对象都存多个副本,Ceph 默认的副本配置是 size = 3, 也就是说数据存三份,2 个副本。但是一般典型的配置 都会把 size 重置为 2,节省空间。

                        # 查看存储池列表

                        root@ceph1:~# ceph osd lspools
                        1 rbd,2 cephfs_data,3 cephfs_metadata,
                        
                        root@ceph1:~# rados lspools
                        rbd
                        cephfs_data
                        cephfs_metadata 
                        

                        查看详细的存储池信息:

                        ceph osd pool ls detail 
                        

                        在新安装好的集群上,只有一个 rbd 存储池。

                        # 创建存储池

                        创建存储池前先看看 存储池、归置组和 CRUSH 配置参考 (opens new window)。 你最好在配置文件里重置默认归置组数量,因为默认值并不理想。关于归置组数量请参考 设置归置组数量 (opens new window)。

                        修改默认归置组数量,只需要在 ceph.conf 文件的 [osd] 配置段修改就好了。

                        例如:

                        osd pool default pg num = 100
                        osd pool default pgp num = 100
                        

                        命令形式:

                        ceph osd pool create {pool_name} {pg_num} [{pgp_num}] [replicated] [crush_ruleset_name] [expected_num_objects]

                        参数说明:

                        名称 类型 是否必需 参数说明
                        pool_name string Yes 存储池名称,必须唯一
                        pg_num int Yes 存储池的归置组总数,默认值为 8
                        pgp_num int No 用于归置的归置组总数。此值应该等于归置组总数
                        replicated string No replicated 表示创建的为多副本存储池
                        crush_ruleset_name string No 此存储池所用的 CRUSH 规则集名字。指定的规则集必须存在。
                        expected_num_objects int No 为这个存储池预估的对象数。
                        设置此值(要同时把 filestore merge threshold 设置为负数)后,
                        在创建存储池时就会拆分 PG 文件夹,
                        以免运行时拆分文件夹导致延时增大。

                        例如:

                        ceph osd pool create mytestpool 256 256 
                        

                        # 设置存储池配额

                        存储池配额可设置最大字节数、以及每个存储池最大对象数。

                        命令形式:

                        ceph osd pool set-quota {pool_name} [max_objects {obj_count}] [max_bytes {bytes}]

                        例如:

                        ceph osd pool set-quota mytestpool max_objects 10000
                        

                        查看存储池配额

                        root@ceph1:~#  ceph osd pool get-quota mytestpool
                        quotas for pool 'rbd':
                          max objects: 10000
                          max bytes  : N/A
                        
                        

                        # 获取/设置 pool 副本数

                        获取存储池副本:

                        ceph osd pool get {pool_name} size

                        例如:

                        ceph osd pool get mytestpool size
                        

                        设置存储池副本:

                        ceph osd pool set {pool_name} size {size}

                        例如:

                        ceph osd pool set mytestpool size 2
                        

                        # 调整存储池选项值

                        命令形式:

                        ceph osd pool set {pool_name} {key} {value}

                        例如:

                        # 获取 pg_num / pgp_num
                        ceph osd pool get mytestpool pg_num
                        ceph osd pool get mytestpool pgp_num
                        # 设置 pg_num
                        ceph osd pool set mytestpool pg_num 512
                        ceph osd pool set mytestpool pgp_num 512
                        

                        具体有哪些属性可以调整,以及有效范围说明,请参考 调整存储池选项值 (opens new window)

                        警告

                        Pool 的 pg_num 只能增大,不能减小。并且如果修改了 pg_num 最好同时修改 pgp_num,保持 pg_num = pgp_num。

                        减少 pg_num 会报错,例如:

                        root@ceph1:~# ceph osd pool get rbd pg_num
                        pg_num: 64
                        root@ceph1:~# ceph osd pool set rbd pg_num 60
                        Error EEXIST: specified pg_num 60 <= current 64
                        

                        # 删除存储池

                        删除存储是非常危险测操作,会销毁存储池中的全部数据,所以如果要删除存储池,你首先要在配置文档 ceph.conf 加入一条配置, 设置允许删除存储池,然后重启 MON 服务生效。

                        mon_allow_pool_delete = true
                        

                        其次为了防止删错,你需要连续输入两次 {pool_name}, 并且命令后面跟上 --yes-i-really-really-mean-it 参数。

                        命令形式:

                        ceph osd pool rm {pool_name} [{pool_name} --yes-i-really-really-mean-it]

                        例如:

                        root@ceph1:~# ceph osd pool rm mytestpool mytestpool --yes-i-really-really-mean-it
                        pool 'mytestpool' removed
                        

                        提示:

                        如果你给自建的存储池创建了定制的规则集,你不需要存储池时最好删除它。 如果你曾严格地创建了用户及其权限给一个存储池,但存储池已不存在,最好也删除那些用户。

                        # 重命名存储池

                        ceph osd pool rename {current_pool_name} {new_pool_name}

                        例如:

                        root@ceph1:~# ceph osd pool rename mytestpool new-pool-name
                        pool 'mytestpool' renamed to 'new-pool-name'
                        

                        # 查看存储池统计信息

                        root@ceph1:~# rados df
                        POOL_NAME       USED    OBJECTS CLONES COPIES MISSING_ON_PRIMARY UNFOUND DEGRADED RD_OPS RD      WR_OPS WR      
                        cephfs_data     1.00GiB     258      0    516                  0       0        0      2    2KiB    290 1.00GiB 
                        cephfs_metadata  214KiB      22      0     44                  0       0        0     75  479KiB    213  338KiB 
                        new-pool-name        0B       0      0      0                  0       0        0      0      0B      0      0B 
                        rbd             1.07GiB     294      5    588                  0       0        0   1943 14.6MiB    709 1.07GiB 
                        
                        total_objects    574
                        total_used       11.2GiB
                        total_avail      24.1GiB
                        total_space      35.3GiB
                        

                        # 创建/删除存储池快照

                        创建存储池快照

                        ceph osd pool mksnap {pool_name} {snap_name}
                        

                        删除存储池快照

                        ceph osd pool rmsnap {pool_name} {snap_name}
                        

                        # 纠删码存储池

                        Ceph 在没有特别指定参数的情况下,默认创建的是多副本存储池。纠删码存储池可以在提供与副本相同的冗余水平的同时节省空间。

                        最简单的纠删码存储池等效于RAID5,它相当于 size = 2 的副本池,却能节省 25% 的磁盘空间。

                        # 创建存储池

                        命令形式:

                        ceph osd pool create {pool_name} {pg_num} {pgp_num} erasure [erasure_code_profile] [crush_ruleset_name] [expected_num_objects]

                        下面命令创建一个最简单的纠删码存储池:

                        root@ceph1:~# ceph osd pool create ecpool 12 12 erasure
                        pool 'ecpool' created
                        root@ceph1:~# echo ABCDEFGHI | rados --pool ecpool put NYAN -
                        root@ceph1:~# rados --pool ecpool get NYAN -
                        ABCDEFGHI
                        

                        # 纠删码配置

                        默认的纠删码配置只能允许损坏一个 OSD。它等效于 size=2 的 多副本存储池,但是需要 1.5TB 而不是 2TB 的数据来存储 1TB 的数据。

                        一个默认的纠删码配置是这样的:

                        root@ceph1:~# ceph osd erasure-code-profile get default
                        k=2
                        m=1
                        plugin=jerasure
                        technique=reed_sol_van
                        

                        在此配置中 k=2 和 m=1 ,其含义为数据分布于 3 个 OSD ( k+m==3 )且允许一个失效。

                        注意:

                        选择正确的配置文件很重要,因为在创建池之后无法对其进行修改:需要创建一个具有不同配置文件的新池,并将先前池中的所有对象移至新池。
                        

                        为了在不增加原始存储空间需求的前提下提升冗余性,你可以新建配置。 例如,一个 k=10 且 m=4 的配置可容忍 4 个 OSD 失效,它会把一对象分布到 14 个( k+m=14 ) OSD 上。 此对象先被分割为 10 块(若对象为 10MB ,那每块就是 1MB )、并计算出 4 个用于恢复的编码块(各编码块尺寸等于数据块,即 1MB ); 这样,原始空间仅多占用 10% 就可容忍 4 个 OSD 同时失效、且不丢失数据。

                        可以通过下面命令创建纠删码配置:

                        root@ceph1:~# ceph osd erasure-code-profile set myprofile k=10 m=4 ruleset-failure-domain=rack
                        root@ceph1:~# ceph osd pool create ecpool 12 12 erasure myprofile
                        pool 'ecpool' created
                        

                        # 纠删码存储池与缓存分级

                        纠删码存储池比复制池需要更多的资源,并且缺少某些功能,例如部分写入。为了弥补这些缺陷,建议在纠删码存储池前面设置一个缓存层。

                        比如,如果 hot-storage 是由快速存储组成,我们可以使用下面的方式设置缓存层:

                        ceph osd tier add ecpool hot-storage
                        ceph osd tier cache-mode hot-storage writeback
                        ceph osd tier set-overlay ecpool hot-storage
                        

                        此时会将 hot-storage 池作为 ecpool 池的回写模式,这样一来 ecpool 的每次写入和读取实际上都在使用 hot-storage 缓存池,并从其灵活性和速度中受益。

                        注意:

                        此外由于它需要部分写入,因此无法在纠删码池上创建 RBD 镜像。但是,当复制池层设置了缓存层时,可以在擦除编码池上创建RBD映像, 但是,当复制池层设置了缓存层时,可以在纠删码池上创建 RBD 镜像。

                        rbd create --size 10G ecpool/myvolume
                        

                        # 参考文献

                        • ttp://docs.ceph.org.cn/rados/operations/pools/ (opens new window)
                        • http://docs.ceph.org.cn/rados/operations/erasure-code/ (opens new window)
                        • https://www.jianshu.com/p/8ccff3846ae1 (opens new window)

                        本站博文如非注明转载则均属作者原创文章,引用或转载无需申请版权或者注明出处,如需联系作者请加微信: geekmaster01

                        2019 个人年终总结 Ceph-05 Ceph 块存储之 RBD