目录
[Ceph 简介是什么](#Ceph 简介是什么)
[Ceph 逻辑架构与数据写入流程](#Ceph 逻辑架构与数据写入流程)
[三、补充:对象到 PG 的哈希计算示例](#三、补充:对象到 PG 的哈希计算示例)
[四、RUSH 算法](#四、RUSH 算法)
[Ceph 部署对 Python 版本的要求](#Ceph 部署对 Python 版本的要求)
[ssh key的验证 打通免密登录。](#ssh key的验证 打通免密登录。)
[部署 Mgr 节点](#部署 Mgr 节点)
[部署 OSD 存储节点](#部署 OSD 存储节点)
[创建 OSD](#创建 OSD)
[批量添加 OSD 节点](#批量添加 OSD 节点)
[实现 Mon 节点高可用](#实现 Mon 节点高可用)
[实现 Mgr 节点高可用](#实现 Mgr 节点高可用)
Ceph 简介是什么
Ceph 是一个开源的分布式存储系统,简单说就是软件定义的大硬盘。
它把多个服务器的硬盘整合在一起,像用一块超大硬盘一样访问数据,不用关心数据具体存在哪台机器上。
x.0.z - 开发版 x.1.z - 候选版 x.2.z - 稳定、修正版
Ceph优点
-
统一存储 --- 一套系统同时提供块、文件、对象三种接口
-
高可用 --- 数据多副本,自动故障恢复,节点挂了不影响服务
-
高扩展 --- 加硬盘、加机器就行,容量和性能线性增长
-
开源免费 --- 不用花钱,生态成熟
-
自平衡 --- 数据自动分布到各节点,不用手动管理
Ceph缺点
-
复杂度高 --- 部署和运维有一定门槛,新手劝退
-
小文件性能一般 --- 海量小文件场景不如专用方案
-
硬件要求 --- 对网络和磁盘IO要求较高
-
调试费劲 --- 出问题排查需要一定经验
Ceph功能介绍
-
Monitor(ceph-mon) ceph 监视器:MON 是集群的注册中心和配置中心。它不存你的数据,只存"谁在哪、状态如何"的元信息。MON 一旦挂了,集群就瘫痪,连不上。它本身只吃少量资源,但对网络延迟很敏感。 一个主机上运行的一个守护进程,用于维护集群状态映射(maintains maps of thecluster state),比如 ceph 集群中有多少存储池、每个存储池有多少 PG 以及存储池和 PG的 映 射 关 系 等 , monitor map, manager map, the OSD map, the MDS map, and the*CRUSH map,这些映射是 Ceph 守护程序相互协调所需的关键 群集状态,此外监视器还负责管理守护程序和客户端之间的身份验证(认证使用 cephX 协议)。通常至少需要三个监视器才能实现冗余和高可用性
-
Managers(ceph-mgr)MGR : 是集群的运维大总管。无它,不影响存/取数据,但你会变成"瞎子",无法知道集群状态。它让 MON 专心干好自己定位导航的核心活。 作用提供丰富的实时监控数据开启 Web 管理界面负责 Prometheus、Zabbix 等监控系统的数据导出执行定时任务:如磁盘空间回收、PG 自动优化建议等。高可用性通常至少需要两个管理器
-
OSD 就是一个个货架,真正存放货物(数据)的地方。 提供存储数据,操作系统上的一个磁盘就是一个 OSD 守护程序,OSD 用于处理 ceph集群数据复制,恢复,重新平衡,并通过检查其他 Ceph OSD 守护程序的心跳来向 Ceph监视器和管理器提供一些监视信息。通常至少需要 3 个 Ceph OSD 才能实现冗余和高可用性。
-
PG 是管理单元,就像把仓库分成很多固定编号的小组,用来决定哪批货放哪个货架。 一个 pool (储存池)内部可以有多个 PG 存在,pool 和 PG 都是抽象的逻辑概念,一个 pool 中有多少个 PG 可以通过公式计算。
-
PGP = PG for Placement 数据迁移/恢复 时,同时工作的 PG 数量迁移/恢复时才用到 PGP所占用多少个PGP同时运行
-
存储池(Pool) 逻辑上的存储分区,从 OSD(物理硬盘)划分而来用来隔离不同业务或用途的数据包含:PG 数量、副本数、CRUSH 规则等配置 存储池是基于 OSD 划分的逻辑分区,用于隔离和管理不同业务的数据(虚拟机)
-
RocksDB / LevelDB 是货架上每个管理员(OSD)手里的私账本,用来记录这个货架上所有货物的元信息和存放位置。
-
MDS(Metadata Server) 是 Ceph 文件系统(CephFS)专属 的元数据服务器。它只在你用 Ceph 存文件 (像 NAS 那样共享目录)时才需要,如果用块存储(RBD)或对象存储(RGW),根本用不到 MDS。
Ceph 逻辑架构与数据写入流程
一、逻辑架构三层模型
比喻:国家 → 省份 → 住户
-
Pool(存储池):好比一个国家,是最高层级的逻辑分区,大小由底层所有磁盘总容量决定。
-
PG(放置组):好比省份,一个 Pool 里有很多 PG,用来把数据进一步打散管理。PG 数量按公式预先算好。
-
OSD(对象存储设备):好比具体的住户,一块物理磁盘就是一个 OSD,数据最终保存在这里。
三者的关系:文件 → 归属于某个 Pool → 被分配到某个 PG → 落到具体的多个 OSD 上。
二、数据写入的六个步骤
整个过程的核心是:一个文件经过"切块"和"两次导航",最终写到多块硬盘上。
-
文件切对象
- 文件按 4MB 切成对象碎片,每个碎片得到唯一 ID: oid = ino(文件号) + ono(碎片序号)
-
对象 → PG(哈希导航)
-
用静态哈希算法计算:
hash(oid) & mask = pgid -
mask = PG总数 - 1,确保结果落在 PG 编号范围内。
-
-
PG → OSD(CRUSH 导航)
- 将 pgid 输入 CRUSH 算法,根据集群规则算出一组 OSD:
CRUSH(pgid) → [主OSD, 从OSD1, 从OSD2]
- 将 pgid 输入 CRUSH 算法,根据集群规则算出一组 OSD:
-
写入主 OSD
- 客户端直接把数据发给主 OSD,主 OSD 写入本地硬盘。
-
同步至从 OSD
- 主 OSD 将数据推送给备份 OSD,并等待所有备份写入确认。
-
返回成功
- 全部副本落盘后,主 OSD 通知客户端写入完成,保证高可用。
三、补充:对象到 PG 的哈希计算示例
当 Pool 有 64 个 PG 时:
-
PG 总数 64,编号 0~63,mask = 63(二进制
0111111) -
某对象 oid 哈希值为 100(二进制
1100100) -
与运算:
1100100 & 0111111 = 0100100→ 十进制 361100100 0111111 =0100100 (一样下替代)因此该对象被分配到编号 36 的 PG,再由 CRUSH 算出对应的 OSD 组合。
四、RUSH 算法
作用:不用查表,现场算出数据该存哪个硬盘。
两步走:对象 → PG(一致性哈希)→ OSD(CRUSH算)
优点:去中心化、扩缩容自动重分布、不用停服务
总结:CRUSH 就是一个让客户端自己算数据位置的算法,从而让 Ceph 能做到真正的分布式、无中心、可无限扩展。
部署
准备工作
Ceph 部署对 Python 版本的要求
-
旧版 Ceph(Nautilus 之前) :依赖 Python 2,部署工具
ceph-deploy也是 Python 2 写的。 -
新版 Ceph(Octopus 之后) :全面转向 Python 3,
ceph-deploy已废弃,改用cephadm。
数据分类存储:
是否存在访问量不高的业务备份数据(数据库备份、配置文件备份)和访问量比较高的业务数 据(静态文件、对象存储数据)都在 ceph 集群存储的场景,如果有的话可以分开不同的磁盘 存储。 备份数据:SAS 7.2K/10K/15K 硬盘 热点数据:SSD 固态硬盘
数据分类存储建议
业务里如果有两种数据:一种是频繁访问的热门数据(像图片、视频这类),另一种是很少动的冷门数据(备份文件之类的)。热门数据放SSD固态盘,速度快;
冷门数据放普通SAS机械盘,便宜量大。这样分开管理,既省钱又不拖累性能。
虚拟网络设置:
eth0: NAT网络 VMnet8 设定为 10.0.0.0 网段,提供公共网络
eth1: 仅主机 VMnet1 设定为 192.168.10.0 网段,提供ceph 集群网络
每个主机额外添加两块盘,每个根据自己的情况设定容量,这里设置为20G
时间同步
对于任何一个集群来说,时间同步是非常重要的。 ceph 要求更高, 默认各节点的时间误差不能超过50ms
crontab -e
*/5 * * * * /usr/sbin/chronyc -a makestep 2>/dev/null || /usr/sbin/ntpdate -u ntp.ntsc.ac.cn 210.72.145.44
防火墙和SELinux管理
#关闭防火墙
ufw stop
ufw disable
#关闭防火墙
systemctl disable --now firewalld
systemctl disable --now iptables
主机名和解析
cat >> /etc/hosts <<EOF
10.0.0.100 admin.wang.org admin
10.0.0.101 mon01.wang.org mon01
10.0.0.102 mon02.wang.org mon02
10.0.0.103 mon03.wang.org mon03
10.0.0.104 mgr01.wang.org mgr01
10.0.0.105 mgr02.wang.org mgr02
10.0.0.106 store01.wang.org store01
10.0.0.107 store02.wang.org store02
10.0.0.108 store03.wang.org store03
EOF
ssh key的验证 打通免密登录。
#当前用户密码
PASS=123456
#设置网段最小和最大的地址的尾数
BEGIN=1
END=99
IP=`ip a s eth0 | awk -F'[ /]+' 'NR==3{print $3}'`
NET=${IP%.*}.
. /etc/os-release
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1" && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
#安装sshpass
install_sshpass() {
if [[ $ID =~ centos|rocky|rhel ]];then
rpm -q sshpass &> /dev/null || yum -y install sshpass
else
dpkg -l sshpass &> /dev/null || { sudo apt update;sudo apt -y install sshpass; }
fi
if [ $? -ne 0 ];then
color '安装 sshpass 失败!' 1
exit 1
fi
}
scan_host() {
[ -e ./SCANIP.log ] && rm -f SCANIP.log
for((i=$BEGIN;i<="$END";i++));do
ping -c 1 -w 1 ${NET}$i &> /dev/null && echo "${NET}$i" >> SCANIP.log &
done
wait
}
push_ssh_key() {
#生成ssh key
[ -e ~/.ssh/id_rsa ] || ssh-keygen -P "" -f ~/.ssh/id_rsa
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no ${USER}@$IP &>/dev/null
ip_list=(`sort -t . -k 4 -n SCANIP.log`)
for ip in ${ip_list[*]};do
sshpass -p $PASS scp -o StrictHostKeyChecking=no -r ~/.ssh ${USER}@${ip}: &>/dev/null
done
#把.ssh/known_hosts拷贝到所有主机,使它们第一次互相访问时不需要输入yes回车
for ip in ${ip_list[*]};do
scp ~/.ssh/known_hosts ${USER}@${ip}:.ssh/ &>/dev/null
color "$ip" 0
done
}
install_sshpass
scan_host
push_ssh_key
出于安全考虑,后续操作不直接使用 root,而是创建一个具有 sudo 权限的普通用户来管理。注意用户名不要设为 ceph,该账户在 Ceph 部署过程中会自动生成。
#用脚本实现批量创建用户
cat > create_cephadm.sh <<EOF
#!/bin/bash
# 设定普通用户
useradd -m -s /bin/bash cephadm
echo cephadm:123456 | chpasswd
echo "cephadm ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers .d/cephadm
chmod 0440 /etc/sudoers .d/cephadm
EOF
#批量执行
for i in {100 ..108}; do ssh root@10.0.0 .$i bash < create_cephadm .sh ; done
所有主机通过cephadm用户实现免密码认证 让 Ceph 管理节点能无密码 SSH 到其他 Ceph 节点
su - cephadm
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
#跨主机密码认证
PASS=123456
for i in {100 108};do
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no cephadm@10.0.0 .$i
done
在所有节点准备安装源配置 确保集群所有节点系统版本一致、源配置正确,后续安装 Ceph 包时能正常下载
#在管理节点准备脚本,注意以root身份执行
[root@admin ~]#cat > ceph_repo.sh <<EOF
#!/bin/bash
# 更新ceph的软件源信息
echo "deb http://mirror.tuna.tsinghua.edu.cn/ceph/debian-pacific/ $(lsb_release
-sc) main" > /etc/apt/sources .list.d/ceph .list
wget -q -O- 'https://download.ceph.com/keys/release.asc ' | apt-key add
apt update
EOF
#因为所有节点都会依赖于这些apt源信息,需要进行同步
[root@admin ~]#for i in {100 ..108};do ssh -o StrictHostKeyChecking=no 10.0.0.$i
bash < ceph_repo .sh;done
admin节点主机安装ceph-deploy工具
#安装
cephadm@admin:~$sudo apt-cache madison ceph-deploy
cephadm@admin:~$sudo apt -y install ceph-deploy
#验证成功和查看版本
cephadm@admin:~$ceph-deploy --version
2 .0.1
部署MON
集群初始化
初始化第一个MON节点,准备创建集群
- 创建目录
mkdir ceph-cluster && cd ceph-cluster
- 生成初始配置
ceph-deploy new --public-network 10.0.0.0/24 --cluster-network 192.168.10.0/24 mon01:mon01.wang.org
参数说明:
-
--public-network:客户端访问用的前端网络。 -
--cluster-network:Ceph 节点间数据同步用的后端网络,与前端隔离更稳定。 -
mon01:mon01.wang.org:MON 节点名称。短名必须和主机名一致,写完整域名是为了防止 DNS 解析报错。
- 生成的文件
-
ceph.conf--- 集群配置(网络、认证、节点 IP 等) -
ceph.mon.keyring--- MON 节点认证密钥 -
ceph-deploy-ceph.log--- 部署日志
- 出错重来
ceph-deploy forgetkeys
ceph-deploy purge mon01
ceph-deploy purgedata mon01
rm ceph.*
清干净后再从第 2 步重新执行。
- 一次初始化多个 MON(生产推荐)
ceph-deploy new \
--public-network 10.0.0.0/24 \
--cluster-network 192.168.10.0/24 \
mon01:mon01.wang.org \
mon02:mon02.wang.org \
mon03:mon03.wang.org
远程安装命令
ceph-deploy install --no-adjust-repos --nogpgcheck --mon mon01
-
--no-adjust-repos:不自动改软件源 -
--nogpgcheck:跳过 GPG 签名校验 -
--mon:只装 MON 相关包
本地手动安装(更推荐)
# Ubuntu/Debian
apt install -y ceph-mon
# CentOS/RHEL
yum install -y ceph-mon
安装后自动发生的事情
-
ceph用户自动创建 :getent passwd ceph可查到,家目录/var/lib/ceph,禁止登录(/usr/sbin/nologin),这就是为什么前面强调不要自己创建叫ceph的用户。 -
ceph-crash进程自动启动:用于收集崩溃日志。 -
Python3 依赖库一并装上 :如
python3-ceph-common等。
| dpkg -l | grep ceph | 包装 | 能看到 ceph-mon、ceph-base 等包 |
|---|---|---|
getent passwd ceph |
用户创建了没 | 有 ceph 用户,Shell 是 nologin |
| `ps aux | grep ceph` | 进程起来了没 |
初始化 Mon 节点生成配置信息
#配置初始化MON节点,同时向所有节点同步配置
ceph-deploy --overwrite-conf mon create-initial
#注意:为了避免因为认证方面导致的通信失败,推荐使用--overwrite-conf 参数
#如果是在一个现有的环境上部署业务,可以先推送基准配置文件
ceph-deploy --overwrite-conf config push mon01 mon02 mon03
#注意:ceph.client.admin.keyring 拥有ceph集群的所有权限,一定不能有误。
#到mon的节点上查看mon的自动开启相应的守护进程
[root@mon01 ~]#ps aux|grep ceph
root 10969 0.0 0.6 21424 12212 ? Ss 5月07 0:00
推送配置与密钥(可选)
目的 :让每个 MON 节点都能独立执行 ceph 管理命令,不用每次都回 admin 节点操作。
推送配置文件(确保所有 MON 节点配置一致):
ceph-deploy --overwrite-conf config push mon01 mon02 mon03
推送 admin 密钥(授予节点管理集群的权限):
ceph-deploy admin mon01 mon02 mon03
#查看效果
[root@mon01 ~]#ls /etc/ceph/
ceph.client.admin.keyring ceph .conf rbdmap tmp30edymns
推送效果
`/etc/ceph/` 目录下多了一个文件 `ceph.client.admin.keyring`,这是客户端与集群通信的认证密钥。
推送后的问题 : 该文件默认属主是 root,权限为 600(只有 root 能读),普通用户 cephadm 无权访问。
现象 :切换到 cephadm 用户执行 ceph -s 会直接报错:
auth: unable to find a keyring ... (2) No such file or directory
原因 :不是文件不存在,是根本没有读权限,程序直接当成找不到文件。
解决方法:
# 安装 ACL 工具
apt install acl -y
# 给 cephadm 用户授予读取权限
setfacl -m u:cephadm:r /etc/ceph/ceph.client.admin.keyring
修复后效果:
su - cephadm
ceph -s # 正常输出集群状态
ceph health # 查看健康详情
配置 admin 节点实现远程管理
背景 :当前只能在 MON 节点上执行 ceph 命令,admin 节点还没法远程管理。
步骤:
bash
# 1. 安装 Ceph 客户端工具
sudo apt install -y ceph-common
# 2. 推送配置文件和 admin 密钥到本机
ceph-deploy admin admin
# 3. 安装 ACL 工具并给 cephadm 用户授权
sudo apt install -y acl
sudo setfacl -m u:cephadm:rw /etc/ceph/ceph.client.admin.keyring
# 4. 验证
ceph -s
执行完效果:admin 节点也能远程查看和管理整个集群了。
消除告警:mon is allowing insecure global_id reclaim
ephadm@admin:~/ceph-cluster$ ceph -s
cluster:
id: a223b6ee-d350-4cbb-b930-f6ccd8237905
health: HEALTH_WARN
mon is allowing insecure global_id reclaim
services:
mon: 1 daemons, quorum mon01 (age 2h)
mgr: no daemons 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
现象 :ceph -s 显示 HEALTH_WARN,提示 mon 允许不安全的全局 ID 回收。
修复:
ceph config set mon auth_allow_insecure_global_id_reclaim false
ceph -s # 显示 HEALTH_OK,告警消失
部署 Mgr 节点
MGR 是 Ceph 12.2 版本后主推的管理组件,工作模式是事件驱动型------等待事件、处理事件、返回结果,继续等待。
核心作用:把集群的运行指标(状态、性能、容量等)暴露给外部系统,如 Prometheus、Dashboard 等。
部署原则
-
生产环境:至少 2 个节点,Active/Standby 模式,主挂备自动接管
-
测试环境:1 个节点即可先用,后续再加
安装 Mgr 相关软件
#在管理节点远程安装mgr软件到mgr节点
cephadm@admin:~/ceph-cluster$ ceph-deploy install --mgr mgr01
#方法2:在mgr01节点手动安装软件
[root@mgr01 ~]#apt -y install ceph-mgr
安装后验证:
[root@mgr01 ~]#dpkg -l | grep ceph
[root@mgr01 ~]#ls /etc/ceph/
rbdmap
配置Mgr节点启动ceph-mgr进程
#创建mgr节点并生成相关配置
cephadm@admin:~/ceph-cluster$ ceph-deploy mgr create mgr01
自动完成三件事:
在 mgr01 上生成配置文件到 /etc/ceph/
自动创建 ceph 系统用户(如已存在则跳过)
启动 ceph-mgr 进程
[root@mgr01 ~]#ls /etc/ceph/
ceph .conf rbdmap tmpoilgb4u0
[root@mgr01 ~]#getent passwd ceph
ceph:x:64045:64045:Ceph storage service:/var/lib/ceph:/usr/sbin/nologin
部署 OSD 存储节点
要设置OSD环境,一般执行下面步骤:
-
要知道对应的主机上有哪些磁盘可以提供给主机来进行正常的使用。
-
格式化磁盘(非必须)
-
ceph擦除磁盘上的数据
-
添加osd
硬盘准备
#所有的存储节点主机都准备了两块额外的磁盘,
[root@store01 ~]#lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8 :1 0 1M 0 part
├─sda2 8 :2 0 1G 0 part /boot
└─sda3 8:3 0 199G 0 part
sdb 8:16 0 20G 0 disk
sdc 8 :32 0 20G 0 disk
#如果不想查看大量无效设备的话,可以执行下面清理操作
apt autoremove --purge snapd -y
安装 OSD 存储节点相关软件
#确认仓库配置
[root@store01 ~]#cat /etc/apt/sources .list.d/ceph .list
deb http://mirrors.aliyun.com/ceph/debian-pacific/ focal main
#安装OSD相关软件
#方法1: 在管理节点远程安装
cephadm@admin:~/ceph-cluster$ ceph-deploy install --release pacific --osd store01
#方法2: 在OSD主机手动安装(推荐)
[root@store01 ~]#apt -y install ceph-osd
安装后自动完成:
-
创建
ceph系统用户(/usr/sbin/nologin,不可登录) -
生成
/etc/ceph/目录(目前只有rbdmap) -
启动
ceph-crash崩溃日志收集进程
验证:
dpkg -l | grep ceph # 能看到 ceph-osd 包
ls /etc/ceph/ # 配置文件目录已生成
ps aux | grep ceph # ceph-crash 进程已运行
查看所有可用的osd磁盘
远程查看 store01 节点上有哪些磁盘,为后面创建 OSD 做准备。
ceph-deploy disk list store01
常见报错与修复
TypeError: startswith first arg must be bytes or a tuple of bytes, not str
原因:ceph-deploy 用 Python 3 执行时,字符串和字节类型不匹配。fdisk -l 的输出是字节类型(bytes),但代码里用字符串(str)去处理,类型冲突。
修复方法:
sudo vim +375 /usr/lib/python3/dist-packages/ceph_deploy/osd.py
把第 375 行:
if line.startswith('Disk /'):
改成:
if line.startswith(b'Disk /'):
只在 'Disk /' 前面加一个字母 b,表示这是字节字符串,类型就匹配了。
清除 OSD磁盘数据(可选) 在管理节点上使用ceph-deploy命令擦除计划专用于OSD磁盘上的所有分区表和数据以便用于OSD 注意: 如果硬盘是无数据的新硬盘此步骤可以不做
清除磁盘命令
ceph-deploy disk zap [-h] [--debug] [HOST] DISK [DISK ...]
#说明此操操作本质上就是执行dd if=/dev/zero of=disk bs=1M count=10
例:
cephadm@admin:~/ceph-cluster$for i in {1 ..3};do ceph-deploy disk zap store0$i
/dev/sdb /dev/sdc;done
配置OSD存储节点
对于OSD的相关操作,可以通过 ceph-deploy osd 命令来进行,帮助信息如下
OSD 存储机制
Ceph 支持两种存储后端,通过 ceph-deploy osd --help 可查看参数:
数据分三类存放:
| 参数 | 用途 | 说明 |
|---|---|---|
--data |
对象数据 | 实际存文件的地方 |
--block-db |
元数据数据库 | 存数据索引信息 |
--block-wal |
数据库预写日志 | 类似数据库的 WAL,保证一致性 |
生产环境建议 data 和 wal/db 分开存放,提升性能。
Filestore(老版本,已废弃)
数据分两类:--data(文件数据)和 --journal(文件系统日志),写放大严重,新版本不再使用。
OSD 子命令:
-
list:列出 OSD 信息 -
create:创建 OSD
创建 OSD
命令格式:
ceph-deploy osd create {host} --data {磁盘}
(单盘全部数据放一起):
# 创建第一个 OSD
ceph-deploy --overwrite-conf osd create store01 --data /dev/sdb
# 创建第二个 OSD
ceph-deploy --overwrite-conf osd create store01 --data /dev/sdc
分开存放
ceph-deploy osd create store01 --data /dev/sdb --block-wal /dev/nvme0n1
验证结果
1. 进程检查:
bash
ps aux | grep ceph
每个磁盘对应一个 ceph-osd 进程(--id 0、--id 1),属主为 ceph 用户。
2. LVM 检查:
每个 OSD 磁盘,Ceph 都会自动创建一套独立的 PV → VG → LV,命名带 UUID 是为了保证集群里唯一不冲突。
pvs # 每块盘被标记为 LVM PV
vgs # 每块盘独立的 VG
lvs # 每个 VG 下有一个 LV
lsblk # 显示磁盘 → LVM 的层级关系
blkid # LV 类型标记为 ceph_bluestore
3. 服务检查:
systemctl status ceph-osd@0 # OSD 0 服务 running
systemctl status ceph-osd@1 # OSD 1 服务 running
4. 集群状态:
ceph -s
osd: 2 osds: 2 up, 2 in
usage: 40 GiB / 40 GiB avail
批量添加 OSD 节点
1.安装软件(二选一)
# 方法1:admin 节点远程批量安装
ceph-deploy install --release pacific --osd store02 store03
# 方法2:各节点手动安装
apt install -y ceph-osd
- 批量创建 OSD
for i in {2..3}; do
ceph-deploy --overwrite-conf osd create store0$i --data /dev/sdb
ceph-deploy --overwrite-conf osd create store0$i --data /dev/sdc
done
结果
ceph -s
health: HEALTH_OK # 告警消失
osd: 6 osds: 6 up, 6 in # 3节点 × 2块盘 = 6个OSD
usage: 120 GiB / 120 GiB avail # 6 × 20G = 120G
pgs: 1 active+clean # 归置组正常
查看 OSD 详情
# 列出所有 OSD 节点磁盘
ceph-deploy osd list store01 store02 store03
# 查看每个 OSD 状态
ceph osd status
ID 所在节点 已用 可用 状态
0 store01 5.6M 19.9G exists,up
1 store01 5.5M 19.9G exists,up
实现 Mon 节点高可用
当前只有一个Mon节点主机,存在SPOF,添加新的mon节点实现高可用
注意:如果 n个 mon节点,至少需要保证有 > n/2 个以上的健康mon节点, ceph 集群才能正常使用
1. 安装软件
# 远程安装
ceph-deploy install --mon mon02
# 或本地手动安装
apt install -y ceph-mon
2. 添加 MON 节点
ceph-deploy mon add mon02
ceph-deploy install --mon mon03
ceph-deploy mon add mon03
3. 更新配置文件
vim ceph.conf
# 修改 mon_host 为所有 MON 节点 IP
mon_host = 10.0.0.101,10.0.0.102,10.0.0.103
4. 同步配置到所有节点
ceph-deploy --overwrite-conf config push admin mon01 mon02 mon03 mgr01 store01 store02 store03
验证结果
ceph -s
mon: 3 daemons, quorum mon01,mon02,mon03
health: HEALTH_OK
实现 Mgr 节点高可用
为什么需要多个 MGR? MGR 以 Active/Standby 模式运行,单节点故障会导致监控面板、Prometheus 指标等对外服务中断。部署多个 MGR,主节点挂掉后备节点自动接管,服务不中断。
cephadm@admin:~/ceph-cluster$ ceph-deploy install --mgr mgr02
#方法2:在mgr02节点手动安装软件
[root@mgr02 ~]#apt -y install ceph-mgr
#添加第二个Mgr节点
cephadm@admin:~/ceph-cluster$ ceph-deploy mgr create mgr02
#查看效果
cephadm@admin:~/ceph-cluster$ ceph -s
mgr: mgr01(active, since 2h), standbys: mgr02
#结果显示:mgr01节点就是主角色节点,mgr02是从角色节点。
验证高可用
测试 MGR 故障切换:关掉 mgr01,mgr02 自动接管。
mgr: mgr02(active, since 3m) # 已自动切换
测试 MON 故障切换:关掉 mon01,集群仍正常工作。
mon: 3 daemons, quorum mon02,mon03, out of quorum: mon01
health: HEALTH_WARN # 有告警但集群可用