## Ceph集群部署

角色了解

5、RADOS cluster: 由多台 host 存储服务器组成的 ceph 集群
6、OSD(Object Storage Daemon) ：每台存储服务器的磁盘组成的存储空间
7、Mon(Monitor) ： ceph 的监视器 , 维护 OSD 和 PG 的集群状态，一个 ceph 集群至少要有一个 mon，可以是一三五七等等这样的奇数个。
8、Mgr(Manager) ：负责跟踪运行时指标和 Ceph 集群的当前状态，包括存储利用率，当前性能指标和系统负载等，只使用一个工作



### 实验环境

**系统基础环境设定**

测试使用的Ceph存储集群可由一个MON主机及两个以上的OSD机组成，这些主机可以是物理服务器，也可以运行于

vmware、virtualbox或kvm等虚拟化平台上的虚拟机，甚至是公有云上的VPS主机。

本测试环境将由ceph-store01、ceph-store02、ceph-store03和ceph-admin四个独立的主机组成，其中ceph-store01、ceph-store02和ceph-store03是为Ceph存储集群节点，它们分别作为MON节点和OSD节点，各自拥有专用于存储数据的磁盘设备/dev/sdb

和/dev/sdc，操作系统环境均为CentOS 7.6。而ceph-admin主机是为管理节点，用于部署ceph-deploy。

