• Ceph存储使用【转】


    5.3 Ceph存储使用#

    在ceph-deploy节点上操作

    1 RBD 块存储#

    (1) RBD介绍
    RBD即RADOS Block Device的简称,RBD块存储是最稳定且最常用的存储类型。RBD块设备类似磁盘可以被挂载。RBD块设备具有快照、多副本、克隆和
    一致性等特性,数据以条带化的方式存储在Ceph集群的多个OSD中。如下是对Ceph RBD的理解。
    1) RBD就是Ceph里的块设备,一个4T的块设备的功能和一个4T的SATA类似,挂载的RBD就可以当磁盘用;
    2) resizable
    这个块可大可小
    3) data striped
    这个块在Ceph里面是被切割成若干小块来保存,不然 1PB 的块怎么存的下
    4) thin-provisioned
    精简置备,1TB的集群是能创建无数1PB的块的。其实就是块的大小和在Ceph中实际占用大小是没有关系的,刚创建出来的块是不占空间,今后用多大空间
    才会在Ceph中占用多大空间。举例:你有一个32G的U盘,存了一个2G的电影,那么RBD大小就类似于32G,而2G就相当于在Ceph中占用的空间。

    块存储本质:
    1) 将裸磁盘或类似裸磁盘(lvm)设备映射给主机使用,主机可以对其进行格式化并存储和读取数据,块设备读取速度快但是不支持共享。
    2) ceph可以通过内核模块和librbd库提供块设备支持。客户端可以通过内核模块挂载rbd使用,客户端使用rbd块设备就像使用普通硬盘一样,可以对
    其进行格式化然后使用,客户应用也可以通过librbd使用ceph块,典型的是云平台的块存储服务,云平台可以使用rbd作为云的存储后端提供镜像存储、volume块或者客户的系统引导盘等。

    使用场景:
    1) 云平台 (OpenStack做为云的存储后端提供镜像存储)
    2) K8s容器(自动pv供给)
    3) map成块设备直接使用,在存储里去申请块,块映射到系统可以识别的盘,比如ls /dev/可以看到这块RBD,可以把它挂载到本机。

    (2) RBD常用管理命令
    命令功能
    rbd create 创建块设备映像
    rbd ls <pool_name> 列出 rbd 存储池中的块设备
    rbd info 查看块设备信息
    rbd diff 可以统计 rbd 使用量
    rbd map 映射块设备
    rbd showmapped 查看已映射块设备
    rbd remove 删除块设备
    rbd resize 更改块设备的大小
    (3) RBD工作流程
    1) 客户端创建一个pool,并指定pg数量,创建rbd设备并挂载到文件系统;
    2) 用户写入数据,ceph进行对数据切块,每个块的大小默认为4M,每个块名字是object+序号;
    3) 将每个object通过pg进行副本位置的分配;
    4) pg根据crush算法会寻找3个osd,把这object分别保存在这3个osd上存储;
    5) osd实际把硬盘格式化为xfs文件系统,object存储在这个文件系统就相当于存储了一个文件rbd0.object1.file。

    补充:
    rbd块设备在挂载的情况下可以进行快照、基于保护快照的克隆、在线扩容操作。
    rbd块设备在非挂载的情况下可以进行快照的回滚操作。

    RBD IO工作流程:rbd-io

    (4) 创建RBD设备
    1) 创建存储池
    格式: ceph osd pool create <pool-name> pg_num [pgp_num]
    # ceph osd pool create rbd-pool 256 256
    # ceph osd pool ls detail

    注:
    256 256: 是它的pg number与pgp number的pg数,就是创建一个pool,256个pg,256个pgp,这个会随着容量的增加,pg也会动态的去扩容,生
    产上规定pg会用多少,根据osd的数量,文件数量,做一个前期的规划。
    # ceph -s
    ......(省略内容)
    progress:
       PG autoscaler decreasing pool 2 PGs from 256 to 32 (17m)
         [=========================...] (remaining: 2m)

    PG数量设置计算公式: PG数量 = (OSD数量 * 100)/副本数(默认3)
    例如我们的环境: (6 * 100)/3=200,一般设置是结果向上取2的N次方,所以pool指定的pg数量就是256。
    需要注意的是,在后续增加PG数量时,还必须增加用于归置PG的PGP数量(pgp_num),PGP的数量应该与PG的数量相等,但在新增POOL时可以不指定
    pgp_num,默认会与pg_num保持一致。

    PG (Placement Group),pg是一个虚拟的概念,用于存放object,PGP(Placement Group for Placement purpose),相当于是pg存放的
    一种osd排列组合。举个例子:假设集群有3个osd,即osd1,osd2,osd3,副本数为2,如果pgp=1,那么pg存放的osd的组合就有一种,可能是[osd1,osd2],那么所有的pg主从副本都会存放到osd1和osd2上;如果pgp=2,那么其osd组合可能就两种,可能是[osd1,osd2]和[osd1,osd3],pg的主从
    副本会落在[osd1,osd2]或者[osd1,osd3]中,和我们数学中的排列组合很像,所以pg是存放对象的归属组是一种虚拟概念,pgp就是pg对应的osd排列
    组合。一般情况下,存储池的pg和pgp的数量设置相等。

    pg_num是pg里面包含的object,pgp_num是描述pg的位置,这两个数是一 一对应的。
    PG是指定存储池存储对象的归属组有多少个,PGP是存储池PG的OSD分布组合个数;PG的增加会引起PG内的数据进行迁移,迁移到不同的OSD上新生成
    的PG中;PGP的增加会引起部分PG的分布变化,但是不会引起PG内对象的变动。

    查看pg的分布: ceph pg dump pgs |grep active |awk '{print $1,$19}'

    2) 指定存储池使用的存储类型
    # ceph osd pool application enable rbd-pool rbd

    3) 创建一个10G的块设备
    格式: rbd create --size {megabytes} {pool-name}/{image-name}
    # rbd create --size 10240 rbd-pool/image01

    4) 查看块设备
    # rbd ls rbd-pool
    # rbd info rbd-pool/image01
    rbd image 'image01':
    size 10 GiB in 2560 objects
    order 22 (4 MiB objects)
    snapshot_count: 0
    id: 5e857b2a6d34
    block_name_prefix: rbd_data.5e857b2a6d34
    format: 2
    features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
    op_features:
    flags:
    create_timestamp: Wed Nov 17 10:13:20 2021
    access_timestamp: Wed Nov 17 10:13:20 2021
    modify_timestamp: Wed Nov 17 10:13:20 2021

    (5) 节点本地挂载使用块设备
    1) 将块设备映射到系统内核
    # rbd map rbd-pool/image01
    # rbd showmapped   # 只有挂载的节点可以看到
    id pool     namespace image   snap device  
    0   rbd-pool             image01 -     /dev/rbd0

    注:
    如果这里报错,根据错误提示执行禁用当前系统内核不支持的feature即可,出现这种错误的原因是OS kernel不支持块设备镜像的一些特性,所以映
    射失败。
    # rbd feature disable rbd-pool/image01 object-map fast-diff deep-flatten

    2) 格式化块设备
    # mkfs.xfs /dev/rbd0

    3) 挂载
    # mount /dev/rbd0 /mnt
    # cd /mnt/
    # for((i=1;i<=20;i++));do echo $i > $i.txt;done

    4) 取消块设备和内核映射
    # umount /mnt
    # rbd unmap rbd-pool/image01

    注: 如果取消块设备报如下错误,可以强制取消块设备的映射
    rbd: rbd-pool/image01: mapped more than once, unmapping /dev/rbd0 only
    rbd: sysfs write failed
    rbd: unmap failed: (16) Device or resource busy

    # rbd unmap -o force rbd-pool/image01

    (6) 远程挂载使用块设备
    1) 在管理节点拷贝配置文件和秘钥到远程节点上
    # cd /root/my-cluster/
    # ssh root@172.16.1.34 "mkdir -p /etc/ceph/"
    # scp ceph.conf ceph.client.admin.keyring root@172.16.1.34:/etc/ceph/

    2) 在远程节点上配置ceph源
    # cat > /etc/yum.repos.d/ceph.repo << EOF
    [Ceph]
    name=Ceph packages for $basearch
    baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/\$basearch
    gpgcheck=0
    [Ceph-noarch]
    name=Ceph noarch packages
    baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/noarch
    gpgcheck=0
    [ceph-source]
    name=Ceph source packages
    baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/SRPMS
    gpgcheck=0
    EOF

    3) 安装Ceph客户端
    # yum -y install ceph-common

    4) 剩余操作就与节点本地挂载使用块设备一样了

    5) 客户端执行相关ceph命令
    如果想在客户端去执行相关的ceph命令,需要配置ceph源(和ceph集群版本保持一致),安装ceph-common,将ceph monitor节点上"/etc/ceph/"
    目录下的"ceph.client.admin.keyring"秘钥文件和"ceph.conf"配置文件拷到客户端的"/etc/ceph"目录下就可以执行ceph相关命令了。

    (7) 快照
    快照: 在某个时间点的副本,当系统出现问题,可以通过恢复快照恢复之前副本状态。
    1) 创建快照
    # rbd snap create rbd-pool/image01@snap01

    2) 列出创建的快照
    # rbd snap list rbd-pool/image01
    SNAPID NAME   SIZE   PROTECTED TIMESTAMP              
         4 snap01 10 GiB             Sun Nov 21 21:38:34 2021

    3) 查看快照详细信息
    # rbd info rbd-pool/image01@snap01
    rbd image 'image01':
    size 10 GiB in 2560 objects
    order 22 (4 MiB objects)
    snapshot_count: 1
    id: 5f6066b25e5f
    block_name_prefix: rbd_data.5f6066b25e5f
    format: 2
    features: layering, exclusive-lock
    op_features:
    flags:
    create_timestamp: Sun Nov 21 20:33:30 2021
    access_timestamp: Sun Nov 21 20:33:30 2021
    modify_timestamp: Sun Nov 21 20:33:30 2021
    protected: False

    注:
    比使用"rbd info rbd-pool/image01"命令多了一个"protected:"。

    4) 还原快照
    # rm -f /mnt/*   # 删除挂载目录中的数据,方便测试
    # umount /mnt
    # rbd unmap rbd-pool/image01
    # rbd snap rollback rbd-pool/image01@snap01
    Rolling back to snapshot: 100% complete...done.

    注:
    还原快照前需先取消挂载和内核映射,否则会出错。
    Rolling back to snapshot: 0% complete...failed.
    rbd: rollback failed: (30) Read-only file system

    5) 重新映射并挂载验证
    # rbd map rbd-pool/image01
    # mount /dev/rbd0 /mnt/
    # ls -l /mnt/   # 发现删除的数据都被还原了

    6) 删除指定快照
    # rbd snap remove rbd-pool/image01@snap01

    (8) 克隆
    克隆: 基于指定的块设备克隆出相同的一份出来
    1) 创建一个块设备并挂载(写入数据,方便测试)
    # rbd create --size 10240 rbd-pool/image02
    # rbd feature disable rbd-pool/image02 object-map fast-diff deep-flatten
    # rbd map rbd-pool/image02
    # mkfs.xfs /dev/rbd1
    # mkdir -p /data/
    # mount /dev/rbd1 /data/
    # for((i=60;i<=70;i++));do echo $i > /data/$i.txt;done

    2) 创建快照
    # rbd snap create rbd-pool/image02@snap01
    # rbd snap ls rbd-pool/image02
    SNAPID NAME   SIZE   PROTECTED TIMESTAMP              
         6 snap01 10 GiB             Sun Nov 21 22:57:06 2021

    3) 设置快照处于被保护状态(快照必须处于被保护状态才能被克隆)
    # rbd snap protect rbd-pool/image02@snap01
    # rbd info rbd-pool/image02@snap01
    rbd image 'image02':
    size 10 GiB in 2560 objects
    order 22 (4 MiB objects)
    snapshot_count: 1
    id: 61034793a788
    block_name_prefix: rbd_data.61034793a788
    format: 2
    features: layering, exclusive-lock
    op_features:
    flags:
    create_timestamp: Sun Nov 21 22:30:25 2021
    access_timestamp: Sun Nov 21 22:30:25 2021
    modify_timestamp: Sun Nov 21 22:30:25 2021
    protected: True

    4) 通过快照克隆一个新块设备
    # rbd clone rbd-pool/image02@snap01 rbd-pool/image02_clone
    # rbd ls rbd-pool
    image01
    image02
    image02_clone

    # 查看快照的children,查看它的子快照
    # rbd children rbd-pool/image02@snap01
    rbd-pool/image02_clone

    # 查看克隆的块设备信息
    # rbd info rbd-pool/image02_clone
    rbd image 'image02_clone':
    size 10 GiB in 2560 objects
    order 22 (4 MiB objects)
    snapshot_count: 0
    id: 620d77fb4d01
    block_name_prefix: rbd_data.620d77fb4d01
    format: 2
    features: layering, exclusive-lock
    op_features:
    flags:
    create_timestamp: Sun Nov 21 23:16:36 2021
    access_timestamp: Sun Nov 21 23:16:36 2021
    modify_timestamp: Sun Nov 21 23:16:36 2021
    parent: rbd-pool/image02@snap01
    overlap: 10 GiB
    注: 多了"parent:、overlap:"参数

    5) 将克隆的块设备独立于父块设备
    # rbd flatten rbd-pool/image02_clone
    Image flatten: 100% complete...done.

    # rbd info rbd-pool/image02_clone
    rbd image 'image02_clone':
    size 10 GiB in 2560 objects
    order 22 (4 MiB objects)
    snapshot_count: 0
    id: 620d77fb4d01
    block_name_prefix: rbd_data.620d77fb4d01
    format: 2
    features: layering, exclusive-lock
    op_features:
    flags:
    create_timestamp: Sun Nov 21 23:16:36 2021
    access_timestamp: Sun Nov 21 23:16:36 2021
    modify_timestamp: Sun Nov 21 23:16:36 2021

    6) 取消快照保护
    # rbd snap ls rbd-pool/image02
    SNAPID NAME   SIZE   PROTECTED TIMESTAMP              
         6 snap01 10 GiB yes       Sun Nov 21 22:57:06 2021

    # rbd snap unprotect rbd-pool/image02@snap01

    # rbd snap ls rbd-pool/image02
    SNAPID NAME   SIZE   PROTECTED TIMESTAMP              
         6 snap01 10 GiB             Sun Nov 21 22:57:06 2021

    7) 挂载克隆的块设备
    注: 根据块设备的快照克隆的块设备UUID不发生改变,所以克隆的块设备不能和原块设备挂载同一台主机上,否则
    会产生冲突。由于之前克隆的镜像已经是格式化的,这里挂载后可以直接使用。
    # rbd map rbd-pool/image02_clone
    # rbd showmapped
    id pool     image         snap device   
    0 rbd-pool image02_clone -   /dev/rbd0

    # mkdir -p /data/
    # mount /dev/rbd0 /data/
    # ls -l /data/ # 之前的数据都在

    (9) 导出导入RBD镜像
    1) 导出RBD镜像(导出的镜像是当前的状态)
    # rbd export rbd-pool/image02 /tmp/image02
    Exporting image: 100% complete...done.

    2) 导入RBD镜像(先把之前的进行删除)
    # rbd ls rbd-pool
    image01
    image02
    image02_clone

    # rbd showmapped
    id pool     namespace image   snap device  
    0   rbd-pool             image01 -     /dev/rbd0
    1   rbd-pool             image02 -     /dev/rbd1

    # rbd snap ls rbd-pool/image02
    SNAPID NAME   SIZE   PROTECTED TIMESTAMP              
         6 snap01 10 GiB             Sun Nov 21 22:57:06 2021

    # umount /dev/rbd1
    # rbd unmap rbd-pool/image02
    # rbd snap purge rbd-pool/image02   # 删除镜像的所有快照,快照必须为非保护状态,否则无法删除快照
    Removing all snapshots: 100% complete...done.

    # rbd remove rbd-pool/image02
    # rbd ls rbd-pool
    image01
    image02_clone

    # rbd import /tmp/image02 rbd-pool/image02 --image-format 2
    Importing image: 100% complete...done.

    # 镜像导入后映射到主机后进行挂载验证,由于之前导出的镜像已经是格式化的,这里挂载后可以直接使用。

    (10) 针对RBD实现在线扩容
    在k8s中如果使用rbd的话,创建一个块设备,映射成系统可识别的设备,格式化之后,mount到本地,通过exports共享出去,使用NFS时一起使用RBD,
    这样也是可以的。
    1) 使用rbd进行扩容,举个新例子,新创建一个rbd镜像
    # rbd create --size 10240 rbd-pool/image03
    # rbd ls rbd-pool

    2) 查看块存储的详细信息
    # rbd info rbd-pool/image03
    rbd image 'image03':
    size 10 GiB in 2560 objects
    order 22 (4 MiB objects)
    snapshot_count: 0
    id: 45635742c5584
    block_name_prefix: rbd_data.45635742c5584
    format: 2
    features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
    op_features:
    flags:
    create_timestamp: Tue Nov 23 22:42:18 2021
    access_timestamp: Tue Nov 23 22:42:18 2021
    modify_timestamp: Tue Nov 23 22:42:18 2021

    3) map成系统可识别的设备
    # rbd feature disable rbd-pool/image03 object-map fast-diff deep-flatten
    # rbd map rbd-pool/image03

    4) 格式化
    # mkfs.xfs /dev/rbd0

    5) 挂载到本地当中
    # mount /dev/rbd0 /mnt

    6) 使用"df -h"可以查看到磁盘已经挂载上
    # df -h
    ......(省略的内容)
    /dev/rbd0       10G   33M   10G   1% /mnt

    7) 进行扩容大小
    # rbd --image rbd-pool/image03 resize --size 15360
    Resizing image: 100% complete...done.

    8) 查看rbd的大小,已经扩容到15,但是这个不会直接占用15g,而是用多少占用多少,使用的精简置用
    # rbd info rbd-pool/image03
    rbd image 'image03':
    size 15 GiB in 3840 objects
    order 22 (4 MiB objects)
    snapshot_count: 0
    id: 45635742c5584
    block_name_prefix: rbd_data.45635742c5584
    format: 2
    features: layering, exclusive-lock
    op_features:
    flags:
    create_timestamp: Tue Nov 23 22:42:18 2021
    access_timestamp: Tue Nov 23 22:42:18 2021
    modify_timestamp: Tue Nov 23 22:42:18 2021

    9) 但是查看我们的系统的挂载目录目前还是没有扩容到我们的15G,可以执行"xfs_growfs -d"指定挂载目录
    # lsblk
    NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    ......(省略内容)
    rbd0   253:0   0   15G 0 disk /mnt

    # df -hT
    Filesystem     Type     Size Used Avail Use% Mounted on
    ......(省略内容)
    /dev/rbd0     xfs       10G   33M   10G   1% /mnt

    # xfs_growfs /mnt <=> xfs_growfs /dev/rbd0
    注:
    xfs文件系统: 不需要卸载已经挂载的磁盘,否则扩容会报错。
    ext4文件系统: 命令为"resize2fs /dev/rbd0",如果卸载已经挂载的磁盘,需要先执行"e2fsck -f /dev/rbd0"命令。e2fsck用于检查已经
    卸载的ext2/ext3/ext4系列文件系统块设备。

    # df -hT # 查看已经扩容成功
    Filesystem     Type     Size Used Avail Use% Mounted on
    ......(省略内容)
    /dev/rbd0     xfs       15G   33M   15G   1% /mnt

    2 CephFS文件存储#

    (1) CephFs文件系统说明
    1) CephFS是一个基于ceph集群且兼容POSIX标准的文件系统,创建cephfs文件系统时需要在ceph集群中添加mds服务,该服务负责处理POSIX文件系统
    中的metadata部分,实际的数据部分交由ceph集群中的OSD处理。cephfs支持以内核模块方式加载也支持fuse方式加载。无论是内核模式还是fuse
    模式,都是通过调用libcephfs库来实现cephfs文件系统的加载,而libcephfs库又调用librados库与ceph集群进行通信,从而实现cephfs的加载。
    2) CephFs的数据是怎么访问的
    首先客户端通过RPC协议到达MDS,从MDS获取到元数据的信息,客户端与RADOS获取文件的一个IO操作,那么有了这两份信息,用户就能得到了想要的那
    份文件,MDS和RADOS之间通过journal metadate,这个Journal是记录文件写入日志的,这个也是存放到OSD当中的,MDS和rados之间也是由交互的
    ,因为所有最终的数据都会存到rados当中。

    (2) 部署MDS服务
    首先要创建两个pool,一个是cephfs-data,一个是cephfs-metadate,分别存储文件数据和文件元数据,这个pg也可以设置小一点,这个根据OSD去
    配置。
    # cd /root/my-cluster/
    # ceph-deploy mds create ceph-node01 ceph-node02 ceph-node03
    # ceph mds stat # 查看mds节点状态
    3 up:standby

    (3) 创建文件系统
    1) 创建存储池
    # ceph osd pool create cephfs_data 256 256
    # ceph osd pool create cephfs_metadata 256 256
    # ceph osd pool ls
    device_health_metrics
    cephfs_data
    cephfs_metadata

    2) 创建文件系统
    格式: ceph fs new <fs_name> <metadata> <data>
    # ceph fs new cephfs-pool cephfs_metadata cephfs_data
    new fs with metadata pool 3 and data pool 2

    # ceph fs ls   # 查看创建后的cephfs
    name: cephfs-pool, metadata pool: cephfs_metadata, data pools: [cephfs_data ]

    # ceph mds stat
    cephfs-pool:1 {0=ceph-node02=up:active} 2 up:standby

    # ceph fs status cephfs-pool
    cephfs-pool - 0 clients
    ===========
    RANK STATE       MDS         ACTIVITY     DNS   INOS 
    0   active ceph-node02 Reqs:   0 /s   10     13  
         POOL         TYPE     USED AVAIL 
    cephfs_metadata metadata 1536k 35.5G 
    cephfs_data     data       0   35.5G 
    STANDBY MDS 
    ceph-node03 
    ceph-node01 
    MDS version: ceph version 15.2.15 (2dfb18841cfecc2f7eb7eb2afd65986ca4d95985) octopus (stable)

    (4) 内核模块方式挂载(以kernel client形式挂载CephFS)
    官方文档:
    http://docs.ceph.org.cn/cephfs/kernel/
    http://docs.ceph.org.cn/cephfs/fstab/
    在172.16.1.34节点上操作

    1) 获取账号名与秘钥
    在ceph-deploy节点上操作
    # ceph auth list |grep admin -A1
    installed auth entries:
    client.admin
    key: AQArL5JhBEiAKRAAymBtomUPKP6M/BSI17oXyg==

    2) 命令行挂载
    # mount -t ceph 172.16.1.31:6789,172.16.1.32:6789,172.16.1.33:6789:/ /mnt -o \
    name=admin,secret=AQArL5JhBEiAKRAAymBtomUPKP6M/BSI17oXyg==
    注:
    这里的3个ip地址是mon的ip地址
    -o: 指定挂载选项

    # df -hT
    Filesystem                                           Type     Size Used Avail Use% Mounted on
    ......(省略部分)
    172.16.1.31:6789,172.16.1.32:6789,172.16.1.33:6789:/ ceph       36G     0   36G   0% /mnt

    3) 取消挂载
    # umount /mnt

    4) /etc/fstab挂载
    # echo "172.16.1.31:6789,172.16.1.32:6789,172.16.1.33:6789:/ /mnt ceph \
    name=admin,secret=AQArL5JhBEiAKRAAymBtomUPKP6M/BSI17oXyg==,_netdev,noatime 0 0" | sudo tee -a /etc/fstab

    # 挂载参数说明
    name:       认证用户
    secret:     秘钥
    _netdev:   文件系统居于需要网络连接的设备上(用于防止系统不断尝试挂载这些文件系统,直到系统中网络被启动)。
    noatime:   不更新文件系统的inode存取时间(例如,可以更快地存取news spool从而提升服务器的速度)。

    # 挂载
    # mount -a

    (5) 内核模块方式挂载(secretfile)
    在172.16.1.34节点上操作
    1) 配置ceph源
    # cat > /etc/yum.repos.d/ceph.repo << EOF
    [Ceph]
    name=Ceph packages for $basearch
    baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/\$basearch
    gpgcheck=0
    [Ceph-noarch]
    name=Ceph noarch packages
    baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/noarch
    gpgcheck=0
    [ceph-source]
    name=Ceph source packages
    baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/SRPMS
    gpgcheck=0
    EOF

    2) 安装客户端
    # yum install -y ceph-common

    3) 创建秘钥文件
    # mkdir -p /etc/ceph/
    # echo 'AQArL5JhBEiAKRAAymBtomUPKP6M/BSI17oXyg==' > /etc/ceph/admin.secret
    # chmod 644 /etc/ceph/admin.secret

    4) 命令行挂载
    # mount -t ceph 172.16.1.31:6789,172.16.1.32:6789,172.16.1.33:6789:/ /mnt -o \
    name=admin,secretfile=/etc/ceph/admin.secret

    5) /etc/fstab挂载
    # echo "172.16.1.31:6789,172.16.1.32:6789,172.16.1.33:6789:/ /mnt ceph \
    name=admin,secretfile=/etc/ceph/admin.secret,_netdev,noatime 0 0" | sudo tee -a /etc/fstab

    (6) fuse方式挂载(以FUSE client形式挂载CephFS)
    官方文档:
    http://docs.ceph.org.cn/cephfs/fuse/
    http://docs.ceph.org.cn/cephfs/fstab/
    在172.16.1.34节点上操作

    1) 配置ceph源
    # cat > /etc/yum.repos.d/ceph.repo << EOF
    [Ceph]
    name=Ceph packages for $basearch
    baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/\$basearch
    gpgcheck=0
    [Ceph-noarch]
    name=Ceph noarch packages
    baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/noarch
    gpgcheck=0
    [ceph-source]
    name=Ceph source packages
    baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el7/SRPMS
    gpgcheck=0
    EOF

    2) 安装fuse
    # yum install -y ceph-fuse

    3) 把监视器主机上的Ceph配置文件和秘钥拷贝到"/etc/ceph/"目录下
    # mkdir -p /etc/ceph
    # scp root@172.16.1.31:/etc/ceph/ceph.conf /etc/ceph/
    # scp root@172.16.1.31:/etc/ceph/ceph.client.admin.keyring /etc/ceph/

    # chmod 644 /etc/ceph/ceph.conf
    # chmod 644 /etc/ceph/ceph.client.admin.keyring

    4) 命令行方式挂载
    # mkdir -p /data/

    # ceph-fuse挂载的目录必须为非空目录
    # ceph-fuse -m 172.16.1.31:6789,172.16.1.32:6789,172.16.1.33:6789 /data
    ceph-fuse[1745]: starting ceph client
    2021-11-24T23:54:17.792+0800 7feadc61df80 -1 init, newargv = 0x55977dda0300 newargc=9
    ceph-fuse[1745]: starting fuse

    # ps -ef | grep fuse
    root 1745 1 0 23:54 pts/0 00:00:00 ceph-fuse -m 172.16.1.31:6789,172.16.1.32:6789,172.16.1.33:6789 /data

    # df -hT
    Filesystem     Type           Size Used Avail Use% Mounted on
    ......(省略的内容)
    ceph-fuse     fuse.ceph-fuse   36G     0   36G   0% /data

    5) 取消挂载
    # fusermount -u /data/

    6) /etc/fstab方式挂载
    # echo "id=admin,conf=/etc/ceph/ceph.conf /data fuse.ceph _netdev,defaults 0 0" | sudo tee -a /etc/fstab
    # mount -a

    (7) MDS主备与主主切换
    1) 当前mds状态
    # ceph fs ls
    name: cephfs-pool, metadata pool: cephfs_metadata, data pools: [cephfs_data ]

    # ceph fs status cephfs-pool
    cephfs-pool - 1 clients
    ===========
    RANK STATE       MDS         ACTIVITY     DNS   INOS 
    0   active ceph-node02 Reqs:   0 /s   30     33  
         POOL         TYPE     USED AVAIL 
    cephfs_metadata metadata 1728k 35.9G 
    cephfs_data     data   3840k 35.9G 
    STANDBY MDS 
    ceph-node01 
    ceph-node03 
    MDS version: ceph version 15.2.15 (2dfb18841cfecc2f7eb7eb2afd65986ca4d95985) octopus (stable)

    注: 从状态中可以看到当前cephfs的mds组件为一主(ceph-node02)两从(ceph-node01、ceph-node03)状态。

    2) 配置MDS主主模式
    当cephfs的性能出现在MDS上时,就应该配置多个活动的MDS,通常是多个客户机应用程序并行的执行大量元数据操作,并且它们分别有自己单独的工
    作目录,这种情况下很适合使用多主MDS模式。配置MDS多主模式时,每个cephfs文件系统都有一个max_mds设置,可以理解为它将控制创建多少个主
    MDS,只有当实际的MDS个数大于或等于max_mds设置的值时,mdx_mds设置才会生效,如果只有一个MDS守护进程在运行,并且max_mds被设置为两
    个,则不会创建第二个主MDS。
    当cephfs用的多,数据量大,就会出现性能的问题,配置单个active mds的时候会遇到系统瓶颈,这个时候就需要配置主主模式,把这个数据做一个
    类似的负载均衡,多主的话也就是这些主会同时提供服务。

    # 添加设置max_mds 2,也就是2个activity,1个standby,称为主主备模式
    # ceph fs set cephfs-pool max_mds 2

    # ceph fs status cephfs-pool
    cephfs-pool - 1 clients
    ===========
    RANK STATE       MDS         ACTIVITY     DNS   INOS 
    0   active ceph-node02 Reqs:   0 /s   30     33  
    1   active ceph-node03 Reqs:   0 /s   10     13  
         POOL         TYPE     USED AVAIL 
    cephfs_metadata metadata 2880k 35.9G 
    cephfs_data     data   3840k 35.9G 
    STANDBY MDS 
    ceph-node01 
    MDS version: ceph version 15.2.15 (2dfb18841cfecc2f7eb7eb2afd65986ca4d95985) octopus (stable)

    注: 从状态中可以看到当前cephfs的mds组件为两主(ceph-node02、ceph-node03)一从(ceph-node01、ceph-node03)状态。

    3) 还原单主MDS
    要是还原的话,直接设置为max_mds 1,也就是一个activity,两个standby。
    # ceph fs set cephfs-pool max_mds 1

    3 对象存储#

    (1) 说明
    Ceph对象存储不能像RBD、CephFS那样方式访问,它是通过Restfulapi方式进行访问和使用,兼容S3/Swift接口,由radosgw组件提供服务,所以需
    要安装这个服务。

    图示:radosgw

    (2) 部署rgw服务
    # cd /root/my-cluster/
    # ceph-deploy rgw create ceph-node01 ceph-node02 ceph-node03

    (3) 验证访问
    RGW默认7480端口,浏览器访问(http://172.16.1.31-33:7480),返回anonymous说明服务正常。

    图示:rgw-anonymous

    (4) 创建 S3 账号
    # radosgw-admin user create --uid="liuchang" --display-name="liuchang"
    ......(省略的内容)
    "keys": [
           {
               "user": "liuchang",
               "access_key": "GAJUYDS9KBP090E2IKDX",
               "secret_key": "GegAR4WtkgdxhgHlkBksNdUCcCiPyvj3AlXUDTlB"
           }
       ],
    ......(省略的内容)

    注:
    radosgw-admin 是 RADOS 网关用户管理工具,记住输出的 keys 中的 access_key 和 secret_key 的值,用于接口访问认证,如果忘记可
    以通过命令'radosgw-admin user info --uid="liuchang"'进行查看。

    (5) 编写Python脚本测试
    在172.16.1.34节点上操作
    安装连接boto模块,用于连接S3接口,参考示例: https://docs.ceph.com/en/nautilus/radosgw/s3/python/
    1) 安装boto模块
    # yum install python3 -y
    # python3 -V
    Python 3.6.8

    # yum install python-pip -y
    # pip3 install boto
    复制代码
    2) 脚本
    # cat ceph-s3test.py
    import boto.s3.connection
    
    access_key = 'GAJUYDS9KBP090E2IKDX' # 创建S3用户时返回的秘钥
    secret_key = 'GegAR4WtkgdxhgHlkBksNdUCcCiPyvj3AlXUDTlB'
    host = '172.16.1.31' # RWG节点IP和端口
    port = 7480
    # 新建一个连接
    conn = boto.connect_s3(
            aws_access_key_id=access_key,
            aws_secret_access_key=secret_key,
            host=host, port=port,
            is_secure=False, calling_format=boto.s3.connection.OrdinaryCallingFormat(),
           )
    # 新建一个Bucket
    bucket = conn.create_bucket('my-new-bucket')
    
    # 列出用户的所有Bucket
    for bucket in conn.get_all_buckets():
        print("桶名称: %s, 创建时间: %s" %(bucket.name,bucket.creation_date))
    
    # 列出Bucket内容
    for key in bucket.list():
        print("key名称: %s, 文件大小: %s, 修改时间: %s" %(key.name,key.size,key.last_modified))
    
    # 新建一个对象
    key = bucket.new_key('hello.txt')
    key.set_contents_from_string('Hello World!')
    
    # 下载一个对象到文件
    key = bucket.get_key('hello.txt')
    key.get_contents_to_filename('/tmp/hello.txt')
    
    3) 执行脚本
    # python3 ceph-s3test.py
    桶名称: my-new-bucket, 创建时间: 2021-11-26T15:14:50.946Z
    key名称: hello.txt, 文件大小: 12, 修改时间: 2021-11-26T15:33:41.092Z
    
    # cat /tmp/hello.txt 
    Hello World!
    复制代码
     

    4 查看CEPH状态#

    (1) 状态
    [root@ceph-deploy ~]# ceph -s
    cluster:
       id:     14912382-3d84-4cf2-9fdb-eebab12107d8
       health: HEALTH_OK

    services:
       mon: 3 daemons, quorum ceph-node01,ceph-node02,ceph-node03 (age 54m)
       mgr: ceph-node03(active, since 54m), standbys: ceph-node01, ceph-node02
       mds: cephfs-pool:2 {0=ceph-node01=up:active,1=ceph-node02=up:active} 1 up:standby
       osd: 6 osds: 6 up (since 54m), 6 in (since 11d)
       rgw: 3 daemons active (ceph-node01, ceph-node02, ceph-node03)

    task status:

    data:
       pools:   9 pools, 225 pgs
       objects: 267 objects, 84 KiB
       usage:   6.5 GiB used, 113 GiB / 120 GiB avail
       pgs:     225 active+clean

    [root@ceph-deploy ~]#

    (2) 磁盘
    # ceph df
    --- RAW STORAGE ---
    CLASS SIZE     AVAIL   USED     RAW USED %RAW USED
    hdd   120 GiB 113 GiB 488 MiB   6.5 GiB       5.40
    TOTAL 120 GiB 113 GiB 488 MiB   6.5 GiB       5.40

    --- POOLS ---
    POOL                       ID PGS STORED   OBJECTS USED     %USED MAX AVAIL
    device_health_metrics       1   1     0 B       0     0 B     0     36 GiB
    cephfs_data                 2   64     51 B       20 2.5 MiB     0     54 GiB
    cephfs_metadata             3   16 207 KiB       41 2.1 MiB     0     54 GiB
    .rgw.root                   4   32 2.4 KiB       6 1.1 MiB     0     36 GiB
    default.rgw.log             5   32 3.4 KiB     175   6 MiB     0     36 GiB
    default.rgw.control         6   32     0 B       8     0 B     0     36 GiB
    default.rgw.meta           7   8   836 B       5 768 KiB     0     36 GiB
    default.rgw.buckets.index   8   8     0 B       11     0 B     0     36 GiB
    default.rgw.buckets.data   9   32     12 B       1 192 KiB     0     36 GiB
    [root@ceph-deploy ~]#

     

     转自

    5.3 Ceph存储使用 - 何以.解忧 - 博客园
    https://www.cnblogs.com/LiuChang-blog/p/15610427.html

  • 相关阅读:
    Lua大整数的实现
    std::allocator在stl容器中使用问题
    深度学习框架安装
    Tensorflow安装使用一段时间后,import时出现错误:ImportError: DLL load failed
    论文解读:SIFA
    多位微软MVP推荐,第一本ASP.NET Core 3.1的书来了
    ASP.NET Core 进程内与进程外的性能对比
    基于Netty的程序主动发送消息
    dbroot文件结构解析(一)
    qtree文件结构解析(二)
  • 原文地址:https://www.cnblogs.com/paul8339/p/15904931.html
Copyright © 2020-2023  润新知