主页

Ceph分布式文件存储

1.Ceph存储简介

Ceph 独一无二地在一个统一的系统中同时提供了对象、块、和文件存储功能

2.Ceph三种存储类型特性

CEPH 对象存储

  • REST 风格的接口
  • 与 S3 和 Swift 兼容的 API
  • S3 风格的子域
  • 统一的 S3/Swift 命名空间
  • 用户管理
  • 利用率跟踪
  • 条带化对象
  • 云解决方案集成
  • 多站点部署
  • 灾难恢复

CEPH 块设备

  • 瘦接口支持
  • 映像尺寸最大 16EB
  • 条带化可定制
  • 内存缓存
  • 快照
  • 写时复制克隆
  • 支持内核级驱动
  • 支持 KVM 和 libvirt
  • 可作为云解决方案的后端
  • 增量备份

CEPH 文件系统

  • 与 POSIX 兼容的语义
  • 元数据独立于数据
  • 动态重均衡
  • 子目录快照
  • 可配置的条带化
  • 有内核驱动支持
  • 有用户空间驱动支持
  • 可作为 NFS/CIFS 部署
  • 可用于 Hadoop (取代 HDFS )

3.Ceph组件

不管你是想为云平台提供Ceph 对象存储和/或 Ceph 块设备,还是想部署一个 Ceph 文件系统或者把 Ceph 作为他用,所有 Ceph 存储集群的部署都始于部署一个个 Ceph 节点、网络和 Ceph 存储集群。 Ceph 存储集群至少需要一个 Ceph Monitor 和两个 OSD 守护进程。而运行 Ceph 文件系统客户端时,则必须要有元数据服务器( Metadata Server )。

  • Ceph OSDs: Ceph OSD 守护进程( Ceph OSD )的功能是存储数据,处理数据的复制、恢复、回填、再均衡,并通过检查其他OSD 守护进程的心跳来向 Ceph Monitors 提供一些监控信息。当 Ceph 存储集群设定为有2个副本时,至少需要2个 OSD 守护进程,集群才能达到 active+clean 状态( Ceph 默认有3个副本,但你可以调整副本数)。
  • Monitors: Ceph Monitor维护着展示集群状态的各种图表,包括监视器图、 OSD 图、归置组( PG )图、和 CRUSH 图。 Ceph 保存着发生在Monitors 、 OSD 和 PG上的每一次状态变更的历史信息(称为 epoch )。
  • MDSs: Ceph 元数据服务器( MDS )为 Ceph 文件系统存储元数据(也就是说,Ceph 块设备和 Ceph 对象存储不使用MDS )。元数据服务器使得 POSIX 文件系统的用户们,可以在不对 Ceph 存储集群造成负担的前提下,执行诸如 lsfind 等基本命令。

Ceph 把客户端数据保存为存储池内的对象。通过使用 CRUSH 算法, Ceph 可以计算出哪个归置组(PG)应该持有指定的对象(Object),然后进一步计算出哪个 OSD 守护进程持有该归置组。 CRUSH 算法使得 Ceph 存储集群能够动态地伸缩、再均衡和修复。

4.Ceph文件写入流程

  • 文件首选被切割成多个object,例如:100M文件会被切成25个object,每个4M(默认4M),切割之后,每个object都会有一个oid(object id),oid(object id)需要存储到pg中;
  • pg可以理解为装载object的文件夹,oid(object id)进行 hash(哈希) 和 mask(掩码) 的运算,最终得到pg的id;
  • pg上有多个object,之后经过crush算法,把pg进行运算,把它分配到集群中对应的osd节点上

image.png

5.Ceph集群安装

5.1集群规划和磁盘

每个机器添加额外两块50G的磁盘,作为osd数据盘,IP和角色规划如下

主机名IP角色
ceph-node01eth0:192.168.2.7 eth1:192.168.3.2mon、mgr、osd
ceph-node02eth0:192.168.2.8 eth1:192.168.3.3mon、mgr、osd
ceph-node03eth0:192.168.2.9 eth1:192.168.3.4mon、mgr、osd

5.2 配置Ceph yum源

[ceph-noarch]
name=Ceph noarch packages
baseurl=http://mirrors.ustc.edu.cn/ceph/rpm-nautilus/el7/noarch
enabled=1
gpgcheck=0

[ceph-x86_64]
name=Ceph x86_64 packages
baseurl=http://mirrors.ustc.edu.cn/ceph/rpm-nautilus/el7/x86_64
enabled=1
gpgcheck=0

5.3 Mon节点安装ceph-deploy

yum install -y ceph-deploy

如果ceph-deploy报错可通过pip3重新安装

pip3 install git+https://github.com/ceph/ceph-deploy.git

5.4 所有节点安装ceph相关软件包

yum install -y ceph ceph-mon ceph-mgr ceph-radosgw ceph-mds

5.5 部署mon节点

只在ceph-node01节点操作

创建目录

mkdir ceph-deploy
cd ceph-deploy

生成配置文件

--public-network用于外部通信,--cluster-network用于内部数据交换

ceph-deploy new --public-network 192.168.2.0/24 --cluster-network 192.168.3.0/24 ceph-node01

修改ceph.conf,额外添加3行

mon_clock_drift_allowed = 2
mon_clock_drift_warn_backoff = 30
mon_allow_pool_delete = true

生成秘钥

ceph-deploy mon create-initial

推送至其他节点

ceph-deploy admin ceph-node01 ceph-node02 ceph-node03

创建mgr

ceph-deploy mgr create ceph-node01

5.6部署osd节点

只在ceph-node01节点操作

ceph-deploy osd create ceph-node01 --data /dev/vdb
ceph-deploy osd create ceph-node02 --data /dev/vdb
ceph-deploy osd create ceph-node03 --data /dev/vdb

5.7 查看集群状态

如有mon is allowing insecure global_id reclaim警告,可以通过禁用不安全模式解决

ceph config set mon auth_allow_insecure_global_id_reclaim false
[root@ceph-node01 ~]# ceph -s
  cluster:
    id:     3b690447-512d-4700-a245-f729e1f2caed
    health: HEALTH_OK
 
  services:
    mon: 1 daemons, quorum ceph-node01 (age 63s)
    mgr: ceph-node01(active, since 48s)
    osd: 3 osds: 3 up (since 60s), 3 in (since 19m)
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   3.0 GiB used, 147 GiB / 150 GiB avail
    pgs:

5.8 扩容mon

只在ceph-node01节点操作

ceph-deploy mon add ceph-node02
ceph-deploy mon add ceph-node03

查看仲裁状态

ceph quorum_status --format json-pretty|jq

或者

[root@ceph-node01 ceph-deploy]# ceph mon stat
e3: 3 mons at {ceph-node01=[v2:192.168.2.7:3300/0,v1:192.168.2.7:6789/0],ceph-node02=[v2:192.168.2.8:3300/0,v1:192.168.2.8:6789/0],ceph-node03=[v2:192.168.2.9:3300/0,v1:192.168.2.9:6789/0]}, election epoch 18, leader 0 ceph-node01, quorum 0,1,2 ceph-node01,ceph-node02,ceph-node03

查看详细信息

[root@ceph-node01 ceph-deploy]# ceph mon dump
epoch 3
fsid 3b690447-512d-4700-a245-f729e1f2caed
last_changed 2021-08-15 22:03:15.760985
created 2021-08-16 05:33:52.631504
min_mon_release 14 (nautilus)
0: [v2:192.168.2.7:3300/0,v1:192.168.2.7:6789/0] mon.ceph-node01
1: [v2:192.168.2.8:3300/0,v1:192.168.2.8:6789/0] mon.ceph-node02
2: [v2:192.168.2.9:3300/0,v1:192.168.2.9:6789/0] mon.ceph-node03
dumped monmap epoch 3

5.9 扩容mgr

只在ceph-node01节点操作

ceph-deploy mgr create ceph-node02 ceph-node03

查看集群状态

[root@ceph-node01 ceph-deploy]# ceph -s
  cluster:
    id:     3b690447-512d-4700-a245-f729e1f2caed
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph-node01,ceph-node02,ceph-node03 (age 5m)
    mgr: ceph-node01(active, since 10m), standbys: ceph-node03, ceph-node02
    osd: 3 osds: 3 up (since 10m), 3 in (since 38m)
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   3.0 GiB used, 147 GiB / 150 GiB avail
    pgs:     
 

6.RBD块存储

6.1 创建资源池pool

ceph osd pool create ceph-rbd-demo 64 64 # 64个PG,64个PGP,默认就会有3个副本

查看创建的资源池

[root@ceph-node01 ceph-deploy]# ceph osd lspools
1 ceph-rbd-demo

查看资源池信息

# 查看pg数量
[root@ceph-node01 ~]# ceph osd pool get ceph-rbd-demo pg_num
pg_num: 64


# 查看pgp数量
[root@ceph-node01 ~]# ceph osd pool get ceph-rbd-demo pgp_num
pgp_num: 64


# 查看副本数
[root@ceph-node01 ~]# ceph osd pool get ceph-rbd-demo size
size: 3

调整副本数

ceph osd pool set ceph-rbd-demo size 2

调整pg数

ceph osd pool set ceph-rbd-demo pg_num 128

调整pgp数

ceph osd pool set ceph-rbd-demo pgp_num 128

6.2 创建块设备和映射

创建块设备

rbd create -p ceph-rbd-demo --image rbd-demo.img --size 10G # -p指定存储池

或者

rbd create ceph-rbd-demo/rbd-demo.img --size 10G

查看刚刚创建的rbd块文件列表

[root@ceph-node01 ~]# rbd -p ceph-rbd-demo ls
rbd-demo.img

查看具体rbd块设备信息

