比起君子讷于言而敏于行,我更喜欢君子善于言且敏于行。
目录
4. 准备好四块盘,一块hdd+sdd为一组,一台设备上有一组
cache-tier + ceph-deploy 模型:SSD 本身作为 单独的缓存池
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 gpt
ubuntu01$: 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-mimic bionic main" | sudo tee /etc/apt/sources.list.d/ceph.list
sudo apt-get clean
sudo apt-get update
二. 安装 Ceph
在node1上执行 ceph-deploy
,作为部署节点
sudo apt install ceph-deploy ceph-common ceph-mds ceph-mon ceph-osd -y
三. 创建 Ceph 集群
ceph-deploy new ubuntu01 ubuntu02 ubuntu03
创建完之后会生成一些文件,我们做一下conf的优化,做好后分发
~/ceph-cluster$ ls
ceph.conf ceph-deploy-ceph.log ceph.mon.keyring
$ 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.xxx
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
#以下为添加的内容
public network = 10.xxx.xxx.0/24
cluster network = 10.xxx.xxx.0/24
[osd]
osd journal size = 10240
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'
四. 安装 MON、MGR 到所有节点
ceph-deploy install ubuntu01 ubuntu02 ubuntu03
ceph-deploy mon create-initial
ceph-deploy --overwrite-conf mgr create ubuntu01 ubuntu02 ubuntu03
#查看状态
ceph -s
如果遇到报错版本冲突问题,那就清理一下,重新install
vim /etc/apt/sources.list.d/ceph.list
deb https://download.ceph.com/debian-nautilus/ bionic main
sudo 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 autoremove
ceph-deploy install ubuntu01 ubuntu02
1. 一些报错:
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.socket
sudo dpkg --configure -a
2. 生成key并分发
#生成 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.keyring
ls /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-ubuntu01
sudo systemctl start ceph-mon@ubuntu01
ceph.client.admin.keyring Ceph 官方建议它只让 Ceph 用户或 root 读,不能所有人都能读(600 root:root ceph:ceph 或者我们有的用户免密sudo 也可以用哪个账户)
五. 配置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 组成)
ceph osd pool create storage 256 256
两台服务器,4个OSD。PG 数 = OSD 数 × 100 = 4 × 100 = 400
Ceph 要求 PG 数为 2 的幂次方(64、128、256、512 等),且方便管理。
2. 创建缓存池(用 SSD 组成)
ceph osd pool create cache 256 256
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
4. 把缓存池设置为写回模式
ceph osd tier cache-mode cache writeback
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
六. 缓存池卸载流程(以后有需要再用)
写回模式,要确保缓存池数据刷写到底层池后才移除缓存。可以用下面命令查看缓存池内对象:
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
总结
部署中遇到了很多问题,不只文章中写的这几个,初次接触,难免思绪不够清晰。ubuntu03的机器也是我做OSD发现,MON必须三台否则无法创建成功,才又加到集群中的,可能某些地方写的不正确,望及时指出,我进行更改。