• 【云原生 | Kubernetes 系列】--Ceph集群应用


    1. Ceph集群应用

    1.1 块设备RBD

    RBD(RADOS Block Devices)即为块存储的一种,RBD通过librbd库与OSD进行交互,RBD为KVM等虚拟技术和云服务(如Openstack和CloudStack)提供高性能和无限可扩展性的存储后端,这些系统依赖于libvirt和QEMU使用程序与RBD进行集成,客户端基于librbd库即可将RADOS存储集群用作块设备,不过,用于rbd的存储池需要事先启用rbd功能并进行初始化.

    1.2 创建RBD

    创建存储池,pg和pgp数量通常保持一致

    ## 创建pool
    $ ceph osd pool create myrbd1 64 64
    pool 'myrbd1' created
    ## 对pool启用RBD
    $ ceph osd pool application enable myrbd1 rbd
    enabled application 'rbd' on pool 'myrbd1'
    ## 初始化myrbd1 pool
    $ rbd pool init -p myrbd1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    1.3 创建并验证img

    rbd存储池并不能直接用于块存储,而是需要实现再其中按需创建映像(image),并把映像文件作为块设备使用,rbd命令可以用于创建,查看及删除块设备所在的映像,以及克隆映像,创建快照,将映像回滚到快照和查看快照等管理操作.

    1.3.1 创建映像

    $ rbd create myimag1 --size 2G --pool myrbd1
    ## 由于centos7只支持layering,所以创建一个给centos7用的myimage2
    $ rbd create myimag2 --size 2G --pool myrbd1 --image-feature layering
    $ rbd --image myimag1 --pool myrbd1 info
    rbd image 'myimag1':
    	size 2 GiB in 512 objects
    	order 22 (4 MiB objects)
    	snapshot_count: 0
    	id: 3739b001adf1
    	block_name_prefix: rbd_data.3739b001adf1
    	format: 2
    	features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
    	op_features: 
    	flags: 
    	create_timestamp: Thu Sep 15 13:33:56 2022
    	access_timestamp: Thu Sep 15 13:33:56 2022
    	modify_timestamp: Thu Sep 15 13:33:56 2022
    $ rbd --image myimag2 --pool myrbd1 info
    rbd image 'myimag2':
    	size 2 GiB in 512 objects
    	order 22 (4 MiB objects)
    	snapshot_count: 0
    	id: 133b3586a124
    	block_name_prefix: rbd_data.133b3586a124
    	format: 2
    	features: layering
    	op_features: 
    	flags: 
    	create_timestamp: Thu Sep 15 14:25:04 2022
    	access_timestamp: Thu Sep 15 14:25:04 2022
    	modify_timestamp: Thu Sep 15 14:25:04 2022
    $ rbd ls --pool myrbd1
    myimag1
    myimag2
    $ ceph df
    --- RAW STORAGE ---
    CLASS    SIZE   AVAIL    USED  RAW USED  %RAW USED
    hdd    12 GiB  12 GiB  84 MiB    84 MiB       0.68
    TOTAL  12 GiB  12 GiB  84 MiB    84 MiB       0.68
     
    --- POOLS ---
    POOL                   ID  PGS  STORED  OBJECTS    USED  %USED  MAX AVAIL
    device_health_metrics   1    1     0 B        1     0 B      0    3.8 GiB
    mypool                  2   32     0 B        0     0 B      0    3.8 GiB
    myrbd1                  3   64   213 B        7  48 KiB      0    3.8 GiB
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    1.4 挂载RBD

    1.4.1 Centos挂载RBD

    centos7客户端上

    ## 安装centos7 源
    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
    ## 安装epel源
    wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
    ## 安装ceph15.2.17源
    yum install -y https://mirrors.aliyun.com/ceph/rpm-15.2.17/el7/noarch/ceph-release-1-1.el7.noarch.rpm
    ## 安装ceph-common
    yum install ceph-common -y
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ceph-deploy服务器,将ceph.conf ceph.client.admin.keyring复制给客户端

    scp ceph.conf ceph.client.admin.keyring root@192.168.31.17:/etc/ceph/
    
    • 1

    centos7先确认是否可以连到ceph

    [root@centos7-1 ~]# ceph -s
      cluster:
        id:     86c42734-37fc-4091-b543-be6ff23e5134
        health: HEALTH_WARN
                client is using insecure global_id reclaim
                mons are allowing insecure global_id reclaim
     
      services:
        mon: 3 daemons, quorum ceph-mon01,ceph-mon02,ceph-mon03 (age 76m)
        mgr: ceph-mgr01(active, since 2h), standbys: ceph-mgr02
        osd: 14 osds: 12 up (since 116m), 12 in (since 116m)
     
      data:
        pools:   3 pools, 97 pgs
        objects: 6 objects, 197 B
        usage:   84 MiB used, 12 GiB / 12 GiB avail
        pgs:     97 active+clean
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    挂载RBD

    [root@centos7-1 ~]# lsblk
    NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda               8:0    0   20G  0 disk 
    ├─sda1            8:1    0    1G  0 part /boot
    └─sda2            8:2    0   19G  0 part 
      ├─centos-root 253:0    0   17G  0 lvm  /
      └─centos-swap 253:1    0    2G  0 lvm  [SWAP]
    sr0              11:0    1  9.5G  0 rom  
    ## 由于centos7不支持除layering的其他几种格式,所以这里就失败了.
    [root@centos7-1 ~]# rbd -p myrbd1 map myimag1
    rbd: sysfs write failed
    RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable myrbd1/myimag1 object-map fast-diff deep-flatten".
    In some cases useful info is found in syslog - try "dmesg | tail".
    rbd: map failed: (6) No such device or address
    
    [root@centos7-1 ~]# rbd -p myrbd1 map myimag2
    /dev/rbd0
    [root@centos7-1 ~]# lsblk
    NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda               8:0    0   20G  0 disk 
    ├─sda1            8:1    0    1G  0 part /boot
    └─sda2            8:2    0   19G  0 part 
      ├─centos-root 253:0    0   17G  0 lvm  /
      └─centos-swap 253:1    0    2G  0 lvm  [SWAP]
    sr0              11:0    1  9.5G  0 rom  
    ## 这个就是映射过来的rbd
    rbd0            252:0    0    2G  0 disk 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    格式化并挂载

    [root@centos7-1 ~]# mkfs.xfs /dev/rbd0
    Discarding blocks...Done.
    meta-data=/dev/rbd0              isize=512    agcount=8, agsize=65536 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0, sparse=0
    data     =                       bsize=4096   blocks=524288, imaxpct=25
             =                       sunit=1024   swidth=1024 blks
    naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
    log      =internal log           bsize=4096   blocks=2560, version=2
             =                       sectsz=512   sunit=8 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    [root@centos7-1 ~]# mkdir /data
    [root@centos7-1 ~]# mount /dev/rbd0 /data
    [root@centos7-1 ~]# df -Th
    Filesystem              Type      Size  Used Avail Use% Mounted on
    devtmpfs                devtmpfs  979M     0  979M   0% /dev
    tmpfs                   tmpfs     991M     0  991M   0% /dev/shm
    tmpfs                   tmpfs     991M  9.5M  981M   1% /run
    tmpfs                   tmpfs     991M     0  991M   0% /sys/fs/cgroup
    /dev/mapper/centos-root xfs        17G  2.1G   15G  13% /
    /dev/sda1               xfs      1014M  138M  877M  14% /boot
    tmpfs                   tmpfs     199M     0  199M   0% /run/user/0
    /dev/rbd0               xfs       2.0G   33M  2.0G   2% /data
    [root@centos7-1 ~]# cp /var/log/messages /data/
    [root@centos7-1 ~]# ls /data/
    messages
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    2. Ceph radosgw(RGW)对象存储

    RGW提供REST接口,用户通过http与其进行交互,完成数据的增删改查等管理操作.
    radosgw用在需要使用RESTful API接口访问ceph数据的场合,因此在使用RBD(块存储)的场合或者使用cephfs的场合可以不用启用radosgw功能.

    2.1 部署radosgw服务

    在mgr节点安装radosgw

    # apt install -y radosgw
    
    • 1

    ceph-deploy节点执行,将mgr01节点创建成radosgw节点

    radosgw默认监听7480

    $ ceph-deploy --overwrite-conf rgw create ceph-mgr01
    $ cephadmin@ceph-mgr01:~/ceph-cluster$ sudo ps -ef |grep radosgw
    ceph      10823      1  0 14:46 ?        00:00:00 /usr/bin/radosgw -f --cluster ceph --name client.rgw.ceph-mgr01 --setuser ceph --setgroup ceph
    cephadm+  11546  10691  0 14:48 pts/0    00:00:00 grep --color=auto radosgw
    $ ss -ntl|grep 7480
    LISTEN   0         128                 0.0.0.0:7480             0.0.0.0:*       
    LISTEN   0         128                    [::]:7480                [::]:* 
    cephadmin@ceph-mgr01:~/ceph-cluster$ ceph -s
      cluster:
        id:     86c42734-37fc-4091-b543-be6ff23e5134
        health: HEALTH_WARN
                client is using insecure global_id reclaim
                mons are allowing insecure global_id reclaim
     
      services:
        mon: 3 daemons, quorum ceph-mon01,ceph-mon02,ceph-mon03 (age 112m)
        mgr: ceph-mgr01(active, since 2h), standbys: ceph-mgr02
        osd: 14 osds: 12 up (since 2h), 12 in (since 2h)
        ## 这里看到rgw已经有一个启动了
        rgw: 1 daemon active (1 hosts, 1 zones)
     
      data:
        pools:   7 pools, 201 pgs
        objects: 209 objects, 14 MiB
        usage:   183 MiB used, 12 GiB / 12 GiB avail
        pgs:     201 active+clean
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    3. Ceph-FS 文件存储

    ceph-fs即ceph filesystem,可以实现文件系统共享功能,客户端通过ceph协议挂载并使用ceph集群作为数据存储服务器.
    ceph FS需要运行Meta Data Services(MDS)服务,其守护进程为ceph-mds,ceph-mds进程管理与cephFS上存储的文件相关的元数据,并协调对ceph存储集群的访问.

    3.1 部署MDS服务

    在安装节点执行

    sudo apt install -y ceph-mds
    
    • 1

    在ceph-deploy部署节点执行

    $ ceph-deploy mds create ceph-mgr01
    $ ps -ef |grep ceph-mds
    ceph      12010      1  0 15:04 ?        00:00:00 /usr/bin/ceph-mds -f --cluster ceph --id ceph-mgr01 --setuser ceph --setgroup ceph
    cephadm+  12121  10691  0 15:06 pts/0    00:00:00 grep --color=auto ceph-mds
    $ ceph mds stat
     1 up:standby
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.2 MDS创建存储池

    $ ceph osd pool create cephfs-metadata 32 32
    pool 'cephfs-metadata' created
    $ ceph osd pool create cephfs-data 64 64
    pool 'cephfs-data' created
    $ ceph fs new mycephfs cephfs-metadata cephfs-data
    new fs with metadata pool 8 and data pool 9
    $ ceph fs ls
    name: mycephfs, metadata pool: cephfs-metadata, data pools: [cephfs-data ]
    $ ceph fs status mycephfs
    mycephfs - 0 clients
    ========
    RANK  STATE      MDS         ACTIVITY     DNS    INOS   DIRS   CAPS  
     0    active  ceph-mgr01  Reqs:    0 /s    10     13     12      0   
          POOL         TYPE     USED  AVAIL  
    cephfs-metadata  metadata  96.0k  5006M  
      cephfs-data      data       0   5006M  
    MDS version: ceph version 16.2.10 (45fa1a083152e41a408d15505f594ec5f1b4fe17) pacific (stable)
    $ ceph mds stat
    mycephfs:1 {0=ceph-mgr01=up:active}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    3.3 客户端挂载

    centos7挂载
    再获取到secret,将key内容复制出来

    $ cat ceph.client.admin.keyring 
    [client.admin]
    	key = AQAAxiFjNoK5FRAAy8DUqFsOoCd2H0m9Q1SuIQ==
    	caps mds = "allow *"
    	caps mgr = "allow *"
    	caps mon = "allow *"
    	caps osd = "allow *"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在客户端上执行命令

    ## 192.168.31.81是mon服务器地址
    # mount -t ceph 192.168.31.81:6789:/ /data2 -o name=admin,secret=AQAAxiFjNoK5FRAAy8DUqFsOoCd2H0m9Q1SuIQ==
    [root@centos7-1 ~]# df -Th
    Filesystem              Type      Size  Used Avail Use% Mounted on
    devtmpfs                devtmpfs  979M     0  979M   0% /dev
    tmpfs                   tmpfs     991M     0  991M   0% /dev/shm
    tmpfs                   tmpfs     991M  9.5M  981M   1% /run
    tmpfs                   tmpfs     991M     0  991M   0% /sys/fs/cgroup
    /dev/mapper/centos-root xfs        17G  2.1G   15G  13% /
    /dev/sda1               xfs      1014M  138M  877M  14% /boot
    /dev/rbd0               xfs       2.0G   33M  2.0G   2% /data
    tmpfs                   tmpfs     199M     0  199M   0% /run/user/0
    192.168.31.81:6789:/    ceph      4.9G     0  4.9G   0% /data2
    [root@centos7-1 ~]# echo "123">/data2/messages 
    [root@centos7-1 ~]# tail /data2/messages
    123
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在另一台ubuntu服务器上挂载

    root@logstash:/data# mount -t ceph 192.168.31.81:6789:/ /data/u01/ -o name=admin,secret=AQAAxiFjNoK5FRAAy8DUqFsOoCd2H0m9Q1SuIQ==
    root@logstash:/data# df -Th
    Filesystem           Type      Size  Used Avail Use% Mounted on
    udev                 devtmpfs  932M     0  932M   0% /dev
    tmpfs                tmpfs     196M  1.3M  195M   1% /run
    /dev/sda2            xfs       120G   10G  111G   9% /
    tmpfs                tmpfs     977M     0  977M   0% /dev/shm
    tmpfs                tmpfs     5.0M     0  5.0M   0% /run/lock
    tmpfs                tmpfs     977M     0  977M   0% /sys/fs/cgroup
    /dev/loop1           squashfs   56M   56M     0 100% /snap/core18/2538
    /dev/loop2           squashfs   71M   71M     0 100% /snap/lxd/21029
    /dev/loop4           squashfs   62M   62M     0 100% /snap/core20/1611
    /dev/loop3           squashfs   68M   68M     0 100% /snap/lxd/22753
    /dev/loop5           squashfs   47M   47M     0 100% /snap/snapd/16292
    tmpfs                tmpfs     196M     0  196M   0% /run/user/0
    /dev/loop6           squashfs   56M   56M     0 100% /snap/core18/2560
    192.168.31.81:6789:/ ceph      4.9G     0  4.9G   0% /data/u01
    root@logstash:/data# cat /data/u01/messages 
    123
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    4. Ceph常用命令

    命令作用
    ceph osd pool ls获取存储池清单
    ceph osd lspools获取存储池清单,但清单前多一个数字
    ceph pg stat查看pg状态
    ceph osd pool stats mypool查看指定pool或所有pool状态
    ceph df查看集群状态
    ceph df detail显示集群详细信息
    ceph osd dump显示osd底层详细信息
    ceph osd tree显示osd和节点的对应关系
    ceph mon stat查看mon的状态
    ceph mon dump显示mon更详细的状态

    5. ceph停止与重启

    5.1 关闭顺序

    1. 先给ceph集群设置成noout,这样就不会将健康检查失败的剔除集群.ceph osd set noout
    2. 关闭客户端,停止数据读写
    3. 如果使用了RGW,关闭RGW
    4. 关闭cephfs元数据服务
    5. 关闭ceph osd
    6. 关闭ceph manager
    7. 关闭ceph monitor
    ## 关闭前
    $ ceph osd set noout
    ## 启动后
    $ ceph osd unset noout
    
    • 1
    • 2
    • 3
    • 4

    5.2 启动顺序

    1. 启动ceph monitor
    2. 启动ceph manager
    3. 启动ceph osd
    4. 启动cephfs元数据服务
    5. 启动RGW
    6. 启动存储客户端
    7. 服务启动完后取消noout ceph osd unset noout

    6. 集群服务器追加和删除

    6.1 追加服务器

    1. 添加仓库源

    2. 初始化安装基本环境

      ceph-deploy install --release pacific ceph-nodex

    3. 擦除磁盘

      ceph-deploy disk zap ceph-nodex /dev/sdx

    4. 添加osd

      ceph-deploy osd create ceph-nodex --data /dev/sdx

    6.2 删除服务器

    1. 把osd踢出集群

      ceph osd out 1

    2. 等一段时间

    3. 停止osd.x进程

    4. 删除osd

      ceph osd rm 1

    5. 当前主机的其他磁盘重复以上操作

    6. OSD全部操作完后下线主机

    7. 存储池,pg和crush

    副本池: replicated,定义每个对象在集群中保存为多少个副本,默认为三个副本,一主两备,实现高可用,副本池是ceph默认的存储池类型.

    纠删码池(erasure code): 把各对象存储为N=K+M个块,其中K为数据块数量,M为编码块数量,因此存储池的尺寸为K+M.
    即数据保存在K个数据库,并提供M个冗余提供数据高可用,那么最多能故障的块就是M个,实际的磁盘占用就是K+M块,因此相比副本池机制比较节省存储资源,一般采用8+4机制,即8个数据块+4个冗余块,那么也就是12个数据块有8个数据块保存数据,4个是用来做冗余的.即1/3的磁盘空间用作冗余,比默认的副本池更节省空间,但不能出现大于一定数据块的故障.

    不是所有应用都支持纠删码池,RBD只支持副本池而radosgw则都支持.

    默认创建是用副本池,如果需要创建纠删码池.

    ceph osd pool create test-erasure-pool 16 16 erasure
    
    • 1

    默认K=2 M=2

    7.1 副本池IO

    将一个数据对象存储为多个副本
    在客户端写入数据时,ceph使用CRUSH算法计算出与对象相应的PG ID和primary OSD根据设置的副本数,对象名称,存储池名称和集群运行图(cluster map)计算出PG的各辅助OSD,然后由OSD将数据再同步给辅助OSD

    读数据:

    1. 客户端发送请求,RADOS将请求发送到主OSD
    2. 主OSD从本地磁盘读取数据并返回数据,最终完成读请求.

    写入数据:

    1. 客户端APP请求写入数据,RADOS发送数据到主OSD.
    2. 主OSD识别副本OSDs,并发送数据到各副本OSD.
    3. 副本OSDs写入数据,并发送写入完成信号给主OSD.
    4. 主OSD发送写入完成信号给客户端APP

    副本池中读全部在主上完成,写先写主,然后向副本同步,同步完后和主确认,主收到所有副本确认后和client确认写完成.

    7.2 纠删码池IO

    Ceph从Firefly版开始支持纠删码,但是不推荐在生产环境使用纠删码池.
    纠删码降低了数据保存所需磁盘总空间数量,但读写数据的计算成本要比副本池高,RGW可以支持纠删码,RBD不支持.
    纠删码池可以降低前期TCO总拥有成本.

    纠删码写:

    数据将在主OSD进行编码然后分发到相应的OSDs上去.

    1. 计算合适的数据块进行编码
    2. 对每个数据块进行编码并写入OSD

    8. PG和PGP

    PG = Placement Group # 归置组
    PGP = Placement Group for Placement purpose # 归置组的组合,pgp相当于pg对应osd的一种排列组合关系.

    归置组是用于跨越多个osd将数据存储在每个存储池中的内部数据结构.归置组在osd守护进程和ceph客户端之间生成了一个中间层,CRUSH算法负责将每个动态映射到一个归置组,然后再将每个归置组动态映射到一个或多个OSD守护进程.从而能够支持在新的OSD设备上线时进行数据重新平衡.

    相对存储池来说,PG是一个虚拟组件,它是对象映射到存储池时使用的虚拟层.

    8.1 Pg计算

    Total PG = (Total_number_of_OSD * 100) / max_replication_count

    8.1.1 Target PGs per OSD值

    root@ceph-mgr01:~# ceph osd ls | wc -l
    16
    
    • 1
    • 2

    所以得出:

    Total_number_of_OSD = 16

    8.1.2 max_replication_count值

    root@ceph-mgr01:~# ceph osd dump | grep repli|awk '{print $6}'|sort -n -u
    3
    
    • 1
    • 2

    所以Total PG = 1600 / 3 = 533

    8.1.3 pool_count值

    root@ceph-mgr01:~# ceph osd pool ls | wc -l
    9
    
    • 1
    • 2

    可以看到都是3所以

    max_replication_count = 3

    8.1.4 Total PGs 值

    Total PGs = PG / pool_count

    Total PGs = 533 / 9

    取最近的2^N 那么就是64

    如果我们pool数确定了,只是到10个

    这时候创建pool,它的 Total PGs = 533 / 10 = 53 取最近2的N次幂也是64

    那么创建时指定的pg和pgs就设置为64

    如果ceph中pool的数不固定,就只要在初期约定一个pg值即可,pg值为2的N次幂.数据量大就使用64,128 ,256.数据量小就使用16或者32

    11. Pg的状态

    最好的状态就是pgs: 233 active+clean,说明整个PG都是健康的

    root@ceph-mgr01:~# ceph -s
      cluster:
        id:     86c42734-37fc-4091-b543-be6ff23e5134
        health: HEALTH_OK
     
      services:
        mon: 3 daemons, quorum ceph-mon01,ceph-mon02,ceph-mon03 (age 113m)
        mgr: ceph-mgr01(active, since 46h)
        mds: 1/1 daemons up
        osd: 16 osds: 16 up (since 112m), 16 in (since 43h)
        rgw: 1 daemon active (1 hosts, 1 zones)
     
      data:
        volumes: 1/1 healthy
        pools:   8 pools, 233 pgs
        objects: 213 objects, 20 KiB
        usage:   434 MiB used, 16 GiB / 16 GiB avail
        pgs:     233 active+clean
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    11.1 Peering

    正在同步状态,同一个PG中的OSD需要将准备数据同步一致,而Peering就是OSD同步过程中的状态.

    11.2 Activating

    Peering已经完成,PG正在等待所有PG实例同步Peering的结果(Inof,Log等)

    11.3 Clean

    干净态,PG不存在需要修复的对象,并且大小等于存储池的副本数.

    11.4 Active

    就绪态或活跃态,Active表示主OSD和备OSD都处于正常工作状态.此时的PG可以正常处理客户端的读写请求,正常PG默认就是Active+Clean状态.

    11.5 Degraded

    降级状态出现OSD标记为down以后,那么其他映射OSD的PG都会被转换到降级态.
    如果OSD被修复,那么就会从Degraded转变为Peering再变为clean
    如果down状态5分钟还没被修复,那么此OSD会被踢出集群,ceph会对被降级的PG启动恢复操作,直到被降级的PG重新恢复到clean状态.
    恢复数据从PG内的主OSD恢复,如果是主OSD出现故障.那么就在剩余的OSD上做选举,选出新的主OSD

    11.6 stale

    过期态,正常情况下,每个主osd都要周期性的向RADOS集群中的监视器mon报告作为主osd所持有的所有pg的最新统计数据,因任何原有导致某个osd无法正常向监视器发送汇报消息,或者由其他osd报告某个osd已经down的时候,则所有此osd为主pg则会立即被标记为stale状态,即他们的主osd已经不是最新数据了,如果备份osd发送down的时候,则ceph会执行修复而不会触发pg状态转换为stale状态.

    11.7 undersized

    PG当前副本数小于存储池定义的值,PG就会转变为undersized状态.

    11.8 scrubbing

    scrub是ceph对数据清洗状态,用来保持数据的完整性机制,ceph的osd定期启动scrub线程来扫描部分对象,通过与其他副本对比来发现是否一致,如果不一致则抛出异常提示用户手动解决.scrub以pg为单位,对每一个pg,ceph分析该pg下所有object,产生一个类似元数据信息摘要的数据结构.轻度扫描(light scrubs)和深度扫描(deep scrubs)深度扫描时状态会是scrubbing+deep

    11.9 Recovering

    正在恢复数据或者正在迁移或者同步副本.可能是新加了一个osd节点到集群或某个osd宕机造成.

    11.10 Backfilling

    后台填充状态,backfilling是recovery的一种特殊场景,值peering完成后,当前权威日志无法对Up Set(上行集)当中的某些PG实例实时增量同步,则会通过完全拷贝当前Primary所有对象的方式进行全量同步,此过程中PG会处于backfilling.

    10.11 backfill-toofull

    某个需要被backfiill的pg实例,他所在osd可用空间不足,backfill流程当前挂起时PG的状态.通过删数据或者加磁盘解决.

    12. 存储池操作

    通过ceph osd pool的子命令及参数实现,比如create/ls/rename/rm等

    12.1 创建存储池

    ceph osd pool create poolname pg pgp

    root@ceph-mgr01:~# ceph osd pool create testpool1 32 32
    pool 'testpool1' created
    
    • 1
    • 2

    12.2 查看存储池

    root@ceph-mgr01:~# ceph osd pool ls
    device_health_metrics
    mypool
    .rgw.root
    default.rgw.log
    default.rgw.control
    default.rgw.meta
    cephfs-metadata
    cephfs-data
    testpool1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    12.3 获取存储池信息

    root@ceph-mgr01:~# ceph osd pool stats testpool1
    pool testpool1 id 10
      nothing is going on
    
    • 1
    • 2
    • 3

    12.4 重命名存储池

    root@ceph-mgr01:~# ceph osd pool rename testpool1 testpool
    pool 'testpool1' renamed to 'testpool'
    root@ceph-mgr01:~# ceph osd pool ls
    device_health_metrics
    mypool
    .rgw.root
    default.rgw.log
    default.rgw.control
    default.rgw.meta
    cephfs-metadata
    cephfs-data
    testpool
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    12.5 显示存储池用量信息

    root@ceph-mgr01:~# rados df
    POOL_NAME                 USED  OBJECTS  CLONES  COPIES  MISSING_ON_PRIMARY  UNFOUND  DEGRADED  RD_OPS      RD  WR_OPS       WR  USED COMPR  UNDER COMPR
    .rgw.root               48 KiB        4       0      12                   0        0         0       4   4 KiB       4    4 KiB         0 B          0 B
    cephfs-data             12 KiB        1       0       3                   0        0         0       2   1 KiB       3  154 KiB         0 B          0 B
    cephfs-metadata        132 KiB       22       0      66                   0        0         0       0     0 B      74   42 KiB         0 B          0 B
    default.rgw.control        0 B        8       0      24                   0        0         0       0     0 B       0      0 B         0 B          0 B
    default.rgw.log        408 KiB      177       0     531                   0        0         0   22563  22 MiB   15007   34 KiB         0 B          0 B
    default.rgw.meta           0 B        0       0       0                   0        0         0       0     0 B       0      0 B         0 B          0 B
    device_health_metrics      0 B        1       0       3                   0        0         0       0     0 B       2    2 KiB         0 B          0 B
    mypool                     0 B        0       0       0                   0        0         0       1   1 KiB       2    1 KiB         0 B          0 B
    testpool                   0 B        0       0       0                   0        0         0       0     0 B       0      0 B         0 B          0 B
    
    total_objects    213
    total_used       435 MiB
    total_avail      16 GiB
    total_space      16 GiB
    root@ceph-mgr01:~# ceph osd df
    ID  CLASS  WEIGHT   REWEIGHT  SIZE      RAW USE  DATA     OMAP  META     AVAIL     %USE  VAR   PGS  STATUS
    10    hdd  0.00099   1.00000  1020 MiB   37 MiB  4.5 MiB   0 B   32 MiB   983 MiB  3.58  1.34   41      up
    11    hdd  0.00099   1.00000  1020 MiB   21 MiB  4.5 MiB   0 B   17 MiB   999 MiB  2.10  0.79   57      up
    12    hdd  0.00099   1.00000  1020 MiB   37 MiB  4.5 MiB   0 B   32 MiB   983 MiB  3.60  1.35   52      up
    13    hdd  0.00099   1.00000  1020 MiB   31 MiB  4.5 MiB   0 B   27 MiB   989 MiB  3.09  1.16   47      up
     2    hdd  0.00099   1.00000  1020 MiB  5.0 MiB  4.5 MiB   0 B   24 MiB  1015 MiB  0.49  0.19   46      up
     3    hdd  0.00099   1.00000  1020 MiB   32 MiB  4.5 MiB   0 B   28 MiB   988 MiB  3.18  1.19   45      up
     4    hdd  0.00099   1.00000  1020 MiB   22 MiB  4.5 MiB   0 B   17 MiB   998 MiB  2.15  0.81   54      up
     5    hdd  0.00099   1.00000  1020 MiB   26 MiB  4.5 MiB   0 B   22 MiB   994 MiB  2.60  0.97   51      up
     6    hdd  0.00099   1.00000  1020 MiB   32 MiB  4.5 MiB   0 B   27 MiB   988 MiB  3.11  1.17   45      up
     7    hdd  0.00099   1.00000  1020 MiB   27 MiB  4.5 MiB   0 B   23 MiB   993 MiB  2.68  1.00   52      up
     8    hdd  0.00099   1.00000  1020 MiB   32 MiB  4.5 MiB   0 B   28 MiB   988 MiB  3.18  1.19   48      up
     9    hdd  0.00099   1.00000  1020 MiB   33 MiB  4.5 MiB   0 B   28 MiB   987 MiB  3.20  1.20   49      up
    14    hdd  0.00099   1.00000  1020 MiB   27 MiB  4.5 MiB   0 B   22 MiB   993 MiB  2.63  0.99   50      up
    15    hdd  0.00099   1.00000  1020 MiB   26 MiB  4.5 MiB   0 B   22 MiB   994 MiB  2.57  0.96   50      up
    16    hdd  0.00099   1.00000  1020 MiB   26 MiB  4.5 MiB   0 B   21 MiB   994 MiB  2.53  0.95   51      up
    17    hdd  0.00099   1.00000  1020 MiB   20 MiB  4.5 MiB   0 B   16 MiB  1000 MiB  1.98  0.74   57      up
                           TOTAL    16 GiB  435 MiB   72 MiB   0 B  386 MiB    16 GiB  2.67                   
    MIN/MAX VAR: 0.19/1.35  STDDEV: 0.74
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    12.6 删除存储池

    需要删除myrbd1这个存储池

    root@ceph-mgr01:~# ceph osd pool ls
    device_health_metrics
    mypool
    myrbd1
    .rgw.root
    default.rgw.log
    default.rgw.control
    default.rgw.meta
    cephfs-metadata
    cephfs-data
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    12.6.1 允许删除存储池

    默认禁止删除存储池,需要先设置成允许删除

    root@ceph-mgr01:~# ceph tell mon.* injectargs --mon-allow-pool-delete=true
    mon.ceph-mon01: {}
    mon.ceph-mon01: mon_allow_pool_delete = 'true' 
    mon.ceph-mon02: {}
    mon.ceph-mon02: mon_allow_pool_delete = 'true' 
    mon.ceph-mon03: {}
    mon.ceph-mon03: mon_allow_pool_delete = 'true' 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    12.6.2 删除存储池

    root@ceph-mgr01:~# ceph osd pool rm myrbd1 myrbd1 --yes-i-really-really-mean-it
    pool 'myrbd1' removed
    root@ceph-mgr01:~# ceph osd pool ls
    device_health_metrics
    mypool
    .rgw.root
    default.rgw.log
    default.rgw.control
    default.rgw.meta
    cephfs-metadata
    cephfs-data
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    12.6.3 禁止删除存储池

    再将允许删除改为禁止

    root@ceph-mgr01:~# ceph tell mon.* injectargs --mon-allow-pool-delete=false
    mon.ceph-mon01: {}
    mon.ceph-mon01: mon_allow_pool_delete = 'false' 
    mon.ceph-mon02: {}
    mon.ceph-mon02: mon_allow_pool_delete = 'false' 
    mon.ceph-mon03: {}
    mon.ceph-mon03: mon_allow_pool_delete = 'false' 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    12.7 存储池配额

    12.7.1 查看存储池限制

    root@ceph-mgr01:~# ceph osd pool get-quota testpool
    quotas for pool 'testpool':
      max objects: N/A		## 默认不限制对象数量
      max bytes  : N/A		## 默认不限制空间大小
    
    • 1
    • 2
    • 3
    • 4

    12.7.2 限制上传对象数量

    限制上传对象数最大1000个

    root@ceph-mgr01:~# ceph osd pool set-quota testpool max_objects 1000
    set-quota max_objects = 1000 for pool testpool
    root@ceph-mgr01:~# ceph osd pool get-quota testpool
    quotas for pool 'testpool':
      max objects: 1k objects  (current num objects: 0 objects)
      max bytes  : N/A
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    12.7.3 限制空间使用

    限制最多使用1G

    root@ceph-mgr01:~# echo "1024*1024*1024"|bc
    1073741824
    root@ceph-mgr01:~# ceph osd pool set-quota testpool max_bytes 1073741824
    set-quota max_bytes = 1073741824 for pool testpool
    root@ceph-mgr01:~# ceph osd pool get-quota testpool
    quotas for pool 'testpool':
      max objects: 1k objects  (current num objects: 0 objects)
      max bytes  : 1 GiB  (current num bytes: 0 bytes)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    12.8 存储池可用参数

    查看的话就使用ceph osd pool get,如果要调整参数的话就ceph osd pool set

    参数含义
    ceph osd pool get testpool size存储池副本数
    ceph osd pool get testpool min_size提供服务最小副本数
    ceph osd pool get testpool pg_num查看pg数量
    ceph osd pool get testpool crush_rule查看crush算法规则,是副本池还是纠删码
    ceph osd pool get testpool nodelete控制是否可以删除,默认是可以
    ceph osd pool get testpool nopgchange是否可以更改存储池的pg_num和pgp_num
    ceph osd pool set testpool pg_num 64将pg数设置成64
    ceph osd pool get testpool nosizechange是否可以修改存储池大小
    ceph osd pool get testpool noscrub是否开启轻量扫描
    ceph osd pool get testpool nodeep-scrub是否开启深度扫描
    scrub_min_interval存储池最小清理间隔

    noxxx 是不允许,如果是false那就可以对该值进行修改,如果是true那就无法修改.可以修改为false后再修改.

    12.9 快照

    对存储池中的数据做快照或恢复,尽量在业务低峰期做快照.

    12.9.1 生成快照

    ## 方法1
    root@ceph-mgr01:~# ceph osd pool mksnap testpool testpool-snap
    created pool testpool snap testpool-snap
    ## 方法2
    root@ceph-mgr01:~# rados -p testpool mksnap testpool-snap2
    created pool testpool snap testpool-snap2
    ## 查看快照
    created pool testpool snap testpool-snap2
    root@ceph-mgr01:~# rados lssnap -p testpool
    1	testpool-snap	2022.09.18 11:06:33
    2	testpool-snap2	2022.09.18 11:07:27
    2 snaps
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    12.9.2 回滚快照

    ## 先往testpool里写一些东西
    root@ceph-mgr01:~# rados -p testpool put test.pass /etc/passwd
    root@ceph-mgr01:~# rados -p testpool put my.sys /etc/fstab
    root@ceph-mgr01:~# rados -p testpool put aat.pass /etc/group
    root@ceph-mgr01:~# rados -p testpool ls
    aat.pass
    test.pass
    my.sys
    
    ## 创建快照
    root@ceph-mgr01:~# rados -p testpool mksnap testpool-snap3
    ## 再做些变化
    root@ceph-mgr01:~# rados -p testpool put issue /etc/issue
    root@ceph-mgr01:~# rados -p testpool ls
    issue
    aat.pass
    test.pass
    my.sys
    root@ceph-mgr01:~# rados -p testpool lssnap
    1	testpool-snap	2022.09.18 11:06:33
    2	testpool-snap2	2022.09.18 11:07:27
    3	testpool-snap3	2022.09.18 11:15:31
    3 snaps
    ## 删除test.pass
    root@ceph-mgr01:~# rados -p testpool rm test.pass
    root@ceph-mgr01:~# rados -p testpool rm test.pass
    error removing testpool>test.pass: (2) No such file or directory
    ## 从快照中还原某个文件
    root@ceph-mgr01:~# rados -p testpool rollback test.pass testpool-snap3
    rolled back pool testpool to snapshot testpool-snap3
    root@ceph-mgr01:~# rados -p testpool ls
    issue
    aat.pass
    test.pass
    my.sys
    ## 又能删了
    root@ceph-mgr01:~# rados -p testpool rm test.pass
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    12.9.3 删除快照

    root@ceph-mgr01:~# rados -p testpool rmsnap testpool-snap
    removed pool testpool snap testpool-snap
    root@ceph-mgr01:~# rados -p testpool rmsnap testpool-snap2
    removed pool testpool snap testpool-snap2
    root@ceph-mgr01:~# rados -p testpool lssnap
    3	testpool-snap3	2022.09.18 11:15:31
    1 snaps
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    12.10 数据压缩

    bulestore存储引擎,ceph支持"实时数据压缩"即边压缩边保存数据的功能,该功能有助于节约磁盘空间,可以在bulestore OSD上创建每个Ceph池上启用或禁用压缩,以节约磁盘空间,默认没有开启压缩,需要后期配置并开启.

    12.10.1 启用压缩并指定压缩算法

    snappy: 该配置为指定压缩使用的算法,默认是snappy,还有none,zlib,lz4,zstd等,zstd压缩比高,但消耗CPU,lz4和snappy对cpu占用较低,不建议使用zlib.

    # ceph osd pool set testpool compression_algorithm snappy
    
    • 1

    12.10.2 指定压缩模式

    # ceph osd pool set testpool compression_mode aggressive
    
    • 1

    压缩模式有:

    • none 从不压缩(默认)
    • passive 除非写操作具有可压缩提示,否则不压缩
    • aggressive 压缩数据,除非写操作具有不可压缩提示
    • force 无论如何都尝试压缩数据.
    存储池压缩参数含义
    compression_algorithm压缩算法
    compression_mode压缩模式
    compression_required_ratio压缩后与压缩前比,默认为.875
    compression_max_blob_size大于此的块在压缩前被分解成更小的blob块,次设置将覆盖blustore压缩max blob的全局设置

    可以配置到ceph.conf配置文件的global中,作用于所有存储池

    参数含义
    bluestore_compression_algorithm压缩算法
    bluestore_compression_mode压缩模式
    bluestore_compression_required_ratio压缩比
    bluestore_compression_min_blob_size小于他的块不被压缩,默认0
    bluestore_compression_max_blob_size大于他的块在压缩前会被拆成更小的块,默认0
    bluestore_compression_min_blob_size_ssd默认8192
    bluestore_compression_max_blob_size_ssd默认65536
    bluestore_compression_min_blob_size_hdd默认8192
    bluestore_compression_max_blob_size_hdd默认65536

    在不加认证的情况下,先把文件拆分成4M每个的数据块,拿出数据块的ino和ono相加,得到对象id.通过hash对象id对pg进行与运算,计算出对象id属于哪个PG,使用CRUSH算法进行OSD映射.

  • 相关阅读:
    【大数据】一、大数据环境配置
    前缀和(c++,超详细,含二维)
    关于我用iVX沉浸式体验了一把0代码项目创建(2)
    Excel VLOOKUP实用教程之 02 vlookup如何双向查找,两个字段查询数据?(教程含数据excel)
    基础springboot扫描讲解
    C# 实现打印机队列监控Win32_PrintJob,Win32_Printer
    2023 Google 开发者大会 – AI 领域的技术更新
    OpenGauss数据库在 CentOS 上的实践,配置篇
    聚焦“碳中和”,成都超算中心牵手重庆大学唱好“成渝双城记”
    漏洞情报|Jackson-databind反序列化漏洞风险通告(CVE-2020-35490,CVE-2020-35491)
  • 原文地址:https://blog.csdn.net/qq_29974229/article/details/126927260