[root@ceph-node01 ~]# rbd -p ceph-rbd-demo info rbd-demo.img
rbd image 'rbd-demo.img':
    size 10 GiB in 2560 objects
    order 22 (4 MiB objects)
    snapshot_count: 0
    id: fab04251724b
    block_name_prefix: rbd_data.fab04251724b
    format: 2
    features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
    op_features: 
    flags: 
    create_timestamp: Sun Aug 15 15:02:45 2021
    access_timestamp: Sun Aug 15 15:02:45 2021
    modify_timestamp: Sun Aug 15 15:02:45 2021

6.3 本地挂载测试

由于CentOS7内核版本较低,默认的feature好多不支持,需要提前禁用掉

rbd feature disable ceph-rbd-demo/rbd-demo.img  deep-flatten
rbd feature disable ceph-rbd-demo/rbd-demo.img  fast-diff
rbd feature disable ceph-rbd-demo/rbd-demo.img  object-map
rbd feature disable ceph-rbd-demo/rbd-demo.img  exclusive-lock

映射rbd

[root@ceph-node01 ~]# rbd map ceph-rbd-demo/rbd-demo.img 
/dev/rbd0

查看块设备

[root@ceph-node01 ~]# rbd device list 
id pool          namespace image        snap device    
0  ceph-rbd-demo           rbd-demo.img -    /dev/rbd0

格式化并挂载

mkfs.xfs /dev/rbd0
mount /dev/rbd0 /mnt/

6.3 rbd数据写入流程

查看当前存储池的objects

rados -p ceph-rbd-demo ls|grep rbd_data.fab04251724b

查看单个object信息

[root@ceph-node01 ~]# rados -p ceph-rbd-demo stat rbd_data.fab04251724b.00000000000000fe
ceph-rbd-demo/rbd_data.fab04251724b.00000000000000fe mtime 2021-08-15 23:18:05.000000, size 4194304

查看某个object最终落在那个pg和osd上

[root@ceph-node01 ~]# ceph osd map ceph-rbd-demo rbd_data.fab04251724b.00000000000000fe
osdmap e45 pool 'ceph-rbd-demo' (2) object 'rbd_data.fab04251724b.00000000000000fe' -> pg 2.ec5371ff (2.3f) -> up ([1,0,2], p1) acting ([1,0,2], p1)

6.4 rbd块存储扩容

扩容rbd

rbd resize ceph-rbd-demo/rbd-demo.img --size 20G

查看信息

[root@ceph-node01 ~]# rbd info ceph-rbd-demo/rbd-demo.img
rbd image 'rbd-demo.img':
    size 20 GiB in 5120 objects
    order 22 (4 MiB objects)
    snapshot_count: 0
    id: fab04251724b
    block_name_prefix: rbd_data.fab04251724b
    format: 2
    features: layering
    op_features: 
    flags: 
    create_timestamp: Sun Aug 15 15:02:45 2021
    access_timestamp: Sun Aug 15 15:02:45 2021
    modify_timestamp: Sun Aug 15 15:02:45 2021

客户端扩容文件系统

注意:如果客户端格式化格式为ext4,需要用resize2fs,这里格式化的为xfs,所以用xfs_growfs

xfs_growfs /dev/rbd0

6.5 ceph告警排查

查看ceph集群信息,可以看到集群为HEALTH_WARN状态

[root@ceph-node01 ~]# ceph -s
  cluster:
    id:     3b690447-512d-4700-a245-f729e1f2caed
    health: HEALTH_WARN
            application not enabled on 1 pool(s)
            1 daemons have recently crashed
 
  services:
    mon: 3 daemons, quorum ceph-node01,ceph-node02,ceph-node03 (age 34m)
    mgr: ceph-node02(active, since 8h), standbys: ceph-node03, ceph-node01
    osd: 3 osds: 3 up (since 36m), 3 in (since 119m)
 
  data:
    pools:   1 pools, 64 pgs
    objects: 296 objects, 1.0 GiB
    usage:   6.1 GiB used, 144 GiB / 150 GiB avail
    pgs:     64 active+clean

查看健康状况详情,可以看到ceph-rbd-demo资源池未启用application,是因为在创建该资源池未进行init操作,按提示需要enable application操作

[root@ceph-node01 ~]# ceph health detail 
HEALTH_WARN application not enabled on 1 pool(s); 1 daemons have recently crashed
POOL_APP_NOT_ENABLED application not enabled on 1 pool(s)
    application not enabled on pool 'ceph-rbd-demo'
    use 'ceph osd pool application enable <pool-name> <app-name>', where <app-name> is 'cephfs', 'rbd', 'rgw', or freeform for custom applications.
RECENT_CRASH 1 daemons have recently crashed
    mon.ceph-node03 crashed on host ceph-node03 at 2021-08-15 07:01:16.120542Z

启用application(即将资源池分类)

ceph osd pool application enable ceph-rbd-demo rbd

查看crash列表

[root@ceph-node01 ~]# ceph crash ls
ID                                                               ENTITY          NEW 
2021-08-15_07:01:16.120542Z_4062980e-2ba8-4041-a894-9d246fc29763 mon.ceph-node03  * 

查看具体crash信息

ceph crash info 2021-08-15_07:01:16.120542Z_4062980e-2ba8-4041-a894-9d246fc29763

打包crash信息,对于误报情况

ceph crash archive 2021-08-15_07:01:16.120542Z_4062980e-2ba8-4041-a894-9d246fc29763

再次查看集群信息

[root@ceph-node01 ~]# ceph -s
  cluster:
    id:     3b690447-512d-4700-a245-f729e1f2caed
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph-node01,ceph-node02,ceph-node03 (age 46m)
    mgr: ceph-node02(active, since 9h), standbys: ceph-node03, ceph-node01
    osd: 3 osds: 3 up (since 48m), 3 in (since 2h)
 
  data:
    pools:   1 pools, 64 pgs
    objects: 296 objects, 1.0 GiB
    usage:   6.1 GiB used, 144 GiB / 150 GiB avail
    pgs:     64 active+clean

7.RGW对象存储

7.1 Ceph对象存储网关架构

image.png

Ceph 对象网关是一个构建在 librados 之上的对象存储接口,它为应用程序访问Ceph 存储集群提供了一个 RESTful 风格的网关 。 Ceph 对象存储支持 2 种接口:

  • 兼容S3: 提供了对象存储接口,兼容 亚马逊S3 RESTful 接口的一个大子集。
  • 兼容Swift: 提供了对象存储接口,兼容 Openstack Swift 接口的一个大子集。

Ceph 对象存储使用 Ceph 对象网关守护进程( radosgw ),它是个与 Ceph 存储集群交互的 FastCGI 模块。因为它提供了与 OpenStack Swift 和 Amazon S3 兼容的接口, RADOS 要有它自己的用户管理。 Ceph 对象网关可与 Ceph FS 客户端或 Ceph 块设备客户端共用一个存储集群。 S3 和 Swift 接口共用一个通用命名空间,所以你可以用一个接口写如数据、然后用另一个接口取出数据。

注意:Ceph 对象存储使用 Ceph 元数据服务器。

7.2 部署RGW存储网关

新建网关实例

ceph-deploy rgw create ceph-node01

查看集群状态,可以看到当前ceph-node01部署为rgw

[root@ceph-node01 my-cluster]# ceph -s
  cluster:
    id:     02416a48-f84a-4aed-a0c3-71a479d8d387
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph-node01,ceph-node02,ceph-node03 (age 13m)
    mgr: ceph-node01(active, since 13m), standbys: ceph-node03, ceph-node02
    osd: 3 osds: 3 up (since 13m), 3 in (since 13m)
    rgw: 1 daemon active (ceph-node01)
 
  task status:
 
  data:
    pools:   5 pools, 192 pgs
    objects: 484 objects, 1.2 GiB
    usage:   6.4 GiB used, 144 GiB / 150 GiB avail
    pgs:     192 active+clean
 
  io:
    client:   53 KiB/s rd, 0 B/s wr, 79 op/s rd, 53 op/s wr

7.3 修改RGW默认端口

在当前部署目录,修改配置文件ceph.conf,最底下添加

[client.rgw.ceph-node01]
rgw_frontends = "civetweb port=80"

推送配置文件至其它节点

ceph-deploy --overwrite-conf config push ceph-node01 ceph-node02 ceph-node03

重启Ceph 对象网关服务

systemctl restart ceph-radosgw@rgw.ceph-node01.service

7.4 RGW之S3接口使用

创建兼容S3风格的Ceph 对象网关用户

[root@ceph-node01 my-cluster]# radosgw-admin user create --uid="ceph-s3-user" --display-name="Ceph S3 User Demo"
{
    "user_id": "ceph-s3-user",
    "display_name": "Ceph S3 User Demo",
    "email": "",
    "suspended": 0,
    "max_buckets": 1000,
    "subusers": [],
    "keys": [
        {
            "user": "ceph-s3-user",
            "access_key": "YZSZ6GLWGFFEM6K4HY3H",
            "secret_key": "8HRi4eH9vYqmT94vhXg0T7aEwB2w3OONA4eKYaR1"
        }
    ],
    "swift_keys": [],
    "caps": [],
    "op_mask": "read, write, delete",
    "default_placement": "",
    "default_storage_class": "",
    "placement_tags": [],
    "bucket_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "user_quota": {
        "enabled": false,
        "check_on_raw": false,
        "max_size": -1,
        "max_size_kb": 0,
        "max_objects": -1
    },
    "temp_url_keys": [],
    "type": "rgw",
    "mfa_ids": []
}

也可以通过如下命令查看该用户信息

radosgw-admin user info --uid ceph-s3-user

验证s3访问

yum install python-boto -y

添加如下脚本

#!/bin/python
import boto
import boto.s3.connection

