一、Ceph是一种为优秀的性能、可靠性和可扩展性而设计的统一的、分布式文件系统。
二、ceph的系统架构
1.Clients:客户端(数据用户)
2.cmds:Metadata server cluster,元数据服务器(缓存和同步分布式元数据)
3.cosd:Object storage cluster,对象存储集群(将数据和元数据作为对象存储,执行其他关键职能)
4.cmon:Cluster monitors,集群监视器(执行监视功能)
三、ceph的核心组件:Ceph OSD,Ceph Monitor,Ceph MDS
1.ceph osd :主要功能包括存储数据,处理数据的复制、恢复、回补、平衡数据分布,并将一些相关数据提供给 Ceph Monitor
2.ceph Monitor:ceph的监控器,主要功能是维护整个集群健康状态,提供一致性的决策,包含了Monitor map、OSD map、PG(Placement Group)map和CRUSH map
3.ceph mds:全称是Ceph Metadata Server,主要保存的是Ceph文件系统(File System)的元数据(metadata);
4.ceph mgr:负责跟踪运行时指标和Ceph集群的当前状态,包括存储利用率,当前性能指标和系统负载,Ceph Manager 守护进程还托管基于python的插件来管理和公开Ceph集群信息,包括基于Web的Ceph Manager Dashboard和 REST API。高可用性通常至少需要两个管理器.
四、Ceph组件及概念介绍
1、Object:ceph最底层的存储最小单位是Object–对象,每个Object包含元数据和原始数据
2、PG:一个PG包含多个OSD。引入PG这一层其实是为了更好的分配数据和定位数据。
3、CRUSH:CRUSH是Ceph底层使用的数据分布算法,让数据分配到预期的地方
4、RBD:RBD全称RADOS block device,是Ceph对外提供的块设备服务
5、RGW:RGW全称RADOS gateway,是Ceph对外提供的对象存储服务,接口与S3和Swift兼容。
6、CephFS 文件存储: CephFS全称Ceph File System,是Ceph对外提供的分布式文件存储服务
一 、Ceph基础介绍
Ceph是一套开源的,分布式存储系统。具有可靠性高,性能优良,可伸缩,支持就删码和副本模式,管理简单等特点。
Ceph优点在于它不单单是存储,同时还充分利用了存储节点上的计算能力,在存储每一个数据时,都会通过计算得出该数据存储的位置,尽量将数据分布均衡,同时由于Ceph的良好设计,采用了CRUSH算法、HASH环等方法,使得它不存在传统的单点故障的问题,且随着规模的扩大性能并不会受到影响。能够可靠地、自动重均衡、自动恢复集群状态。
根据场景划分可以将Ceph分为三大块:
(1)对象存储RADOSGW
(2)块设备存储 RBD
(3)文件系统服务Ceph FS
二、Ceph的核心组件
Ceph的核心组件包括:Ceph Monitor、Ceph MDS,Ceph OSD,Ceph Manager。
(1)Ceph Monitor监视器:负责监视Ceph集群,维护Ceph集群的健康状态,同时维护着Ceph集群中的各种Map图,比如OSD Map、Monitor Map、PG Map和CRUSH Map,这些Map统称为Cluster Map,Cluster Map是RADOS的关键数据结构,管理集群中的所有成员、关系、属性等信息以及数据的分发,比如当用户需要存储数据到Ceph集群时,OSD需要先通过Monitor获取最新的Map图,然后根据Map图和object id等计算出数据最终存储的位置。
(2)Ceph MDS:全称是Ceph MetaData Server,主要保存的文件系统服务的元数据,但对象存储和块存储设备是不需要使用该服务的。
(3)Ceph OSD:存储数据,处理数据复制,恢复,重新平衡,并通过检查其他Ceph OSD守护进程来获取心跳,为Ceph监视器和管理器提供一些监视信息。冗余和高可用性通常至少需要3个Ceph OSD。
目前使用两种存储引擎:filestore bluestore
filestore简介:使用Linux的文件系统的扩展属性,用于表示各种形式的内部对象状态和元数据,数据提交到后备存储器之前,ceph首先将数据写入一个称为journal的存储区,然后在写入到后备存储。
bluestore简介:不在使用文件系统,直接管理物理hdd或ssd
(4)Ceph mgr:负责跟踪运行时指标和Ceph集群的当前状态,包括存储利用率,当前性能指标和系统负载。Ceph Manager守护进程还托管基于python的模块来管理和公开Ceph集群信息,包括基于Web的Ceph Dashboard和 REST API。为新增进程在12.x版本以后为必须组件,11.x版本为可选组件,0.94版本中没有这个进程
三、Ceph基础架构组件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kRVWiHMP-1616384745160)(file:///C:/Users/V-LIUY~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)]
从架构图中可以看到最底层的是RADOS,RADOS系统主要由两部分组成,分别是OSD和Monitor。Ceph的高可靠、高可拓展、高性能、高自动化都是由这一层来提供的,用户数据的存储最终也都是通过这一层来进行存储的,RADOS是Ceph的核心。从角色上看,rados集群提供底层的存储服务。
基于RADOS层的上一层是LIBRADOS,LIBRADOS是一个库,它允许应用程序通过访问该库来与RADOS系统进行交互,支持多种编程语言,比如C、C++、Python等。从角色看,可以理解为使用存储的客户端。通过librados与后端集群rados进行交互。
基于LIBRADOS向上封装接口,提供三种功能如下:
(1)RADOSGW是一套基于当前流行的RESTFUL协议的网关,并且兼容S3和Swift。
(2)RBD通过Linux内核客户端和QEMU/KVM驱动来提供一个分布式的块设备。
(3)CEPH FS通过Linux内核客户端和FUSE来提供一个兼容POSIX的文件系统。
四、Ceph数据分布算法
在分布式存储系统中比较重要的一点是使得数据能够均衡分布,常见的数据分布算法有一致性Hash和Ceph的Crush算法。Crush是一种伪随机的控制数据分布、复制的算法,Ceph是为大规模分布式存储而设计的,数据分布算法必须能够满足在大规模的集群下数据依然能够快速的准确的计算存放位置,同时能够在硬件故障或扩展硬件设备时做到尽可能小的数据迁移,Ceph的CRUSH算法就是精心为这些特性设计的,可以说CRUSH算法也是Ceph的核心之一。
介绍crush前,先介绍存储数据与集群关系
存储数据与object的关系:用户要将数据存储到Ceph集群时,存储数据都会被分割成多个object,每个object都有一个object id,每个object的大小是可以设置的,默认是4MB,object可以看成是Ceph存储的最小存储单元。
object与pg的关系:由于object的数量很多,所以Ceph引入了pg的概念用于管理object,每个object最后都会通过hash计算映射到某个pg中,一个pg可以包含多个object。
pg与osd的关系:pg通过CRUSH计算映射到osd中去存储,如果是二副本的,则每个pg都会映射到二个osd,比如[osd.1,osd.2],那么osd.1是存放该pg的主副本,osd.2是存放该pg的从副本,保证了数据的冗余。
pg和pgp的关系:pg是用来存放object的,pgp相当于是pg存放osd的一种排列组合,举个例子,比如有3个osd,osd.1、osd.2和osd.3,副本数是2,如果pgp的数目为1,那么pg存放的osd组合就只有一种,可能是[osd.1,osd.2],那么所有的pg主从副本分别存放到osd.1和osd.2,如果pgp设为2,那么其osd组合可以两种,可能是[osd.1,osd.2]和[osd.1,osd.3],类似排列组合,pgp就是代表这个意思。一般来说应该将pg和pgp的数量设置为相等。
总结以上,下图表明了存储数据,object、pg、pool、osd、存储磁盘的关系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0aXNwBdE-1616384745163)(file:///C:/Users/V-LIUY~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg)]
本质上CRUSH算法是根据存储设备的权重来计算数据对象的分布的,权重高则数据存储比例多,官网推荐根据磁盘容量设置权重,标准为1T容量磁盘权重为1。在计算过程中,CRUSH是根据Cluster Map、数据分布策略和一个随机数共同决定数组最终的存储位置的。其中Cluster Map包括存储集群中可用的存储资源及其相互之间的空间层次关系,比如集群中有多少个机架,每个机架中有多少个服务器,每个服务器有多少块磁盘用以OSD等。
数据分布策略是指可以通过Ceph管理者通过配置信息指定数据分布的一些特点,比如管理者配置的故障域是Host,也就意味着当有一台Host起不来时,数据能够不丢失,CRUSH可以通过将每个pg的主从副本分别存放在不同Host的OSD上即可达到,不单单可以指定Host,还可以指定机架等故障域,除了故障域,还有选择数据冗余的方式,比如副本数或纠删码。
1****集群操作
ceph 0.9X版本以前
启动进程
service ceph start mon #启动节点所有mon
service ceph start mon.$id #启动指定mon进程
例:service ceph start mon.ceph1
service ceph start osd #停止节点所有osd进程
service ceph start osd.$id #启动指定osd进程
例:service ceph start osd.1
停止进程
service ceph stop mon
service ceph stop osd
查看进程状态
service ceph status mon
service ceph status osd
ceph 10.X版本以后
启动进程
systemctl start ceph-mon.target
systemctl start ceph-mon@$id
例:systemctl start ceph-mon@ceph1
systemctl start ceph-osd.target
systemctl start ceph-osd@id
例:systemctl start ceph-osd@2
停止进程:stop
查看进程状态:status
2****查看集群状态
ceph -s #查看集群状台
ceph health detail #当集群报警时,根据此命令可查看详细的报警信息
3****查看集群使用量
ceph df #显示集群的使用率
ceph osd df #使用
4****查看map信息
ceph mon dump #查看mon map
ceph osd dump #查看osd map
ceph pg dump #查看pg map
ceph osd crush dump #查看crush map
5****查看osd的逻辑结构
ceph osd tree
6****组件状态
mon状态
ceph health detail #查看mon健康状态
ceph quorum_status #查看mon选举状态
(1)probing 探测
mon每次启动,会保持一段时间的这个状态,并通过monmap查找其余的mon监视器,当mon为单个时,mon会快速通过这种状态,若为多个则会在选举完成此状态通过此状态。若只是用两个mon,那么mon将无期限的保持这种状态。
(2)electing 选举
mon处于选举状态,一般很快完成,若长时间出现此类情况,主要由时钟偏差导致或者通信故障导致
(3)synchronizing 同步
表示此mon正在与其他mon进行数据同步,monitor数据越小此状态保持时间越短
(4)leader 或peon
mon间时钟不同步,导致出现此种状态
osd状态
ceph osd tree #查看
in out up down
(1) in,表示osd在使用的集群中,up为工作态,down为停止状态
(2) out,标识osd不在使用的集群中,up为工作台,down为停止状态
pg状态
ceph pg dump # 查看
ceph pg dump_stuck [unclean|inactive|stale|undersized|degraded] #查看不同状态的pg
(1)createing 创建
当创建pg时,可查看到此状态
(2)peering 对等
可理解为pg放入osd的过程。当增加减少osd或者调整osd的权重时,会导致pg映射改变,pg调整在osd的位置,对等(放入)到新的osd。
(3)active 活动
正常的pg,显示状态
(4)clean 清洁
pg对等主osd和副本osd成功,并且pg映射的osd中存储的对象没有异常
(5)degraded 降级
对象写入主osd后pg进入降级状态,在写入副本osd后,解除异常
或者以3副本为例,当pg映射的3个osd中,其中一个出现异常,会导致pg进入降级状态
(6)reoverying 同步
osd异常或者修改权重后pg保存osd映射信息需要更新,此时属于同步状态
(7)backfilling 回填
当增加减少osd或调整osd的权重时,pg移动到新osd的过程,称为回填
(8)remapped重新映射
pg映射的主osd更改,pg迁移到新的osd,此时老osd会一直保持服务,直到pg数据迁移完成。
(9)stale陈旧
osd不能像mon报告pg信息,mon则将此osd中的pg标记为stale,标识pg信息陈旧
7****常用pool操作
查看池
ceph osd pool ls
创建池
ceph osd pool create {pool-name} {pg-num} [{pgp-num}] [replicated] [crush-ruleset-name] [expected-num-objects]
例:ceph osd pool create volumes 128 128 replicated replicated_ruleset
删除池
ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it] #参数mon_allow_pool_delete=true
池配额
ceph osd set-quota {pool-name} [max_object {obj-count}] [max_bytes {bytes}]
#取消配额需要将,valume的值为0即可
重命名池
ceph osd pool rename {current-poo-name} {new-pool-name}
池快照
ceph osd pool mksnap {pool-name} {snap-name} #添加快照
ceph osd pool rmsnap {pool-name} {snap-name} #删除快照
rados -p {pool-name} lssnap #查看快照
rados rollback -p {pool-name} {snap-name} #回复快照
池参数
ceph osd pool get {pool-name} {key} #获取
ceph osd pool set {pool-name} {key} {value} #设置
8****常用rbd操作
查看池中rbd
rbd -p {pool-name} ls
创建rbd
rbd create {pool-name}/{rbd-name} --size {size} --image-format 2
查看rbd信息
rbd info {pool-name}/{rbd-name}
rbd剪切操作
rbd mv 池名/块名 新池/新块名
rbd复制操作
rbd cp 池名/块名 新池/新块名
rbd导出
rbd export {pool-name}/{rbd-name} 导出位置
rbd导入
rbd import 文件 {pool-name}/{rbd-name} --image-format 2
rbd快照
rbd snap create {pool-name}/{rbd-name}@{rbd-snapname} #创建
rbd snap ls {pool-name}/{rbd-name} #查看
rbd snap rollback {pool-name}/{rbd-name}@{rbd-snapname}#回滚
rbd snap rm {pool-name}/{rbd-name}@{rbd-snapname} #删除
rbd snap purge {pool-name}/{rbd-name} #清理所有
rbd克隆
rbd snap protect {pool-name}/{rbd-name}@{rbd-snapname} #保护
rbd clone {pool-name}/{rbd-name}@{rbd-snapname} {pool-name}/{rbd-clone-name}
rbd flatten {pool-name}/{rbd-clone-name} #取消合并信息
rbd snap unprotect {pool-name}/{rbd-name}@{rbd-snapname} #取消保护
rbd实际使用大小统计
rbd diff {pool-name}/{rbd-name} | awk '{SUM+=$2}END{print SUM/1024/1024 "MB"}'
9 crush****操作
(1)创建
ceph osd crush add-bucket $HOSTNAME host
(2)删除
ceph osd crush rm $HOSTNAME
(4)查看
ceph osd crush rule ls
(5)osd加入crush规则
ceph osd crush add osd.$id weight host=$HOSTNAME
host加入到root下
ceph osd crush move $HOSTNAME root=$ROOTNAME
调整权重
ceph osd crush reweight osd.$id {weight}
ceph osd crush set $osd_id $set_weight root={rootname} host={hostname}
crushmap相关操作
ceph osd getcrushmap -o {compiled-crushmap-filename} #导出crushmap
crushtool -d {compiled-crushmap-filename} -o {decompiled-crushmap-filename} #反编译为可阅读文件
crushtool -c {decompiled-crush-map-filename} -o {compiled-crush-map-filename} #编译为2进制文件
ceph osd setcrushmap -i {compiled-crushmap-filename} #导入crushmap
10pg****计算和修复
1)计算pool应该设置多少pg
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JLneN211-1616384745166)(file:///C:/Users/V-LIUY~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)]
#官网推荐,每个osd中的pg理想值时100,若pg数过大会导致,节点负载过高
2) ceph pg scrub {pg-id} #清洗
3) Scrub errors问题修复:
Ceph health detail 确认有异常的pgid
ceph pg repair {pg-id} #修复问题pg
11****添加mon
(1)修改配置文件
sed -i "/mon initial members =/ s/$/,$HOSTNAME/g" /etc/ceph/ceph.conf #添加mon所在的hostname
sed -i "/mon host =/ s/$/,$IP/g" /etc/ceph/ceph.conf #添加mon使用的ip,使用192.192.*.*
echo -e "" >> /etc/ceph/ceph.conf
echo -e "[mon.$HOSTNAME]" >> /etc/ceph/ceph.conf
echo -e "host = $HOSTNAME" >> /etc/ceph/ceph.conf
echo -e "mon addr = $IPPORT" >> /etc/ceph/ceph.conf
echo -e "" >> /etc/ceph/ceph.conf
(2)创建临时文件夹
mkdir /tmp_mondir/
(3)导出mon的key文件
ceph auth get mon. -o /tmp_mondir/key-filename
(4)导出mon的monmap
ceph mon getmap -o /tmp_mondir/map-filename
(5)创建mon的运行目录
mkdir -p /var/lib/ceph/mon/ceph-$HOSTNAME
(6)激活新建mon
ceph-mon -i $HOSTNAME --mkfs --monmap /tmp_mondir/map-filename --keyring /tmp_mondir/key-filename
(8)删除临时文件放置目录
rm -rf /tmp_mondir/
(7)启动mon
service ceph start mon
12****添加osd
参见创建osd
13****减少mon
(1)清除mon.id
ceph mon remove $id #这里指的id例:mon.ceph12 id为ceph12
(2)停止mon进程
service ceph stop mon.$id
(3)清除配置文件ceph.conf中的配置文件。
14****减少osd
减少osd会造成集群数据同步,若同步速率过高,会导致客户端连接缓慢,需要优先调节同步速度
(1)调整同步速度
ceph tell osd.* injectargs "--osd_recovery_max_active 3" #调整同步速度
ceph tell osd.* injectargs "--osd_max_backfills 1" #调整回填速度
(2)设置不同步不会填
ceph osd set nobackfill
ceph osd set norecover
(3)去除crush规则
ceph osd crush remove osd.$i hostname
(4)取消不同步,不会填
ceph osd unset nobackfill
ceph osd unset norecover
(5)将osd剔除集群
ceph osd out $i
(6)停止osd进程
serivce ceph stop $i
(7)删除osd认证秘钥
ceph auth del osd.$i
(8)删除osdID
ceph osd rm $i
(9)进入ceph.conf清除osd的相关配置,同步配置文件
15mgr****相关操作
(1)查看mgr模块
ceph mgr module ls
(2)开启模块
ceph mgr module enable
(3)关闭模块
ceph mgr module disable
(4)查看模块地址
ceph mgr services
16mon****时钟异常
mon异常报警如下:
解决方式
(1)检查ntp服务,保障ntp服务正常
(2)若ntp无异常,连接ntp服务器,查看状态
ntpq -p
(3)同步ntp时间
Ntpdate ntp.server
date && hwclock -w
17mon****更换IP地址
(1)清除老的mon
ceph mon remove $oldid
(2)加入新的mon
rm /var/lib/ceph/mon/*
mkdir -p /var/lib/ceph/mon/ceph-$newid #创建运行
ceph auth get mon. -o /tmp/keyring
ceph-mon -i $newid --mkfs --monmap monmap --keyring keyring
chown -R ceph:ceph /var/lib/ceph/mon/ceph-$newid
service ceph start mon.$newid #0.94版本
systemctl start ceph-mon@$newid #12新版本
(3)更新配置文件
mon initial members = ipaddr #配置文件修改
mon host = $hostname #配置文件修改
[mon.$ID] #配置文件末尾添加
host = $hostname #配置文件末尾添加
mon addr = $ipaddr:6789 #配置文件末尾添加
官网方式
ceph-mon -i $oldid --extract-monmap /tmp/monmap
cp /var/lib/ceph/mon/ceph-$oldid/keyriny /tmp/monmap
monmaptool --add $newid ipaddr /tmp/monmap
monmaptool /tmp/monmap --rm $oldid
ceph-mon -i $newid --mkfs --monmap monmap --keyring keyring
**18 pools have many more objects per pg than average**
原因:
object/pg*3>参数”mon pg warn max object skew”设定值 #默认10负值禁用
查看报警池
object数=34825
pg数=1024
34825/1024=34 34/3(poolsize)=11.333 >10 #报警
解决方式:
ceph tell osd.* config set mon_pg_warn_max_object_skew -1
ceph tell mon.* config set mon_pg_warn_max_object_skew -1
19****集群使用阈值调整
ceph osd set-backfillfull-ratio #回填过程中若osd使用量超过设定值,将发出警告并停止对应osd的回填操作
ceph osd set-nearfull-ratio #当集群使用率到达此设定值,发出警告,集群容量使用率接近满
ceph osd set-full-ratio #当集群使用率到达此设定值,集群将停止工作。
-mon -i $oldid --extract-monmap /tmp/monmap
cp /var/lib/ceph/mon/ceph-$oldid/keyriny /tmp/monmap
monmaptool --add $newid ipaddr /tmp/monmap
monmaptool /tmp/monmap --rm $oldid
ceph-mon -i $newid --mkfs --monmap monmap --keyring keyring
18 pools have many more objects per pg than average
原因:
object/pg*3>参数”mon pg warn max object skew”设定值 #默认10负值禁用
查看报警池
object数=34825
pg数=1024
34825/1024=34 34/3(poolsize)=11.333 >10 #报警
解决方式:
ceph tell osd.* config set mon_pg_warn_max_object_skew -1
ceph tell mon.* config set mon_pg_warn_max_object_skew -1
**19****集群使用阈值调整**
ceph osd set-backfillfull-ratio #回填过程中若osd使用量超过设定值,将发出警告并停止对应osd的回填操作
ceph osd set-nearfull-ratio #当集群使用率到达此设定值,发出警告,集群容量使用率接近满
ceph osd set-full-ratio #当集群使用率到达此设定值,集群将停止工作。