前言:为即将在生产环境搭建ceph高可用集群做准备,测试环境搭建ceph高可用集群进行性能和高可用测试,本次ceph集群版本为15.2.9 octopus;
(1)在学习Ceph之前,需要了解元数据的概念。元数据又称为中介数据、中继数据,为描述数据的数据。主要描述数据属性的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。通俗地说,就 是用于描述一个文件的特征的系统数据,比如访问权限、文件拥有者以及文件数据库的分布信息(inode)等等。在集群文件系统中,分布信息包括文件在磁盘上的位置以 及磁盘在集群中的位置。用户需要操作一个文件就必须首先得到它的元数据,才能定位到文件的位置并且得到文件的内容或相关属性。
(2)元数据管理
元数据的管理方式有2种方式:集中式管理和分布式管理。
集中式管理是指在系统中有一个节点专门司职元数据管理,所有元数据都存储在该节点的存储设备上。所有客户端对文件的请求前,都要先对该元数据管理器请求元数据。
分布式管理是指将元数据存放在系统的任意节点并且能动态的迁移。对元数据管理的职责也分布到各个不同的节点上。大多数集群文件系统都采用集中式的元数据管理。
因为集中式管理实现简单,一致性维护容易,在一定的操作频繁内可以提供较为满意的性能。缺点是单一失效的问题,若该服务器失效,整个系统将无法正常 工作。而且,当对元数据的操作过于频繁时,集中的元数据管理会成为整个系统的性能瓶颈。
分布式元数据管理的好处是解决了集中式管理的单一失效点问题,而且性能不会随着操作频繁而出现瓶颈。其缺点是,实现复杂,一致性维护复杂,对性能有一 定的影响。
(3)什么是Ceph?
Ceph是一种为优秀的性能、可靠性和可扩展性而设计的统一的、分布式的存储系统。Ceph 独一无二地用统一的系统提供了对象、块、和文件存储功能,它可靠性高、管理简便、并且是开源软件。 Ceph 的强大足以改变贵公司的 IT 基础架构、和管理海量数据的能力。Ceph 可提供极大的伸缩性——供成千用户访问 PB 乃至 EB 级的数据。 Ceph 节点以普通硬件和智能守护进程作为支撑点, Ceph 存储集群组织起了大量节点,它们之间靠相互通讯来复制数据、并动态地重分布数据。
(4)Ceph的核心组件
Monitors:Ceph Monitor ( ceph-mon) 维护集群状态的映射,包括监视器映射、管理器映射、OSD 映射、MDS 映射和 CRUSH 映射。这些映射是 Ceph 守护进程相互协调所需的关键集群状态。监视器还负责管理守护进程和客户端之间的身份验证。通常至少需要三个监视器才能实现冗余和高可用性。
管理器:Ceph 管理器守护进程 ( ceph-mgr) 负责跟踪运行时指标和 Ceph 集群的当前状态,包括存储利用率、当前性能指标和系统负载。Ceph 管理器守护进程还托管基于 Python 的模块来管理和公开 Ceph 集群信息,包括基于 Web 的Ceph 仪表板和 REST API。高可用性通常至少需要两个管理器。
Ceph OSD:Ceph OSD(对象存储守护进程 ceph-osd)存储数据,处理数据复制、恢复、重新平衡,并通过检查其他 Ceph OSD 守护进程的心跳来向 Ceph 监视器和管理器提供一些监控信息。通常至少需要 3 个 Ceph OSD 来实现冗余和高可用性。
MDS:Ceph 元数据服务器(MDS,ceph-mds)代表Ceph 文件系统存储元数据(即 Ceph 块设备和 Ceph 对象存储不使用 MDS)。Ceph的元数据服务器允许POSIX文件系统的用户来执行基本的命令(如 ls,find没有放置在一个Ceph存储集群的巨大负担,等等)。
(5)Ceph的其他组件
RADOS(Reliable Autonomic Distributed Object Store, RADOS):RADOS是Ceph 存储集群的基础。Ceph 中的一切都以对象的形式存储,而RADOS 就负责存储这些对象,而不考虑它们的数据类型。RADOS 层确保数据一致性和可靠性。对于数据一致性,它执行数据复制、故障检测和恢复。还包括数据在集群节点间的recovery。
Librados:简化访问RADOS的一种方法,目前支持PHP、Ruby、Java、Python、C和C++语言。它提供了Ceph 存储集群的一个本地接口RADOS ,并且是其他服务(如RBD 、RGW) 的基础,以及为CephFS 提供POSIX 接口。librados API 支持直接访问RADOS ,使得开发者能够创建自己的接口来访问Ceph 集群存储。
RBD:Ceph块设备。对外提供块存储。可以像磁盘一样被映射、格式化以及挂载到服务器上。支持snapshot(快照)及增量备份。
RGW:Ceph对象网关,提供了一个兼容S3和Swift的restful API接口。RGW还支持多租户和Openstack的keyston身份验证服务。
Ceph 将数据作为对象存储在逻辑存储池中。使用 CRUSH算法,Ceph 计算出哪个归置组应该包含该对象,并进一步计算出哪个 Ceph OSD Daemon 应该存储该归置组。CRUSH 算法使 Ceph 存储集群能够动态扩展、重新平衡和恢复。
#注意:如果ceph集群中某个osd存储使用率达到95%,整个ceph集群会卡死
组件 | 主机IP | 主机名 |
---|---|---|
Monitors、Ceph-mgr、MDS | 192.168.69.41 | ceph-1 |
Monitors、Ceph-mgr、MDS | 192.168.69.42 | ceph-2 |
Monitors、Ceph-mgr、MDS、OSD | 192.168.69.43 | ceph-3 |
OSD | 192.168.69.44 | ceph-4 |
OSD | 192.168.69.45 | ceph-5 |
[SRPMS]
name=SRPMS
baseurl=https://mirrors.aliyun.com/ceph/rpm-15.2.9/el7/SRPMS/
enabled=1
gpgcheck=0
priority=1
[aarch64]
name=aarch64
baseurl=https://mirrors.aliyun.com/ceph/rpm-15.2.9/el7/aarch64/
enabled=1
gpgcheck=0
priority=1
[noarch]
name=noarch
baseurl=https://mirrors.aliyun.com/ceph/rpm-15.2.9/el7/noarch/
enabled=1
gpgcheck=0
priority=1
[x86_64]
name=x86_64
baseurl=https://mirrors.aliyun.com/ceph/rpm-15.2.9/el7/x86_64/
enabled=1
gpgcheck=0
priority=1
[root@ceph-3 ~]# mkfs.xfs /dev/vdb #其他硬盘依次格式化
#!/bin/bash
for i in `echo {b..k}`
do
mkfs.xfs /dev/vd$i
done
ceph-deploy节点到其他ceph节点做免密登录
[root@ceph-1 ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.69.41 ceph-1
192.168.69.42 ceph-2
192.168.69.43 ceph-3
192.168.69.44 ceph-4
192.168.69.45 ceph-5
因为是内网环境,所以将69.41作为ntp server,其他节点同步69.41的时间
[root@ceph-1 ~]# yum -y install ntp #安装ntp
[root@ceph-1 ~]# vi /etc/ntp.conf
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server 127.127.1.0
Fudge 127.127.1.0 stratum 10 #注释server 0 ~ server n,添加server 127.127.1.0,Fudge 127.127.1.0 stratum #在其他节点修改ntp.conf文件,也是注释server 0 ~ server n,添加server 192.168.69.41 Fudge 127.127.1.0 stratum 10(填写41的IP)
[root@ceph-1 ~]# yum -y install ceph-deploy #安装ceph-deploy
[root@ceph-1 ~]# mkdir ceph #创建ceph目录
[root@ceph-1 ~]# cd ceph/ #切换到ceph目录
[root@ceph-1 ceph]# ceph-deploy new ceph-1 ceph-2 ceph-3 #使用ceph-deploy工具部署mon, 如果执行ceph-deploy new xxx报以下错误,安装python-setuptools后再次执行即可
Traceback (most recent call last):
File "/usr/bin/ceph-deploy", line 18, in
from ceph_deploy.cli import main
File "/usr/lib/python2.7/site-packages/ceph_deploy/cli.py", line 1, in
import pkg_resources
ImportError: No module named pkg_resourc
[root@ceph-1 ceph]# yum -y install python-setuptools #yum安装python-setuptools
[root@ceph-1 ceph]# ceph-deploy new ceph-1 ceph-2 ceph-3 #再次执行后成功并生成配置文件
[root@ceph-1 ceph]# ls
ceph.conf ceph-deploy-ceph.log ceph.mon.keyring
[root@ceph-1 ceph]# vi ceph.conf #进入配置文件添加公网、内网、存储池副本数
[global]
fsid = de4a6428-02c9-409a-9469-9845f12266cc
mon_initial_members = ceph-1, ceph-2, ceph-3
mon_host = 192.168.69.41,192.168.69.42,192.168.69.43
cluster_network = 192.168.69.0/24 #内网网络
public_network = 192.168.69.0/24 #公网网络
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
osd_pool_default_size = 2 #存储池副本数
[root@ceph-1 ceph]# ceph-deploy install --no-adjust-repos ceph-1 ceph-2 ceph-3 ceph-4 ceph-5
#因为上面我们已经配置好ceph源,因此这里使用--no-adjust-repos参数忽略设置ceph源
[root@ceph-1 ceph]# ceph-deploy mon create ceph-1 ceph-2 ceph-3
[root@ceph-1 ceph]# ceph-deploy gatherkeys ceph-1 ceph-2 ceph-3
[root@ceph-1 ceph]# ll
总用量 860
-rw------- 1 root root 113 11月 8 16:25 ceph.bootstrap-mds.keyring
-rw------- 1 root root 113 11月 8 16:25 ceph.bootstrap-mgr.keyring
-rw------- 1 root root 113 11月 8 16:25 ceph.bootstrap-osd.keyring
-rw------- 1 root root 113 11月 8 16:25 ceph.bootstrap-rgw.keyring
-rw------- 1 root root 151 11月 8 16:25 ceph.client.admin.keyring
-rw-r--r-- 1 root root 333 11月 8 16:12 ceph.conf
-rw-r--r-- 1 root root 344892 11月 8 16:25 ceph-deploy-ceph.log
-rw------- 1 root root 73 11月 8 14:40 ceph.mon.keyring
该步骤也可以放到最后执行
[root@ceph-1 ceph]# ceph-deploy osd create --data /dev/vdb ceph-3 --journal /dev/vdk1 #create创建,--data指定硬盘路径,ceph-3(主机名);--joutnal指定日志盘(可以是整块硬盘或分区)
硬盘多的话可以用脚本执行
#!/bin/bash
for i in `echo {b..k}`
do
ceph-deploy osd create --data /dev/vd$i ceph-3 --journal /dev/vdk1
done
[root@ceph-1 ceph]# ceph-deploy disk zap ceph-3 /dev/vdc #对需要添加osd的硬盘进行数据删除,如果是新增硬盘此步可忽略
[root@ceph-1 ceph]# ceph-deploy osd create ceph-3 --data /dev/vdc --journal /dev/vdk1 #将数据删除完成的硬盘的再次通过create添加到osd服务
需要扩容的硬盘比较多可以用脚本执行
#!/bin/bash
for i in `echo {b..p}`
do
ceph-deploy disk zap ceph-3 /dev/vd$i
ceph-deploy osd create ceph-3 --data /dev/vd$i --journal /dev/vdk1
done
如果想要让某台主机使用ceph 命令管理集群,节点上需安装ceph,且需要使用admin参数赋予权限
[root@ceph-1 ceph]# ceph-deploy admin ceph-1 ceph-2 ceph-3
[root@ceph-1 ceph]# ll | grep ceph.client.admin.keyring
-rw------- 1 root root 151 11月 8 16:25 ceph.client.admin.keyring #执行后会生成ceph.client.admin.keyring文件,该文件删除后ceph命令将不能使用
测试ceph是否可以使用
[root@ceph-1 ceph]# ceph -s
cluster:
id: de4a6428-02c9-409a-9469-9845f12266cc
health: HEALTH_WARN
no active mgr #提示mgr未激活
clock skew detected on mon.ceph-2, mon.ceph-3
services:
mon: 3 daemons, quorum ceph-1,ceph-2,ceph-3 (age 19h)
mgr: no daemons active
osd: 30 osds: 30 up (since 24m), 30 in (since 24m)
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
[root@ceph-1 ceph]# ceph-deploy mgr create ceph-1 ceph-2 ceph-3 #激活mgr
[root@ceph-1 ceph]# ceph -s #查看ceph状态
cluster:
id: de4a6428-02c9-409a-9469-9845f12266cc
health: HEALTH_WARN
Module 'restful' has failed dependency: No module named 'pecan' #提示restful模块未启用,因为没有名为pecan的依赖;restful提供一个ceph的API接口,pecan模块可以使用pip3进行安装
clock skew detected on mon.ceph-2, mon.ceph-3
services:
mon: 3 daemons, quorum ceph-1,ceph-2,ceph-3 (age 21h)
mgr: ceph-1(active, since 2h), standbys: ceph-2, ceph-3
osd: 30 osds: 30 up (since 2h), 30 in (since 2h)
data:
pools: 1 pools, 1 pgs
objects: 0 objects, 0 B
usage: 31 GiB used, 269 GiB / 300 GiB avail
pgs: 1 active+clean
[root@ceph-1 ceph]# ceph-deploy mds create ceph-1 ceph-2 ceph-3 #激活mds
[root@ceph-1 ceph]# ceph mds stat #查看mds状态
3 up:standby #3个mds为开启状态
新版本ceph已经有了自动调整pg的功能
[root@ceph-1 ceph]# ceph fs ls #查看ceph文件系统为未启用状态
No filesystems enabled
[root@ceph-1 ceph]# ceph mgr module enable pg_autoscaler
module 'pg_autoscaler' is already enabled (always-on) #开启pg自动调整模块
[root@ceph-1 ceph]# ceph osd pool create cephfs_data1 512 --autoscale-mode= #创建ceph存储池,512为pg数量,cephfs_data1为存储池名称,可自定义;pg值也可以不选,直接选自动调整参数,系统会自动调整;
autoscaler是按每个池配置的,可以在以下几种模式下运行:
**警告(warn)**模式:如果建议的pg_num值与当前值相差太大,则会发出健康警告。 这是新池和现有池的默认设置。
**启用(on)**模式:无需任何管理员交互即可自动调整池pg_num。
**禁用(off)**模式:还可以为任何给定池关闭autoscaler,让管理员像以前一样手动管理pg_num。
pool 'cephfs_data' created
(OSDs * 100) / max replication count #(osd数*100) / 副本数
Total PGs = ------------------------------------ #pg计算公式
pool size #pool数量
[root@ceph-1 ceph]# ceph osd pool create cephfs_data2 512 --autoscale-mode= #创建第二个存储池,cephfs必须要有两个存储池才能进行创建,一个作为元数据存储池,一个作为数据存储池
Ceph集群中的PG总数:
PG总数 = (OSD总数 * 100) / 最大副本数
** 结果必须舍入到最接近的2的N次方幂的值。
Ceph集群中每个pool中的PG总数:
存储池PG总数 = (OSD总数 * 100 / 最大副本数) / 池数
其中: = 128 ,
关于创建存储池
确定 pg_num 取值是强制性的,因为不能自动计算。下面是几个常用的值:
*少于 5 个 OSD 时可把 pg_num 设置为 128
*OSD 数量在 5 到 10 个时,可把 pg_num 设置为 512
*OSD 数量在 10 到 50 个时,可把 pg_num 设置为 4096
*OSD 数量大于 50 时,你得理解权衡方法、以及如何自己计算 pg_num 取值
*自己计算 pg_num 取值时可借助 pgcalc 工具
随着 OSD 数量的增加,正确的 pg_num 取值变得更加重要,因为它显著地影响着集群的行为、以及出错时的数据持久性(即灾难性事件导致数据丢失的概率)。
PG是指定存储池存储对象的目录有多少个,PGP是存储池PG的OSD分布组合个数
PG的增加会引起PG内的数据进行分裂,分裂到相同的OSD上新生成的PG当中
PGP的增加会引起部分PG的分布进行变化,但是不会引起PG内对象的变动
[root@ceph-1 ceph]# ceph fs new cephfs cephfs_data1 cephfs_data2 #创建ceph文件系统,cephfs_data1作为元数据存储池,cephfs_data2为数据存储池,其中cephfs可自定义
[root@ceph-1 ceph]# ceph fs ls #再查看一下ceph文件系统
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
[root@ceph-1 ceph]# ceph mds stat #查看mds状态
cephfs:1 {0=ceph-3=up:active} 2 up:standby
mount内核挂载比ceph-fuse工具挂载性能高三倍左右,建议使用mount内核挂载
相关参考链接:https://mp.weixin.qq.com/s/R8TC-S6h_gHPaokTGTqKeQ?
ceph-fuse工具挂载
[root@ceph-5 ~]# yum -y install ceph-fuse #在客户端安装ceph-fuse工具
[root@ceph-5 ~]# mkdir /cephmount #创建挂载目录
[root@ceph-1 ceph]# ceph-deploy admin 192.168.69.31 #在控制节点添加69.31为客户端,执行后会在/etc下生成ceph目录及三个文件
[root@ceph-5 /]# ll /etc/ceph/
total 8
-rw------- 1 root root 151 Nov 9 17:01 ceph.client.admin.keyring
-rw-r--r-- 1 root root 333 Nov 9 17:01 ceph.conf
-rw------- 1 root root 0 Nov 9 17:01 tmp7g5X3W
[root@ceph-5 /]# ceph-fuse -m 192.168.69.41:6789,192.168.69.42:6789,192.168.69.43:6789 /cephmount #挂载到/cephmount目录
ceph-fuse[17536]: starting ceph client
2021-11-09T17:01:58.273+0800 7f808daf8f80 -1 init, newargv = 0x555eea2d74b0 newargc=9
ceph-fuse[17536]: starting fuse
[root@ceph-5 ~]# df -h | grep ceph
tmpfs 2.0G 52K 2.0G 1% /var/lib/ceph/osd/ceph-2
tmpfs 2.0G 52K 2.0G 1% /var/lib/ceph/osd/ceph-21
tmpfs 2.0G 52K 2.0G 1% /var/lib/ceph/osd/ceph-22
tmpfs 2.0G 52K 2.0G 1% /var/lib/ceph/osd/ceph-23
tmpfs 2.0G 52K 2.0G 1% /var/lib/ceph/osd/ceph-24
tmpfs 2.0G 52K 2.0G 1% /var/lib/ceph/osd/ceph-25
tmpfs 2.0G 52K 2.0G 1% /var/lib/ceph/osd/ceph-26
tmpfs 2.0G 52K 2.0G 1% /var/lib/ceph/osd/ceph-27
tmpfs 2.0G 52K 2.0G 1% /var/lib/ceph/osd/ceph-28
tmpfs 2.0G 52K 2.0G 1% /var/lib/ceph/osd/ceph-29
ceph-fuse 126G 0 126G 0% /cephmount #查看ceph客户端已成功挂载
mount内核挂载
[root@ceph-1 ceph]# ceph auth list #列出各组件密钥
client.admin
key: AQB4HI5hgVjCCxAAhspRhXixUTjfVvfq0b+QeA== #admin用户密钥
caps: [mds] allow *
caps: [mgr] allow *
caps: [mon] allow *
caps: [osd] allow *
[root@ceph-1 ceph]# ssh 192.168.69.45 #切换到69.45
[root@ceph-5 ~]# mount -t ceph 192.168.69.41:6789,192.168.69.42:6789,192.168.69.43:6789:/ /cephmount -o name=admin,secret=AQB4HI5hgVjCCxAAhspRhXixUTjfVvfq0b+QeA== #-t:指定挂载类型,用户名admin,密钥AQB4HI5hgVjCCxAAhspRhXixUTjfVvfq0b+QeA==