access_key = 'YZSZ6GLWGFFEM6K4HY3H'
secret_key = '8HRi4eH9vYqmT94vhXg0T7aEwB2w3OONA4eKYaR1'
conn = boto.connect_s3(
        aws_access_key_id = access_key,
        aws_secret_access_key = secret_key,
        host = '192.168.2.7', port = 80,
        is_secure=False, calling_format = boto.s3.connection.OrdinaryCallingFormat(),
        )

bucket = conn.create_bucket('ceph-s3-bucket')
for bucket in conn.get_all_buckets():
            print "{name}".format(
                    name = bucket.name,
                    created = bucket.creation_date,
 )

运行脚本创建bucket

[root@ceph-node01 ~]# python s3test.py 
ceph-s3-bucket

查看资源池

[root@ceph-node01 ~]# ceph osd lspools 
1 ceph-rbd-demo
2 .rgw.root
3 default.rgw.control
4 default.rgw.meta
5 default.rgw.log
6 default.rgw.buckets.index

7.5 使用s3cmd管理对象存储

安装s3cmd

yum install -y s3cmd

配置s3cmd,按提示输入即可

[root@ceph-node01 ~]# s3cmd --configure

Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.

Access key and Secret key are your identifiers for Amazon S3. Leave them empty for using the env variables.
Access Key: YZSZ6GLWGFFEM6K4HY3H
Secret Key: 8HRi4eH9vYqmT94vhXg0T7aEwB2w3OONA4eKYaR1
Default Region [US]: 

Use "s3.amazonaws.com" for S3 Endpoint and not modify it to the target Amazon S3.
S3 Endpoint [s3.amazonaws.com]: 192.168.2.7:80

Use "%(bucket)s.s3.amazonaws.com" to the target Amazon S3. "%(bucket)s" and "%(location)s" vars can be used
if the target S3 system supports dns based buckets.
DNS-style bucket+hostname:port template for accessing a bucket [%(bucket)s.s3.amazonaws.com]: 192.168.2.7:80/%(bucket)s 

Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password: 
Path to GPG program [/usr/bin/gpg]: 

When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP, and can only be proxied with Python 2.7 or newer
Use HTTPS protocol [Yes]: no

On some networks all internet access must go through a HTTP proxy.
Try setting it here if you can't connect to S3 directly
HTTP Proxy server name:   

New settings:
  Access Key: YZSZ6GLWGFFEM6K4HY3H
  Secret Key: 8HRi4eH9vYqmT94vhXg0T7aEwB2w3OONA4eKYaR1
  Default Region: US
  S3 Endpoint: 192.168.2.7:80
  DNS-style bucket+hostname:port template for accessing a bucket: 192.168.2.7:80/%(bucket)s
  Encryption password: 
  Path to GPG program: /usr/bin/gpg
  Use HTTPS protocol: False
  HTTP Proxy server name: 
  HTTP Proxy server port: 0

Test access with supplied credentials? [Y/n] y
Please wait, attempting to list all buckets...
Success. Your access key and secret key worked fine :-)

Now verifying that encryption works...
Not configured. Never mind.

Save settings? [y/N] y
Configuration saved to '/root/.s3cfg'

更改s3cmd验证版本,修过/root/.s3cfg

signature_v2 = True

查看bucket列表

[root@ceph-node01 ~]# s3cmd ls
2021-08-16 06:45  s3://ceph-s3-bucket

创建bucket

[root@ceph-node01 ~]# s3cmd mb s3://s3cmd-demo
Bucket 's3://s3cmd-demo/' created

上传文件测试

[root@ceph-node01 ~]# s3cmd put s3test.py s3://s3cmd-demo/
upload: 's3test.py' -> 's3://s3cmd-demo/s3test.py'  [1 of 1]
 605 of 605   100% in    1s   334.54 B/s  done

关于s3cmd上传ERROR: S3 error: 416 (InvalidRange)错误,进入ceph部署目录,ceph.conf添加如下内容,然后重新推送到mon节点,重启ceph-mon即可

mon_max_pg_per_osd = 800

推送至其他节点

ceph-deploy --overwrite-conf config push ceph-node01 ceph-node02 ceph-node03

7.6 swift风格API接口

新建一个 SWIFT 用户,需要在之前建立的s3风格接口的用户基础上创建

radosgw-admin subuser create --uid=ceph-s3-user --subuser=ceph-s3-user:swift --access=full

新建secret key

radosgw-admin key create --subuser=ceph-s3-user:swift --key-type=swift --gen-secret

测试访问,安装Python包

pip install python-swiftclient

访问测试

swift -A http://192.168.2.7/auth/1.0 -U ceph-s3-user:swift -K "DZJRYrczpBDwXj1fSMxe3I052vxJnIybsSgVi2V5" list

配置swift连接信息环境变量,以便直接使用

export ST_AUTH=http://192.168.2.7/auth
export ST_USER=ceph-s3-user:swift
export ST_KEY=DZJRYrczpBDwXj1fSMxe3I052vxJnIybsSgVi2V5

通过swift创建bucket

swift post swift-demo

通过swift上传文件

swift upload swift-demo s3test.py

8.CephFS文件存储

8.1 CephFS组件架构

image.png

Ceph 文件系统( Ceph FS )是个 POSIX 兼容的文件系统,它使用 Ceph 存储集群来存储数据。 Ceph 文件系统与 Ceph 块设备、同时提供 S3 和 Swift API 的 Ceph 对象存储、或者原生库( librados )一样,都使用着相同的 Ceph 存储集群系统。

Ceph 文件系统要求 Ceph 存储集群内至少有一个 Ceph MDS

8.2 安装部署CephFS集群

添加元数据服务器mds,进入部署目录操作

ceph-deploy mds create ceph-node01 ceph-node02 ceph-node03

查看集群信息,看到三个mds都是standby状态

[root@ceph-node01 my-cluster]# ceph -s
  cluster:
    id:     02416a48-f84a-4aed-a0c3-71a479d8d387
    health: HEALTH_WARN
            too many PGs per OSD (288 > max 250)
 
  services:
    mon: 3 daemons, quorum ceph-node01,ceph-node02,ceph-node03 (age 105m)
    mgr: ceph-node01(active, since 3h), standbys: ceph-node03, ceph-node02
    mds:  3 up:standby
    osd: 3 osds: 3 up (since 100m), 3 in (since 3h)
    rgw: 1 daemon active (ceph-node01)
 
  task status:
 
  data:
    pools:   8 pools, 288 pgs
    objects: 791 objects, 2.2 GiB
    usage:   9.4 GiB used, 141 GiB / 150 GiB avail
    pgs:     288 active+clean

8.3 创建CephFS文件系统

创建CephFS元数据资源池

ceph osd pool create cephfs_metadata 16 16

创建CephFS数据资源池

ceph osd pool create cephfs_data 16 16

创建CephFS文件系统,关联上面创建的两个资源池

ceph fs new cephfs-demo cephfs_metadata cephfs_data

查看创建的文件系统列表

[root@ceph-node01 my-cluster]# ceph fs ls
name: cephfs-demo, metadata pool: cephfs_metadata, data pools: [cephfs_data ]

查看mds状态

[root@ceph-node01 my-cluster]# ceph mds stat
cephfs-demo:1 {0=ceph-node01=up:active} 2 up:standby

8.4 CephFS内核挂载

创建挂载测试目录

mkdir -p /mnt/cephfs_demo

挂载CephFS

mount -t ceph 192.168.2.7:6789:/ /mnt/cephfs_demo/ -o name=admin

查看挂载情况

[root@ceph-node01 ~]# df -hT
Filesystem         Type      Size  Used Avail Use% Mounted on
devtmpfs           devtmpfs  2.0G     0  2.0G   0% /dev
tmpfs              tmpfs     2.0G     0  2.0G   0% /dev/shm
tmpfs              tmpfs     2.0G  8.9M  2.0G   1% /run
tmpfs              tmpfs     2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/sda2          xfs        50G  2.5G   48G   6% /
/dev/sda1          xfs       297M  144M  154M  49% /boot
tmpfs              tmpfs     2.0G   24K  2.0G   1% /var/lib/ceph/osd/ceph-0
tmpfs              tmpfs     393M     0  393M   0% /run/user/0
192.168.2.7:6789:/ ceph       45G     0   45G   0% /mnt/cephfs_demo

8.5 Ceph-fuse用户态挂载

安装ceph-fuse客户端

yum install -y ceph-fuse

创建挂载测试目录

mkdir -p /mnt/cephfs_fuse

挂载文件系统,mds服务器可以写多个,以逗号隔开

ceph-fuse -n client.admin -m 192.168.2.7:6789,192.168.2.8:6789,192.168.2.9:6789 /mnt/cephfs_fuse/

查看挂载情况

[root@ceph-node01 ~]# df -hT
Filesystem     Type            Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs        2.0G     0  2.0G   0% /dev
tmpfs          tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs          tmpfs           2.0G  8.9M  2.0G   1% /run
tmpfs          tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/sda2      xfs              50G  2.6G   48G   6% /
/dev/sda1      xfs             297M  144M  154M  49% /boot
tmpfs          tmpfs           2.0G   24K  2.0G   1% /var/lib/ceph/osd/ceph-0
tmpfs          tmpfs           393M     0  393M   0% /run/user/0
ceph-fuse      fuse.ceph-fuse   45G     0   45G   0% /mnt/cephfs_fuse

9.OSD的扩容和换盘

9.1 OSD纵向扩容

随着集群资源的不断增长,Ceph集群的空间可能会存在不够用的情况,因此需要对集群进行扩容,扩容通常包含两种:横向扩容和纵向扩容。横向扩容即增加台机器,纵向扩容即在单个节点上添加更多的OSD存储,以满足数据增长的需求。

需要在部署目录中操作

如果扩容的磁盘已经有分区,可以如下操作删除分区表

ceph-deploy disk zap ceph-node01 /dev/sdc

