--- 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 时, * 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} *2 ceph osd pool set {pool_name} *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 ```