zoukankan      html  css  js  c++  java
  • ceph存储之RBD块存储

    无论是通过Ceph块设备、对象存储还是文件系统,Ceph存储群集都从Ceph客户端接收数据,并将其存储为对象。每个对象对应于文件系统中的一个文件,该文件存储在对象存储设备上。Ceph OSD守护程序处理存储磁盘上的读/写操作。

    此博文基于部署ceph集群 (Nautilus版)进行操作!

    没有特殊声明,在 ceph-node-11 节点上执行

    一、ceph资源池的相关概念

    Ceph存储系统支持“池”的概念,“池”是用于存储对象的逻辑分区。

    Ceph客户端从Ceph监控器检索集群映射,并将对象写入池中。池的size副本数或副本数,CRUSH规则和放置组的数量决定了Ceph将如何放置数据。

    数据存储流程

    1.1 创建存储池

    $ ceph osd pool create ceph-demo 64 64      # 创建一个名字为ceph-demo的pool(第一个64是pg数量,第二个64是pgp数量) 
    pool 'ceph-demo' created
    
    $ ceph osd lspools     # 查看当前所有pool
    1 ceph-demo
    
    $ ceph osd pool application enable ceph-demo rbd    # 将 ceph-demo 池分类为 rbd
    enabled application 'rbd' on pool 'ceph-demo'
    
    $ ceph osd pool application get ceph-demo     # 查看资源池类型为rbd
    {
        "rbd": {}
    }
    

    1.2 ceph中pg与pgp的关系

    pg是用来存放object的,pgp相当于是pg存放osd的一种排列组合!

    举例说明:比如有3个osd,osd1、osd2、osd3 ,副本数是2,如果pgp的数目是1,那么所有的pg存放的osd组合就只有一种,可能是[osd.1,osd.2],那么所有的pg主从副本分别存放到osd.1和osd.2,如果pgp设为2,那么其osd组合可以两种,可能是[osd.1,osd.2]和[osd.1,osd.3],是不是很像我们高中数学学过的排列组合,pgp就是代表这个意思。一般来说应该将pg和pgp的数量设置为相等。

    1.3 调整存储池副本数

    $ ceph osd pool get ceph-demo size     # 查看pool的副本数(默认副本为3)
    size: 3
    
    $ ceph osd pool set ceph-demo size 2    # 调整pool副本数为2
    $ ceph osd pool get ceph-demo size      
    size: 2
    

    1.4 调整存储池的pg即pgp数量

    $ ceph osd pool get ceph-demo pg_num   # 查看pg和pgp的数量
    pg_num: 64
    
    $ ceph osd pool get ceph-demo pgp_num
    pgp_num: 64
    
    $ ceph osd pool set ceph-demo pg_num 128   # 调整pg数量为128
    set pool 1 pg_num to 128
    $ ceph osd pool get ceph-demo pg_num        # 查看确认
    pg_num: 128
    
    $ ceph osd pool set ceph-demo pgp_num 128   # 最好将pgp数量调整为和pg数量一致
    set pool 1 pgp_num to 128
    $ ceph osd pool get ceph-demo pgp_num   # 查看确认
    pgp_num: 128
    

    二、RDB(块存储)

    ceph集群搭建起来后,可以在ceph集群上进行块存储、对象存储以及文件系统存储。从架构上来看,在ceph集群的上面是rados协议,该协议为使用ceph集群的用户提供必要的支持(ceph用户通过调用rados协议来使用ceph集群)。对于块存储来说,可以通过内核模块的方式使用ceph集群也可以通过用户态调用librbd库来使用ceph集群。通过内核模块方式可以充分的利用内核的page cache机制,而通过用户态调用librbd也可以使用librbd在用户态提供的cache方式提高性能。

    在进行创建rbd之前,需要先按照上面的操作,创建出来一个可用的pool。

    2.1 创建rbd

    $ rbd -p ceph-demo ls        # 确认当前pool中没有rbd
    
    $ rbd create -p ceph-demo --image rbd-demo.img --size 10G
    # 基于ceph-demo池创建名称为rbd-demo.img的块文件
    
    $ rbd create ceph-demo/rbd-demo-1.img --size 10G 
    # 换种语法格式创建第二个块文件
    
    $ rbd -p ceph-demo ls  # 查看ceph-demo池中的块文件
    rbd-demo-1.img
    rbd-demo.img
    

    2.2 查看块文件的详细信息

    $ rbd info ceph-demo/rbd-demo.img    # 查看rbd-demo.img块文件
    rbd image 'rbd-demo.img':    # 此块设备大小为10G,包含了2560个object,每个object的大小为4M
            size 10 GiB in 2560 objects
            order 22 (4 MiB objects)
            snapshot_count: 0
            id: 11194f22705d
            block_name_prefix: rbd_data.11194f22705d
            format: 2
            features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
            op_features:
            flags:
            create_timestamp: Sun Jun 13 17:13:51 2021
            access_timestamp: Sun Jun 13 17:13:51 2021
            modify_timestamp: Sun Jun 13 17:13:51 2021
    $ rbd info -p ceph-demo --image rbd-demo.img  # 查看rbd-demo-1.img块文件
    rbd image 'rbd-demo.img':
            size 10 GiB in 2560 objects
            order 22 (4 MiB objects)
            snapshot_count: 0
            id: 11194f22705d
            block_name_prefix: rbd_data.11194f22705d
            format: 2
            features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
            op_features:
            flags:
            create_timestamp: Sun Jun 13 17:13:51 2021
            access_timestamp: Sun Jun 13 17:13:51 2021
            modify_timestamp: Sun Jun 13 17:13:51 2021
    

    2.3 删除块设备

    $ rbd -p ceph-demo rm --image rbd-demo-1.img
    Removing image: 100% complete...done.
    
    $ rbd -p ceph-demo ls   # 确认已删除
    rbd-demo.img
    

    2.4 内核级别挂载使用块设备

    $ rbd map ceph-demo/rbd-demo.img
    # 默认创建的块文件有些特性不支持,会报错如下
    rbd: sysfs write failed
    RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable ceph-demo/rbd-demo.img 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
    

    2.5 删除块设备不支持的特性

    $ rbd info ceph-demo/rbd-demo.img   # 查看块设备特性
    rbd image 'rbd-demo.img':
            size 10 GiB in 2560 objects
            order 22 (4 MiB objects)
            snapshot_count: 0
            id: 11194f22705d
            block_name_prefix: rbd_data.11194f22705d
            format: 2
            features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
            op_features:
            flags:
            create_timestamp: Sun Jun 13 17:13:51 2021
            access_timestamp: Sun Jun 13 17:13:51 2021
            modify_timestamp: Sun Jun 13 17:13:51 2021
    
    # 删除不支持的特性
    $ rbd feature disable ceph-demo/rbd-demo.img deep-flatten
    $ rbd feature disable ceph-demo/rbd-demo.img  fast-diff        
    # 删除上面两个后,就可以再次进行内核级别挂载了,如果还不行,再删除下面两个
    $ rbd feature disable ceph-demo/rbd-demo.img  object-map
    $ rbd feature disable ceph-demo/rbd-demo.img  exclusive-lock
    
    $ rbd info ceph-demo/rbd-demo.img      # 确认不支持的特性已删除 
    rbd image 'rbd-demo.img':
            size 10 GiB in 2560 objects
            order 22 (4 MiB objects)
            snapshot_count: 0
            id: 11194f22705d
            block_name_prefix: rbd_data.11194f22705d
            format: 2
            features: layering    # layering特性需要保持
            op_features:
            flags:
            create_timestamp: Sun Jun 13 17:13:51 2021
            access_timestamp: Sun Jun 13 17:13:51 2021
            modify_timestamp: Sun Jun 13 17:13:51 2021
            
    $ rbd map ceph-demo/rbd-demo.img   # 再次映射块设备
    /dev/rbd0        
    

    2.6 查看块设备

    $ rbd device list
    id pool      namespace image        snap device
    0  ceph-demo           rbd-demo.img -    /dev/rbd0
    
    $ lsblk /dev/rbd0
    NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    rbd0 252:0    0  10G  0 disk
    

    至此,就可以将/dev/rbd0当成我们一个本地的磁盘来使用了。

    2.7 格式化并使用块设备

    如果将ceph对接云平台,当成云盘来使用,那么不建议对块设备进行分区,这样可以避免块设备扩容带来的麻烦。

    $ mkfs.xfs /dev/rbd0  
    meta-data=/dev/rbd0              isize=512    agcount=16, agsize=163840 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0, sparse=0
    data     =                       bsize=4096   blocks=2621440, 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
    
    # 挂载并测试使用
    $ mkdir /data && mount /dev/rbd0 /data/
    $ echo 'test block' > /data/test.txt 
    

    2.8 RBD数据写入流程

    2021-06-13_172759

    一个文件被切割成多个object,每个object大小为4M,object存储到pg上(经过hash运算,再取掩码,得到它要落到哪个pg上,),pg再通过crush算法,最终找到对应的osd上。

    2.9 RDB块设备扩容

    rdb块设备,支持扩缩容,但是对于缩容操作,强烈不建议,可能会造成数据丢失。

    $ rbd -p ceph-demo info --image rbd-demo.img    # 确认当前块设备大小
    rbd image 'rbd-demo.img':
            size 10 GiB in 2560 objects
            order 22 (4 MiB objects)
            snapshot_count: 0
            id: 11194f22705d
            block_name_prefix: rbd_data.11194f22705d
            format: 2
            features: layering
            op_features:
            flags:
            create_timestamp: Sun Jun 13 17:13:51 2021
            access_timestamp: Sun Jun 13 17:13:51 2021
            modify_timestamp: Sun Jun 13 17:13:51 2021
            
    $ rbd resize ceph-demo/rbd-demo.img --size 20G
    # 从10G大小扩容到20G
    Resizing image: 100% complete...done.
    
    $ rbd -p ceph-demo info --image rbd-demo.img    # 确认已扩容20G
    rbd image 'rbd-demo.img':
            size 20 GiB in 5120 objects
            order 22 (4 MiB objects)
            snapshot_count: 0
            id: 11194f22705d
            block_name_prefix: rbd_data.11194f22705d
            format: 2
            features: layering
            op_features:
            flags:
            create_timestamp: Sun Jun 13 17:13:51 2021
            access_timestamp: Sun Jun 13 17:13:51 2021
            modify_timestamp: Sun Jun 13 17:13:51 2021
            
    $ df -hT /data   # 此时块设备已经扩容,但文件系统还未识别到,如下,还是原来的10G
    文件系统       类型  容量  已用  可用 已用% 挂载点
    /dev/rbd0      xfs    10G   33M   10G    1% /data        
    $ xfs_growfs /dev/rbd0
    $ partprobe
    # 扩容文件系统(原磁盘是xfs格式的,故需要使用xfs_growfs指令扩容)
    
    $ resize2fs /dev/rbd0
    # 如果你格式化为ext4的,请执行该命令
    
    $ df -hT /data    # 确认已扩容成功
    文件系统       类型  容量  已用  可用 已用% 挂载点
    /dev/rbd0      xfs    20G   34M   20G    1% /data
    
    *************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************
  • 相关阅读:
    editplus 支持lua语言语法高亮显示
    云服务器使用: 域名备案
    2-使用git管理一个单片机程序
    1-git的安装和基本使用
    编译lua固件NodeMcu 8266
    linux 安装Apache服务器
    2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(监听Wi-Fi和APP的数据)
    Spring源码学习之:ClassLoader学习(3)
    Spring源码学习之:ClassLoader学习(2)
    Spring源码学习之:ClassLoader学习(1)
  • 原文地址:https://www.cnblogs.com/lvzhenjiang/p/14880706.html
Copyright © 2011-2022 走看看