使用ceph-deploy纵向扩容,使用一开始准备的第二块盘

ceph-deploy osd create ceph-node01 --data /dev/sdc
ceph-deploy osd create ceph-node02 --data /dev/sdc
ceph-deploy osd create ceph-node03 --data /dev/sdc

9.2 数据的rebalancing重分布

添加OSD的时候由于集群的状态(cluster map)已发生了改变,因此会涉及到数据的重分布(rebalancing),即 pool 的PGs数量是固定的,需要将PGs数平均的分摊到多个OSD节点上,例如,我们将2个OSD扩容至3个OSD,扩容后,Ceph集群的OSD map发生改变,需要将PGs移动至其他的节点上。

如果在生产中添加节点则会涉及到大量的数据的迁移,可能会造成性能的影响,所以尽量是一个一个扩容osd。

image.png

9.3 临时暂停rebalance

暂停数据rebalance,如果此时业务流量较大,可以先将数据rebalance临时关闭,保障业务流量正常

ceph osd set norebalance
ceph osd set nobackfill

恢复数据rebalance

ceph osd unset nobackfill
ceph osd unset norebalance

9.4 OSD坏盘更换(删除OSD)

查看osd延迟,可以通过osd延迟判定对应的盘是否出现故障

ceph osd perf

模拟osd故障

systemctl stop ceph-osd@5.service

查看集群状态

[root@ceph-node01 ~]# ceph -s
  cluster:
    id:     9f1caa0b-78df-4788-b279-ca45e12686d9
    health: HEALTH_WARN
            1 osds down
            Degraded data redundancy: 128/834 objects degraded (15.348%), 55 pgs degraded, 133 pgs undersized
 
  services:
    mon: 3 daemons, quorum ceph-node01,ceph-node02,ceph-node03 (age 35m)
    mgr: ceph-node01(active, since 36m), standbys: ceph-node02, ceph-node03
    mds: cephfs-demo:1 {0=ceph-node02=up:active} 2 up:standby
    osd: 6 osds: 5 up (since 75s), 6 in (since 35m)
    rgw: 1 daemon active (ceph-node01)
 
  task status:
 
  data:
    pools:   8 pools, 256 pgs
    objects: 278 objects, 158 MiB
    usage:   6.4 GiB used, 294 GiB / 300 GiB avail
    pgs:     128/834 objects degraded (15.348%)
             123 active+clean
             78  active+undersized
             55  active+undersized+degraded

查看osd列表,看到osd.5是down的状态

[root@ceph-node01 ~]# ceph osd tree
ID CLASS WEIGHT  TYPE NAME            STATUS REWEIGHT PRI-AFF 
-1       0.29279 root default                                 
-3       0.09760     host ceph-node01                         
 0   hdd 0.04880         osd.0            up  1.00000 1.00000 
 3   hdd 0.04880         osd.3            up  1.00000 1.00000 
-5       0.09760     host ceph-node02                         
 1   hdd 0.04880         osd.1            up  1.00000 1.00000 
 4   hdd 0.04880         osd.4            up  1.00000 1.00000 
-7       0.09760     host ceph-node03                         
 2   hdd 0.04880         osd.2            up  1.00000 1.00000 
 5   hdd 0.04880         osd.5          down  1.00000 1.00000

将故障的osd进行out操作,out操作后等待数据重新rebalance完成后再进行以后操作

ceph osd out osd.5

删除对应的crush map

ceph osd crush rm osd.5

删除osd

ceph osd rm osd.5

删除osd认证key

ceph auth rm osd.5

再次查看osd列表,发现osd.5已经不在osd列表中了

[root@ceph-node01 ~]# ceph osd tree
ID CLASS WEIGHT  TYPE NAME            STATUS REWEIGHT PRI-AFF 
-1       0.24399 root default                                 
-3       0.09760     host ceph-node01                         
 0   hdd 0.04880         osd.0            up  1.00000 1.00000 
 3   hdd 0.04880         osd.3            up  1.00000 1.00000 
-5       0.09760     host ceph-node02                         
 1   hdd 0.04880         osd.1            up  1.00000 1.00000 
 4   hdd 0.04880         osd.4            up  1.00000 1.00000 
-7       0.04880     host ceph-node03                         
 2   hdd 0.04880         osd.2            up  1.00000 1.00000

9.5 数据一致性检查

数据一致性检查集群会在固定时间自动进行,如果要手动执行可以按如下操作。

列出pg

ceph pg ls

数据轻量级一致性检查

ceph pg scrub 1.0

深度数据一致性检查

ceph pg deep-scrub 1.0

10.Ceph集群运维

10.1 操作集群服务

主要通过systemd管理ceph集群服务

  • 启动所有守护进程

    systemctl start ceph.target
  • 要停止 Ceph 节点上的所有守护进程(不考虑类型),请执行以下命令

    systemctl stop ceph\*.service ceph\*.target
  • 要在 Ceph 节点上启动特定类型的所有守护进程,请执行以下操作之一

    systemctl start ceph-osd.target
    systemctl start ceph-mon.target
    systemctl start ceph-mds.target
  • 要停止 Ceph 节点上特定类型的所有守护进程,请执行以下操作之一

    systemctl stop ceph-mon\*.service ceph-mon.target
    systemctl stop ceph-osd\*.service ceph-osd.target
    systemctl stop ceph-mds\*.service ceph-mds.target
  • 要在 Ceph 节点上启动特定的守护程序实例,请执行以下操作之一

    systemctl start ceph-osd@{id}
    systemctl start ceph-mon@{hostname}
    systemctl start ceph-mds@{hostname}

    例如:

    systemctl start ceph-osd@1
    systemctl start ceph-mon@ceph-server
    systemctl start ceph-mds@ceph-server

10.2 Ceph日志分析

ceph的日志位置在/var/log/ceph

10.3 Ceph集群监控

集群状态

通过实时交互终端查看集群状况

[root@ceph-node01 ~]# ceph
ceph> status
  cluster:
    id:     9f1caa0b-78df-4788-b279-ca45e12686d9
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph-node01,ceph-node02,ceph-node03 (age 18m)
    mgr: ceph-node02(active, since 18m), standbys: ceph-node03, ceph-node01
    mds: cephfs-demo:1 {0=ceph-node03=up:active} 2 up:standby
    osd: 6 osds: 6 up (since 18m), 6 in (since 2h)
    rgw: 1 daemon active (ceph-node01)
 
  task status:
 
  data:
    pools:   8 pools, 256 pgs
    objects: 535 objects, 1.2 GiB
    usage:   9.5 GiB used, 291 GiB / 300 GiB avail
    pgs:     256 active+clean

通过参数的方式查看集群状况

ceph status #或者ceph -s

动态查看集群状态,集群的信息状态会实时刷新

ceph -w

查看集群当前占用

ceph df #或者用rados df

集群仲裁情况

ceph quorum_status 

osd监控

[root@ceph-node01 ~]# ceph osd status 
+----+-------------+-------+-------+--------+---------+--------+---------+-----------+
| id |     host    |  used | avail | wr ops | wr data | rd ops | rd data |   state   |
+----+-------------+-------+-------+--------+---------+--------+---------+-----------+
| 0  | ceph-node01 | 1552M | 48.4G |    0   |     0   |    0   |     0   | exists,up |
| 1  | ceph-node02 | 1699M | 48.3G |    0   |     0   |    0   |     0   | exists,up |
| 2  | ceph-node03 | 1531M | 48.5G |    0   |     0   |    0   |     0   | exists,up |
| 3  | ceph-node01 | 1675M | 48.3G |    0   |     0   |    0   |     0   | exists,up |
| 4  | ceph-node02 | 1527M | 48.5G |    0   |     0   |    0   |     0   | exists,up |
| 5  | ceph-node03 | 1695M | 48.3G |    0   |     0   |    0   |     0   | exists,up |
+----+-------------+-------+-------+--------+---------+--------+---------+-----------+
[root@ceph-node01 ~]# ceph osd stat #或者用 ceph osd dump
6 osds: 6 up (since 25m), 6 in (since 2h); epoch: e81
[root@ceph-node01 ~]# ceph osd df
ID CLASS WEIGHT  REWEIGHT SIZE    RAW USE DATA    OMAP    META     AVAIL   %USE VAR  PGS STATUS 
 0   hdd 0.04880  1.00000  50 GiB 1.5 GiB 528 MiB  20 KiB 1024 MiB  48 GiB 3.03 0.96 113     up 
 3   hdd 0.04880  1.00000  50 GiB 1.6 GiB 651 MiB  27 KiB 1024 MiB  48 GiB 3.27 1.04 143     up 
 1   hdd 0.04880  1.00000  50 GiB 1.7 GiB 676 MiB  20 KiB 1024 MiB  48 GiB 3.32 1.05 121     up 
 4   hdd 0.04880  1.00000  50 GiB 1.5 GiB 504 MiB  23 KiB 1024 MiB  49 GiB 2.98 0.95 135     up 
 2   hdd 0.04880  1.00000  50 GiB 1.5 GiB 508 MiB  23 KiB 1024 MiB  49 GiB 2.99 0.95 123     up 
 5   hdd 0.04880  1.00000  50 GiB 1.7 GiB 672 MiB  20 KiB 1024 MiB  48 GiB 3.31 1.05 133     up 
                    TOTAL 300 GiB 9.5 GiB 3.5 GiB 136 KiB  6.0 GiB 291 GiB 3.15                 
MIN/MAX VAR: 0.95/1.05  STDDEV: 0.15

mon监控

[root@ceph-node01 ~]# ceph mon stat 
e3: 3 mons at {ceph-node01=[v2:192.168.2.7:3300/0,v1:192.168.2.7:6789/0],ceph-node02=[v2:192.168.2.8:3300/0,v1:192.168.2.8:6789/0],ceph-node03=[v2:192.168.2.9:3300/0,v1:192.168.2.9:6789/0]}, election epoch 20, leader 0 ceph-node01, quorum 0,1,2 ceph-node01,ceph-node02,ceph-node03

