比起君子讷于言而敏于行,我更喜欢君子善于言且敏于行。
目录
一. 准备工作(所有节点)
1. /etc/hosts
2. 安装python2
3. 配置普户免密sudo
4. 准备好四块盘,一块hdd+sdd为一组,一台设备上有一组
5. 添加源
二. 安装 Ceph
在node1上执行 ceph-deploy,作为部署节点
三. 创建 Ceph 集群
四. 安装 MON、MGR 到所有节点
1. 一些报错
2. 生成key并分发
在使用 ceph-deploy 工具部署 Ceph 集群时,ceph.client.admin.keyring 文件会自动生成。如果是手动部署 Ceph 集群,需要手动生成 ceph.client.admin.keyring 文件
五. 配置OSD和缓存池
cache-tier + ceph-deploy 模型:SSD 本身作为 单独的缓存池
SSD 作为独立缓存池
SSD 作为 OSD 的 DB/WAL
1. 创建主存储池(用 HDD 组成)
2. 创建缓存池(用 SSD 组成)
3. 创建 OSD ,分别将设备添加为 OSD
报错问题1:[errno 13] RADOS permission denied (error connecting to the cluster) 说明 Ceph 仍然无法通过 client.bootstrap-osd keyring 连接到集群
报错问题2:ceph-volume lvm create: error: GPT headers found, they must be removed on: /dev/sdg意思是 /dev/sdg 上存在 GPT 分区表,Ceph 不允许直接在带有分区表的磁盘上创建 OSD,需要先清理干净。
4. 把缓存池设置为写回模式
Error EINVAL: pool 'cache' is not a tier如果遇到了这个报错,那就先执行5挂接,再执行4设置写回模式
5. 把缓存池挂接到主存储池上(建立Tier关系)
6. 将客户端流量指向缓存池(设置Overlay)
7. 设置缓存池的缓存命中策略为 Bloom 过滤器
8. 设置缓存命中计数和时间周期
9. 设置缓存池最大容量(以字节为单位)
10. 设置缓存池提升对象的读写最短时间(秒)
11. 设置缓存池容量阈值,触发刷写和驱逐操作
12. 设置缓存池最大容量和最大对象数(可选)
13. 设置缓存池对象最短刷写周期(秒)
14. 设置缓存池对象最短驱逐周期(秒)
六. 缓存池卸载流程(以后有需要再用)
1. 禁用缓存池(将缓存模式改为 none)
2. 移除流量指向缓存池(取消 Overlay)
3. 从主存储池中移除缓存池
七. 彻底从集群移除 OSD(以后有需要再用)
1. 查看id号并停止写入数据
2.在 MON 中删除 OSD 注册信息
总结
ubuntu01 | ubuntu02 | ubuntu03 |
MON | MON | MON |
MON | MGR | MGR |
MDS | MDS | |
OSD | OSD |
由于我只有两台设备有可用的磁盘和ssd,但是mon最少要奇数才能选举。所以第三台我这里只部署mon和mgr,仅参与选举。这样的话,第三台机器哪怕是台虚拟机或者笔记本,都可以。三台机器都是ubuntu18.04
一. 准备工作(所有节点)
1. /etc/hosts
$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 ubuntu01
10.xxx.xxx.xxx ubuntu01
10.xxx.xxx.xxx ubuntu02
2. 安装python2
sudo apt-get install python2.7
which python2.7
sudo ln -s /usr/bin/python2.7 /usr/bin/python2
python2 --version
3. 配置普户免密sudo
echo "ubuntu ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ubuntu-nopasswd
sudo chmod 440 /etc/sudoers.d/ubuntu-nopasswd
#可以测试一下
sudo -k
sudo ls /root
4. 准备好四块盘,一块hdd+sdd为一组,一台设备上有一组
# 清除所有文件系统签名(wipefs)
sudo wipefs -a /dev/sdb
sudo wipefs -a /dev/sde
sudo wipefs -a /dev/sdf
sudo wipefs -a /dev/sdg#创建新的 GPT 分区表(确保干净)
sudo parted /dev/sdb mklabel gpt
sudo parted /dev/sde mklabel gpt
sudo parted /dev/sdf mklabel gpt
sudo parted /dev/sdg mklabel gptubuntu01$: lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 7.3T 0 disk ubuntu01$: lsblk /dev/sde
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sde 8:64 0 1.9T 0 disk ubuntu02$: lsblk /dev/sdf
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdf 8:80 0 7.3T 0 disk ubuntu02$:~/storcli64/Linux OS$ lsblk /dev/sdg
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdg 8:96 0 1.9T 0 disk
5. 添加源
wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -echo "deb https://download.ceph.com/debian-octopus bionic main" | sudo tee /etc/apt/sources.list.d/ceph.listsudo apt-get cleansudo apt-get update
二. 安装 Ceph
在node1上执行 ceph-deploy
,作为部署节点
sudo apt install ceph-deploy ceph-common ceph-mds ceph-mon ceph-osd -y#升级的话用这条命令,只升级已安装的 Ceph 包,而不是全新安装。所有节点都执行升级
sudo apt install --only-upgrade ceph ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr ceph-deploy -y#查看版本
ceph --version
三. 创建 Ceph 集群
ceph-deploy new ubuntu01 ubuntu02 ubuntu03
创建完之后会生成一些文件,我们做一下conf的优化,做好后分发
~/ceph-cluster$ ls
ceph.conf ceph-deploy-ceph.log ceph.mon.keyringubuntu01:/etc/ceph$ cat ceph.conf
[global]
fsid = xxxxxx-xxxx-xxxx-xxxx-xxxxx
mon_initial_members = ubuntu01, ubuntu02,ubuntu03
mon_host = 10.xxx.xxx.xxx,10.xxx.xxx.xxx,10.xxx.xxx.xxxpublic_network = 10.xxx.xxx.0/24
cluster_network = 10.xxx.xxx.0/24auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephxosd_journal_size = 2048
osd_pool_default_size = 2
osd_pool_default_min_size = 1# MON节点
[mon.ubuntu-R730xd-01]
host = ubuntu-R730xd-01
mon_addr = 10.xxx.xxx.xxx[mon.ubuntu-R730-02]
host = ubuntu-R730-02
mon_addr = 10.xxx.xxx.xxx[mon.ubuntu-T630]
host = ubuntu-T630
mon_addr = 10.xxx.xxx.xxx# MDS 节点
[mds.ubuntu-R730xd-01]
host = ubuntu-R730xd-01[mds.ubuntu-R730-02]
host = ubuntu-R730-02[client.admin]
keyring = /etc/ceph/ceph.client.admin.keyring[osd]
osd journal size = 10240
###################################################cp ~/ceph-cluster/ceph.conf /etc/ceph/scp /etc/ceph/ceph.conf ubuntu@ubuntu02:/tmp/ssh ubuntu@ubuntu02 'sudo mv /tmp/ceph.conf /etc/ceph/ceph.conf && sudo chmod 644 /etc/ceph/ceph.conf'scp /etc/ceph/ceph.conf ubuntu@ubuntu03:/tmp/ssh ubuntu@ubuntu03 'sudo mv /tmp/ceph.conf /etc/ceph/ceph.conf && sudo chmod 644 /etc/ceph/ceph.conf'
四. 安装 MON、MGR 到所有节点
1. 安装 Ceph 的相关软件包并创建所需目录
ceph-deploy install ubuntu01 ubuntu02 ubuntu03#所有节点创建目录
sudo mkdir -p /var/lib/ceph
sudo chown ceph:ceph /var/lib/ceph
sudo chmod 755 /var/lib/ceph
如果遇到报错版本冲突问题,那就清理一下,重新install
vim /etc/apt/sources.list.d/ceph.list
deb https://download.ceph.com/debian-nautilus/ bionic mainsudo apt-get clean
sudo apt-get update
sudo apt-get purge ceph ceph-osd ceph-mds ceph-mon radosgw ceph-common ceph-mgr librgw2
sudo apt-get autoremoveceph-deploy install ubuntu01 ubuntu02
一些报错
ceph-deploy install 如果遇到[ubuntu01][WARNIN] E: Sub-process /usr/bin/dpkg returned an error code (1)
这个错误是 dpkg
安装包出错 的通用错误码,说明某个包在安装过程中出错了。
先验证系统状态,看是否都在 ii
状态(已安装)。如果都在,就代表系统层面一切 OK。状态是 iU
(表示“Unpacked”,但未完全配置),这说明安装过程未完成或中断。
dpkg -l | grep ceph
用这个命令它会尝试完成所有“iU”状态软件包的配置,报错也会更详细
sudo dpkg --configure -a
我遇到的报错:Failed to restart lvm2-lvmetad.service: Unit lvm2-lvmetad.socket is masked.lvm2
没有配置成功,导致 ceph-osd
和 ceph
也配置失败。
解决方案:解除 mask 并启用 lvm2 的相关服务。然后再去执行sudo dpkg --configure -a,全部ii
状态,那就可以放心的去执行ceph-deploy install ubuntu01 ubuntu02了。
sudo systemctl unmask lvm2-lvmpolld.socket
sudo systemctl unmask lvm2-lvmpolld.service
sudo systemctl enable lvm2-lvmpolld.socket
sudo systemctl start lvm2-lvmpolld.socketsudo dpkg --configure -a
2. 生成key并分发
在使用 ceph-deploy
工具部署 Ceph 集群时,ceph.client.admin.keyring
文件会自动生成。如果是手动部署 Ceph 集群,需要手动生成 ceph.client.admin.keyring
文件。建议手动生成
#生成 ceph.client.admin.keyring,这个密钥环文件用于管理员用户,执行各种管理操作。
sudo ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *'sudo cp /home/ubuntu/ceph-cluster/ceph.client.admin.keyring /etc/ceph/
sudo chmod 644 /etc/ceph/ceph.client.admin.keyring
sudo chown ubuntu:ubuntu /etc/ceph/ceph.client.admin.keyring#生成 ceph.mon.keyring
sudo ceph-authtool --create-keyring /etc/ceph/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'# 生成 ceph.bootstrap-osd.keyring
sudo ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd'#生成 ceph.bootstrap-mds.keyring
sudo ceph-authtool --create-keyring /var/lib/ceph/bootstrap-mds/ceph.keyring --gen-key -n client.bootstrap-mds --cap mon 'profile bootstrap-mds'sudo cp /var/lib/ceph/bootstrap-mds/ceph.keyring /etc/ceph/ceph.bootstrap-mds.keyringls /etc/ceph/
#应该看到
ceph.client.admin.keyring
ceph.conf
ceph.mon.keyring
ceph.bootstrap-osd.keyring
ceph.bootstrap-mds.keyring#分发到所有节点上
sudo scp /etc/ceph/ceph.mon.keyring ubuntu@ubuntu02:/etc/ceph/
sudo scp /etc/ceph/ceph.bootstrap-osd.keyring ubuntu@ubuntu02:/etc/ceph/
sudo scp /etc/ceph/ceph.bootstrap-mds.keyring ubuntu@ubuntu02:/etc/ceph/
sudo scp /etc/ceph/ceph.mon.keyring ubuntu@ubuntu03:/etc/ceph/
sudo scp /etc/ceph/ceph.bootstrap-osd.keyring ubuntu@ubuntu03:/etc/ceph/
sudo scp /etc/ceph/ceph.bootstrap-mds.keyring ubuntu@ubuntu03:/etc/ceph/sudo mkdir -p /var/lib/ceph/mon/ceph-ubuntu01sudo systemctl start ceph-mon@ubuntu01
ceph.client.admin.keyring Ceph 官方建议它只让 Ceph 用户或 root 读,不能所有人都能读(600 root:root ceph:ceph 或者我们有的用户免密sudo 也可以用哪个账户)一定要保证所有地方的conf和keying全部一致且权限正确,才能执行成功下面的命令
3. 初始化MON、创建MGR
#初始化mon
ceph-deploy mon create-initialceph-deploy --overwrite-conf mgr create ubuntu01 ubuntu02 ubuntu03
ceph-deploy mon create-initial
的主要作用是:
-
创建第一个监控节点:初始化 Ceph 集群的第一个监控节点。
-
生成必要的配置文件:生成
ceph.conf
和ceph.client.admin.keyring
文件。 -
设置监控节点的密钥:为监控节点生成密钥,并将其存储在密钥环文件中。
-
启动监控节点服务:启动监控节点服务,使监控节点开始运行。
五. 配置OSD和缓存池
cache-tier + ceph-deploy 模型:SSD 本身作为 单独的缓存池
理论内容:在 Ceph 存储系统中,SSD 可以被用作独立的缓存池(Cache Pool)或者作为 OSD 的 DB/WA
SSD 作为独立缓存池
优势 | 劣势 |
高性能:独立缓存池可以显著提高读写性能,特别是对于频繁访问的数据。 | 成本较高:需要额外的 SSD 设备来构建缓存池,增加了硬件成本。 |
资源隔离:缓存池与其他存储池隔离,不会互相影响,确保了性能的稳定性。 | 管理复杂:需要额外的管理开销来维护缓存池,包括监控缓存命中率和调整缓存策略。 |
灵活性:可以根据需要动态调整缓存池的大小和配置。 | 数据一致性:需要确保缓存数据与后端存储的一致性,特别是在缓存失效或故障时。 |
SSD 作为 OSD 的 DB/WAL
优势 | 劣势 |
性能提升:将 DB/WAL 放在 SSD 上可以显著提高 OSD 的性能,特别是对于随机写入操作。 | 性能上限:虽然性能有所提升,但可能不如独立缓存池的性能提升明显。 |
成本效益:不需要额外的 SSD 设备作为缓存池,减少了硬件成本。 | 资源争抢:如果多个 OSD 共享同一个 SSD 设备作为 DB/WAL,可能会发生资源争抢。 |
简化管理:减少了管理复杂性,因为 DB/WAL 是 OSD 的一部分,不需要额外的缓存管理策略。 | 写入放大:频繁的写入操作可能会导致 SSD 的写入放大问题,影响其寿命。 |
总结
-
如果你的应用场景需要极高的读写性能,并且预算允许,使用 SSD 作为独立缓存池是一个不错的选择。
-
如果你希望在成本和性能之间取得平衡,将 SSD 用作 OSD 的 DB/WAL 是一个更经济的选择。
理论结束,上实践命令
在管理节点ubuntu01执行
1. 创建主存储池(用 HDD 组成)
sudo ceph osd pool create storage 64 64
2. 创建缓存池(用 SSD 组成)
sudo ceph osd pool create cache 64 64
3. 创建 OSD ,分别将设备添加为 OSD
在管理节点执行(会远程操作指定服务器和设备)
# ubuntu01
ceph-deploy osd create ubuntu01:/dev/sdb
ceph-deploy osd create ubuntu01:/dev/sde# ubuntu02
ceph-deploy osd create ubuntu02:/dev/sde
ceph-deploy osd create ubuntu02:/dev/sdg
报错问题1:[errno 13] RADOS permission denied (error connecting to the cluster)
说明 Ceph 仍然无法通过 client.bootstrap-osd
keyring 连接到集群
# 删除旧的 bootstrap-osd key
sudo ceph auth del client.bootstrap-osd#重新创建 bootstrap-osd key(带正确权限)
sudo ceph auth get-or-create client.bootstrap-osd mon 'profile bootstrap-osd' > /var/lib/ceph/bootstrap-osd/ceph.keyring
sudo chown ceph:ceph /var/lib/ceph/bootstrap-osd/ceph.keyring
sudo chmod 600 /var/lib/ceph/bootstrap-osd/ceph.keyring
#注意:这里使用的是 默认路径 /var/lib/ceph/bootstrap-osd/ceph.keyring,ceph-volume 会自动读取。# 验证 key 是否有效
sudo ceph --cluster ceph --name client.bootstrap-osd --keyring /var/lib/ceph/bootstrap-osd/ceph.keyring -s
#如果能看到集群状态输出(即使 OSD 还没创建),说明 key 有效。
如果仍然报 [errno 13] RADOS permission denied,说明 Mon 没有正确加载 key,需要重启 Mon:sudo systemctl restart ceph-mon@ubuntu-R730-02#创建OSD
sudo ceph-volume lvm create --data /dev/sde
#ceph-volume 会自动使用 /var/lib/ceph/bootstrap-osd/ceph.keyring。
创建完成后可以查看 OSD 是否成功:sudo ceph -s
sudo ceph osd tree
报错问题2:ceph-volume lvm create: error: GPT headers found, they must be removed on: /dev/sdg
意思是 /dev/sdg 上存在 GPT 分区表,Ceph 不允许直接在带有分区表的磁盘上创建 OSD,需要先清理干净。
#完全清理磁盘分区表(注意:会删除磁盘上所有数据):
sudo sgdisk --zap-all /dev/sde
sudo wipefs -a /dev/sde
sudo dd if=/dev/zero of=/dev/sde bs=1M count=100
#sgdisk --zap-all → 删除 GPT/MBR 分区表
wipefs -a → 清除文件系统签名
dd → 清零开头的 100MB,确保无残留数据#确认磁盘干净:应该看到 没有分区。
sudo lsblk /dev/sde
sudo fdisk -l /dev/sde#执行 OSD 创建:
sudo ceph-volume lvm create --data /dev/sde
4. 把缓存池设置为写回模式
ceph osd tier cache-mode cache writeback
Error EINVAL: pool 'cache' is not a tier如果遇到了这个报错,那就先执行5挂接,再执行4设置写回模式
5. 把缓存池挂接到主存储池上(建立Tier关系)
ceph osd tier add storage cache
6. 将客户端流量指向缓存池(设置Overlay)
ceph osd tier set-overlay storage cache
7. 设置缓存池的缓存命中策略为 Bloom 过滤器
ceph osd pool set cache hit_set_type bloom
8. 设置缓存命中计数和时间周期
ceph osd pool set cache hit_set_count 1
ceph osd pool set cache hit_set_period 3600
9. 设置缓存池最大容量(以字节为单位)
ceph osd pool set cache target_max_bytes 1000000000000
10. 设置缓存池提升对象的读写最短时间(秒)
ceph osd pool set cache min_read_recency_for_promote 1
ceph osd pool set cache min_write_recency_for_promote 1
11. 设置缓存池容量阈值,触发刷写和驱逐操作
ceph osd pool set cache cache_target_dirty_ratio 0.4
ceph osd pool set cache cache_target_dirty_high_ratio 0.6
ceph osd pool set cache cache_target_full_ratio 0.8
12. 设置缓存池最大容量和最大对象数(可选)
ceph osd pool set cache target_max_bytes 1073741824
ceph osd pool set cache target_max_objects 256
13. 设置缓存池对象最短刷写周期(秒)
ceph osd pool set cache cache_min_flush_age 600
14. 设置缓存池对象最短驱逐周期(秒)
ceph osd pool set cache cache_min_evict_age 1800
六. 生成元数据池启动MDS
#创建元数据池
sudo ceph osd pool create cephfs_meta 64 64#创建CephFS文件系统
sudo ceph fs new cephfs cephfs_meta storage#需要给mds服务新建路径和获取key
#目录名称格式为 ceph-<fs_name>,其中 <fs_name> 是你的 CephFS 文件系统的名称。
sudo mkdir -p /var/lib/ceph/mds/ceph-cephfs#创建key
sudo ceph auth get-or-create mds.cephfs mon 'allow profile mds' mds 'allow *' osd 'allow *'#把key写到mds的数据目录
sudo ceph auth get mds.cephfs -o /var/lib/ceph/mds/ceph-cephfs/keyring
#设置正确的权限
sudo chown -R ceph:ceph /var/lib/ceph/mds/ceph-cephfs
sudo chmod 700 /var/lib/ceph/mds/ceph-cephfs
sudo chmod 600 /var/lib/ceph/mds/ceph-cephfs/keyring#检查并启动 MDS 服务
sudo systemctl status ceph-mds@cephfs
sudo systemctl start ceph-mds@cephfs
sudo systemctl status ceph-mds@cephfs
sudo systemctl enable ceph-mds@cephfs#检查文件系统状态
sudo ceph fs status
sudo ceph mds stat
拿数据的流程是:客户端 → MDS(元数据池)获取文件位置 → 数据池/缓存池读写数据
-
元数据池(Metadata Pool)
-
存储的是 目录结构、文件名、权限、文件大小、文件块位置等信息。
-
客户端通过 MDS 请求元数据,MDS 会从元数据池读取这些信息。
-
-
数据池(Data Pool)
-
存储 实际的文件内容块。
-
文件数据先写入数据池,也可以经过缓存层加速。
-
-
缓存池(Cache Pool)
-
挂在数据池
storage
前端,作为 高速缓存。 -
读操作:先到缓存池,如果命中就直接返回,未命中则去数据池取,再更新缓存池。
-
写操作(写回模式):
-
数据先写到缓存池(高速写入)。
-
缓存池在触发刷写条件后,把修改的数据异步写回数据池。
-
-
七. 缓存池卸载流程(以后有需要再用)
写回模式,要确保缓存池数据刷写到底层池后才移除缓存。可以用下面命令查看缓存池内对象:
rados ls -p cache
手动触发刷写和驱逐:
rados -p cache cache-flush-evict-all
1. 禁用缓存池(将缓存模式改为 none)
ceph osd tier cache-mode cache none
2. 移除流量指向缓存池(取消 Overlay)
ceph osd tier remove-overlay storage
3. 从主存储池中移除缓存池
ceph osd tier remove storage cache
八. 彻底从集群移除 OSD(以后有需要再用)
1. 查看id号并停止写入数据
sudo ceph osd tree## 先把 OSD 从 CRUSH map 中移除(停止写入数据)假设要删除的是4
sudo ceph osd out 4
2.在 MON 中删除 OSD 注册信息
sudo ceph osd crush remove osd.4
sudo ceph auth del osd.4
sudo ceph osd rm 4
#执行完之后再查看一下
sudo ceph osd tree
sudo ceph -s
总结
部署中遇到了很多问题,不只文章中写的这几个,初次接触,难免思绪不够清晰。ubuntu03的机器也是我做OSD发现,MON必须三台否则无法创建成功,才又加到集群中的,可能某些地方写的不正确,望及时指出,我进行更改。