---
title: "Ceph 笔记"
date: 2019-10-30T11:44:37+08:00
lastmod: 2019-10-30T11:44:37+08:00
tags: ["ceph"]
categories: ["storage"]
---

## 测试环境
操作系统 | 主机名 | IP | OSD 设备 | OSD ID | 容量 | ceph 版本
---- | ---- | ---- | ---- | ---- | ---- | ----
CentOS7 | ceph101 | 192.168.1.101 | /dev/sdb | 0 | 3TB | jewel
CentOS7 | ceph102 | 192.168.1.102 | /dev/sdb | 1 | 3TB | jewel
CentOS7 | ceph103 | 192.168.1.103 | /dev/sdb | 2 | 3TB | jewel

- ceph 部署机
    - 操作系统: CentOS7
    - 部署用户: cephdeploy
    - 操作目录: /home/cephdeploy/ceph-cluster
    - IP: 192.168.1.100

## 新增 OSD
- 设置 ceph 三个 noflag，禁止 ceph 自动迁移数据
    ```bash
    # 在任一节点上执行下面命令即可
    ceph osd set noout
    ceph osd set nobackfill
    ceph osd set norecover
    ceph -s # 此时能看到这三个 flag，而且集群处于不健康状态
    ```
- 关闭这三台 ceph 服务器， 加装新的磁盘，个人认为无需配置多盘 raid
- 启动这三台 ceph 服务器，此时 ceph 自动启动，那三个 noflag 依旧有效
- 此时查看每台服务器的存储，应该能看到新增的一个或多个裸磁盘
    ```bash
    lsblk
    ```
- 这里假设每台服务器新增两个磁盘(/dev/sdc,/dev/sdd)，都配置成 osd
    ```bash
    # 在 ceph 部署机上执行以下命令
    su - cephdeploy
    cd /home/cephdeploy/ceph-cluster
    # 每次创建一个，别浪 ...
    ceph-deploy osd create ceph101:/dev/sdc
    ceph-deploy osd create ceph101:/dev/sdd
    ceph-deploy osd create ceph102:/dev/sdc
    ceph-deploy osd create ceph102:/dev/sdd
    ceph-deploy osd create ceph103:/dev/sdc
    ceph-deploy osd create ceph103:/dev/sdd
    ```
- osd 增加完成后， 取消之前设置的那三个 noflag
    ```bash
    # 在任一节点上执行下面命令即可
    ceph osd unset noout
    ceph osd unset nobackfill
    ceph osd unset norecover
    ```
- 此时数据向新增的 osd 上均衡，时间不确定 …… 只能等！
    ```bash
    # 在任一节点上执行下面命令，观察数据迁移
    ceph -w
    ```
- 直至 ceph 恢复健康状态
    ```bash
    # 在任一节点上执行下面命令，查看集群状态
    ceph -s
    ```

## 删除 OSD
- 把指定的 osd 踢出集群
    ```bash
    # 在任一节点上执行下面命令即可
    ceph osd out {osd-id}
    ceph -s # 此时能看到一个 osd 已经 out
    ```
- 此时数据在剩下的几个 osd 上均衡，时间不确定 …… 只能等！
    ```bash
    # 在任一节点上执行下面命令，观察数据迁移
    ceph -w
    ```
- 直至 ceph 恢复健康状态
    ```bash
    # 在任一节点上执行下面命令，查看集群状态
    ceph -s
    ```
- 停止该被踢出的 osd
    ```bash
    # 在运行该 osd 的节点上执行下面命令
    systemctl stop ceph-osd@{osd-id}
    ceph -s # 此时能看到一个 osd 已经 down
    ```
- 删除该被停止的 osd
    ```bash
    # 在任一节点上执行下面命令即可
    # 删除 CRUSH 图对应的 osd 条目
    ceph osd crush remove osd.{osd-id}
    # 删除 osd 认证密钥
    ceph auth del osd.{osd-id}
    # 删除 osd
    ceph osd rm {osd-num}
    # 删除各节点的 ceph.conf 可能存在的 osd.{osd-id} 配置
    ```
- 设置 ceph 三个 noflag，禁止 ceph 自动迁移数据
    ```bash
    # 在任一节点上执行下面命令即可
    ceph osd set noout
    ceph osd set nobackfill
    ceph osd set norecover
    ceph -s # 此时能看到这三个 flag，而且集群处于不健康状态
    ```
- 关闭这三台 ceph 服务器，撤掉已被删除 osd 对应的旧磁盘
- 启动这三台 ceph 服务器，此时 ceph 自动启动，三个 noflag 依旧有效；
- 取消之前设置的那三个 noflag
    ```bash
    # 在任一节点上执行下面命令即可
    ceph osd unset noout
    ceph osd unset nobackfill
    ceph osd unset norecover
    ```
- 直至 ceph 恢复健康状态
    ```bash
    # 在任一节点上执行下面命令，查看集群状态
    ceph -s
    ```

## OSD 动态配置
- 查看 osd 当前配置
    ```bash
    ceph -n osd.0 --show-config
    ```
- 动态修改 osd 某个参数
    ```bash
    ceph tell osd.* injectargs '--osd_max_backfills 7'
    ```

## PG 和 PGP
- 少于 5 个 OSD 时可把 pg_num 设置为 128
- OSD 数量在 5 到 10 个时，可把 pg_num 设置为 512
- OSD 数量在 10 到 50 个时，可把 pg_num 设置为 1024
- OSD 数量大于 50 时，<osd数量> * 100/副本数量(默认3)，该值接近的 2 的 N 次方值
- 存储池的 PG 和 PGP 数量一般相等，都是 2 的 N 次方，只能增加，每次增加为当前的 2 倍
- 查看存储池的 PG 和 PGP 数量
    ```bash
    ceph osd pool get {pool_name} pg_num
    ceph osd pool get {pool_name} pgp_num
    ```
- 增加/设置存储池的 PG 和 PGP 数量
    ```bash
    ceph osd pool set {pool_name} <cur_pg_num>*2
    ceph osd pool set {pool_name} <cur_pgp_num>*2
    ```
- 获取所有卡在某状态的归置组统计信息
    ```bash
    ceph pg dump_stuck inactive|unclean|stale|undersized|degraded
    #Inactive （不活跃）归置组不能处理读写，因为它们在等待一个有最新数据的 OSD 复活且进入集群
    #Unclean （不干净）归置组含有复制数未达到期望数量的对象，它们应该在恢复中
    ```
- 获取一个具体归置组的归置组图
    ```bash
    ceph pg map {pg-id}
    ```

## CEPH 服务器关机维护
- 设置 ceph 节点 down 后不自动迁移或恢复数据
    ```bash
    ceph osd set noout
    ceph osd set nobackfill
    ceph osd set norecover
    ```
- 直接关机
- 下次开机
- 设置 ceph 节点开始自动迁移或回复数据
    ```bash
    ceph osd unset noout
    ceph osd unset nobackfill
    ceph osd unset norecover
    ```