mds监控

[root@ceph-node01 ~]# ceph mds stat
cephfs-demo:1 {0=ceph-node03=up:active} 2 up:standby

或者

ceph fs dump

ceph admin socket应用

直接通过和ceph服务进程的socket文件通信,进行操作

例如:查看mon的config

ceph --admin-daemon  /var/run/ceph/ceph-mon.ceph-node01.asok config show

10.4 pools(资源池)管理

列出集群的pool列表

ceph osd lspools

查看某个pool的配置信息

例如查看某个pool的pg_num

ceph osd pool get cephfs_data pg_num

pool关联特定应用

针对不同应用的pool进行分类,如:rbd类型的pool配置成rbd类型,cephfs类型配置为cephfs,rgw类型配置为rgw

创建实例pool

ceph osd pool create pool_demo 32 32

关联为rbd类型

ceph osd pool application enable pool_demo rbd

pool设定配额

配置pool可以使用多少objects

ceph osd pool set-quota pool_demo max_objects 10000

10.5 Ceph PG数据分布

什么是PG

PG和pool(资源池)是互相关联的,最终存储的是object,PG又经过crush map的算法,最终落到不同的osd上。pg数量越多,经过crush map算法,他会映射到更多的osd上。

PG的作用

  • 数据分布情况

    PG数量越多,数据在osd上就越分散,丢数据概率越小,反之亦然。

  • 提高计算效率

    由于object的数量非常大,直接由ceph运算负荷会非常大,所以有了PG后,PG中会有多个object,crush map算法计算时只计算PG落在哪个osd上即可。

PG数量计算方法

image.png

注意:最终pg_num的计算结果取接近计算值的2次幂,以提高CRUSH算法效率。例如:计算值为200时,取256作为结果。pgp_num的值应设置为与pg_num一致。

参数解释:

  • Target PGs per OSD:预估每个OSD的PG数,一般取100计算。当预估以后集群OSD数不会增加时,取100计算;当预估以后集群OSD数会增加一倍时,取200计算。
  • OSD #:集群OSD数量。
  • %Data:预估该pool占该OSD集群总容量的近似百分比。
  • Size:该pool的副本数。

经过计算后,可以适当调整资源池pg的数量,可以通过如下命令

ceph osd pool set {pool-name} pg_num {pg-num}

相对于的pgp数量也需要调整,一般和pg数量相同

ceph osd pool set {pool-name} pgp_num {pgp-num}

10.6 删除pool(资源池)

删除资源池pool的命令格式有特殊要求,资源池名必须重复两次,最后加入--yes-i-really-really-mean-it

ceph osd delete {pool-name} {pool-name} --yes-i-really-really-mean-it

而且ceph.conf配置文件必须加入mon_allow_pool_delete = true,修改后重新推送至集群节点

11.定制Crush Map规则

11.1 CrushMap功能简介

所述CRUSH算法确定如何存储和通过计算存储位置检索数据。CRUSH 使 Ceph 客户端能够直接与 OSD 通信,而不是通过中央服务器或代理。通过算法确定的数据存储和检索方法,Ceph 避免了单点故障、性能瓶颈和可扩展性的物理限制。

crushmap能够决定你的数据如何在ceph集群分配,通过crushmap规则可以实现数据的容灾。

桶是层次结构中内部节点的 CRUSH 术语:主机、机架、行等。 CRUSH 映射定义了一系列用于描述这些节点的类型

image.png