**[官网](https://ceph.io/en/)**

**一定去看官网对环境的要求，比如内核要求，系统版本和ceph的版本!!!实验环境无法使用多资源，所以资源有限，在生产上不能这样子，要把各部分拆开放在不同的服务器，如:osd、mgr等**

此外，各主机需要预设的系统环境如下：

- 借助于NTP或chrony服务设定各节点时间精确同步；
- 通过DNS完成各节点的主机名称解析，测试环境主机数量较少时也可以使用hosts文件进行；
- 关闭各节点的iptables或ﬁrewalld服务，并确保它们被禁止随系统引导过程启动；
- 各节点禁用SELinux；
| 主机名 | ip | 备注 | 磁盘 |
| :---: | :---: | :---: | :---: |
| admin | 192.168.245.200 | ceph-admin | 20GB |
| ceph01 | 192.168.245.201 | mon01、stor-01、mgr01、mds | 20GB、20GB、40GB |
| mon02 | 192.168.245.202 | mon02、stor-02、mgr02 | 20GB、20GB、40GB |
| mon03 | 192.168.245.203 | mon03、stor-03、rgw | 20GB、20GB、40GB |


### 关闭防火墙与安全策略

```shell
# 全部机子都执行
# 防火墙
systemctl stop firewalld
systemctl disable firewalld

# 安全策略
setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
```

### 检查磁盘

```shell
# 全部存储节点机子都执行
# 查看是否新的两个未格式化的盘

fdisk -l
```

### 更改主机名

```shell
[root@c1 ~]# hostnamectl set-hostname admin   # 永久修改，断连重进

[root@c2 ~]# hostnamectl set-hostname mon01
[root@c3 ~]# hostnamectl set-hostname mon02
[root@c4 ~]# hostnamectl set-hostname mon03
```

### 时间同步

若节点可直接访问互联网，直接启动chronyd系统服务，并设定其随系统引导而启动。不过，建议用户配置使用本地的的时间服务器，在节点数量众多时尤其如此。存在可用的本地时间服务器时，修改节点的/etc/crhony.conf配置文件，并将时间服务器指向相应的主机即可

#### 管理节点

```shell
# 在admin角色的机子上操作
# 管理节点
[root@admin ~]# vim /etc/chrony.conf
[root@admin ~]# grep -Ev "#|^$" /etc/chrony.conf 
server 3.centos.pool.ntp.org iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
allow 192.168.0.0/16
logdir /var/log/chrony
```

#### 存储节点

```shell
[root@mon01 ~]# vim /etc/chrony.conf
[root@mon01 ~]# grep -Ev "#|^$" /etc/chrony.conf
server 192.168.245.200 iburst   # 以admin的为标准减少对外请求，防止误认为攻击
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
logdir /var/log/chrony

# 分发到另外两台mon机子
[root@mon01 ~]# scp -r /etc/chrony.conf 192.168.245.202:/etc/chrony.conf
[root@mon01 ~]# scp -r /etc/chrony.conf 192.168.245.203:/etc/chrony.conf
```

#### 同步

```shell
# 所有机子都操作
systemctl restart chronyd
date
```

### 主机名解析(映射)

```shell
[root@admin ~]# vim /etc/hosts   # 对应多个解析名
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.245.200 admin ceph-admin 
192.168.245.201 mon01 stor-01 mgr01 mds 
192.168.245.202 mon02 stor-02 mgr02 
192.168.245.203 mon03 stor-03 rgw 


# 分发
[root@admin ~]# scp -r /etc/hosts 192.168.245.201:/etc/hosts
[root@admin ~]# scp -r /etc/hosts 192.168.245.202:/etc/hosts
[root@admin ~]# scp -r /etc/hosts 192.168.245.203:/etc/hosts


# 验证
ping 解析名
```

### 准备yum源仓库

Ceph官方的仓库路径为http://download.ceph.com/

目前主流版本相关的程序包都在提供，包括kraken、luminous和mimic等，它们分别位于rpm-mimic等一类的目录中。直接安装程序包即可生成相关的yum仓库相关的配置文件，程序包位于相关版本的noarch目录下，

例如rpm-mimic/el7/noarch/ceph-release-1-1.el7.noarch.rpm 是为负责生成适用于部署mimic版本Ceph的yum仓库配置文件，因此直接在线安装此程序包，也能直接生成yum仓库的相关配置。

在ceph-admin节点上，使用如下命令即可安装生成mimic版本相关的yum仓库配置。

```shell
# 为了减少部分时间建议所有机子都操作

# 根据系统选择m版的ceph
rpm -ivh https://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch/ceph-release-1-1.el7.noarch.rpm

# 准备epel源
yum -y install wget
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

# 把ceph源里面的官方链接换成阿里源的链接
sed -i 's#download.ceph.com#mirrors.aliyun.com/ceph#'g /etc/yum.repos.d/ceph.repo

# 重新生成缓存
yum clean all && yum makecache
```

### 创建部署Ceph的特定用户账号

部署工具ceph-deploy    必须以普通用户登录到Ceph集群的各目标节点，且此用户需要拥有无密码使用sudo命令的权限，以便在安装软件及生成配置文件的过程中无需中断配置过程。不过，较新版的ceph-deploy也支持用 ”--username“ 选项提供可无密码使用sudo命令的用户名（包括 root ，但不建议这样做）。

另外，使用”ceph-deploy --username {username} “命令时，指定的用户需要能够通过SSH协议自动认证并连接到各Ceph节点，以免ceph-deploy命令在配置中途需要用户输入密码。

在各Ceph各节点创建新用户

首先需要在各节点以管理员的身份创建一个专用于ceph-deploy的特定用户账号，例如cephadm（建议不要使用

ceph），并为其设置认证密码

```shell
~]# useradd cephadm

~]# echo "123456" | passwd --stdin cephadm
```

```shell
# 确保这些节点上新创建的用户cephadm都有无密码运行sudo命令的权限

# 使用子配置文件，也可以直接visudo修改主文件
~]# echo "cephadm ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephadm   

# 修改权限
~]# chmod 0440 /etc/sudoers.d/cephadm
```

```shell
# 所有节点都切换到cephadm
# 一定要切换
# 验证
~]# su - cephadm

~]$ cd
~]$ sudo vim /etc/passwd
```

### 免密

ceph-deploy命令不支持运行中途的密码输入，因此，必须在管理节点（ceph-admin.magedu.com）上生成SSH密钥并将其公钥分发至Ceph集群的各节点上。下面直接以cephadm用户的身份生成SSH密钥对

```shell
# 在admin机器上生成密钥分发
admin ~]$ ssh-keygen -t RSA -N '' -f ~/.ssh/id_rsa

admin ~]$ ssh-copy-id -i .ssh/id_rsa.pub cephadm@mon01
admin ~]$ ssh-copy-id -i .ssh/id_rsa.pub cephadm@mon02
admin ~]$ ssh-copy-id -i .ssh/id_rsa.pub cephadm@mon03

# 验证
[cephadm@admin ~]$ ssh mon01
[cephadm@admin ~]$ ssh mon02
[cephadm@admin ~]$ ssh mon03
```

另外，为了后续操作之便，建议修改管理节点上cephadm用户的 ~/.ssh/config 文件，设定其访问Ceph集群各节点 时默认使用的用户名为，从而避免每次执行ceph-deploy命令时都要指定 使用”--username“选项设置使用的用户名。 文件内容示例如下所示：

```shell
[cephadm@admin ~]$ vim ~/.ssh/config
Host mon01
  Hostname mon01
  User cephadm
Host mon02
  Hostname mon02
  User cephadm
Host mon03
  Hostname mon03
  User cephadm
  
[cephadm@admin ~]$ sudo chmod 600 ~/.ssh/config   # 修改权限否则ssh 主机名的时候报错"Bad owner or permissions on /home/cephadm/.ssh/config"
  
# 分发到其他机子上
[cephadm@c1 ~]$ sudo scp -p ~/.ssh/config cephadm@mon01:~/.ssh/   # 发送到指定主机的用户下，-p参数保留权限等
[cephadm@c1 ~]$ sudo scp -p ~/.ssh/config cephadm@mon02:~/.ssh/
[cephadm@c1 ~]$ sudo scp -p ~/.ssh/config cephadm@mon03:~/.ssh/
```

### 在管理节点安装ceph-deploy

Ceph存储集群的部署的过程可通过管理节点使用ceph-deploy全程进行，这里首先在管理节点安装ceph-deploy及其依赖到的程序包

```shell
[cephadm@admin ~]$ sudo yum install ceph-deploy python-setuptools python2-subprocess32 -y
```

### 部署RADOS存储集群

#### 初始化RADOS集群

**初始化等操作一定要在创建的目录下进行**

**记住当初设定好的身份**

**1.首先在管理节点上以cephadm用户创建集群相关的配置文件目录**

```shell
# 为了防止出现权限问题就在cephadm的家目录下操作

[cephadm@c1 ~]$ mkdir ceph-cluster
[cephadm@c1 ~]$ cd ceph-cluster
```

**2.初始化第一个MON节点，准备创建集群**

初始化第一个MON节点的命令格式为”ceph-deploy new {initial-monitor-node(s)}“，本示例中，ceph-store01即为第一个

MON节点名称，其名称必须与节点当前实际使用的主机名称保存一致。运行如下命令即可生成初始配置

```shell
[cephadm@c1 ceph-cluster]$ chmod 600 ~/.ssh/config   # 修改权限，否则初始化报错,如下图
[cephadm@admin ceph-cluster]$ ceph-deploy new mon01
```

![](https://figure-bed-1304788733.cos.ap-guangzhou.myqcloud.com/typora/202205062231389.png#alt=)

**3.编辑生成ceph.conf配置文件，在[global]配置段中设置Ceph集群面向客户端通信时使用的IP地址所在的网络，即公网网络地址**

```shell
[cephadm@c1 ceph-cluster]$ grep -Ev "#|^$" ceph.conf 
[global]
fsid = e017ca20-2329-484a-b6bb-7d4e3764bbaa
mon_initial_members = mon01
mon_host = 192.168.245.201
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
public network = 192.168.245.0/16   # 现在没有公网，但是需要这个配置，写上去没有影响，写成局域网的网段
```

**4.安装Ceph集群**

ceph-deploy命令能够以远程的方式连入Ceph集群各节点完成程序包安装等操作，命令格式如下： ceph-deploy install {ceph-node} [{ceph-node} ...]

因此，若要将mon01、mon02和mon03配置为Ceph集群节点，则执行如下命令即可

```shell
# 当网络问题可以使用命令sudo yum -y install ceph ceph-radosgw在存储节点上手动安装先
# yum -y install epel-release
[cephadm@admin ceph-cluster]$ ceph-deploy install mon01 mon02 mon03
```

**5.配置初始MON节点，并收集所有密钥**

```shell
# 管理节点
[cephadm@admin ceph-cluster]$ ceph-deploy mon create-initial

# 验证
[cephadm@admin ceph-cluster]$ ll
总用量 88
-rw------- 1 cephadm cephadm   113 5月   8 09:27 ceph.bootstrap-mds.keyring
-rw------- 1 cephadm cephadm   113 5月   8 09:27 ceph.bootstrap-mgr.keyring
-rw------- 1 cephadm cephadm   113 5月   8 09:27 ceph.bootstrap-osd.keyring
-rw------- 1 cephadm cephadm   113 5月   8 09:27 ceph.bootstrap-rgw.keyring
-rw------- 1 cephadm cephadm   151 5月   8 09:27 ceph.client.admin.keyring
-rw-rw-r-- 1 cephadm cephadm   229 5月   8 09:22 ceph.conf
-rw-rw-r-- 1 cephadm cephadm 59148 5月   8 09:27 ceph-deploy-ceph.log
-rw------- 1 cephadm cephadm    73 5月   8 09:21 ceph.mon.keyring
```

```shell
# 在存储节点检查会有文件
[cephadm@mon01 ~]$ ll /etc/ceph/
```

**6.把配置文件和admin密钥拷贝Ceph集群各节点，以免得每次执行”ceph“命令行时不得不明确指定MON节点地址和ceph.client.admin.keyring**

```shell
# 管理节点
[cephadm@admin ceph-cluster]$ ceph-deploy admin mon01 mon02 mon03

# 在存储节点检查会多文件
[cephadm@mon01 ~]$ ll /etc/ceph/
```

而后在Ceph集群中需要运行ceph命令的的节点上（或所有节点上）以root用户的身份设定用户cephadm能够读 取/etc/ceph/ceph.client.admin.keyring文件

```shell
# 在所有存储节点运行
sudo setfacl -m u:cephadm:r /etc/ceph/ceph.client.admin.keyring
```

**7.配置Manager节点，启动ceph-mgr进程（仅Luminious+版本）**

```shell
# 管理节点
[cephadm@admin ceph-cluster]$ ceph-deploy mgr create mon01
```

**8.在Ceph集群内的节点上以cephadm用户的身份运行如下命令，测试集群的健康状态**

```shell
# 在存储节点运行
[cephadm@mon01 ~]$ ceph -s
# 这样子是正常的，因为还没有开osd所以是这样
  cluster:
    id:     967d2d3a-2a1c-4472-bd1a-fe9bf70a12d7
    health: HEALTH_WARN
            OSD count 0 < osd_pool_default_size 3
 
  services:
    mon: 1 daemons, quorum mon01
    mgr: mon01(active)
    osd: 0 osds: 0 up, 0 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:     
 

```

#### 向RADOS集群添加OSD

列出并擦净磁盘 “ceph-deploy disk”命令可以检查并列出OSD节点上所有可用的磁盘的相关信息

```shell
[cephadm@admin ceph-cluster]$ ceph-deploy disk list mon01 mon02 mon03
```

而后，在管理节点上使用ceph-deploy命令擦除计划专用于OSD磁盘上的所有分区表和数据以便用于OSD，命令格式 为”ceph-deploy disk zap {osd-server-name} {disk-name}“，需要注意的是此步会清除目标设备上的所有数据。下 面分别擦净mon01、mon02和mon03上用于OSD的一个磁盘设备sdb

```shell
[cephadm@admin ceph-cluster]$ ceph-deploy disk zap mon01 /dev/sdb
[cephadm@admin ceph-cluster]$ ceph-deploy disk zap mon02 /dev/sdb
[cephadm@admin ceph-cluster]$ ceph-deploy disk zap mon03 /dev/sdb
```

提示：若设备上此前有数据，则可能需要在相应节点上以root用户使用“ceph-volume lvm zap --destroy {DEVICE}”命令 进行；

**添加OSD**

早期版本的ceph-deploy命令支持在将添加OSD的过程分为两个步骤：准备OSD和激活OSD，但新版本中，此种操作 方式已经被废除，添加OSD的步骤只能由命令”ceph-deploy osd create {node} --data {data-disk}“一次完成，默认 使用的存储引擎为bluestore。 如下命令即可分别把mon01、mon02和mon03的设备sdb添加为OSD

```shell
[cephadm@admin ceph-cluster]$ ceph-deploy osd create mon01 --data /dev/sdb
[cephadm@admin ceph-cluster]$ ceph-deploy osd create mon02 --data /dev/sdb
[cephadm@admin ceph-cluster]$ ceph-deploy osd create mon03 --data /dev/sdb
```

而后可使用”ceph-deploy osd list”命令列出指定节点上的OSD

```shell
[cephadm@admin ceph-cluster]$ ceph-deploy osd list mon01 mon02 mon03
```

事实上，管理员也可以使用ceph命令查看OSD的相关信息

```shell
[cephadm@admin ceph-cluster]$ sudo yum -y install ceph ceph-radosgw

[cephadm@admin ceph-cluster]$ ceph osd stat
2022-05-07 09:37:43.729 7fd6d2f80700 -1 auth: unable to find a keyring on /etc/ceph/ceph.client.admin.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin,: (2) No such file or directory
2022-05-07 09:37:43.729 7fd6d2f80700 -1 monclient: ERROR: missing keyring, cannot use cephx for authentication
[errno 2] error connecting to the cluster

# 解决方法
[cephadm@admin ceph-cluster]$ sudo mkdir -p /etc/ceph/
[cephadm@admin ceph-cluster]$ ls
ceph.bootstrap-mds.keyring  ceph.bootstrap-osd.keyring  ceph.client.admin.keyring  ceph-deploy-ceph.log
ceph.bootstrap-mgr.keyring  ceph.bootstrap-rgw.keyring  ceph.conf                  ceph.mon.keyring
[cephadm@admin ceph-cluster]$ sudo cp -p ./ceph.client.admin.keyring /etc/ceph/
[cephadm@admin ceph-cluster]$ ll /etc/ceph/   # 检查一下权限
总用量 8
-rw-r-----+ 1 cephadm cephadm 151 5月   6 23:06 ceph.client.admin.keyring
-rw-r--r--  1 root    root     92 4月  24 2020 rbdmap
# 如不是符合就执行
[cephadm@admin ceph-cluster]$ sudo setfacl -m u:cephadm:r /etc/ceph/ceph.client.admin.keyring
```

或者使用如下命令了解相关的信息

```shell
[cephadm@mon01 ~]$ ceph osd dump
[cephadm@mon01 ~]$ ceph osd ls
0
1
2
```

```shell
# 强一致性，三块20G硬盘合起来60G，就是和LVM差不多，就是做到PV那一步然后由集群(PG)帮我们做VG池(相当于三台服务器组成VG池)
[cephadm@mon01 ~]$ ceph -s
  cluster:
    id:     967d2d3a-2a1c-4472-bd1a-fe9bf70a12d7
    health: HEALTH_OK
 
  services:
    mon: 1 daemons, quorum mon01   # 核心节点
    mgr: mon01(active)
    osd: 3 osds: 3 up, 3 in   # 存储节点
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   3.0 GiB used, 57 GiB / 60 GiB avail
    pgs:     
 
[cephadm@mon01 ~]$
```

```shell
# 把第三块磁盘也擦除添加
[cephadm@admin ceph-cluster]$ ceph-deploy disk zap mon01 /dev/sdc
[cephadm@admin ceph-cluster]$ ceph-deploy disk zap mon02 /dev/sdc
[cephadm@admin ceph-cluster]$ ceph-deploy disk zap mon03 /dev/sdc

[cephadm@admin ceph-cluster]$ ceph-deploy osd create mon01 --data /dev/sdc
[cephadm@admin ceph-cluster]$ ceph-deploy osd create mon02 --data /dev/sdc
[cephadm@admin ceph-cluster]$ ceph-deploy osd create mon03 --data /dev/sdc

[cephadm@admin ceph-cluster]$ ceph -s
  cluster:
    id:     967d2d3a-2a1c-4472-bd1a-fe9bf70a12d7
    health: HEALTH_OK
 
  services:
    mon: 1 daemons, quorum mon01
    mgr: mon01(active)
    osd: 6 osds: 6 up, 6 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   6.0 GiB used, 174 GiB / 180 GiB avail
    pgs:
    
 [cephadm@mon01 ~]$ ceph osd status
+----+-------+-------+-------+--------+---------+--------+---------+-----------+
| id |  host |  used | avail | wr ops | wr data | rd ops | rd data |   state   |
+----+-------+-------+-------+--------+---------+--------+---------+-----------+
| 0  | mon01 | 1027M | 18.9G |    0   |     0   |    0   |     0   | exists,up |
| 1  | mon02 | 1027M | 18.9G |    0   |     0   |    0   |     0   | exists,up |
| 2  | mon03 | 1027M | 18.9G |    0   |     0   |    0   |     0   | exists,up |
| 3  | mon01 | 1027M | 38.9G |    0   |     0   |    0   |     0   | exists,up |
| 4  | mon02 | 1027M | 38.9G |    0   |     0   |    0   |     0   | exists,up |
| 5  | mon03 | 1027M | 38.9G |    0   |     0   |    0   |     0   | exists,up |
+----+-------+-------+-------+--------+---------+--------+---------+-----------+

```

#### 从RADOS集群中移除OSD的方法

Ceph集群中的一个OSD通常对应于一个设备，且运行于专用的守护进程。在某OSD设备出现故障，或管理员出于管 理之需确实要移除特定的OSD设备时，需要先停止相关的守护进程，而后再进行移除操作。对于Luminous及其之后 的版本来说，停止和移除命令的格式分别如下所示：

1. 停用设备：ceph osd out {osd-num}
2. 停止进程：sudo systemctl stop ceph-osd@{osd-num}
3. 移除设备：ceph osd purge {id} --yes-i-really-mean-it

若类似如下的OSD的配置信息存在于ceph.conf配置文件中，管理员在删除OSD之后手动将其删除。

> [osd.1] host = {hostname}


不过，对于Luminous之前的版本来说，管理员需要依次手动执行如下步骤删除OSD设备：

1. 于CRUSH运行图中移除设备：ceph osd crush remove {name}
2. 移除OSD的认证key：ceph auth del osd.{osd-num}
3. 最后移除OSD设备：ceph osd rm {osd-num}

#### 存储池管理

存取数据时，客户端必须首先连接至RADOS集群上某存储池，而后根据对象名称由相关的CRUSH规则完成数据对象 寻址。于是，为了测试集群的数据存取功能，这里首先创建一个用于测试的存储池mypool，并设定其PG数量为16 个(并不符合生产要求)。

**或者去官网使用官网提供的计算器进行计算[Ceph PGCalc - Ceph](https://old.ceph.com/pgcalc/)**

```shell
# 在任一mon节点上操作
# 存取数据时，客户端必须首先连接至RADOS集群上某存储池，而后根据对象名称由相关的CRUSH规则完成数据对象寻址。于是，为了测试集群的数据存取功能，这里首先创建一个用于测试的存储池mypool，并设定其PG数量为16个
[cephadm@mon01 ceph]$ ceph osd pool create mypool 16
pool 'mypool' created

# 而后即可将测试文件上传至存储池中，例如下面的“rados put”命令将/etc/issue文件上传至mypool存储池，对象名
# 称依然保留为文件名issue，而“rados ls”命令则可以列出指定存储池中的数据对象
[cephadm@mon01 ceph]$ rados put issue /etc/issue --pool=mypool
[cephadm@mon01 ceph]$ rados ls --pool=mypool
issue

# 而“ceph osd map”命令可以获取到存储池中数据对象的具体位置信息
[cephadm@mon01 ceph]$ ceph osd map mypool issue
```

删除数据对象，“rados rm”命令是较为常用的一种方式

```shell
[cephadm@mon01 ceph]$ rados rm issue --pool=mypool
```

删除存储池命令存在数据丢失的风险，Ceph于是默认禁止此类操作。管理员需要在ceph.conf配置文件中启用支持删 除存储池的操作后，方可使用类似如下命令删除存储池

```shell
[cephadm@mon01 ~]$ ceph osd pool rm mypool mypool --yes-i-really-really-mean-it
Error EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool

# 解决方法
# 打开mon节点的配置文件
[cephadm@mon01 ~]$ sudo vim /etc/ceph/ceph.conf
# 添加以下内容
[mon]
mon_allow_pool_delete = true

# 重启ceph-mon服务，命令如下
[cephadm@mon01 ~]$ systemctl restart ceph-mon.target
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to manage system services or units.
Authenticating as: root
Password: 
==== AUTHENTICATION COMPLETE ===

# 执行删除pool命令
[cephadm@mon01 ~]$ ceph osd pool rm mypool mypool --yes-i-really-really-mean-it
pool 'mypool' removed
```

### 扩展Ceph集群

#### 扩展监视器节点

**Ceph存储集群需要至少运行一个Ceph   Monitor和一个Ceph    Manager，生产环境中，为了实现高可用性，Ceph存储集群通常运行多个监视器，以免单监视器整个存储集群崩溃。Ceph使用Paxos算法，该算法需要半数以上的监视器**

**（大于n/2，其中n为总监视器数量）才能形成法定人数。尽管此非必需，但奇数个监视器往往更好。**

**“ceph-deploy mon add {ceph-nodes}”命令可以一次添加一个监视器节点到集群中。例如，下面的命令可以将集群中的mon01、mon02和mon03也运行为监视器节点**

```shell
# 管理节点
[cephadm@admin ceph-cluster]$ ceph-deploy mon add mon02
[cephadm@admin ceph-cluster]$ ceph-deploy mon add mon03

# 验证
[cephadm@admin ceph-cluster]$ ceph -s
  cluster:
    id:     967d2d3a-2a1c-4472-bd1a-fe9bf70a12d7
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum mon01,mon02,mon03
    mgr: mon01(active)
    osd: 6 osds: 6 up, 6 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   6.0 GiB used, 174 GiB / 180 GiB avail
    pgs:     
 
[cephadm@mon01 ~]$
```

设置完成后，可以在ceph客户端上查看监视器及法定人数的相关状态

```shell
[cephadm@mon01 ~]$ ceph quorum_status --format json-pretty

{
    "election_epoch": 18,
    "quorum": [
        0,
        1,
        2
    ],
    "quorum_names": [
        "mon01",
        "mon02",
        "mon03"
    ],
    "quorum_leader_name": "mon01",
    "monmap": {
        "epoch": 3,
        "fsid": "967d2d3a-2a1c-4472-bd1a-fe9bf70a12d7",
        "modified": "2022-05-07 12:53:24.277547",
        "created": "2022-05-06 23:06:08.792633",
        "features": {
            "persistent": [
                "kraken",
                "luminous",
                "mimic",
                "osdmap-prune"
            ],
            "optional": []
        },
        "mons": [
            {
                "rank": 0,
                "name": "mon01",
                "addr": "192.168.245.201:6789/0",
                "public_addr": "192.168.245.201:6789/0"
            },
            {
                "rank": 1,
                "name": "mon02",
                "addr": "192.168.245.202:6789/0",
                "public_addr": "192.168.245.202:6789/0"
            },
            {
                "rank": 2,
                "name": "mon03",
                "addr": "192.168.245.203:6789/0",
                "public_addr": "192.168.245.203:6789/0"
            }
        ]
    }
}
```

#### 扩展Manager节点

Ceph Manager守护进程以“Active/Standby”模式运行，部署其它ceph-mgr守护程序可确保在Active节点或其上的ceph-mgr守护进程故障时，其中的一个Standby实例可以在不中断服务的情况下接管其任务。

“ceph-deploy mgr create {new-manager-nodes}”命令可以一次添加多个Manager节点。下面的命令可以将mon02节点作为备用的Manager运行

```shell
# 管理节点
[cephadm@admin ceph-cluster]$ ceph-deploy mgr create mon02

# 验证
[cephadm@mon01 ~]$ ceph -s
  cluster:
    id:     967d2d3a-2a1c-4472-bd1a-fe9bf70a12d7
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum mon01,mon02,mon03
    mgr: mon01(active), standbys: mon02
    osd: 6 osds: 6 up, 6 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   6.0 GiB used, 174 GiB / 180 GiB avail
    pgs:     
 

```

## ceph dashboard

### ceph dashboard介绍

Ceph dashboard 是通过一个web界面，对已经运行的ceph集群进行状态查看以及功能配置等功能，早起ceph使用的是第三方的dashboard组件。

#### Calamari

- calamari对外提供了十分漂亮的web管理和监控界面，以及一套改进的REST API接口，在一定程度上简化了ceph管理，最初calamari是作为lnktank公司的ceph企业级商业产品来销售，红帽2015年收购后为了更好地推动ceph的发展，对外宣布calamari开源
- [https://github.com/ceph/calamari](https://github.com/ceph/calamari)
- 优点

   - 管理功能好
   - 界面友好
   - 可以利用它来部署ceph和监控ceph
- 缺点

   - 非官方
   - 依赖openstack某些包

![image-20221110164925824](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202211101649938.png)



#### VSM

- Virtual Storage Manager(VSM)是Inter公司研发并且开源的一款ceph集群管理和监控软件，简化了一些ceph集群部署的一些步骤，可以简单的通过web页面来操作
- [https://github.com/intel/virtual-storage-manager](https://github.com/intel/virtual-storage-manager)
- 优点

   - 已部署
   - 轻量级
   - 灵活
- 缺点
- 

   - 监控选项少
   - 缺乏ceph管理功能

![img](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202211101654079.png)



#### Inkscope

- Inksope是一个ceph的管理和监控系统，依赖于ceph提供的API，使用MongoDB来存储实时的监控数据和历史信息
- [https://github.com/inkscope/inkscope](https://github.com/inkscope/inkscope)
- 优点

   - 已部署
   - 轻量级
   - 灵活
- 缺点

   - 监控选项少
   - 缺乏ceph管理功能

![img](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202211101654232.png)

#### ceph-dash

- ceph-dash是用python开发的一个ceph的监控面板，用来监控ceph的运行状态。同时提供REST API来访问状态数据
- [http://cephdash.crapworks.de/](http://cephdash.crapworks.de/)
- [https://docs.ceph.com/en/mimic/mgr/](https://docs.ceph.com/en/mimic/mgr/)
- [https://docs.ceph.com/en/latest/mgr/dashboard/](https://docs.ceph.com/en/latest/mgr/dashboard/)
- [https://packages.debian.org/unstable/ceph-mgr-dashboard](https://packages.debian.org/unstable/ceph-mgr-dashboard)
- dashboard插件必须安装在mgr节点上
- 优点

   - 易部署
   - 轻量级
   - 灵活
- 缺点

   - 功能相对简单

![img](https://note-1308251438.cos.ap-guangzhou.myqcloud.com/typora/202211101655534.png)

### 开启 dashboard module

```shell
# 我选择在管理节点上操作
[cephadm@admin ceph-cluster]$ ceph mgr module enable dashboard

# 验证
[cephadm@admin ceph-cluster]$ ceph mgr module ls   # 查看mgr模块列表
```

### 禁止 SSL

这里没必要使用不信任的https，公司内部使用可以关闭

```shell
[cephadm@admin ceph-cluster]$ ceph config set mgr mgr/dashboard/ssl false
```

也可以选择生成安全证书

```shell
[cephadm@admin ceph-cluster]$ ceph dashboard create-self-signed-cert
```

### 设置监听地址和端口

```shell
# ceph config set mgr mgr/dashboard/ceph-mgr02/server_addr ip地址
# mgr/dashboard/ceph-mgr02/server_addr: 指定监控ceph-mgr02 节点
# ceph-mgr02 节点IP: 192.168.245.202
[cephadm@admin ceph-cluster]$ ceph config set mgr mgr/dashboard/server_addr 192.168.245.202

# ceph config set mgr mgr/dashboard/ceph-mgr02/server_port 端口号
# mgr/dashboard/ceph-mgr02/server_port : 指定监控ceph-mgr02节点端口
[cephadm@admin ceph-cluster]$ ceph config set mgr mgr/dashboard/server_port 9999


# 在所有mgr节点都执行(mon01、mon02)
systemctl restart ceph-mgr@*
```

```shell
# 浏览器打开节点IP:9999会发现有错误，其实应该把可视化节点设置在活跃的mgr节点上，我这里是mon01活跃
# 将dashboard迁移至其它mgr节点
[cephadm@admin ceph-cluster]$ ceph config set mgr mgr/dashboard/server_addr mon01

# 在所有mgr节点都执行(mon01、mon02)
systemctl restart ceph-mgr@*

# 查看服务访问方式
[cephadm@admin ceph-cluster]$ ceph mgr services
{
    "dashboard": "http://mon01:9999/"
}
```

### 设定用户名和密码

```shell
# 方式一
[cephadm@admin ceph-cluster]$ ceph dashboard set-login-credentials admin admin

# 方式二
# 指定密码为 12345678
[cephadm@admin ceph-cluster]$ echo "12345678" >> dashboard_passwd.txt
# 指定密码从dashboard_passwd.txt文件中获取
[cephadm@admin ceph-cluster]$ ceph dashboard set-login-credentials wgs -i dashboard_passwd.txt
```

### web页面登陆

![](https://figure-bed-1304788733.cos.ap-guangzhou.myqcloud.com/typora/202205081037815.png#alt=)

## ceph的fs使用

启用文件系统（CephFS）接口

CephFS需要至少运行一个元数据服务器（MDS）守护进程（ceph-mds），此进程管理与CephFS上存储的文件相关  的元数据，并协调对Ceph存储集群的访问。因此，若要使用CephFS接口，需要在存储集群中至少部署一个MDS实例。“ceph-deploy mds create {ceph-node}”命令可以完成此功能

- **一个Ceph文件系统至少需要两个存储池，一个用于数据，另一个用于元数据。注意元数据池中的任何数据丢失都可能导致整个文件系统无法访问。**
- **对元数据池使用较低延迟的存储（例如SSD），因为这将直接影响在客户端上观察到的文件系统操作的延迟。**

### 1.创建数据pool池

在任一mon节点机上操作，这里选择mon01

```shell
# 接下来会创建用户密钥，所以进入/etc/ceph下操作
[cephadm@mon01 ~]$ cd /etc/ceph/

# 创建ceph_fsdata：
[cephadm@mon01 ceph]$ ceph osd pool create ceph_fsdata 128   # 原始数据，128为pg数量
pool 'ceph_fsdata' created
 

# 创建matadata：
[cephadm@mon01 ceph]$ ceph osd pool create ceph_fsmetadata 128   # 元数据
pool 'ceph_fsmetadata' created

# 确认pools已创建
[cephadm@mon01 ceph]$ ceph osd lspools
2 ceph_fsdata
3 ceph_fsmetadata
```

### 2.启用pool

```shell
# 元数据池一定放在最前面，因为文件写入都是先写元数据
# 创建文件系统，格式为：ceph fs new <fs_name> <metadata> <data>
[cephadm@mon01 ceph]$ ceph fs new cephfs ceph_fsmetadata ceph_fsdata   
new fs with metadata pool 3 and data pool 2   # 新的fs元数据池3个数据池2个

# 验证
[cephadm@mon01 ceph]$ ceph fs ls   # 查看cephfs相关信息
name: cephfs, metadata pool: ceph_fsmetadata, data pools: [ceph_fsdata ]
```

### 3.开启mds

```shell
# 需要覆盖mon节点上的配置文件，因为前面执行删除pool命令对mon01节点上/etc/ceph/ceph.conf修改了

# 管理节点
[cephadm@admin ceph-cluster]$ ceph-deploy --overwrite-conf mon create mon01
[cephadm@admin ceph-cluster]$ ceph-deploy mds create mon01   # 开启

# 验证
# mon01
[cephadm@mon01 ceph]$ ceph -s
```

### 4.创建使用对象

```shell
# 格式
ceph fs authorize <fs_name> client.<client_id> <path in cephfs> rw

[cephadm@mon01 ceph]$ ceph fs authorize cephfs client.ljr / rw  | sudo tee /etc/ceph/ljr.keyring

[cephadm@mon01 ceph]$ ceph fs authorize cephfs client.ljr2 /test r  | sudo tee /etc/ceph/ljr2.keyring

# 可以对多路径进行授权
# 这里的/代表cephfs文件系统的起始目录

# 查看
[cephadm@mon01 ceph]$ ceph auth list
[cephadm@mon01 ceph]$ ceph auth get client.ljr
exported keyring for client.ljr
[client.ljr]
	key = AQDIQHdiZE3fLhAAyetJk+McEoyWGccS+/gpuQ==
	caps mds = "allow rw"
	caps mon = "allow r"
	caps osd = "allow rw tag cephfs data=cephfs"

# 默认端口6789
[cephadm@mon01 ceph]$ sudo netstat -aulntp | grep 6789

# 删除：
ceph auth rm client.ljr
# 获取信息：
ceph auth get client.ljr
# -o 导出到文件
```

**客户端需要有ceph.cnf以及创建的用户密钥文件,以及ceph软件包**

**根据用户密钥文件生成密钥key，给用户的是用户名.key，而不是用户名.keyring**

```shell
# 导出密钥文件
ceph-authtool -n client.ljr -p ljr.keyring > ljr.key

# mon01需要切换到root操作
[cephadm@mon01 ceph]$ exit
exit
[root@mon01 ~]# cd /etc/ceph/
[root@mon01 ceph]# ceph-authtool -n client.ljr -p ljr.keyring  > ljr.key
[root@mon01 ceph]# ceph-authtool -n client.ljr2 -p ljr2.keyring  > ljr2.key
[root@mon01 ceph]# ll
总用量 28
-rw-r-----+ 1 root root 151 5月   8 09:28 ceph.client.admin.keyring
-rw-r--r--  1 root root 229 5月   8 11:56 ceph.conf
-rw-r--r--  1 root root  92 4月  24 2020 rbdmap
-rw-r--r--  1 root root  41 5月   8 12:22 ljr2.key
-rw-r--r--  1 root root  62 5月   8 12:02 ljr2.keyring
-rw-r--r--  1 root root  41 5月   8 12:22 ljr.key		#相当于公钥
-rw-r--r--  1 root root  61 5月   8 12:02 ljr.keyring	#相当于私钥
-rw-------  1 root root   0 5月   8 09:27 tmp5s_HoT
-rw-------  1 root root   0 5月   8 11:53 tmpds0kqe

# 这里选择mon03为客户端挂载
# 分发密钥(key)过去mon03
[root@mon01 ceph]# scp ljr.key mon03:`pwd`
[root@mon01 ceph]# scp ljr2.key mon03:`pwd`

# 检查mon03
[cephadm@mon03 ~]$ cd /etc/ceph/
[cephadm@mon03 ceph]$ ll
总用量 20
-rw-r-----+ 1 root root 151 5月   8 09:42 ceph.client.admin.keyring
-rw-r--r--  1 root root 229 5月   8 09:42 ceph.conf
-rw-r--r--  1 root root  92 4月  24 2020 rbdmap
-rw-r--r--  1 root root  41 5月   8 12:28 ljr2.key
-rw-r--r--  1 root root  41 5月   8 12:28 ljr.key
-rw-------  1 root root   0 5月   8 09:28 tmpWqBPTz
```

### 5.客户端挂载

```shell
# 方式1：
mount -t ceph mon1:6789,mon2:6789,mon3:6789:/ 本地路径 -o name=用户名,secret=密钥
或者
mount -t ceph mon1:6789,mon2:6789,mon3:6789:/ 本地路径 -o name=用户名,secretfile=密钥文件

# 方式2：
yum install ceph-fuse -y
ceph-fuse -n  client.ljr -m mon1:6789,mon2:6789,mon3:6789 本地路径（挂载点） -o  nonempty
#注意，挂载点必须为空，如果不为空，要么清理空，要么指定参数 -o nonempty
```

```shell
# 创建挂载点并使用
[cephadm@mon03 ceph]$ sudo mkdir /data/
[cephadm@mon03 ceph]$ sudo mount -t ceph mon01:6789,mon02:6789,mon03:6789:/ /data/ -o name=ljr,secretfile=ljr.key
[cephadm@mon03 ceph]$ df -hT
文件系统                                                   类型      容量  已用  可用 已用% 挂载点
/dev/sda3                                                  xfs        17G  2.4G   15G   14% /
devtmpfs                                                   devtmpfs  903M     0  903M    0% /dev
tmpfs                                                      tmpfs     912M     0  912M    0% /dev/shm
tmpfs                                                      tmpfs     912M  8.6M  904M    1% /run
tmpfs                                                      tmpfs     912M     0  912M    0% /sys/fs/cgroup
/dev/sr0                                                   iso9660   4.3G  4.3G     0  100% /mnt
/dev/sda1                                                  xfs      1014M  135M  880M   14% /boot
tmpfs                                                      tmpfs     183M     0  183M    0% /run/user/0
192.168.245.201:6789,192.168.245.202:6789,192.168.245.203:6789:/ ceph      180G  6.1G  174G    4% /data
```

```shell
# 测试
[cephadm@mon03 ceph]$ sudo mkdir /opt/test/test
[cephadm@mon03 ceph]$ cd /data
[cephadm@mon03 data]$ sudo vim test.txt  # 发现可读可写
[cephadm@mon03 data]$ cat test.txt
[cephadm@mon03 data]$ sudo mkdir test

# 卸载挂载
[cephadm@mon03 data]$ cd /etc/ceph/
[cephadm@mon03 ceph]$ sudo umount /data/
[cephadm@mon03 ceph]$ df -hT
文件系统       类型      容量  已用  可用 已用% 挂载点
/dev/sda3      xfs        17G  2.4G   15G   14% /
devtmpfs       devtmpfs  903M     0  903M    0% /dev
tmpfs          tmpfs     912M     0  912M    0% /dev/shm
tmpfs          tmpfs     912M  8.6M  904M    1% /run
tmpfs          tmpfs     912M     0  912M    0% /sys/fs/cgroup
/dev/sr0       iso9660   4.3G  4.3G     0  100% /mnt
/dev/sda1      xfs      1014M  135M  880M   14% /boot
tmpfs          tmpfs     183M     0  183M    0% /run/user/0
[cephadm@mon03 ceph]$ ll /data/
总用量 0
```

推荐使用一下方法

```shell
# 添加用户jerry，jerry只有对/jerry路径下的文件具有读写权限，对其他路径下的文件只有读的权限

[root@mon01 ceph]# ceph auth get-or-create client.jerry mon 'allow r' mds 'allow r, allow rw path=/jerry' osd 'allow rw' | sudo tee /etc/ceph/ceph.client.jerry.keyring

[root@mon01 ceph]# ceph-authtool -n client.jerry -p ceph.client.jerry.keyring > jerry.key
[root@mon01 ceph]# scp jerry.key mon03:`pwd`


# mon03操作
# 先利用ljr账号挂载创建好jerry目录先再卸载
[cephadm@mon03 ceph]$ sudo mount -t ceph mon01:6789,mon02:6789,mon03:6789:/ /mnt -o name=jerry,secretfile=jerry.key
[cephadm@mon03 ceph]$ df -h
文件系统                                                    容量  已用  可用 已用% 挂载点
/dev/sda3                                                    17G  2.4G   15G   14% /
devtmpfs                                                    903M     0  903M    0% /dev
tmpfs                                                       912M     0  912M    0% /dev/shm
tmpfs                                                       912M  8.6M  904M    1% /run
tmpfs                                                       912M     0  912M    0% /sys/fs/cgroup
/dev/sda1                                                  1014M  135M  880M   14% /boot
tmpfs                                                       183M     0  183M    0% /run/user/0
192.168.245.201:6789,192.168.245.202:6789,192.168.245.203:6789:/  180G  6.1G  174G    4% /mnt
[cephadm@mon03 ceph]$ cd /mnt/
[cephadm@mon03 mnt]$ ll
总用量 0
drwxr-xr-x 1 root root 0 5月   8 19:43 jerry
drwxr-xr-x 1 root root 0 5月   8 19:34 test
[cephadm@mon03 mnt]$ cd jerry/
[cephadm@mon03 jerry]$ sudo touch test.txt
[cephadm@mon03 jerry]$ ll
总用量 0
-rw-r--r-- 1 root root 0 5月   8 19:44 test.txt
[cephadm@mon03 jerry]$ cd ../test/
[cephadm@mon03 test]$ sudo touch test.txt
touch: 无法创建"test.txt": 权限不够
```

```shell
# 修改用户权限
$ ceph auth caps client.jerry mon 'allow r' mds 'allow r, allow rw path=/jerry, allow rw path=/test' osd 'allow rw'


# 当用java api操作cephfs时，api无法指定新建文件or目录的所属用户or所属组，这两个属性取决于运行java程序时的当前用户(uid)及其所属的用户组(gid)

# 经过测试发现，cephfs文件or目录的权限是linux本身用户权限和cephfs用户权限的交集

# 修改用户权限后，在本地需要重新挂载才可生效

# 建目录，设置权限无需前后顺序
```

## Ceph存储集群的访问接口

Ceph块设备接口（RBD） Ceph块设备，也称为RADOS块设备（简称RBD），是一种基于RADOS存储系统支持超配（thin-provisioned）、可伸缩的条带化数据存储系统，它通过librbd库与OSD进行交互。RBD为KVM等虚拟化技术和云OS（如OpenStack和 CloudStack）提供高性能和无限可扩展性的存储后端，这些系统依赖于libvirt和QEMU实用程序与RBD进行集成。 客户端基于librbd库即可将RADOS存储集群用作块设备，不过，用于rbd的存储池需要事先启用rbd功能并进行初始化。例如，下面的命令创建一个名为rbddata的存储池，在启用rbd功能后对其进行初始化：

```shell
# 这里选择mon01节点操作
# 切回root操作
```

### 创建存储池rbddata

指定pg与pgp都为32(pgp不用指定也可以，默认与pg一样)

pgp 是对存在于 pg 的数据进行组合存储，pgp 通常等于 pg 的值

```shell
[root@mon01 ceph]# ceph osd pool create kvm 32 32
pool 'kvm' created
```

### 转换模式

转换存储池为rbd模式

```shell
# 如果不启动 rbd 功能的话该块存储没法使用
[root@mon01 ceph]# ceph osd pool application enable kvm rbd
enabled application 'rbd' on pool 'kvm'
```

**注意**

如果自定义crush rule 请为pool指定rule

```
ceph osd pool set kvm crush_rule 规则名字（ljr_rule）
```

### 初始化存储池

```shell
[root@mon01 ceph]# rbd pool init -p kvm

# 不过，rbd存储池并不能直接用于块设备，而是需要事先在其中按需创建映像（image），并把映像文件作为块设备使用。rbd命令可用于创建、查看及删除块设备相在的映像（image），以及克隆映像、创建快照、将映像回滚到快照和查看快照等管理操作。
```

### 创建镜像

```shell
rbd create --size 5G --pool <pool name> <image name>
# 示例：
[root@mon01 ceph]# rbd create --size 1G --pool kvm img1
```

### 查看镜像

```shell
[root@mon01 ceph]# rbd ls --pool kvm list
img1
```

### 查看镜像详细信息

```shell
[root@mon01 ceph]# rbd --image img1 --pool kvm info
rbd image 'img1':
	size 1 GiB in 256 objects
	order 22 (4 MiB objects)
	id: d4916b8b4567
	block_name_prefix: rbd_data.d4916b8b4567
	format: 2
	features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
	op_features: 
	flags: 
	create_timestamp: Sun May  8 20:59:30 2022
	
# 可简写：rbd info kvm/img1
[root@mon01 ceph]# rbd info kvm/img1
```

### 修改镜像大小(动态扩容)

```shell
# 扩容到5G
[root@mon01 ceph]# rbd resize --pool kvm --image img1 --size 5G
Resizing image: 100% complete...done.
[root@mon01 ceph]# rbd info kvm/img1
rbd image 'img1':
	size 5 GiB in 1280 objects
	……

# 减少（不建议操作）
rbd resize --pool kvm --image img1 --size 2G  --allow-shrink

# 不建议直接删除镜像用以下方法（直接删除无法恢复）
rbd remove kvm/img1

# 删除推荐方法：
rbd trash move kvm/img1
rbd trash list --pool kvm
rbd trash restore kvm/id   #（id用list看） (恢复操作)
```

## rbd使用

安装ceph客户端包

### 创建一个可以访问rbd存储的用户

```shell
# 这里选择在mon01操作
# root身份下操作
[root@mon01 ceph]# ceph auth get-or-create client.osd-mount osd "allow * pool=kvm" mon "allow r" > /etc/ceph/ceph.client.osd-mount.keyring
```

### 关闭特性

修改镜像特性，镜像默认只支持layering和striping特性。需关闭

```shell
[root@mon01 ceph]# rbd feature disable kvm/img1 object-map,fast-diff,deep-flatten
```

### 开启rbd

```shell
[cephadm@admin ceph-cluster]$ ceph osd pool application enable kvm rbd
enabled application 'rbd' on pool 'kvm'
```

### 发送配置文件与密钥

将ceph的配置文件以及密钥文件放到客户机

```shell
# 这里选择发送到mon03
[root@mon01 ceph]# scp ceph.client.osd-mount.keyring mon03:`pwd`
root@mon03's password: 
ceph.client.osd-mount.keyring                             100%   67   117.7KB/s   00:00
```

### 在客户端安装ceph-common包

```shell
[cephadm@mon03 ceph]$ sudo yum install ceph-common -y
```

### 执行客户端映射

```shell
# root身份下操作
[root@mon03 ceph]# rbd map --pool kvm --image img1 --keyring /etc/ceph/ceph.client.osd-mount.keyring --user osd-mount
/dev/rbd0
```

### 查看/断开映射

```shell
[root@mon03 ceph]# rbd showmapped
id pool image snap device    
0  kvm  img1  -    /dev/rbd0 
[root@mon03 ceph]# rbd unmap kvm/img1
[root@mon03 ceph]# rbd showmapped
```

### 格式化并挂载

```shell
[root@mon03 ceph]# mkfs.xfs /dev/rbd0
meta-data=/dev/rbd0              isize=512    agcount=9, agsize=162816 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1310720, 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@mon03 ceph]# mount /dev/rbd0 /mnt/
[root@mon03 ceph]# df -hT
文件系统       类型      容量  已用  可用 已用% 挂载点
/dev/sda3      xfs        17G  2.4G   15G   14% /
devtmpfs       devtmpfs  903M     0  903M    0% /dev
tmpfs          tmpfs     912M     0  912M    0% /dev/shm
tmpfs          tmpfs     912M  8.6M  904M    1% /run
tmpfs          tmpfs     912M     0  912M    0% /sys/fs/cgroup
/dev/sda1      xfs      1014M  135M  880M   14% /boot
tmpfs          tmpfs     912M   28K  912M    1% /var/lib/ceph/osd/ceph-5
tmpfs          tmpfs     912M   28K  912M    1% /var/lib/ceph/osd/ceph-2
tmpfs          tmpfs     183M     0  183M    0% /run/user/0
/dev/rbd0      xfs       5.0G   33M  5.0G    1% /mnt
```

### 在线扩容

```shell
# mon01
[root@mon01 ceph]# rbd resize --pool kvm --image img1 --size 10G
Resizing image: 100% complete...done.

# mon03
# 在不重启不重新挂载的情况下，df查看还是5GB，可以执行下面命令在线刷新
# 客户端：
resize2fs /dev/rbd0  (ext4)
xfs_growfs /dev/rbd0  (xfs)


[root@mon03 ceph]# xfs_growfs /dev/rbd0
meta-data=/dev/rbd0              isize=512    agcount=9, agsize=162816 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=1310720, imaxpct=25
         =                       sunit=1024   swidth=1024 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 1310720 to 2621440
[root@mon03 ceph]# df -hT
文件系统       类型      容量  已用  可用 已用% 挂载点
/dev/sda3      xfs        17G  2.4G   15G   14% /
devtmpfs       devtmpfs  903M     0  903M    0% /dev
tmpfs          tmpfs     912M     0  912M    0% /dev/shm
tmpfs          tmpfs     912M  8.6M  904M    1% /run
tmpfs          tmpfs     912M     0  912M    0% /sys/fs/cgroup
/dev/sda1      xfs      1014M  135M  880M   14% /boot
tmpfs          tmpfs     912M   28K  912M    1% /var/lib/ceph/osd/ceph-5
tmpfs          tmpfs     912M   28K  912M    1% /var/lib/ceph/osd/ceph-2
tmpfs          tmpfs     183M     0  183M    0% /run/user/0
/dev/rbd0      xfs        10G   33M   10G    1% /mnt
```

## 快照操作

```shell
格式：rbd snap create --pool <pool name> --image <image name> --snap <snap name>
```

示例（简约用法）：

```shell
rbd snap create <pool name>/<image name>@<snap name>

# 因为在mon03挂载了所以在mon03操作
[root@mon03 ceph]# rbd snap create kvm/img1@img1_snap1   # 创建一个快照
```

### 查看指定镜像快照

```shell
[root@mon03 ceph]# rbd snap list kvm/img1
SNAPID NAME         SIZE TIMESTAMP                
     4 img1_snap1 10 GiB Sun May  8 22:12:41 2022
```

### 测试

```shell
[root@mon03 ceph]# cd /mnt/
[root@mon03 mnt]# ll
总用量 0
[root@mon03 mnt]# mkdir test
[root@mon03 mnt]# echo "123" >> /mnt/test/too.txt
[root@mon03 mnt]# cat /mnt/test/too.txt
123
[root@mon03 mnt]# rbd snap create kvm/img1@img1_snap1
rbd: failed to create snapshot: (17) File exists
[root@mon03 mnt]# rbd snap create kvm/img1@img1_snap2
[root@mon03 mnt]# rbd snap list kvm/img1
SNAPID NAME         SIZE TIMESTAMP                
     4 img1_snap1 10 GiB Sun May  8 22:12:41 2022 
     5 img1_snap2 10 GiB Sun May  8 22:29:08 2022

[root@mon03 mnt]# rm -rf /mnt/*
[root@mon03 mnt]# cd
[root@mon03 ~]# umount /mnt/   # 卸载
[root@mon03 ~]# rbd unmap kvm/img1   # 断开映射
[root@mon03 ~]# rbd snap rollback kvm/img1@img1_snap2   # 回滚快照
Rolling back to snapshot: 100% complete...done.
[root@mon03 ~]# rbd map --pool kvm --image img1 --keyring /etc/ceph/ceph.client.osd-mount.keyring --user osd-mount   # 重新映射
/dev/rbd0

[root@mon03 ~]# mount /dev/rbd0 /mnt/
[root@mon03 ~]# cd /mnt/
[root@mon03 mnt]# ll
总用量 0
drwxr-xr-x 2 root root 21 5月   8 22:28 test

[root@mon03 mnt]# ll /mnt/test/
总用量 0
-rw-r--r-- 1 root root 0 5月   8 22:28 too.txt
```

### 总结

```shell
做快照还原注意：
1，卸载客户端断开映射
umount
rbd unmap kvm/img1
在服务端恢复快照
客户端重新映射
```

```shell
rbd snap create --pool <pool name> --image <image name> --snap <snap name>

# 示例（简约用法）：
rbd snap create <pool name>/<image name>@<snap name>
rbd snap create kvm/img1@img1_snap1
# 查看指定镜像快照：
rbd snap list kvm/img1
# 还原快照：
rbd snap rollback kvm/img1@img1_snap1
# 限制镜像快照个数：
rbd snap limit set kvm/img1 --limit 3
# 解除限制：
rbd snap limit clear kvm/img1
# 删除快照：
rbd snap rm kvm/img1@img1_snap1
# 删除所有快照：
rbd snap purge kvm/img1


# 快照克隆：
1,将上游快照设置为保护模式
rbd snap protect kvm/img1@img1_snap1
2,克隆新快照：
rbd clone kvm/img1@img1_snap1 --dest kvm/img2
查看克隆快照：
rbd children kvm/img1@img1_snap1
# 一般来说父快照不可以删除，因为新镜像来自父快照。
# 如果想删除父快照保留克隆需要展平
1，展平子镜像
rbd flatten kvm/img2
2,取消父快照的保护
rbd snap unprotect kvm/img1@img1_snap1
3,删除父快照。
4,查看镜像
rbd ls --pool kvm -l
```





## rgw对象存储

三个方面：
1. 用户   （user）
2. 存储桶（bucket）
3. 对象（object）

三者关系，user将object存储到存储系统的bucket上
存储桶属于某个用户并可以容纳对象，一个存储桶可以存储多个对象
同一个用户可以有多个存储桶，不同用户允许使用相同名字的存储桶，因此用户名可以作为存储桶的名称空间。



### 1.创建rgw守护进程，在任何节点创建

```shell
[cephadm@admin ceph-cluster]$ ceph-deploy rgw create mon03   #在mon03上创建网关，注意单点故障问题
# 创建后会自动创建pool（如果定制rule则修改rule）
```



### 2.默认情况下，rgw监听7480端口，可以curl访问

```shell
[cephadm@admin ceph-cluster]$ curl 192.168.245.203:7480
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>
```



### 3.更改rgw监听的端口

```shell
# 在admin机子上操作
[cephadm@admin ceph-cluster]$ vim ceph.conf
# 添加以下内容
[client]
rgw_host = mon03
rgw_frontends = "civetweb port=8888 num_threads=500 request_timeout_ms=60000"

# 推送配置文件覆盖
[cephadm@admin ceph-cluster]$ ceph-deploy --overwrite-conf config push mon01 mon02 mon03

# 全部节点重启服务
systemctl restart ceph-radosgw.target
```



### 4.HTTPS配置

要在 civetweb 上启用 SSL ，首先你需要一个证书、它应该与提供 Ceph 对象网关服务的域名相对应

下述操作均在rgw节点上进行

#### 1、生成CA证书私钥

```shell
# 1、生成CA证书私钥：civetweb.key
# 首先需要生成证书，CA签名证书或者自签证书都可以，测试使用这里生成自签名证书即可。
[cephadm@mon03 ~]$ openssl genrsa -out civetweb.key 2048
```



#### 2、生成CA证书公钥

```shell
# 2、生成CA证书公钥：civetweb.crt
格式：
openssl req -new -x509 -key civetweb.key -out civetweb.crt -days 3650 -subj "/CN=ip"

# 实例
[cephadm@mon03 ~]$ openssl req -new -x509 -key civetweb.key -out civetweb.crt -days 3650 -subj "/CN=192.168.245.203"
```



#### 3、将生成的证书合并为pem

```shell
# 切换回root用户
[root@mon03 ~]# cd /home/cephadm/
[root@mon03 cephadm]# cat civetweb.key civetweb.crt > /etc/ceph/civetweb.pem
```



#### 4、修改ceph.conf配置文件

```shell
# 修改ceph.conf配置文件，指定配置如下
[root@mon03 cephadm]# vim /etc/ceph/ceph.conf
[client]
rgw_host = mon03
rgw_frontends = "civetweb port=8888+443s ssl_certificate=/etc/ceph/civetweb.pem num_threads=500 request_timeout_ms=60000"

# 配置解析：
# port：如果是https端口，需要在端口后面加一个s。
# ssl_certificate：指定证书的路径。
```



#### 5、重启服务

```shell
[root@mon03 cephadm]# systemctl restart ceph-radosgw.target
[root@mon03 cephadm]# netstat -an |grep 443
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN
```



#### 6、创建rgw的访问用户

```shell
[root@mon03 cephadm]# radosgw-admin user create --uid="test" --display-name="test user"

#注意重要的是创建后生成的access_key 以及secret_key
#"access_key": "xxxxxxxxxxxxxxxxxx",
#"secret_key": "xxxxxxxxxxxxxxxxxxxxxxxxxx"
#如果忘记，可用下面命令重新查看
#radosgw-admin user info --uid="test"


# 浏览器打开https://192.168.245.203/
```



#### 7、python脚本测试

```shell
# coding:utf-8​
# boto s3手册：http://boto.readthedocs.org/en/latest/ref/s3.html
# boto s3快速入门：http://boto.readthedocs.org/en/latest/s3_tut.html
# 如果脚本长时间阻塞，请检查集群状态，开启的端口等

import ssl
import boto.s3.connection
from boto.s3.key import Key

try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    pass
else:
    ssl._create_default_https_context = _create_unverified_https_context
#    
# test用户的keys信息
access_key = "NX538HZTYL2BKS17G2Z9"
secret_key = "0bFMErU1OjKXMLayi8PUVkxkecsAUWtNo8T4uSAl"
#
# rgw的ip与端口
host = "192.168.245.203"
port = 443  # 如果使用443端口，下述链接应设置is_secure=True
# port = 80  # 如果使用80端口，下述链接应设置is_secure=False
#
conn = boto.connect_s3(
    aws_access_key_id=access_key,
    aws_secret_access_key=secret_key,
    host=host,
    port=port,
    is_secure=True,
    validate_certs=False,
    calling_format=boto.s3.connection.OrdinaryCallingFormat()
)
#
'''
# 一：创建存储桶
conn.create_bucket(bucket_name='bucket01')
conn.create_bucket(bucket_name='bucket02')
#
# 二：获得一个存储桶
bucket1 = conn.get_bucket('bucket01')
bucket2 = conn.get_bucket('bucket02')
#
# 三：判断是否存在，不存在返回None
exists = conn.lookup('bucket01')
print(exists)
exists = conn.lookup('bucket02')
print(exists)
#
# 四：查看一个bucket下的内容
print(list(bucket1.list()))
print(list(bucket2.list()))
#
'''
'''
# 五：向s3上存储数据, 数据来源可以是file、stream、or string
# 5.1、上传文件
bucket1 = conn.get_bucket('bucket01')
key = Key(bucket=bucket1, name='myfile')  # name的值是数据的key
key.set_contents_from_filename('test.txt')
print(key.get_contents_as_string())  # 读取s3中文件的内容，返回string即文件test.txt的内容
#
'''
'''
# 5.2、上传字符串
bucket1 = conn.get_bucket('bucket01')  # 如果之前已经获取过对象，此处不需要重复获取
k = Key(bucket1)
k.key = 'xxx'
k.set_contents_from_string('dyx is happy')
print(k.get_contents_as_string())
#
'''
# 六：删除一个存储桶，在删除存储桶本身时必须删除该存储桶内的所有key
bucket1 = conn.get_bucket('bucket01')
for key in bucket1:
    key.delete()
bucket1.delete()
#
# bucket1.get_all_keys()[0].delete()  # 删除某一个key
#
# 迭代遍历buckets and keys
for bucket in conn:
    for key in bucket:
        print(key.name,key.get_contents_as_string())
#
# 一个判断文件夹中是否有文件的方法
bucket1 = conn.get_bucket('bucket01')
res = bucket1.get_all_keys() 
if len(res) > 0:
    print('有文件')
else:
    print('为空')
```



## 分布式存储ceph之crush规则配置(慎重修改规则)

请根据自己的情况替换



```shell
#目录
#一 命令生成osd树形结构
#二 crushmap信息介绍
#三 修改 crushmap 信息
#	3.1 导出crush map
#	3.2 修改test.txt
#	3.3 把重新写的 ceph crush 导入 ceph 集群
#	3.4 修改现有存储池的crush_rule
#	3.5 查看集群状态
```



```
一 命令生成osd树形结构
# 创建数据中心：datacenter0
ceph osd crush add-bucket datacenter0 datacenter

# 创建机房：room0 
ceph osd crush add-bucket room0 room

# 创建机架：rack0、rack1、rack2
ceph osd crush add-bucket rack0 rack
ceph osd crush add-bucket rack1 rack
ceph osd crush add-bucket rack2 rack

# 把机房room0移动到数据中心datacenter0下
ceph osd crush move room0 datacenter=datacenter0

# 把机架rack0、rack1、rack2移动到机房room0下
ceph osd crush move rack0 room=room0
ceph osd crush move rack1 room=room0
ceph osd crush move rack2 room=room0

# 把主机osd01移动到：datacenter0/room0/rack0下
ceph osd crush move osd01 datacenter=datacenter0 room=room0 rack=rack0

# 把主机osd02移动到：datacenter0/room0/rack1下
ceph osd crush move osd02 datacenter=datacenter0 room=room0 rack=rack1

# 把主机osd03移动到：datacenter0/room0/rack2下
ceph osd crush move osd03 datacenter=datacenter0 room=room0 rack=rack2
查看

[root@admin ~]# ceph osd tree
ID  CLASS WEIGHT  TYPE NAME              STATUS REWEIGHT PRI-AFF 
 -9       0.17537 datacenter datacenter0                         
-10       0.17537     room room0                                 
-11       0.05846         rack rack0                             
 -3       0.05846             host osd01                         
  0   hdd 0.01949                 osd.0      up  1.00000 1.00000 
  1   hdd 0.01949                 osd.1      up  1.00000 1.00000 
  2   hdd 0.01949                 osd.2      up  1.00000 1.00000 
-12       0.05846         rack rack1                             
 -5       0.05846             host osd02                         
  3   hdd 0.01949                 osd.3      up  1.00000 1.00000 
  4   hdd 0.01949                 osd.4      up  1.00000 1.00000 
  5   hdd 0.01949                 osd.5      up  1.00000 1.00000 
-13       0.05846         rack rack2                             
 -7       0.05846             host osd03                         
  6   hdd 0.01949                 osd.6      up  1.00000 1.00000 
  7   hdd 0.01949                 osd.7      up  1.00000 1.00000 
  8   hdd 0.01949                 osd.8      up  1.00000 1.00000 
 -1             0 root default  

二 crushmap信息介绍
我们可以通过命令导出集群当前的crushmap信息

# 把二进制格式的crush map导出到test.bin文件中
ceph osd getcrushmap -o test.bin

# 用 crushtool 工具把 test.bin 里的二进制数据转换成文本形式保存到 test.txt 文档里。
crushtool -d test.bin -o test.txt

crushmap配置中最核心的当属rule了，crush rule决定了三点重要事项：

1、从OSDMap中的哪个节点开始查找
2、使用那个节点作为故障隔离域
3、定位副本的搜索模式（广度优先 or 深度优先）。
# rules
rule egon_ruleset                       #规则集的命名，创建pool时可以指定rule集
{
id 1                                            #rules集的编号，顺序编即可
type replicated                                #定义pool类型为replicated(还有esurecode模式)
min_size 1                                     #pool中最小指定的副本数量不能小于1

max_size 10                                    #pool中最大指定的副本数量不能大于10    

step take default                              #定义pg查找副本的入口点

step chooseleaf  firstn  0  type  host         #选叶子节点、深度优先、隔离host

step emit                                      #结束

}

总结

pg 选择osd的过程，首先要知道在rules中 指明从osdmap中哪个节点开始查找，入口点默认为default也就是root节点，
然后隔离域为host节点(也就是同一个host下面不能选择两个子节点)。由default到3个host的选择过程，
这里由default根据节点的bucket类型选择下一个子节点，由子节点再根据本身的类型继续选择，直到选择到host，然后在host下选择一个osd。

三 修改 crushmap 信息
对于比较熟的 crush 配置比较熟悉的老手推荐使用， 线上业务集群慎用。

3.1 导出crush map
把 ceph 的二进制格式的 crush map 导出并转换为文本格式

# 把二进制格式的crush map导出到test.bin文件中
ceph osd getcrushmap -o test.bin

# 用 crushtool 工具把 test.bin 里的二进制数据转换成文本形式保存到 test.txt 文档里。
crushtool -d test.bin -o test.txt

3.2 修改test.txt
# 1、将take default改成take datacenter0，修改权重，

# 2、设置叶节点Weight：
以容量为指标，设置weight值：推荐以1TB为基数，设置weight值为1.0。这样500G的则为0.5,3TB则为3.0. 

以性能为指标，设置weight值：比如性能好些的盘，weight设置为1.2，性能差些的weight设置为0.8，
bucket 节点Weight为下级items weight之和

参考设置

# tunable：这里都是一些微调的参数，通常不建议修改，一般得集群规模够大，到了专家级别才会去修改。
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：这下面将列出集群中的所有OSD基本信息。
device 0 osd.0 class hdd
device 1 osd.1 class hdd
device 2 osd.2 class hdd
device 3 osd.3 class hdd
device 4 osd.4 class hdd
device 5 osd.5 class hdd
device 6 osd.6 class hdd
device 7 osd.7 class hdd
device 8 osd.8 class hdd

# 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 region  # 区域（华东1，华东2等）
type 10 root  # 最顶级，必须存在 注意：这些故障域也称之为Bucket，但有些Bucket非radowsgw里面的bucket。

# buckets：这里就是定义故障域名。
root default {
    id -1       # do not change unnecessarily
    id -2 class hdd     # do not change unnecessarily
    # weight 0.000
    alg straw2
    hash 0  # rjenkins1
}
host osd01 {
    id -3       # do not change unnecessarily
    id -4 class hdd     # do not change unnecessarily
    # weight 0.058
    alg straw2
    hash 0  # rjenkins1
    item osd.0 weight 1.000
    item osd.1 weight 1.000
    item osd.2 weight 1.000
}
host osd02 {
    id -5       # do not change unnecessarily
    id -6 class hdd     # do not change unnecessarily
    # weight 0.058
    alg straw2
    hash 0  # rjenkins1
    item osd.3 weight 1.000
    item osd.4 weight 1.000
    item osd.5 weight 1.000
}
host osd03 {
    id -7       # do not change unnecessarily
    id -8 class hdd     # do not change unnecessarily
    # weight 0.058
    alg straw2
    hash 0  # rjenkins1
    item osd.6 weight 1.000
    item osd.7 weight 1.000
    item osd.8 weight 1.000
}
rack rack0 {
    id -11      # do not change unnecessarily
    id -16 class hdd        # do not change unnecessarily
    # weight 0.058
    alg straw2
    hash 0  # rjenkins1
    item osd01 weight 3.000
}
rack rack1 {
    id -12      # do not change unnecessarily
    id -15 class hdd        # do not change unnecessarily
    # weight 0.058
    alg straw2
    hash 0  # rjenkins1
    item osd02 weight 3.000
}
rack rack2 {
    id -13      # do not change unnecessarily
    id -14 class hdd        # do not change unnecessarily
    # weight 0.058
    alg straw2
    hash 0  # rjenkins1
    item osd03 weight 3.000
}
room room0 {
    id -10      # do not change unnecessarily
    id -17 class hdd        # do not change unnecessarily
    # weight 0.175
    alg straw2
    hash 0  # rjenkins1
    item rack0 weight 3.000
    item rack1 weight 3.000
    item rack2 weight 3.000
}
datacenter datacenter0 {
    id -9       # do not change unnecessarily
    id -18 class hdd        # do not change unnecessarily
    # weight 0.175
    alg straw2
    hash 0  # rjenkins1
    item room0 weight 9.000
}

# rules：这里定义的是存储池的规则
# 1、type为存储池的类型，replicated代表副本池。如果有纠删码池也会创建出一个默认的配置，这里没有。
# 2、min_size代表允许的最少副本数
# 3、max_size允许的最大副本数
# 4、step代表每一个步骤，基本第二步为选择如何找到OSD，需要指定故障域级别，这里定义为host，如果有机房或者其它的，可以将故障域定义为更高的级别。
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 egon_rule {                       # 规则集的命名，创建pool时可以指定rule集
    id 1                               # id设置为1
    type replicated                # 定义pool类型为replicated(还有esurecode模式)
    min_size 1                     # pool中最小指定的副本数量不能小1
    max_size 10                    # pool中最大指定的副本数量不能大于10
    step take datacenter0          # 定义pg查找副本的入口点
    step chooseleaf firstn 0 type host  # 深度优先、隔离默认为host，设置为host
    step emit                      # 结束
}

# end crush map



3.3 把重新写的 ceph crush 导入 ceph 集群
# 把 test1 转换成二进制形式
crushtool -c test.txt -o new.bin

# 把 test2 导入集群
ceph osd setcrushmap -i new.bin



3.4 修改现有存储池的crush_rule
重新导入集群后，需要把之前存在过的pool池的crush_rule都修一下，否则集群会出现unknown状态有无法达到activee+clean状态

ceph osd pool set cephfs_data crush_rule egon_rule
ceph osd pool set cephfs_metadata crush_rule egon_rule
ceph osd pool set egon_test crush_rule egon_rule



3.5 查看集群状态
ceph osd dump  # 发现使用的crush_rule的id变为1
```





## 维护集群常用命令

### 查看集群健康状况

```shell
# 检查ceph的状态
ceph -s
ceph status
ceph health
ceph health detail

# 实时观察集群健康状态
ceph -w

或者

watch ceph -s
```



### 检查集群的使用情况

```shell
ceph df  # 它和 Linux 上的 df 相似

# GLOBAL段
展示了数据所占用集群存储空间的概要,详解如下
SIZE: 集群的总容量;
AVAIL: 集群的空闲空间总量;
RAW USED: 已用存储空间总量;
% RAW USED: 已用存储空间比率。用此值参照 full ratio 和 near full \ ratio 来确保不会用尽集群空间。 详情见存储容量。

# POOLS 段:
展示了存储池列表及各存储池的大致使用率。没有副本、克隆品和快照占用情况。例如，如果你 把 1MB 的数据存储为对象，理论使用率将是 1MB ，但考虑到副本数、克隆数、和快照数，实际使用率可能是 2MB 或更多。
NAME: 存储池名字;
ID: 存储池唯一标识符;
USED: 大概数据量，单位为 B、KB、MB 或 GB ;
%USED: 各存储池的大概使用率;
Objects: 各存储池内的大概对象数。
```

```shell
ceph osd df  # 可以详细列出集群每块磁盘的使用情况，包括大小、权重、使用多少空间、使用率等等
4.3 mds相关
1、查看mds状态

ceph mds stat
ceph mds dump
2、删除mds节点

ssh root@mon01 systemctl stop ceph-mds.target
ceph mds rm 0  # 删除一个不活跃的mds

# 启动mds后，则恢复正常
3、关闭mds集群

ceph mds cluster_down
4、开启mds集群

ceph mds cluster_up
5、设置cephfs 文件系统存储方式最大单个文件尺寸

ceph mds set max_file_size 1024000000000
6、了解：清除mds文件系统

# 1、强制 mds 状态为 featrue
ceph mds fail 0
​
# 2、删除 mds 文件系统
ceph fs rm cephfs --yes-i-really-mean-it
​
# 3、删除数据池
ceph osd pool delete cephfs_data cephfs_data --yes-i-really-really-mean-it
​
# 4、删除元数据池
ceph osd pool delete cephfs_metadata cephfs_metadata --yes-i-really-really-mean-it 
​
# 5、然后再删除 mds key,残留文件等
​
# 6、最后删除不活跃的mds
ceph mds rm 0 
4.4 mon相关
1、查看mon状态

ceph mon stat
2、查看mon映射信息

ceph mon dump
3、检查Ceph monitor仲裁/选举状态

ceph quorum_status --format json-pretty
4、查看mon信息包括ip地址

获得一个正在运行的 mon map，并保存在 1.txt 文件中 
ceph mon getmap -o 1.txt
monmaptool --print 1.txt
```