默认类型包括:

  • osd(或device
  • host
  • chassis
  • rack
  • row
  • pdu
  • pod
  • room
  • datacenter
  • zone
  • region
  • root

11.2 CrushMap规则剖析

查看集群CrushMap规则

ceph osd crush tree # 或者ceph osd crush dump

查看某个pool的crush_rule

ceph osd pool get {pool-name} crush_rule

11.3 定制Crush拓扑架构

本次实例集群架构为左边,通过调整实现右边架构(模拟每个机器两种不同磁盘,HDD和SSD)

image.png

11.4 手动编辑CrushMap

导出二进制格式crushmap

ceph osd getcrushmap -o crushmap.bin

反编译

crushtool -d crushmap.bin -o crushmap.txt
# begin crush map
tunable choose_local_tries 0
tunable choose_local_fallback_tries 0
tunable choose_total_tries 50
tunable chooseleaf_descend_once 1
tunable chooseleaf_vary_r 1
tunable chooseleaf_stable 1
tunable straw_calc_version 1
tunable allowed_bucket_algs 54

# devices
device 0 osd.0 class hdd
device 1 osd.1 class hdd
device 2 osd.2 class hdd
device 3 osd.3 class ssd
device 4 osd.4 class ssd
device 5 osd.5 class ssd

# types
type 0 osd
type 1 host
type 2 chassis
type 3 rack
type 4 row
type 5 pdu
type 6 pod
type 7 room
type 8 datacenter
type 9 zone
type 10 region
type 11 root

# buckets
host ceph-node01 {
    id -3        # do not change unnecessarily
    id -4 class hdd        # do not change unnecessarily
    # weight 0.098
    alg straw2
    hash 0    # rjenkins1
    item osd.0 weight 0.049
}
host ceph-node02 {
    id -5        # do not change unnecessarily
    id -6 class hdd        # do not change unnecessarily
    # weight 0.098
    alg straw2
    hash 0    # rjenkins1
    item osd.1 weight 0.049
}
host ceph-node03 {
    id -7        # do not change unnecessarily
    id -8 class hdd        # do not change unnecessarily
    # weight 0.098
    alg straw2
    hash 0    # rjenkins1
    item osd.2 weight 0.049
}
host ceph-node01-ssd {
    # weight 0.098
    alg straw2
    hash 0    # rjenkins1
    item osd.3 weight 0.049
}
host ceph-node02-ssd {
    # weight 0.098
    alg straw2
    hash 0    # rjenkins1
    item osd.4 weight 0.049
}
host ceph-node03-ssd {
    # weight 0.098
    alg straw2
    hash 0    # rjenkins1
    item osd.5 weight 0.049
}
root default {
    id -1        # do not change unnecessarily
    id -2 class hdd        # do not change unnecessarily
    # weight 0.293
    alg straw2
    hash 0    # rjenkins1
    item ceph-node01 weight 0.049
    item ceph-node02 weight 0.049
    item ceph-node03 weight 0.049
}
root ssd {
    # weight 0.293
    alg straw2
    hash 0    # rjenkins1
    item ceph-node01-ssd weight 0.049
    item ceph-node02-ssd weight 0.049
    item ceph-node03-ssd weight 0.049
}

# rules
rule replicated_rule {
    id 0
    type replicated
    min_size 1
    max_size 10
    step take default
    step chooseleaf firstn 0 type host
    step emit
}

rule demo_rule {
    id 1
    type replicated
    min_size 1
    max_size 10
    step take ssd
    step chooseleaf firstn 0 type host
    step emit
}
# end crush map

重新编译为二进制文件

crushtool -c crushmap.txt -o crushmap-new.bin

应用新规则

ceph osd setcrushmap -i crushmap-new.bin

查看新规则

[root@ceph-node01 ~]# ceph osd tree
ID  CLASS WEIGHT  TYPE NAME                STATUS REWEIGHT PRI-AFF 
-12       0.14699 root ssd                                         
 -9       0.04900     host ceph-node01-ssd                         
  3   ssd 0.04900         osd.3                up  1.00000 1.00000 
-10       0.04900     host ceph-node02-ssd                         
  4   ssd 0.04900         osd.4                up  1.00000 1.00000 
-11       0.04900     host ceph-node03-ssd                         
  5   ssd 0.04900         osd.5                up  1.00000 1.00000 
 -1       0.14699 root default                                     
 -3       0.04900     host ceph-node01                             
  0   hdd 0.04900         osd.0                up  1.00000 1.00000 
 -5       0.04900     host ceph-node02                             
  1   hdd 0.04900         osd.1                up  1.00000 1.00000 
 -7       0.04900     host ceph-node03                             
  2   hdd 0.04900         osd.2                up  1.00000 1.00000

获取演示资源池crush规则

[root@ceph-node01 ~]# ceph osd pool get demo-pool crush_rule
crush_rule: replicated_rule

修改为刚刚创建的名为demo_rule的crushrule

[root@ceph-node01 ~]# ceph osd pool set demo-pool crush_rule demo_rule
set pool 12 crush_rule to demo_rule

创建rbd并查看osd分布

[root@ceph-node01 ~]# rbd -p demo-pool create test-crush.img --size 10G
[root@ceph-node01 ~]# rbd -p demo-pool ls
test-crush.img
[root@ceph-node01 ~]# ceph osd map demo-pool test-crush.img
osdmap e189 pool 'demo-pool' (12) object 'test-crush.img' -> pg 12.2e7135e6 (12.6) -> up ([4,3,5], p4) acting ([4,3,5], p4)

11.5 命令行调整CrushMap

添加bucket

ceph osd crush add-bucket ssd root
ceph osd crush add-bucket ceph-node01-ssd host
ceph osd crush add-bucket ceph-node02-ssd host
ceph osd crush add-bucket ceph-node03-ssd host

移动目标osd至新建的bucket

ceph osd crush move osd.3 host=ceph-node01-ssd root=ssd
ceph osd crush move osd.4 host=ceph-node02-ssd root=ssd
ceph osd crush move osd.5 host=ceph-node03-ssd root=ssd

查看当前osd crushmap

[root@ceph-node01 ~]# ceph osd tree
ID  CLASS WEIGHT  TYPE NAME            STATUS REWEIGHT PRI-AFF 
-12       0.04880 host ceph-node03-ssd                         
  5   hdd 0.04880     osd.5                up  1.00000 1.00000 
-11       0.04880 host ceph-node02-ssd                         
  4   hdd 0.04880     osd.4                up  1.00000 1.00000 
-10       0.04880 host ceph-node01-ssd                         
  3   hdd 0.04880     osd.3                up  1.00000 1.00000 
 -9             0 root ssd                                     
 -1       0.14639 root default                                 
 -3       0.04880     host ceph-node01                         
  0   hdd 0.04880         osd.0            up  1.00000 1.00000 
 -5       0.04880     host ceph-node02                         
  1   hdd 0.04880         osd.1            up  1.00000 1.00000 
 -7       0.04880     host ceph-node03                         
  2   hdd 0.04880         osd.2            up  1.00000 1.00000

创建rule

ceph osd crush rule create-replicated ssd-demo ssd host hdd

11.6 编辑CrushMap注意事项

  • 在进行任何操作crushmap之前,提前导出crushmap二进制文件备份
  • 自定义crush location需要配置osd crush update on start = false

    如果没有配置这个参数,重启osd后,该节点的osd会回到原来的默认位置,在配置了这个参数之后,扩容osd需要手动将新的osd move到指定的bucket下

    进入部署目录修改ceph.conf,加入

    [osd]
    osd crush update on start = false

    推送至其他节点

    ceph-deploy --overwrite-conf  config push ceph-node01 ceph-node02 ceph-node03

    重启所有节点osd

    systemctl restart ceph-osd.target

12.RBD的高级功能

12.1 RBD回收站机制

创建演示rbd

ceph osd pool create demo-pool 32 32
ceph osd pool application enable demo-pool rbd
rbd create demo-pool/demo-rbd.img --size 10G
for i in deep-flatten fast-diff object-map exclusive-lock;do rbd feature disable demo-pool/demo-rbd.img $i  ;done

移动rbd到回收站

rbd trash move demo-pool/demo-rbd.img --expires-at 20210820 #需要指定过期日期

查看rbd回收站

[root@ceph-node01 ~]# rbd trash  -p demo-pool ls
ae4e93029347 demo-rbd.img

从回收站恢复

rbd trash restore -p  demo-pool ae4e93029347

12.2 RBD镜像制作快照

创建指定类型的rbd image

rbd create demo-pool/demo-rbd.img --image-feature layering --size 10G

映射此镜像到块设备并挂载

rbd map demo-pool/demo-rbd.img #映射块设备
mkfs.ext4 /dev/rbd0 #格式化
mount /dev/rbd0 /mnt/ceph_rbd/ #挂载

#写入测试数据
cd /mnt/ceph_rbd/
echo "hahahahaah" > 1.txt

创建快照

rbd snap create demo-pool/demo-rbd.img@snap_20210817 # @后跟快照的名称

查看快照列表

[root@ceph-node01 ~]# rbd snap ls demo-pool/demo-rbd.img
SNAPID NAME          SIZE   PROTECTED TIMESTAMP                
     4 snap_20210817 10 GiB           Tue Aug 17 19:58:42 2021

12.3 RBD数据快照恢复

模拟误删除数据

[root@ceph-node01 ceph_rbd]# cd /mnt/ceph_rbd/ && rm -rf * && ll
total 0

卸载块设备

umount /dev/rbd0

恢复快照

rbd snap rollback demo-pool/demo-rbd.img@snap_20210817

重新挂载rbd块设备

mount /dev/rbd0 /mnt/ceph_rbd/

查看目录文件

[root@ceph-node01 ~]# cd /mnt/ceph_rbd/ && ll && cat 1.txt
total 20
-rw-r--r-- 1 root root    11 Aug 17 20:16 1.txt
drwx------ 2 root root 16384 Aug 17 20:16 lost+found
hahahahaah

12.4 RBD镜像克隆机制

参考公有云公共系统镜像,直接使用公共系统镜像可以快速创建实例。

ceph通过copy-on-write(COW)功能实现了类似的功能,通过提前对rbd img拍摄的模板快照,可以直接从此快照快速克隆出一个rbd img。

克隆分为两种,一种是完整克隆,但速度较慢;另一种是快速克隆,新镜像是类似链接到父镜像,读取从父镜像读取,写的话写入子镜像,既节省空间又加快了克隆速度,但是必须保证父镜像一直存在,所以必须对父镜像加入protect的标志位防止误删除。

创建模板镜像

rbd snap create demo-pool/demo-rbd.img@template

保护此镜像

rbd snap protect demo-pool/demo-rbd.img@template

克隆镜像

rbd clone demo-pool/demo-rbd.img@template demo-pool/vm1-clone.img

查看克隆出的镜像信息

[root@ceph-node01 ~]# rbd info demo-pool/vm1-clone.img
rbd image 'vm1-clone.img':
    size 10 GiB in 2560 objects
    order 22 (4 MiB objects)
    snapshot_count: 0
    id: d46d218cf54
    block_name_prefix: rbd_data.d46d218cf54
    format: 2
    features: layering
    op_features: 
    flags: 
    create_timestamp: Tue Aug 17 22:02:33 2021
    access_timestamp: Tue Aug 17 22:02:33 2021
    modify_timestamp: Tue Aug 17 22:02:33 2021
    parent: demo-pool/demo-rbd.img@template
    overlap: 10 GiB

12.5 RBD解除依赖关系

由于以上克隆镜像的操作,父镜像如果损坏或丢失,所有的子镜像全部都会故障,所有可以通过接触依赖关系将父子镜像关系抽离出来。由于是一个独立的镜像,相应的占用空间也会增大,

查看某个父镜像包含的子镜像

[root@ceph-node01 ~]# rbd children demo-pool/demo-rbd.img@template
demo-pool/vm1-clone.img
demo-pool/vm2-clone.img
demo-pool/vm3-clone.img

解除某个镜像的父子关系(flatten)

rbd flatten demo-pool/vm1-clone.img

12.6 RBD的备份和恢复

前面的快照是建立在ceph集群内部的,如果ceph集群不可用了,则快照也没有办法进行恢复,所以可使用RBD的备份功能,备份到集群外部。或者需要将某些数据迁移到另外一个ceph集群,也可以通过备份恢复来实现。

创建rbd镜像快照

rbd snap create demo-pool/demo-rbd.img@snap-demo

导出rbd镜像快照

rbd export demo-pool/demo-rbd.img@snap-demo /root/snap-demo.img

演示误删除数据,该演示rbd块设备挂载在/mnt/ceph_rbd下

cd /mnt/ceph_rbd/ && rm -rf *

导入备份的rbd镜像快照,导入另一个新的rbd,不存在会自动创建

rbd import snap-demo.img demo-pool/demo-rbd-import.img

映射新的rbd并挂载到原来位置

#禁用不兼容的feature
[root@ceph-node01 ~]# rbd feature disable demo-pool/demo-rbd-import.img object-map fast-diff deep-flatten

#映射rbd为块设备
[root@ceph-node01 ~]# rbd map demo-pool/demo-rbd-import.img
/dev/rbd1

#卸载原块设备
[root@ceph-node01 ~]# umount /dev/rbd0

#挂载恢复的新的rbd为块设备
[root@ceph-node01 ~]# mount /dev/rbd1 /mnt/ceph_rbd/

#进入目录查看数据
[root@ceph-node01 ~]# cd /mnt/ceph_rbd/
[root@ceph-node01 ceph_rbd]# ll
total 20
-rw-r--r-- 1 root root    11 Aug 17 20:16 1.txt
drwx------ 2 root root 16384 Aug 17 20:16 lost+found

12.7 RBD的增量备份和恢复

使用增量备份可以使生成的rbd镜像备份更小,但前提是必须是有一个rbd镜像快照全备状态一直的rbd镜像,才可以应用增量备份。

进入挂载目录,生成测试增量数据

cd /mnt/ceph_rbd && echo "azhe azhe" > 2.txt

重新拍摄rbd快照

rbd snap create demo-pool/demo-rbd.img@snap-demo-diff

导出增量快照

rbd export-diff demo-pool/demo-rbd.img@snap-demo-diff /root/snap-demo-diff.img

恢复原来的全量rbd快照备份至新的rbd镜像

rbd import snap-demo.img demo-pool/demo-rbd-new.img

恢复增量rbd快照备份至新的rbd镜像

rbd import-diff snap-demo-diff.img demo-pool/demo-rbd-new.img

12.8 RGW高可用集群搭建

增加rgw节点,进入部署目录操作

ceph-deploy rgw create ceph-node02

修改rgw为默认端口,需要删除ceph.conf文件中自定义rgw端口的配置,然后从新推送配置文件

ceph-deploy --overwrite-conf  config push ceph-node02 ceph-node01

ceph-node01和ceph-node02安装haproxy、keepalived

yum install -y keepalived haproxy

修改haproxy配置文件,ceph-node01和ceph-node02配置文件相同

#全局配置不用修改
frontend  http_web *:80
    mode http
    default_backend  rgw
backend rgw
    balance     roundrobin
    mode http
    server ceph-node01 192.168.2.7:7480 
    server ceph-node02 192.168.2.8:7480

修改keepalived的配置文件

ceph-node01

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
}

vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight -2
}

vrrp_instance RGW {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.2.11/24 dev eth0
    }
    track_script {
        chk_haproxy
    }
}

ceph-node02

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
}

vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight -2
}

vrrp_instance RGW {
    state BACKUP  #角色是BACKUP
    interface eth0
    virtual_router_id 51  #和MASTER的id一致
    priority 99 #优先级比MASTER低,但不能低太多,低太多故障转移会出问题
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.2.11/24 dev eth0
    }
    track_script {
        chk_haproxy
    }
}

分别启动两个节点的haproxy和keepalived

systemctl enabled keepalived.service haproxy.service --now

修改客户端指向

s3cmd

'''''
host_base = 192.168.2.11:80
host_bucket = 192.168.2.11:80/%(bucket)s
'''''

swift

export ST_AUTH=http://192.168.2.11/auth

13.Ceph与Kubernetes集成

注意:kubernetes集群和ceph集群集成,k8s所有的node节点必须安装ceph-common,配置ceph yum源直接安装即可

yum install -y ceph-common

13.1 Ceph与volumes集成

创建pool

ceph osd pool create kubernetes 64 64

标记资源池类型

ceph osd pool application enable kubernetes rbd

创建rbd镜像

rbd create -p kubernetes --image-feature layering rbd.img --size 50G

创建k8s连接ceph集群的认证用户

[root@ceph-node01 ~]# ceph auth get-or-create client.kubernetes mon 'profile rbd' osd 'profile rbd pool=kubernetes' mgr 'profile rbd pool=kubernetes'
[client.kubernetes]
    key = AQAsJh1hykyAEhAAuyctXoUSL+1VL3izREDqCg==

将key的值base64

[root@ceph-node01 ~]# ceph auth get-key client.kubernetes|base64  
QVFBc0poMWh5a3lBRWhBQXV5Y3RYb1VTTCsxVkwzaXpSRURxQ2c9PQo=

在k8s中创建secret

apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret
type: "kubernetes.io/rbd"
data:
  key: QVFBc0poMWh5a3lBRWhBQXV5Y3RYb1VTTCsxVkwzaXpSRURxQ2c9PQo=

创建测试pod

apiVersion: v1
kind: Pod
metadata:
  name: ceph-pod
spec:
  containers:
    - name: pod-with-rbd
      imagePullPolicy: IfNotPresent
      image: nginx:1.18.0
      ports:
        - containerPort: 80
          name: www
          protocol: TCP
      volumeMounts:
        - mountPath: /data
          name: ceph-rbd
  volumes:
    - name: ceph-rbd
      rbd:
        pool: kubernetes #连接到ceph集群的资源池
        image: rbd.img   #ceph集群的rbd镜像名称
        fsType: ext4     #指定rbd文件系统
        user: kubernetes #访问ceph集群的用户
        secretRef:
          name: ceph-secret #访问ceph集群的认证秘钥
        monitors:          #ceph集群的mon地址
          - 192.168.2.7:6789
          - 192.168.2.8:6789
          - 192.168.2.9:6789

查看容器挂载情况

[root@k8s-master01 ~]# kubectl exec -it ceph-pod -- df -hT
Filesystem     Type     Size  Used Avail Use% Mounted on
overlay        overlay   50G  4.2G   46G   9% /
tmpfs          tmpfs     64M     0   64M   0% /dev
tmpfs          tmpfs    2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/rbd0      ext4      50G   53M   50G   1% /data
/dev/sda2      xfs       50G  4.2G   46G   9% /etc/hosts
shm            tmpfs     64M     0   64M   0% /dev/shm
tmpfs          tmpfs    2.0G   12K  2.0G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs          tmpfs    2.0G     0  2.0G   0% /proc/acpi
tmpfs          tmpfs    2.0G     0  2.0G   0% /proc/scsi
tmpfs          tmpfs    2.0G     0  2.0G   0% /sys/firmware

13.2 Ceph与k8s pv集成

准备工作,需要提前在ceph集群创建:用户、资源池、rbd镜像等资源供k8s调用,参考上一步

创建rbd镜像

rbd create -p kubernetes --image-feature layering k8s-demo-pv.img --size 10G

创建pv

apiVersion: v1
kind: PersistentVolume
metadata:
  name: rbd-demo
spec:
  persistentVolumeReclaimPolicy: Retain
  storageClassName: ceph-rbd
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 10G
  rbd:
    pool: kubernetes
    image: k8s-demo-pv.img
    user: kubernetes
    fsType: ext4
    secretRef:
      name: ceph-secret
    monitors:
      - 192.168.2.7:6789
      - 192.168.2.8:6789
      - 192.168.2.9:6789

创建pvc

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ceph-demo-pvc
spec:
  accessModes:
    - ReadWriteOnce
  volumeName: rbd-demo
  resources:
    requests:
      storage: 10G
  storageClassName: ceph-rbd

pod中使用pvc

apiVersion: v1
kind: Pod
metadata:
  name: demo-pod
spec:
  containers:
    - name: nginx
      image: nginx:1.18.0
      imagePullPolicy: IfNotPresent
      ports:
        - containerPort: 80
          name: www
          protocol: TCP
      volumeMounts:
        - mountPath: /data
          name: rbd-volume
  volumes:
    - name: rbd-volume
      persistentVolumeClaim:
        claimName: ceph-demo-pvc

查看pod挂载情况

[root@k8s-master01 ceph]# kubectl exec -it demo-pod -- df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          50G  3.9G   46G   8% /
tmpfs            64M     0   64M   0% /dev
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/rbd0       9.8G   37M  9.7G   1% /data
/dev/sda2        50G  3.9G   46G   8% /etc/hosts
shm              64M     0   64M   0% /dev/shm
tmpfs           2.0G   12K  2.0G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs           2.0G     0  2.0G   0% /proc/acpi
tmpfs           2.0G     0  2.0G   0% /proc/scsi
tmpfs           2.0G     0  2.0G   0% /sys/firmware

13.3 Ceph与k8s StorageClass集成

storageclass一般由管理员创建,它作为存储资源的抽象定义,对用户设置的PVC申请屏蔽后端存储的细节操作,一方面减少了用户对于存储资源细节的关注,另一方面减轻了管理员手工管理PV的工作,由系统根据spec自动完成PV的创建和绑定,实现了动态的资源供应。并且,storageclass是不受namespace限制的。
storageclass的关键组成:

  • provisioner
    每个storageclass都有一个provisioner,用来决定使用哪个卷插件创建PV,该字段必须指定。不同的存储有对应的provisioner,但是k8s内置了一些存储的provisioner,另外有一些存储没有内置到k8s中。没有内置的,可以使用外部第三方的provisioner,第三方的provisioner要符合k8s定义的规范https://github.com/kubernetes/community/blob/master/contributors/design- proposals/volume-provisioning.md
  • parameters
    后端存储资源提供者的参数设置,不同的provisioner包括不同的参数设置。某些参数可以不显示设定,provisioner将使用其默认值。例如ceph存储的参数可以由ceph集群的monitor地址,存储池,默认文件系统等参数构成。
  • reclaimPolicy
    由storageclass动态创建的pv会在类的reclaimPolicy字段中指定回收策略,可以是Delete或者 Retain。如果storageclass对象被创建时没有指定reclaimPolicy,它将默认为Delete。通过storageclass手动创建并管理的pv会使用它们被创建时指定的回收政策。

动态创建流程图(来源于kubernetes in action)

image.png

创建命名空间

kubectl create namespace ceph

生成ceph-csi ConfigMap

通过ceph mon dump获取集群fsid和mon节点地址和端口,然后修改示例configmap资源文件csi-config-map.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: ceph-csi-config
data:
  config.json: |-
    [
      {
        "clusterID": "9f1caa0b-78df-4788-b279-ca45e12686d9",
        "monitors": [
          "192.168.2.7:6789",
          "192.168.2.8:6789",
          "192.168.2.9:6789"
        ]
      }
    ]

生成后,将新的ConfigMap对象存储在 Kubernetes 中

kubectl -n ceph apply -f csi-config-map.yaml

ceph-csi 的最新版本还需要一个额外的ConfigMap对象来定义密钥管理服务 (KMS) 提供程序的详细信息,配置示例ConfigMap文件csi-kms-config-map.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: ceph-csi-encryption-kms-config
data:
  config.json: |-
    {}

生成后,将新的ConfigMap对象存储在 Kubernetes 中

kubectl -n ceph apply -f csi-kms-config-map.yaml

生成ceph-csi cephx Secret

ceph-csi需要 cephx 凭据才能与 Ceph 集群通信。使用13.1生成的key即可,csi-rbd-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: csi-rbd-secret
  namespace: ceph
stringData:
  userID: kubernetes
  userKey: AQAsJh1hykyAEhAAuyctXoUSL+1VL3izREDqCg==

生成后,将新的Secret对象存储在 Kubernetes 中

kubectl -n ceph apply -f csi-rbd-secret.yaml

配置ceph-csi驱动插件

下载所需的ServiceAccount和 RBAC ClusterRole / ClusterRoleBinding Kubernetes 对象资源文件

wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-provisioner-rbac.yaml
wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-nodeplugin-rbac.yaml

修改命名空间

sed -i "s#namespace: default#namespace: ceph#g" csi-provisioner-rbac.yaml
sed -i "s#namespace: default#namespace: ceph#g" csi-nodeplugin-rbac.yaml

创建资源

kubectl -n ceph create -f csi-provisioner-rbac.yaml -f csi-nodeplugin-rbac.yaml

最后,创建ceph-csi配置器和节点插件,由于大部分镜像在国外,需要同步镜像至国内或者内网后修改资源文件镜像地址,这里不再叙述。

下载资源文件

wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml
wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin.yaml

修改命名空间

sed -i "s#namespace: default#namespace: ceph#g" csi-rbdplugin-provisioner.yaml
sed -i "s#namespace: default#namespace: ceph#g" csi-rbdplugin.yaml

创建资源

kubectl -n ceph apply -f csi-rbdplugin-provisioner.yaml -f csi-rbdplugin.yaml

创建StorageClass

Kubernetes StorageClass定义了一类存储。 可以创建多个StorageClass对象以映射到不同的服务质量级别(即 NVMe 与基于 HDD 的池)和功能。

例如,要创建一个映射到 上面创建的kubernetes池的ceph -csi StorageClass,在确保“clusterID”属性与您的 Ceph 集群的fsid匹配后,可以使用以下 YAML 文件:

csi-rbd-sc.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
   clusterID: 9f1caa0b-78df-4788-b279-ca45e12686d9 #修改为ceph集群的fsid
   pool: kubernetes
   imageFeatures: layering
   csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
   csi.storage.k8s.io/provisioner-secret-namespace: ceph
   csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
   csi.storage.k8s.io/controller-expand-secret-namespace: ceph
   csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
   csi.storage.k8s.io/node-stage-secret-namespace: ceph
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
   - discard

创建StorageClass资源

kubectl apply -f csi-rbd-sc.yaml

查看StorageClass资源

kubectl get storageclasses.storage.k8s.io

将该设置为默认StorageClass(可选)

kubectl patch storageclass csi-rbd-sc -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

测试StorageClass

创建pvc,sc-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rbd-pvc
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 1Gi
  storageClassName: csi-rbd-sc

pod中使用pvc,sc-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: csi-rbd-demo-pod
spec:
  containers:
    - name: web-server
      image: nginx:1.18.0
      volumeMounts:
        - name: mypvc
          mountPath: /var/lib/www/html
  volumes:
    - name: mypvc
      persistentVolumeClaim:
        claimName: rbd-pvc
        readOnly: false

创建pod并查看pod挂载情况

[root@k8s-master01 ceph]# kubectl exec -it csi-rbd-demo-pod -- df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          50G  5.1G   45G  11% /
tmpfs            64M     0   64M   0% /dev
tmpfs           985M     0  985M   0% /sys/fs/cgroup
/dev/sda2        50G  5.1G   45G  11% /etc/hosts
shm              64M     0   64M   0% /dev/shm
/dev/rbd0       976M  2.6M  958M   1% /var/lib/www/html
tmpfs           985M   12K  985M   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs           985M     0  985M   0% /proc/acpi
tmpfs           985M     0  985M   0% /proc/scsi
tmpfs           985M     0  985M   0% /sys/firmware

安装SnapshotClass

k8s1.19版本以上需要单独安装volumesnapshots组件,安装资源在:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/volumesnapshots

安装ceph snapshotclass

snapshotclass.yaml

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: csi-rbdplugin-snapclass
driver: rbd.csi.ceph.com
parameters:
  clusterID: 9f1caa0b-78df-4788-b279-ca45e12686d9  #修改为ceph集群的fsid
  csi.storage.k8s.io/snapshotter-secret-name: csi-rbd-secret
  csi.storage.k8s.io/snapshotter-secret-namespace: ceph #修改csi-rbd-secret所在的namaspace
deletionPolicy: Delete

测试volumesnapshot创建

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: rbd-pvc-snapshot
spec:
  volumeSnapshotClassName: csi-rbdplugin-snapclass #snapshotclass的名称
  source:
    persistentVolumeClaimName: rbd-pvc #需要做snapshot的pvc的名称

在k8s查看volumesnapshot

[root@k8s-master01 ~]# kubectl get volumesnapshot
NAME               READYTOUSE   SOURCEPVC   SOURCESNAPSHOTCONTENT   RESTORESIZE   SNAPSHOTCLASS             SNAPSHOTCONTENT                                    CREATIONTIME   AGE
rbd-pvc-snapshot   true         rbd-pvc                             1Gi           csi-rbdplugin-snapclass   snapcontent-792c06cc-7e86-4c2d-9fae-b3f84a6a6ac2   39s            39s

在ceph集群查看快照

[root@ceph-node01 ~]# rbd snap ls kubernetes/csi-snap-598bb238-010e-11ec-9fc8-02540db9f4c6
SNAPID NAME                                          SIZE  PROTECTED TIMESTAMP                
     9 csi-snap-598bb238-010e-11ec-9fc8-02540db9f4c6 1 GiB           Fri Aug 20 00:56:09 2021

14.Ceph管理和监控

14.1 Ceph mgr的特性和功能

仪表板提供以下功能:

  • 多用户和角色管理:仪表板支持具有不同权限(角色)的多个用户帐户。用户帐户和角色可以通过命令行和 WebUI 进行管理。仪表板支持各种增强密码安全性的方法。可以配置密码复杂性规则,要求用户在第一次登录后或在可配置的时间段后更改密码。有关详细信息,请参阅 用户和角色管理
  • 单点登录 (SSO):仪表板支持使用 SAML 2.0 协议通过外部身份提供商进行身份验证。有关详细信息,请参阅 启用单点登录 (SSO)
  • SSL/TLS 支持:Web 浏览器和仪表板之间的所有 HTTP 通信都通过 SSL 进行保护。可以使用内置命令创建自签名证书,但也可以导入由 CA 签名和颁发的自定义证书。有关详细信息,请参阅SSL/TLS 支持
  • 审计:仪表板后端可以被配置为记录所有PUTPOSTDELETE在Ceph的审计日志API请求。有关 如何启用此功能的说明,参阅审核 API 请求
  • 国际化 (I18N):可以在运行时选择用于仪表板文本的语言。

Ceph 仪表板提供以下监控和管理功能:

  • 整体集群健康:显示性能和容量指标以及集群状态。
  • 嵌入式 Grafana 仪表板:Ceph 仪表板 Grafana仪表板可以嵌入外部应用程序和网页中,以显示由Prometheus 模块模块收集的信息和性能指标。有关如何配置此功能的详细信息,请参阅 启用 Grafana 仪表板的嵌入
  • 集群日志:显示集群事件和审计日志文件的最新更新。日志条目可以按优先级、日期或关键字进行过滤。
  • 主机:显示所有集群主机的列表及其存储驱动器、正在运行的服务以及安装的 Ceph 版本。
  • 性能计数器:显示每个正在运行的服务的特定于服务的详细统计信息。
  • Monitors:列出所有 Mons、它们的仲裁状态和打开的会话。
  • 监控:启用 Prometheus 静默的创建、重新创建、编辑和到期,列出警报配置以及所有已配置和触发的警报。显示触发警报的通知。
  • 配置编辑器:显示所有可用的配置选项、它们的描述、类型、默认值和当前设置的值。这些也可以编辑。
  • :列出 Ceph 池及其详细信息(例如应用程序、pg-autoscaling、归置组、复制大小、EC 配置文件、CRUSH 规则、配额等)
  • OSD:列出 OSD、它们的状态和使用统计信息以及详细信息,如属性(OSD 映射)、元数据、性能计数器和读/写操作的使用直方图。标记 OSD 向上/向下/退出、清除和重新加权 OSD、执行清理操作、修改各种与清理相关的配置选项、选择配置文件以调整回填活动的级别。列出与 OSD 关联的所有驱动器。设置和更改 OSD 的设备类别,按设备类别显示和排序 OSD。在新驱动器和主机上部署 OSD。
  • 设备管理:列出编排器已知的所有主机。列出连接到主机的所有驱动器及其属性。显示驱动器健康预测和 SMART 数据。闪烁外壳 LED。
  • iSCSI:列出所有运行 TCMU 运行器服务的主机,显示所有图像及其性能特征(读/写操作、流量)。创建、修改和删除 iSCSI 目标(通过ceph-iscsi)。显示 iSCSI 网关状态和有关活动启动器的信息。有关如何配置此功能的说明,请参阅启用 iSCSI 管理
  • RBD:列出所有 RBD 镜像及其属性(大小、对象、特征)。创建、复制、修改和删除 RBD 镜像(包括快照)并管理 RBD 命名空间。在全局、每个池或每个镜像级别定义各种 I/O 或带宽限制设置。创建、删除和回滚所选镜像的快照,保护/取消保护这些快照以防止修改。复制或克隆快照,平整克隆的镜像。
  • RBD 镜像:启用并配置到远程 Ceph 服务器的 RBD 镜像。列出活动守护进程及其状态、池和 RBD 映像,包括同步进度。
  • CephFS:列出活动的文件系统客户端和关联的池,包括使用统计信息。驱逐活跃的 CephFS 客户端。管理 CephFS 配额和快照。浏览 CephFS 目录结构。
  • 对象网关:列出所有活动的对象网关及其性能计数器。显示和管理(添加/编辑/删除)对象网关用户及其详细信息(例如配额)以及用户的存储桶及其详细信息(例如放置目标、所有者、配额、版本控制、多因素身份验证)。有关配置说明,请参阅启用对象网关管理前端
  • NFS:通过 NFS Ganesha 管理 CephFS 文件系统和 RGW S3 存储桶的 NFS 导出。有关如何启用此功能的详细信息,请参阅NFS-Ganesha 管理
  • Ceph 管理器模块:启用和禁用 Ceph 管理器模块,管理特定于模块的配置设置。

14.2 Ceph Dashboard安装部署

安装ceph-mgr-dashboard,所有的mgr节点都需要安装

yum install -y ceph-mgr-dashboard

启动dashboard模块

ceph mgr module enable dashboard

自动生成ssl

ceph dashboard create-self-signed-cert

或者可以直接禁用ssl(可选)

ceph config set mgr mgr/dashboard/ssl false

配置主机名和端口,如果未配置,则默认监听所有,默认http端口都8080,https端口为8443

ceph config set mgr mgr/dashboard/server_addr 0.0.0.0
ceph config set mgr mgr/dashboard/server_port 8080
ceph config set mgr mgr/dashboard/ssl_server_port 8443

配置一个用户

ceph dashboard ac-user-create admin -i pass administrator #-i指定一个包含密码的文本文件

版权属于:admin
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
0
查看目录

目录

来自 《Ceph快速入门》
评论

本篇文章评论功能已关闭

博主很懒,啥都没有
26 文章数
1 评论量
11 分类数
27 页面数
已在风雨中度过 5年252天10小时31分