Ceph案例
【摘要】 存储设备DAS(物理存储,接在主板上的):IDE、SATA、SAS、USBNAS(网络存储):NFS、CIFS SAN(存储区域网络):SCSI、FC SAN、iSCSICeph是什么?sds:软件定义的存储Ceph是一个对象(object)式存储系统,它把每一个待管理的数据流(例如一个文件)切分为一到多个固定大小的对象数据,并以其为原子单元完成数据存取。每个对象都存放的有自己的元数据,定义...
存储设备
DAS(物理存储,接在主板上的):IDE、SATA、SAS、USB
NAS(网络存储):NFS、CIFS
SAN(存储区域网络):SCSI、FC SAN、iSCSI
Ceph是什么?
sds:软件定义的存储
Ceph是一个对象(object)式存储系统,它把每一个待管理的数据流(例如一个文件)切分为一到多个固定大小的对象数据,并以其为原子单元完成数据存取。每个对象都存放的有自己的元数据,定义了属性,格式等
对象数据的底层存储服务是由多个主机(host)组成的存储集群,该集群也被称之为RADOS(Reliable Automatic Distributed Object Store)存储集群,即可靠、自动化、分布式对象存储系统
librados是RADOS存储集群的API,它支持C、C++、Java、Python、Ruby和PHP等编程语言
关键点:解决元数据容易成为瓶颈的问题。因为元数据存放了文件属性、格式、类型、数据在哪个块上等数据,当数据达到一定规模时会不够用。ceph直接使用了CRUSH算法直接调度或分配到某一个块上,不再用元数据存储方法
ceph没有文件元数据,但是有监视器,也叫集群元数据,注意它不是文件级别,所以没有瓶颈,用来管理整个ceph集群的(总共有多少个节点、每个节点有多少osd(硬盘)、每个节点的osd是否健康正常,)
Ceph接口
RadosGW、RBD和都是RADOS存储服务的客户端,它们把RADOS的存储服务接口(librados)分别从不同的角度做了进一步抽象,因而各自适用于不同的应用场景:
CEPHFS:ceph 文件系统。没有瓶颈,也nfs一样,直接挂载。需要两个存储池,需要保存数据和元数据
RBD:块(映像)接口,当rbd启用并创建了多个imge后,就是一个个虚拟物理磁盘,通过内核导出,格式化化之后挂载到需要的主机上使用即可。需要一个存储池
RADOSGW:对象存储,跨互联网使用的存储,也就是云存储。基于http/https
librados:自定义使用编程语言定义的存储
Ceph两种磁盘管理
FileStore:磁盘已经格式化,再用ceph存储(不得已情况再用,慢,浪费空间)
BlueStore:磁盘未格式化,再用ceph存储,完全交给ceph管理(可直接用,快,节约空间)
存储过程
mon:集群监视器,节点于存储块监视使用,还有认证功能,宕了整个集群会崩,需要做高可用。至少三个
mgr:集群管理器,数据查询使用,查询内存、cpu、磁盘剩余大小,使用率等,支持python插件,由mon分出来的,如果宕了接口会使用不了。无状态的。至少两个
poll:存储池,存储数据必须得先有存储池
PG:是计算的结果,虚拟不存在的
OSD:一块磁盘就一个OSD,每个OSD都有一个进程,这个进程主要用来管理OSD。至少需要三块OSD
RADOS Cluster:组织整个存储服务的。
主要有三类主机组成
可用的存储磁盘主机
mon主机:用来监控集群
mgr主机:用来数据查询
节点规划
主机名 | IP地址 |
---|---|
ceph-admin | 172.18.199.77(内网) 172.29.0.77(外网) |
mon01(也是充当stor01) | 172.18.199.71(内网) 172.29.0.11(外网) |
mon02(也是充当stor02) | 172.18.199.72(内网) 172.29.0.12(外网) |
mon03(也是充当stor03) | 172.18.199.73(内网) 172.29.0.13(外网) |
stor04 | 172.18.199.74(内网) 172.29.0.14(外网) |
每台stor都添加两块盘,分别是 80G、120G
安装部署
为了安全起见,使用普通用户进行部署,并配置普通用户能使用sudo执行管理员命令
所以节点配置hosts解析(所有节点)
vim /etc/hosts 172.29.0.11 mon01.linux.org stor01 mon01 172.29.0.12 mon01.linux.org stor02 mon02 172.29.0.13 mon01.linux.org stor03 mon03 172.29.0.14 mon01.linux.org stor04 172.29.0.15 mon01.linux.org stor05 172.29.0.16 mon01.linux.org stor06
准备时间同步(所有节点)
systemctl enable --now chronyd
准备yum仓库配置文件(所有节点)
rpm -ivh https://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch/ceph-release-1-1.el7.noarch.rpm yum install -y epel-release
创建部署ceph的特定用户账号
部署工具ceph-deploy必须以普通用户登录到Ceph集群的各目标节点,且此用户需要拥有无密码使用sudo命令的权限,以便在安装软件及生成配置文件的过程中无需中断配置过程。不过,较新版的ceph-deploy也支持用 "--username"选项提供可无密码使用sudo命令的用户名(包扩root,但不建议这样做)
另外,使用"ceph-deploy --username{username}"命令时,指定的用户需要能够通过SSH协议自动认证并连接到各Ceph节点,以免ceph-deploy命令在配置中途需要用户输入密码。
在各Ceph各节点创建新用户(所有节点)
首先需要在各节点以管理员的身份创建一个专用于ceph-deploy的特定用户账号,例如cephadm(建议不要使用ceph),并为其设置认证密码(例如cephadm)
useradd cephadm; echo "xier" | passwd --stdin cephadm
而后,确保这些节点上新创建的用户cephadm都有无密码运行sudo命令的权限(ceph-admin节点)
echo "cephadm ALL = (root) NOPASSWD: ALL" > /etc/sudoers.d/cephadm chmod 0440 /etc/sudoers.d/cephadm # 测试 su - cephadm sudo -l
配置免密(ceph-admin节点)
su - cephadm ssh-keygen -t rsa sudo ssh-copy-id -i .ssh/id_rsa.pub cephadm@localhost sudo for i in `seq 1 4`;do scp -rp .ssh/ cephadm@stor0$i:/home/cephadm;done exit for i in `seq 1 4`;do scp /etc/sudoers.d/cephadm root@stor01:/etc/sudoers.d/;done
在管理节点安装ceph-deploy(ceph-admin节点)
Ceph存储集群的部署过程可通过管理节点使用ceph-deploy全程进行,这里首先在管理节点安装ceph-deploy及其依赖到的程序包
yum install -y ceph-deploy python-setuptools python2-subprocess32
部署RADOS存储集群
初始化RADOS集群
首先在管理节点上以cephadm用户创建集群相关的配置文件目录(ceph-admin节点)
su - cephadm mkdir ceph-cluster cd ceph-cluster
初始化第一个MON节点,准备创建集群(ceph-admin节点)
ceph-deploy查看帮助
ceph-deploy --help ceph-deploy new --help
初始化第一个MON节点的命令格式为"ceph-deploy new {initial-monitor-node(s)}",本示例中,stor01即为第一个MON节点名称,其名称必须于节点当前实际使用的主机名保持一致。运行如下命令即可生成初始配置
ceph-deploy new --cluster-network 172.18.199.0/16 --public-network 172.29.0.0/16 mon01.ilinux.org
编辑生成ceph.conf配置文件,在[global]配置段中设置Ceph集群面向客户端通信时使用的IP地址的网络,即公网网络地址(cephadm节点)
初始化mon节点后会在当前生成 ceph.conf ceph-deploy-ceph.log ceph.mon.keyring(密钥环) 配置文件
如果初始化没有指定集群与公共网络
vim ceph.conf [global] mon_initial_members = mon01 # 如果有多个,mon01,mon02....即可 cluster_network = 172.18.0.0/16 # osd需要集群网络 public_network = 172.29.0.0/16 # 客户端连接需要公共网络 mon_host = 172.29.0.11 # 只需要公共网络的地址即可,不参与集群内部的事务,所以不需要集群网络
安装Ceph集群(ceph-admin节点)
ceph-deploy命令能够以远程的方式连入Ceph集群各节点完成程序包安装等操作,命令格式如下
ceph-deploy install {ceph-node} [{ceph-node}..]
方式1: 将stor01、stor02、stor03、stor04配置为Ceph集群节点,则执行如下命令即可,不建议,很慢,用方式2
su - cephadm cd ceph-cluster ceph-deploy install stor01 stor02 stor03 stor04
方式2: 手动部署(单独到mon与stor节点执行)
# 所有mon与stor节点 yum install -y ceph ceph-radosgw # cephadm节点 su - cephadm cd ceph-cluster ceph-deploy install --no-adjust-repos mon01 mon02 mon03 stor04
配置初始MON节点,并收集所有密钥(ceph-admin节点)
su - cephadm cd ceph-cluster # 不用配置主机,会根据配置文件完成 ceph-deploy mon create-initial
把配置文件和admin密钥拷贝Ceph集群各节点,以免得每次执行"ceph"命令时不得不明确指定MON节点地址和ceph.client.admin.keyring(ceph-admin节点)
ceph-deploy admin mon01 mon02 mon03 stor04
到ceph任意集群节点验证配置文件是否已拷贝过来
ls /etc/ceph/
而后在Ceph集群中需要运行ceph命令的节点上(或所有节点上)以root用户的身份设定用户cephadm能够读取/etc/ceph/ceph.client.admin.keyring文件
# 到各集群节点执行 setfacl -m u:cephadm:rw /etc/ceph/ceph.client.admin.keyring
配置Manager节点,启动ceph-mgr进程(ceph-admin节点)
ceph-deploy mgr create mon03
在Ceph集群内的节点上以cephadm用户的身份运行如下命令,测试集群健康状态(ceph-admin节点)
yum install ceph-common -y # 将配置文件与密码给管理节点 ceph-deploy admin ceph-admin setfacl -m u:cephadm:rw /etc/ceph/ceph.client.admin.keyring ceph health ceph -s
向RADOS集群添加OSD
列出并擦净磁盘(ceph-admin节点)
"ceph-deploy disk"命令可用检查并列出OSD节点上所有可用的磁盘相关信息
ceph-deploy disk list mon01 mon02 mon03 stor04
而后,在管理节点上使用ceph-deploy命令擦除计划专用于OSD磁盘上的所有分区表和数据以便用于OSD,命令格式为"ceph-deploy disk zap {osd-server-name}{disk-name}",需要注意的是此步会清除目标设备上的所有数据。下面分别擦净mon01 mon02 mon03 stor04用于OSD的一个磁盘设备sdb
ceph-deploy disk zap mon01 /dev/sdb ceph-deploy disk zap mon01 /dev/sdc ceph-deploy disk zap mon02 /dev/sdb ceph-deploy disk zap mon02 /dev/sdc ceph-deploy disk zap mon03 /dev/sdb ceph-deploy disk zap mon03 /dev/sdc ceph-deploy disk zap stor04 /dev/sdb ceph-deploy disk zap stor04 /dev/sdc
添加OSD
早期版本的ceph-deploy命令支持在将添加OSD的过程分为两个步骤:准备OSD和激活OSD,但新版本中,此种操作已经被废除,添加OSD的步骤只能由命令"ceph-deploy osd create {node} --data {data-disk}"一次完成,默认使用的存储引擎为bluestore
如下命令即可分别把磁盘添加为OSD
ceph-deploy osd create mon01 --data /dev/sdb ceph-deploy osd create mon01 --data /dev/sdc ceph-deploy osd create mon02 --data /dev/sdb ceph-deploy osd create mon02 --data /dev/sdc ceph-deploy osd create mon03 --data /dev/sdb ceph-deploy osd create mon03 --data /dev/sdc ceph-deploy osd create stor4 --data /dev/sdb ceph-deploy osd create stor4 --data /dev/sdc
列出指定节点上的OSD
ceph-deploy osd list mon01 mon02 stor04
管理员也可以使用ceph命令查看OSD相关信息
ceph osd stat
了解相关信息
ceph osd dump ceph osd ls
从RADOS集群中移除OSD的方法
Ceph集群中的一个OSD通常对应于一个设备,且运行于专用的守护进程。在某OSD设备出现故障,或管理员出于管理之需确实要移除特定的OSD设备时,需要先停止相关的守护进程,而后在进行移除操作。对于Luminous及其之后的版本来说,停止和移除命令的格式分别如下所示
停用设备
ceph osd out {osd-num}
停止进程
sudo systemctl stop ceph-osd@{osd-num}
移除设备
ceph osd purge {id} --yes-i-really-mean-it
若类似如下的OSD的配置信息存在于ceph.conf配置文件中,管理员在删除OSD之后手动将其删除
[osd.1] host = {hostname}
对于Luminous之前的版本来说,管理员需要依次手动执行如下步骤删除OSD设备
# 于CRUSH运行图中移除设备 ceph osd crush remove {name} # 移除OSD的认证key ceph auth del osd.{osd-num} # 最后移除OSD设备 ceph osd rm {osd-num}
测试上传/下载数据对象
存取数据时,客户端必须首先连接至RADOS集群上某存储池,而后根据对象名称由相关的CRUSH规则完成数据对象寻址。于是,为了测试集群的数据存取功能,这里首先创建一个用于测试的存储池mypool,并设定其PG数量为16个
存储池就类似于一个个的命名空间
ceph osd pool create mypool 16
而后即可将测试文件上传至存储池中,例如下面的"rados put"命令将/etc/issue文件上传至mypool存储池,对象名称依然保留为文件名issue,而"rados ls"命令则可以列出指定存储池中的数据对象
rados put issue /etc/issue --pool=mypool # 简写指定存储池 -p rados ls --pool=mypool
而"ceph osd map"命令可以获取到存储池中数据对象的具体位置信息
ceph osd map mypool issue
删除数据对象,"rados rm"命令是较为常用的一种方式
rados rm issue --pool=mypool
删除存储池命令存在数据丢失风险,Ceph于是默认禁用此类操作。管理员需要在ceph.conf配置文件中启用支持删除存储池的操作后,方可使用类似如下命令删除存储池
ceph osd pool rm mypool mypool --yes-i-really-really-mean-it
扩展Ceph集群
扩展监视器节点
Ceph存储集群需要至少运行一个Ceph Monitor和一个Ceph Manager,生产环境中,为了实现高可用性,Ceph存储集群通常运行多个监视器,以免单监视器整个存储集群崩溃。Ceph使用Paxos算法,该算法需要半数以上的监视器(大于n/2,其中n为总监视器数据)才能形成法定人数。尽管此非必需,但奇数个监视器往往更好。
"ceph-deploy mon add {ceph-nodes}"命令可以一次添加一个监视器节点到集群中,例如,下面的命令可以将集群中的mon02和mon03也运行为监视器节点
至少三个节点
ceph-deploy mon add mon02 ceph-deploy mon add mon03
设置完成后,可以在ceph客户端查看监视器及法定人数的相关状态
ceph quorum_status --format json-pretty
扩展Manager节点
Ceph Manager守护进程以 "Active/Standby" 模式运行,部署其它ceph-mgr守护程序可确保Active节点或其上的ceph-mgr守护进程故障时,其中的一个Standby实例可以在不中断服务情况下接管其任务
至少两个节点
"ceph-deploy mgr create {new-manager-nodes}"命令可以一次添加多个Manager节点。下面可以将mon02节点作为备用的Manager运行
ceph-deploy mgr create stor04 ceph -s # 检查
Ceph存储集群的访问接口
Ceph块设备接口(RBD)
Ceph块设备,也称为RADOS块设备(简称RBD),是一种基于RADOS存储系统支持超配(thin-provisioned)、可伸缩的条带化数据存储系统,它通过librbd库于OSD进行交互。RBD为KVN等虚拟化技术和云OS(如OpenStack和CloudStack)提供高性能和无限可扩展性的存储后端,这些系统依赖于libvirt和QEMU实用程序于RBD进行集成
客户端基于librbd库可将RADOS存储集群用作块设备,不过用于rbd的存储池需要事先启用rbd功能并进行初始化。例如,下面的命令创建一个名为rbdpool的存储池,在启用rbd功能后对其进行初始化
ceph osd pool create rbdpool 64 64 ceph osd pool application enable rbdpool rbd rbd pool init -p rbdpool
不过,rbd存储池并不能直接用于块设备,而是需要事先在其中按需创建映像(image),并把映像文件作为块设备使用。rbd命令可用于创建、查看及删除块设备相在的映像(image),以及克隆映像、创建快照、将映像回滚到快照和查看快照等管理操作,例如,下面命令能够创建一个名为img1的映像
rbd create myimg --size 1024 -p rbdpool
映像的相关的信息则可以使用"rbd info"命令获取
rbd --image myimg -p rbdpool info
在客户端主机上,用户通过内核级的rbd驱动识别相关的设备,即可对其进行分区,创建文件系统并挂载使用
启用radosgw接口
RGW非必须的接口,仅在需要用到与S3和Swift兼容的RESTful接口时才需要部署RGW实例,相关的命令为"ceph-deploy rgw create (gateway-node)"。例如,下面的命令用于把mon03部署为rgw主机
ceph-deploy rgw create mon01 # 会启用7480端口,访问测试 http://172.29.0.11:7480 # 查看 ceph -s
RGW会在rados集群上生成包括如下的一系列存储池
ceph osd pool ls
RGW提供的是REST接口,客户端通过http与其进行交互,完成数据的增删改查等管理操作
启用文件系统(CephFS)接口
CephFS需要至少运行一个元数据服务器(MDS)守护进程(ceph-mds),此进程管理与CephFS上存储的文件相关的元数据,并协调对Ceph存储集群的访问。因此,若要使用CephFS接口,需要在存储集群中至少部署一个MDS实例。"ceph-deploy mds create {ceph-node}"命令可以完成此功能,例如,在stor01上启用MDS
客户端在访问集群时,会有三种数据存在,MDS、metadata pool、data pool
MDS:用来存索引的
metadata pool:用来存元数据信息的
data pool:用来存储数据的
ceph-deploy mds create mon02
查看MDS的相关状态可以发现,刚添加的MDS处于Stanby模式
ceph mds stat
使用CephFS之前需要事先于集群中创建一个文件系统,并为其分别指定元数据和数据相关的存储池。下面创建一个名为cephfs的文件系统用于测试,它使用cephfs-metadata为元数据存储池,使用cephfs-data为存储池
ceph osd pool create cephfs-metadata 32 32 ceph osd pool create cephfs-data 64 64 ceph fs new cephfs cephfs-metadata cephfs-data
查看创建的cephfs详细信息
ceph fs status cephfs
此时,MDS的状态已经发生了改变
ceph mds stat
随后,客户端通过内核中的cephfs文件系统接口即可挂载使用cephfs文件系统,或者通过FUSE接口与文件系统进行交互
集群基本命令
获取集群的即时状态
ceph pg stat ceph osd pool stats {存储池} ceph df ceph df detail
检查OSD和Mon的状态
ceph osd stat ceph osd dump
还可以根据OSD在CRUSH地图中的位置查看OSD
ceph osd tree
ceph将列显CRUSH树及主机、它的OSD、OSD是否已启动及其权重
集群中存在多个Mon主机时,应该在启动集群之后读取或写入数据之前检查的Mon的仲裁状态;事实上,管理员也应该定期检查这种仲裁结果
显示监视器映射:ceph mon stat 或 ceph mon dump
显示仲裁状态:ceph quorum_status
使用管理套接字(需要在自己节点运行)
Ceph的管理套接字接口常用于查询守护进程
套接字默认保存于 /var/run/ceph 目录
此接口的使用不能以远程方式进程
命令使用格式
ceph --admin-daemon /var/run/ceph/socket-name
获取使用帮助
ceph --admin-daemon /var/run/ceph/socket-name help
停止或重启ceph集群
停止
告知Ceph集群不用将OSD标记为out
命令:ceph osd set noout
按如下顺序停止守护进程和节点
存储客户端
网关,例如 NFS Ganesha或对象网关
元数据服务器(MDS)
ceph OSD
ceph Manager
ceph Monitor
启动
以于停止过程相关的顺序启动节点
ceph Monitor
ceph Manager
ceph OSD
元数据服务器(MDS)
网关,例如 NFS Ganesha或对象网关
存储客户端
删除noout标志
命令:ceph osd unset noout
关于存储池
存储池类型
存储池就是与客户端的IO接口
副本池(replicated):把每个对象在集群中存储为多个副本,其中存储于主OSD的为主副本,副本数量在创建存储池时,由管理员指定;此为默认的存储池类型;
三分之一利用率。更吃空间
纠删码池(erasure code): 把各对象存储为 N=K+M个块,其中,K为数据块数量,M为编码块数量,因此存储池的尺寸为K+M。冗余级别基于M纠删编码块数量。最多允许M块磁盘丢失
三分之二的利用率。更吃cpu
预设Ceph集群中的PG数至关重要,公式如下:
(**结果必须舍入到最接近2的N次幂的值)**
PG 总数 = (OSD 数 * 100) / 最大副本数
副本池IO
将一个数据对象存储为多副本
写入操作时,ceph客户端使用CRUSH算法来计算对象的PG ID和Primary OSD
主OSD根据设定的副本数、对象的名称、存储池名称和集群运行图(Cluster Map)计算出PG的各辅助OSD,而后由OSD将数据同步给这些辅助OSD
纠删码池IO
纠删码是一种向前纠错(FEC)代码
把各对象存储为 N=K+M个块,其中,K为数据块数量,M为编码块数量,因此存储池的尺寸为K+M。冗余级别基于M纠删编码块数量。最多允许M块磁盘丢失
类似于RAID5
纠删码池减少了数据持久性所需的磁盘空间量,但计算量上却比副本存储池要更贵一些
RGW可以使用纠删码存储池,但RBD不支持
关于归置组
归置组(placement group)是用于跨OSD将数据存储在某个存储池中的内部数据结构
相当于存储池来说,PG是一个虚拟组件,它是对象映射到存储池时使用的虚拟层
出于规模伸缩及性能方面的考虑,Ceph将存储池细分为归置组,把每个单独的对象映射到归置组,并将归置组分配给一个主OSD
存储池由一系列的归置组组成,而CRUSH算法则根据集群运行图和集群状态,将各PG均匀、为随机地分布到集群中的OSD之上
若某OSD失败或需要对集群进行重新平衡,ceph则移动或复制整个归置组而无需单独寻址每个对象
归置组在OSD守护进程和Ceph客户端之间生成一个中间层,CRUSH算法复责将每个对象动态映射到一个归置组,然后再将每个归置组动态映射到一个或多个OSD守护进程,从而能够支持在新的OSD设备上线时动态进行数据重新平衡。
不再以文件或对象为单位,而已组为单位,节省集群资源
归置组计数
一般来说,对于有着超过50个OSD的RADOS集群,建议每个OSD大约有50-100个PG以平衡资源使用,取得更好的数据持久性和数据分布,更大规模的集群中,每个OSD大约可持有100-200个PG
至少应该使用多少个PG,可通过下面的公式计算后,结果必须舍入到最接近2的N次幂的值
PGperOSD:当预估以后集群OSD数不会增加时,取100计算;当预估以后集群OSD数会增加一倍时,取200计算。
(总的OSD数量 * PGperOSD) / 副本数量 => 总PG数
归置组状态
PG常见状态
Active
主OSD和各辅助OSD均处于就绪状态,可正常服务于客户端的IO请求
Clean
主OSD和各辅助OSD均处于就绪状态,所有对象的副本数量均符合期望,并且PG活动集和上集是为同一组OSD
Peering
一个PG中的所有OSD必须就它们持有的数据对象状态达成一致,而 "对等(Peering)" 即为让其OSD从不一致转为一致的过程
Degraded
在某OSD标记为 "down" 时,所有映射到处OSD的PG即转入"降级(degraded)"状态
此OSD重新启动并完成Peering操作后,PG将重新转会clean
stale
每个OSD都要周期性地向RADOS集群中的监视器报告其作为主OSD所持有PG的最新统计数数据,因任何原因导致某个主OSD无法正常向监视器发送此类报告,或由其它报告某个OSD已经down掉,则所有此OSD为主OSD的PG将立即被标记为stale状态
Undersized
PG中的副本数少于其存储池定义的个数时即转入undersized状态,恢复和回填操作在随后会启动以修复其副本期望值
Scrubbing
数据一致性检测
Recovering
处于内部数据同步过程中的PG则被标记为recivering状态
Backfilling
新OSD加入存储集群后,ceph则会加入数据重新均衡状态。即一些数据对象会在进程后台出现有OSD移到新的OSD之上,此操作过程即为backfill
关于CRUSH
把对象直接映射到OSD之上会导致二者之间的紧密耦合关系,在OSD设备变动时不可避免对整个集群产生扰动
于是,Ceph将一个对象映射进RADOS集群的过程分为两步
首先是以一致性哈希算法将对象名称映射到PG
而后是将PG ID基于CRUSH算法映射到OSD
此两个过程都以"实时计算"的方式完成,而非传统的查表方式,从而有效规避了任何组件被"中心化"的可能性,使得集群规模扩展不再受限
这个实时计算操作用到的算法就是CRUSH
它是一种数据分布式算法,类似于一致性哈希算法,用于RADOS存储集群控制数据分布
操作存储池
创建存储池
副本型存储池创建命令
ceph osd pool create <pool-name> <pg-num> [pgp-num] [replicated] [crush-rule-name] [expected-num-objects]
纠删码池创建命令
ceph osd pool create <pool-name> <pg-num> <pgp-num> erasure [erasure-code-profile] [crush-rule-name] [expected-num-objects]
命令格式中常用的参数
pool-name:存储池名称。在一个RADOS存储集群上必须具有唯一性
pg-num:当前存储池中的PG数量,合理的PG数量对于存储池的数据分分布及性能表现来说至关重要
pgp-num:用于归置的PG数量,其值应该等于PG的数量
relicated|erasure:存储池类型,副本存储池需要更多原始存储空间,但已实现Ceph支持的所有操作,而纠删码存储池所需原始存储空间较少,但目前仅实现了Ceph的部分操作
crush-ruleset-name:此存储池所用的CRUSH规则集的名称,不过,引用的规则集必须实现存在
获取存储池的相关信息
列出存储池
命令:ceph osd pool ls [detail]
获取存储池的统计数据
命令: ceph osd pool stats [pool-name]
显示存储池的用量信息
rados df
重命名存储池
重命名:ceph osd pool rename old-name new-name
删除存储池
意外删除存储池会导致数据丢失,因此Ceph实施了两个机制来防止删除存储池,要删除存储池,必须先禁用两个机制
第一个机制是NODELETE标志,其值需要为false,默认也是falsee
查看命令:ceph osd pool get pool-name nodelete
修改命令:ceph osd pool set pool-name nodelete false
第二个机制是集群范围的配置参数mon allow pool delete,其默认值为 "false",这表示默认不能删除存储池,临时设定的方法如下
ceph tell mon.* injectargs --mon-allow-pool-delete={true|false}
建议删除之前将其设置为true,删除完成后再改为false
删除命令:ceph osd pool rm pool-name pool-name --yes-i-really-really-mean-it
范例:
ceph tell mon.* injectargs --mon-allow-pool-delete=true ceph osd pool rm mypool mypool --yes-i-really-really-mean-it ceph tell mon.* injectargs --mon-allow-pool-delete=false
设置存储池配额
Ceph支持为存储池设置可存储对象的最大数量(max_objects)和可占用的最大空间(max_bytes)两个纬度的配额
命令格式:ceph osd pool set-quota pool-name max_objects|max_bytes val
获取存储池配额的相关消息
命令:ceph osd pool get-quota <pool-name>
范例
ceph osd pool set-quota rbdpool max_objects 10000 ceph osd pool set-quota rbdpool max_bytes 100000
配置存储池参数
存储池的诸多配置属性保存于配置参数中
获取配置:ceph osd pool get <pool-name>
设定配置:ceph osd pool set <pool-name> <key> <value>
常用的可配置参数
size: 存储池中的对象副本数
min_size: I/O所需要的最小副本数
pg_num:存储池的PG数量
pgp_num:计算数据归置时要使用的PG的有效数量
crush_ruleset:用于在集群中映射对象归置的规则组
nodelete:控制是否可删除存储池
nopgchange:控制是否可更改存储池的pg_num和pgp_num
nosizechange:控制是否可更改存储池的大小
noscrub和nodeep-scrub:控制是否可整理或深层整理存储池以解决临时高I/O负载的问题
scrub_min_interval:集群负载较低时整理存储池的最小时间间隔,默认值为0,表示其取值来自于配置文件中的osd_scrub_min_interval参数
scrub_max_interval:整理存储池的最大时间间隔,默认值为0,表示其取值来自于配置文件中的osd_scrub_max_interval参数
deep_scrub_interval:深层整理存储池的间隔,默认值为0,表示其取值来自于配置文件中的osd_deep_scrub参数
存储池快照
创建存储池快照
ceph osd pool mksnap <pool-name> <snap-name>
rados -p <pool-name> mksnap <snap-name>
列出存储池的快照
rados -p <pool-name> lssnap
回滚存储池至指定的快照
rados -p <pool-name> lssnap
回滚存储池至指定的快照
rados -p <pool-name> rollback <snap-name>
删除存储池快照
ceph osd pool rmsnap <pool-name> <snap-name>
rados -p <pool-name> rmsnap <snap-name>
数据压缩
BlueStore存储引擎提供即时数据压缩,以节省磁盘空间
启用压缩
ceph osd pool set <pool-name> compression_algorithm snappy
压缩算法有none、zlib、lz4、zstd和snappy等几种,默认为snappy
zstd有较好的压缩比,但比较消化CPU
lz4和snappy对CPU占用比例较低
不建议使用zlib
ceph osd pool set <pool-name> compression_mode aggressive
压缩模式:none、aggressive、passive和force、默认值为none
none:不压缩
passive:若提示COMPRESSIBLE,则压缩
aggressive:除非提示INCOMPRESSIBLE,否则就压缩
force:始终压缩
配置纠删码配置文件
列出纠删码配置文件
ceph osd erasure-code-profile ls
获取指定的配置文件的相关内容
ceph osd erasure-code-profile get default
自定义纠删码配置文件
ceph osd erasure-code-profile set <name> [directory=directory] [<plugin=plugin>] [crush-device-class] [<crush-failure-domain>] [<key=value>...] [--fore]
directory:加载纠删码插件的目录路径,默认为/usr/lib/ceph/erasure-code
plugin:用于生成及恢复纠删码块的插件名称,默认为jerasure
crush-device-class:设备类别,例如hdd或ssd,默认为none,即无视类别
crush-failure-domain:故障域,默认为host,支持使用的包括osd、host、rack、row和room等
force:强制覆盖现有的同名配置文件
范例,承受两个OSD的丢失
ceph osd erasure-code-profile set myprofile k=4 m=2 crush-failure-domain=osd
用户管理
各项权利的意义
allow
需先于守护进程的访问设置指定
仅对MDS表示rw之意,其它的表示字面意义
r:读取权限,访问MON以检索CRUSH时依赖此使能
w:对象写入权限
x:调用类方法(读取和写入)的能力,以及在MON上执行auth操作的能力
class-read:x的子集,授予用户调用类读取方法的能力
class-write:x的子集,授予用户类写入方法的能力
*:授予用户对特定守护进程/存储池的读取、写入和执行权限,以及执行管理命令的能力
Ceph集群管理员能够直接在Ceph集群中创建、更新和删除用户
创建用户时,需要将密钥分发到客户端,以便将密钥添加到密钥环
列出用户
命令:ceph auth list
用户表示:TYPE.ID,因此,osd.0表示OSD类型的用户,用户ID为0
检索特定用户
命令:ceph auth get TYPE.ID或者ceph auth export TYPE.ID
添加用户
命令
ceph auth add:规范方法,它能够创建用户,添加并指定的caps(mon mgr osd权限类型)
ceph auth get-or-create:简便方法,创建用户并返回密钥文件格式的密钥信息,或者在用户存在时返回用户名及密钥文件格式的密钥信息
ceph auth get-or-create-key:简便方法,创建用户并返回密钥信息,或者在用户存在时返回密钥信息
注意:典型的用户至少对Ceph monitor 具有读取功能,并对Ceph OSD具有读取和写入功能,另外,用户的OSD权限通常应该限制为只能访问特定的存储池,否则,它将具有访问集群中所有存储池的权限
范例
ceph auth add client.testuser mon 'allow r' osd 'allow rw pool=rbdpool' ceph auth get client.testuser ceph auth print-key client.testuser # 更改 ceph auth caps client.testuser mon 'allow rw' osd 'allow rw pool=rbdpool' # 删除 ceph auth del client.testuser
管理keyring
创建keyring
ceph auth add等命令添加的用户还需要额外使用ceph-authtool命令为其创建用户密钥
ceph客户端通过keyring文件查找用户名并检索密钥
命令:ceph-authtool --create-keyring /path/to/keyring
注意
keyring文件一般应该保存于/etc/ceph/目录中,以便客户端能自动查找
创建包含多个用户的keyring文件时,应该使用cluster-name.keyring作为文件名
将用户添加至keyring,导入用户
可将某个用户从包含多个用户的keyring中导出,并保存于一个专用的keyring文件
命令:ceph auth get TYPE.ID -o /etc/ceph/cluster-name.user-name.keyring
也将用户的keyring合并一个统一的keyring文件中
命令:ceph-authtool /etc/ceph/cluster-name.keyring --import-keyring /etc/ceph/cluster-name.user-name.keyring
范例
ceph auth get-or-create client.kube mon 'allow r' osd 'allow * pool=kube' # k8s拿着ceph.client.kube.keyring这个文件就可以访问ceph集群了,权限根据设置osd定义 ceph auth get client.kube -o ceph.client.kube.keyring # 创建空密钥环文件,导入多个用户密钥环 ceph-authtool --create-keyring cluster.keyring ceph-authtool cluster.keyring --import-keyring ./ceph.client.kube.keyring ceph-authtool cluster.keyring --import-keyring ./ceph.client.admin.keyring ceph-authtool -l cluster.keyring
RBD使用
ceph osd pool ls # 创建存储池 ceph osd pool create kube 64 64 # 将kube存储池设置为rbd接口 ceph osd pool application enable kube rbd # 初始化kube的rbd存储池 rbd pool init kube # 创建映像(磁盘) rbd create --pool kube --image vol01 --size 2G # 查看存储池信息 rbd ls --pool kube # 创建映像(磁盘) rbd create --size 2G kube/vol02 rbd ls --pool kube # 查看存储池详细信息 rbd ls --pool kube -l # 查看存储池详细信息以json格式显示 rbd ls --pool kube -l --format json --pretty-format # 查看存储池中映像详细信息 rbd info kube/vol01 rbd info --pool kube --image vol01 rbd info --pool kube vol01 # 禁用特性 rbd feature disable kube/vol01 object-map fast-diff deep-flatten
创建一台stor05客户端,来使用ceph集群的osd
公网:172.29.0.15
私网:172.18.199.75
# stor04节点拷贝yum源文件 scp /etc/yum.repos.d/ceph.repo 172.18.199.75:/etc/yum.repos.d/ # 回到stor05节点 yum -y install epel-release yum -y install ceph-common # rbd依赖的是libvirtrbd模块 modinfo ceph # 到管理节点ceph-admin创建账号 ceph auth get client.kube scp ceph.client.kube.keyring 172.18.199.75:/etc/ceph/ scp ceph.conf 172.18.199.75:/etc/ceph/ # 回到stor05节点 ceph -s # 发现默认使用的密钥是ceph.client.admin.keyring,而这里只有ceph.client.kube.keyring,所以需要指定用户 ceph --user kube -s
加载内核识别rbd创建好的ceph镜像文件,映射到本机(stor05)
rbd help map rbd --user kube map kube/vol01 mkfs.xfs /dev/rbd0 mount /dev/rbd0 /mnt # 操作系统必须得有ceph模块 modinfo ceph
将磁盘镜像移除本机(stor05)
# 查看当前已加载的镜像文件 rbd showmapped # ceph集群中可查看rbd被其它主机映射时加了锁(ceph集群任意节点) rbd -p kube ls -l # 移除设备 rbd unmap /dev/rbd0
更改镜像大小(ceph-admin节点)
rbd resize -s 5G kube/vol01 # 查看是否已更改 rbd -p kube ls -l
删除镜像(ceph-admin节点)
# 帮助 rbd help rm # 删除 rbd rm kube/vol02 rbd ls -p kube -l
rbd回收站功能(ceph-admin节点)
rbd help trash rbd -p kube trash move vol01 # 发现没有,已经放入到回收站中了 rbd ls -p kube -l # 查看回收站 rbd trash list -p kube # 从回收站恢复镜像 rbd trash restore -p kube --image vol01 --image-id xxxxx # 再次查看发现已回收到存储池中 rbd ls -p kube -l
rbd快照功能(stro05与ceph集群节点)
# stor05映射ceph集群存储池镜像到本地 rbd --user kube map kube/vol01 # 测试模拟放入数据使用快照恢复 mount /dev/rbd01 /mnt cp /etc/passwd /mnt/ # 到ceph集群节点进行快照操作 rbd help snap rbd snap create kube/vol01@snap1 rbd snap list kube/vol01 # 到stor05模拟删除数据 rm -f /mnt/passwd umount /mnt rbd unmap /dev/rbd0 # 到ceph集群节点使用快照回滚 rbd snap rollback kube/vol01@snap1 # 到stor05节点重新加载镜像挂载查看 rbd --user kube map kube/vol01 mount /dev/rbd0 /mnt # 发现数据回来了 ls /mnt # ceph集群删除快照 rbd snap rm kube/vol01@snap1 # ceph集群限制镜像能创建快照的数量。这里设置最多不超过10个 rbd snap limit set kube/vol01 --limit 10 # ceph集群清除快照数量限制 rbd snap limit clear kube/vol01
rbd多层快照,也称为克隆(根据的是镜像快照,而不是镜像)(ceph-admin节点)
作用:克隆的镜像不是用来回滚使用的,是真正用来当镜像使用
需要对第一层做以下两步
readonly:不能随意动此快照
protect(保护模式):设置后快照可进行克隆操作
# stor05节点 umount /dev/rbd0 rbd --user kube unmap /dev/rbd0 # ceph节点创建克隆使用的模板快照 rbd snap create kube/vol01@clonetpl1 rbd snap ls kube/vol01 # 对快照使用保护模式 rbd snap protect kube/vol01@clonetpl1 # 使用克隆 rbd help clone rbd clone kube/vol01@clonetpl1 kube/myimg01 # 查看可发现多了个镜像 rbd ls -p kube # stor05使用快照克隆的镜像 rbd --user kube map kube/myimg01 # 发现属性和原镜像一样 mount /dev/rbd0 /mnt # 再创建克隆镜像,做对比,发现它们之间没有关联,独立的 touch /mnt/xier # ceph-admin节点 rbd clone kube/vol01@clonetpl1 kube/myimg02 # stor05节点 rbd --user kube map kube/myimg02 mount /dev/rbd1 /opt/ # 与mnt目录下做对比,发现是不一样的 ls /opt/ umount /mnt umount /opt rbd --user kube unmap /dev/rbd0 rbd --user kube unmap /dev/rbd1 # ceph-admin节点查看快照克隆数量 rbd children kube/vol01@clonetpl1 # 删除克隆镜像,不然无法关闭保护模式 rbd rm kube/myimg02 # 现在可能会出现的情况是,镜像或快照丢失或删除,那么克隆的镜像就全不能用了,这里使用展平(单独制作为镜像,切断它们之间的关联作为独体) rbd flatten kube/myimg01 # 模拟镜像,快照故障,发现展平的克隆镜像还能使用 # 关闭保护模式 rbd snap unprotect kube/vol01@clonetpl1 rbd snap rm kube/vol01@clonetpl1
rbd制作为操作系统镜像
将镜像制作为操作系统的思路,使用import导入操作系统镜像
范例
已cirros镜像为例
# ceph-admin节点 rbh help import rbd import cirros-0.5.0-x86_64-disk.img kube/cirros # 更改镜像大小 rbd resize -s 512M kube/cirros # kvm使用必须得有相应的权限,比如获取前缀,能否使用克隆镜像 ceph auth caps client.kube mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=kube' ceph auth get client.kube -o ceph.client.kube.keyring scp ceph.client.kube.keyring root@172.18.199.75:/etc/ceph/ # stor05节点 yum install -y libvirt qemu-kvm systemctl start libvirtd
将用户的认证信息导入为libvirtd上一个可用的secret
# stor05节点 vim client.kube.xml <secret ephemeral='no' private='no'> <usage type='ceph'> <name>client.kube secret</name> </usage> </secret>
使用virsh命令创建secret,命令返回创建的secret的UUID
# stor05节点 virsh secret-define client.kube.xml
使用创建成功的secret设置密码
# 到kube-admin节点取key ceph auth print-key client.kube # stor05节点 virsh secret-set-value --secret 创建的secretID --base64 kube-admin节点取到的key virsh secret-get-value --secret 创建的secretID
这个是创建libvirt守护进程为与ceph集群通信认证的账号和密码
创建VM配置文件,一个接近最小化的配置如下所示,其中的disk配置段指明了要使用rbd image,而auth配置段指明了认证到ceph集群时使用secret的UUID,附带console和监听与对外通信地址上的vnc图形化界面,配置如下
vim testvm.xml <domain type='kvm'> <name>testvm</name> <memory>131072</memory> <currentMemory unit='KiB'>65536</currentMemory> <vcpu>1</vcpu> <os> <type arch='x86_64'>hvm</type> </os> <clock sync="localtime"/> <devices> <emulator>/usr/libexec/qemu-kvm</emulator> <disk type='network' device='disk'> <source protocol='rbd' name='kube/cirros'> # 存储池与镜像 <host name='mon01' port='6789'/> # ceph监视器 </source> <auth username='kube'> # 上面设置的用户名 <secret type='ceph' uuid='7384444b-3d69-44e8-9999-1f821cd9ca8c'/> # 使用 virsh secret-list查看 </auth> <target dev='vda' bus='virtio'/> </disk> <interface type='network'> <mac address='52:54:00:25:a1:80'/> # 避免冲突,每次利用这个文件都要任意修改一个值即可 <source network='default'/> <model type='virtio'/> </interface> <serial type='pty'> <target type='isa-serial' port='0'> <model name='isa-serial'/> </target> </serial> <console type='pty'> <target type='virtio' port='0'/> </console> <graphics type='vnc' port='-1' autoport='yes'> <listen type='address' address='0.0.0.0'/> </graphics> </devices> </domain>
将上述⽰例内容任意⼀个保存为xml⽂件后即可以之创建VM。例如,将第⼆个保存为testvm.xml,并使⽤如下命令完成VM创建:
virsh define testvm.xml virsh start testvm # 查看块设备域的列表 virsh domblklist testvm # 查看虚拟机的磁盘设备状态: virsh domblklist testvm Target Source da rbdpool/cirros-0.3.4
CephFS使用
创建存储池(ceph-admin节点)
ceph osd pool create cephfs-metadata 32 32 ceph osd pool create cephfs-data 64 64
激活cephfs存储池(ceph-admin节点)
ceph fs new cephfs cephfs-metadata cephfs-data # 查看状态 ceph fs status cephfs ceph mds stat
创建授权账号,给客户端使用(ceph-admin节点)
ceph auth get-or-create client.fsclient mon 'allow r' mds 'allow rw' osd 'allow rwx pool=cephfs-data' -o ceph.client.fsclient.keyring -o 指定保存的客户端key文件,这是一种方式,可以创建授权文件,再利用授权文件导出key保存给客户端使用 # 其实cat也是一样 ceph auth get client.fsclient cat ceph.client.fsclient.keyring # 单独获取key值 ceph auth print-key client.fsclient # 客户端key的第二种方式 ceph auth print-key client.fsclient > fsclient.key scp fsclient.key root@172.18.199.75:/etc/ceph/
客户端使用cephfs(stor05节点)
yum -y install epel-release yum -y install ceph-common # cephfs依赖ceph模块 modinfo ceph # 检查是否有上面授权给予的密钥key,如果密钥则无法使用相应的key ls /etc/ceph/ # 创建挂载点 mkdir /data # name不要加client前缀 mount -t ceph mon01:6789,mon02:6789:/ /data -o name=fsclient,secretfile=/etc/ceph/fsclient.key # 查看 mount # 查看文件系统类型 stat -f /data # 配置永久挂载 vim /etc/fstab mon01:6789,mon03:6789:/ /data ceph name=fsclient,secretfile=/etc/ceph/fsclient.key,_netdev,noatime 0 0 # _netdev作为网络传输挂载,不能访问时就不挂载 # noatime为了提示文件性能,不用实时访问时间戳
当内核不支持ceph模块时解决方法(stor05节点)
用户空间类型的文件系统
yum install ceph-fuse ceph-common -y # ceph-admin节点将生成的授权密钥复制过来 scp ceph.client.fsclient.keyring root@172.18.199.75:/etc/ceph ceph-fuse -n client.fsclient -m mon01:6789,mon02:6789 /data # 查看 mount # 配置永久挂载 vim /etc/fstab none /data fuse.ceph ceph.id=fsclient,ceph.conf=/etc/ceph/ceph.conf,_netdev,defaults 0 0 umount /data mount -a # 查看是否成功 mount
解决单个MDS问题
MDS:存放元数据的,如果挂了,哪cephfs就不可用了,而且容易瓶颈,默认使用动态子树分区
动态子树分区:子树分区和迁移的决策是一个同步过程,各MDS每10秒钟做一次独立的迁移决策,每个MDS并不存在一个一致的名称空间视图,且MDS集群也不存在一个全局调度器负责统一的调度决策
各MDS彼此通过交互心跳信息及负载状态来确定是否要进行迁移、如何分区名称空间,以及是否需要目录切分为子树等
Cephfs使用元数据日志来解决容错问题
# 拷贝本机配置文件统一 ceph-deploy --overwrite-conf config push mon01 mon02 mon03 stor04 # 由于受rank数量限制,会处于备用状态 ceph-deploy mds create mon01 mon03 # 可看到Standby MDS两个节点 ceph fs status ceph fs get cephfs
rank管理
一个MDS集群中可处于Active状态的MDS数量上限由max_mds参数配置,它控制着可用的rank数量,默认值为1
rank是指CephFS上可同时处于Active状态的MDS守护进程的可用编号,其范围从0到max_mds-1
一个rank编号意味着一个可承载CephFS层级文件系统目录子树元数据管理功能的Active状态的ceph-mds守护进程编制,max_mds的值为1时意味着仅有一个0号rank可用
刚启动的ceph-mds守护进程编制,max_mds的值为1时意味着仅有一个0号rank可用
刚启动的ceph-mds守护进程没有接管如何rank,它随后由MON按需进行分配
一个ceph-mds一次仅可占据一个rank,并且在守护进程终止时将其释放
一个rank可用处于下列三种状态中的某一种:
UP:rank已经由某个ceph-mds守护进程接管
Failed:rank未被如何ceph-mds守护进程接管
Damaged:rank处于损害状态
ceph fs set cephfs max_mds 2
# 当使用两个cephfs节点时,下面备用的MDS立马就补上去了,所以当中有cephfs挂时,不满足两个,会立马补上去实现高可用
ceph fs status
故障转移机制
出于冗余的目的,每个CephFS上都应该配置一定数量Standby状态的ceph-mds守护进程等着接替失效的rank,CephFS提供了四个选项用于控制Standby状态的MDS守护进程如何工作
mds_standby_replay:布尔型值,true表示当前MDS守护进程将持续读取某个特定的Up状态的rank的元数据日志,从而持有相关rank的元数据缓存,并在此rank失效时加速故障切换
一个Up状态的rank仅能拥有一个replay守护进程,多出的会被自动降级为正常的非replay型MDS
mds_standby_for_name:设置当前MDS进程仅备用于指定名称的rank
mds_standby_for_rank:设置当前MDS进程仅备用于指定的rank,它不会接替任何其它失效的rank,不过,在有多个CephFS的场景中,可联合使用下面的参数来指定为哪个文件系统的rank进行冗余
mds_standby_for_fscid:联合mds_strandy_for_rank参数的值协同生效
同时设置了mds_standby_for_rank:备用于指定fscid的指定rank
未设置mds_standby_for_rank时:备用于指定fscid的任意rank(推荐写法,因为智能)
MDS的配置段
[mds.a],[mds.b],...
vim /etc/ceph.conf ''''' [mds.mon01] mds_standby_for_fscid = cephfs # 最优配置 #mds_standby_for_name = mon02 #mds_standby_replay = true
RadosGW使用
Object Storage System = OSS
API
curl
bucket:存储桶的概念
三个基础概念
Users
Buckets
Objects
s3(亚马逊):User,Bucket,Object
Swift(OpenStack):Account(项目),User,Container,Object
RGW:tenant,user/subuser,backup,object
ACL(权限访问设置):read、write、readwrite、full-controller
创建rgw
ceph -s curl http://mon01:7480 # 创建一个rgw,覆盖对方配置文件 ceph-deploy --overwrite-conf rgw create mon02 curl http://mon02:7480 # 编辑配置文件使它们达到不同的配置效果 vim /etc/ceph.conf ''''' [client.rgw.mon01] rgw_host = mon01 rgw_frontends = "civetweb port=8080" [client.rgw.mon02] ceph-deploy --overwrite-conf config push mon{1,2,3} stor04 # 由于只对mon01发生了变动,配置文件也要修改变化,在mon01重启服务 systemctl restart ceph-radosgw@rgw.mon01
设置https(mon01节点)
mkdir /etc/ceph/ssl cd /etc/ceph/ssl # 生成自签证书 openssl genrsa -out civetweb.key 2048 openssl req -new -x509 -key civetweb.key -out civetweb.crt -days 3650 -subj "/CN=mon01.iliunx.io" # 由于ceph特性,需要将证书内容一起 cat civetweb.key civetweb.crt > civetweb.pem vim /etc/ceph/ceph.conf [client.rgw.mon01] rgw_host = mon01 rgw_frontends = "civetweb port=8443s ssl_certificate=/etc/ceph/ssl/civetweb.pem" systemctl restart ceph-radosgw@rgw.mon01
配置即是http也是https并配置日志(mon01节点)
vim /etc/ceph/ceph.conf [client.rgw.mon01] rgw_host = mon01 rgw_frontends = "civeweb port=7480+8443s ssl_certificate=/etc/ceph/ssl/civetweb.pem access_logfile=/var/log/access_ceph.log error_logfile=/var/log/error_ceph.log" systemctl restart ceph-radosgw@rgw.mon01
开启多线程(mon01节点)
默认是50个(num_threads)
vim /etc/ceph/ceph.conf [client.rgw.mon01] rgw_host = mon01 rgw_frontends = "civetweb port=7480+8443s ssl_certificate=/etc/ceph/ssl/civetweb.pem access_logfile=/var/log/access_ceph.log error_logfile=/var/log/error_ceph.log num_threads=2000" systemctl restart ceph-radosgw@rgw.mon01
配置DNS(mon01节点)
yum -y install bind vim /etc/named.conf // listen-on port 53 { 0.0.0.0; }; // listen-on-v6 port 53 { ::1; }; // allow-query {xxx} // dnssec-enable yes; // dnssec-validation yes; // bindkeys-file "/etc/named.isdlv.key"; vim /etc/named.rfc1912.zones .... zone "ilinux.io" IN { type master; file "ilinux.io.zone"; }; //zone "29.172.in-addr.arpa" IN { // type master; // file "172.29.zone"; //} cd /var/named/ cp named.localhost ilinux.io.zone vim ilinux.io.zone vi /var/named/ilinux.io.zone $TTL 600 ; 10 minutes @ IN SOA ns.ilinux.io. admin.ilinux.io. ( 2021031701 ; serial 10800 ; refresh (3 hours) 900 ; retry (15 minutes) 604800 ; expire (1 week) 86400 ) ; minimum (1 day) IN NS ns ns IN A 172.29.0.11 mon01 IN A 172.29.0.11 mon02 IN A 172.29.0.12 *.mon01 IN CNAME mon01 *.mon02 IN CNAME mon02 chown :named ilinux.io.zone # 将stor05当客户端 vim /etc/resolv.conf .... nameserver 172.29.0.11 yum install -y bind-utils host -t A mon01.ilinux.io host -t A images.mon01.ilinux.io # ceph-admin节点统一配置文件 vim /etc/ceph/ceph.conf [client.rgw.mon01] rgw_host = mon01 rgw_frontends = "civetweb port=7480" rgw_dns_name = mon01.ilinux.io [client.rgw.mon02] rgw_host = mon02 rgw_frontends = "civetweb port=7480 num_threads=500 request_timeout_ms=60000" rgw_dns_name = mon02.ilinux.io ceph-deploy --overwrite-conf config push mon0{1,2,3} stor04 # mon01重启服务 systemctl restart ceph-radosgw@rgw.mon01 # mon02重启服务 systemctl restart ceph-radosgw@rgw.mon02 # ceph-admin创建管理账号 radosgw-admin user create --uid="s3user" --display-name="S3 Testing User" 取出access key 备用 取出secret key 备用 # stor05访问接口 yum info s3cmd yum install -y s3cmd s3cmd --configure # 预设配置 rgw的access key rgw的secret key 区域默认,回车 mon01.ilinux.io:7480 s.mon01.ilinux.io:7480 回车 回车 No 回车 y y s3cmd mb s3://images s3cmd ls s3cmd put xier.jpg s3://images/webimgs/1.jpg s3cmd ls s3://images/webimgs/
dashboard与Prometheus监控(stor05节点)
ceph启用Dashboard模块
# can_run为true表示可使用的模块 ceph mgr module ls ceph mgr module enable dashboard
若使⽤http协议的Dashboard,需要设定禁⽤SSL功能:
默认是https,因为会涉及内部信息,为了安全,这里是关闭https,但是不建议
ceph config set mgr mgr/dashboard/ssl false
若使⽤https协议的Dashboard,需要以如下步骤⽣成证书及相关配置:
ceph dashboard create-self-signed-cert # 若需要⾃定义证书,则应该通过合适的⽅式获取到相关证书。例如,以如下⽅式运⾏命令⽣成⾃定义的证书: openssl req -new -nodes -x509 -subj "/O=IT/CN=ceph-mgr-dashboard" -days 3650 -keyout dashboard.key -out dashboard.crt -extensions v3_ca # ⽽后配置dashboard加载证书: ceph config-key set mgr mgr/dashboard/crt -i dashboard.crt ~]$ ceph config-key set mgr mgr/dashboard/key -i dashboard.key # 配置监听的地址和端⼝: ceph config set mgr mgr/dashboard/server_addr 0.0.0.0 ~]$ ceph config set mgr mgr/dashboard/server_port 8443
配置监听地址和端口
如果关闭了ssl模块,不要配置8443的https协议
ceph config set mgr mgr/dashboard/server_addr 0.0.0.0 ceph config set mgr mgr/dashboard/server_port 8443
也可以分别为每个mgr实例配置监听的地址和端口,将下面命令格式中的$name替换为mgr实例的名称即可
ceph config set mgr mgr/dashboard/$name/server_addr $IP ceph config set mgr mgr/dashboard/$name/server_port $PORT
范例
ceph config set mgr mgr/dashboard/mon03/server_addr 0.0.0.0 ceph config set mgr mgr/dashboard/mon03/server_port 8080 # 访问 http://mon03:8080
配置管理员认证信息,命令格式
ceph dashboard set-login-credentials <username> <password>
例如,为admin设置密码
ceph dashboard set-login-credentials admin xier123
查看mgr节点主机
ceph status # 访问 http://mon03:8080 使用创建的用户名与密码登录
Prometheus监控ceph
下载地址:https://prometheus.io/download/
创建运⾏Prometheus Server进程的系统⽤⼾,并为其创建家⽬录/var/lib/prometheus作为数据存储⽬录
useradd -r -m -d /var/lib/prometheus prometheus
下载并安装Prometheus Server,以2.7.2版为例
wget https://github.com/prometheus/prometheus/releases/download/v2.7.2/prometheus-2.7.2.linux-amd64.tar.gz tar xf prometheus-2.7.2.linux-amd64.tar.gz -C /usr/local/ cd /usr/local/ ln -sv prometheus-2.7.2.linux-amd64 prometheus
创建Unit File 创建Prometheus专⽤的Unit File,⽂件路径为/usr/lib/systemd/system/prometheus.service
vim /usr/lib/systemd/system/prometheus.service [Unit] Description=The Prometheus 2 monitoring system and time series database. Documentation=https://prometheus.io After=network.target [Service] EnvironmentFile=-/etc/sysconfig/prometheus User=prometheus ExecStart=/usr/local/prometheus/prometheus --storage.tsdb.path=/var/lib/prometheus --config.file=/usr/local/prometheus/prometheus.yml --web.listen-address=0.0.0.0:9090 --web.external-url= $PROM_EXTRA_ARGS Restart=on-failure StartLimitInterval=1 RestartSec=3 [Install] WantedBy=multi-user.target systemctl daemon-reload systemctl restart prometheus # 访问 http://$IP:9090
编辑配置⽂件 Prometheus的主配置⽂件为prometheus.yml,它主要由global、rule_fifiles、scrape_confifigs、alerting、remote_write和remote_read⼏个配置段组成:
global:全局配置段;
scrape_confifigs:scrape配置集合,⽤于定义监控的⽬标对象(target)的集合,以及描述如何抓取(scrape)相关指标数据的配置参数;通常,每个scrape配置对应于⼀个单独的作业(job),⽽每个targets可通过静态配置(static_confifigs)直接给出定义,也可基于Prometheus⽀持的服务发现机制进⾏⾃动配置;
alertmanager_confifigs:可由Prometheus使⽤的Alertmanager实例的集合,以及如何同这些Alertmanager交互的配置参数;每个Alertmanager可通过静态配置(static_confifigs)直接给出定义,也可基于Prometheus⽀持的服务发现机制进⾏⾃动配置;
remote_write:配置“远程写”机制,Prometheus需要将数据保存于外部的存储系统(例如InflfluxDB)时定义此配置段,随后Prometheus将样本数据通过HTTP协议发送给由URL指定适配器(Adaptor);
remote_read:配置“远程读”机制,Prometheus将接收到的查询请求交给由URL指定适配器(Adpater)执⾏,Adapter将请求条件转换为远程存储服务中的查询请求,并将获取的响应数据转换为Prometheus可⽤的格式;
部署监控工具node_exporter于ceph监控
下载地址:https://prometheus.io/download/
mon03来当做监控节点
wget https://github.com/prometheus/node_exporter/releases/download/v0.17.0/node_exporter-0.17.0.linux-amd64.tar.gz # 创建运⾏Prometheus Server进程的系统⽤⼾,并为其创建家⽬录/var/lib/prometheus作为数据存储⽬录。 useradd -r -m -d /var/lib/prometheus prometheus tar xf node_exporter-0.17.0.linux-amd64.tar.gz -C /usr/local/ ln -sv node_exporter-0.17.0.linux-amd64 node_exporter
创建Unit File(mon03与stor05)
vim /usr/lib/systemd/system/node_exporter.service [Unit] Description=Prometheus exporter for machine metrics, written in Go with pluggable metric collectors. Documentation=https://github.com/prometheus/node_exporter After=network.target [Service] EnvironmentFile=-/etc/sysconfig/node_exporter User=prometheus ExecStart=/usr/local/node_exporter/node_exporter $NODE_EXPORTER_OPTS Restart=on-failure StartLimitInterval=1 RestartSec=3 [Install] WantedBy=multi-user.target # 启动,查看有没有9100端口 systemctl start node_exporter.service # 配置设置好的node_exporter,在stor05节点中设置 vim /usr/local/prometheus/prometheus.yml '''' scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: "prometheus" # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ["localhost:9090"] - job_name: 'nodes' static_configs: - targets: ['stor04.xier.org:9100'] systemctl restart prometheus # 在web界面中点击status中的targets查看是否被发现 # dahboard的targets查看状态是否全启动成功,如果没成功,那么换启动方式 ./prometheus --config.file=/usr/local/prometheus/prometheus.yml &
启动服务
systemctl daemon-reload; systemctl start node_exporter.service # 查看是否有9100端口 curl localhost:9100/metrics
设定Ceph Mgr(ceph-admin)
Ceph Manager内置了众多模块,包括prometheus模块,⽤于直接输出Prometheus⻛格的指标数据
ceph mgr module enable prometheus Prometheus模块默认监听于TCP协议的9283端⼝
配置Prometheus Job(stro05节点)
修改Prometheus的配置⽂件,添加与Ceph相关的Job
vim /usr/local/prometheus/prometheus.yml ''' scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: "prometheus" # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ["localhost:9090"] - job_name: 'nodes' static_configs: - targets: ['stor04.xier.org:9100'] - job_name: 'ceph' static_configs: - targets: ["mon03.xier.org:9283"] systemctl restart prometheus # 在web主页面中查看是否有ceph开头的数据选项
发现没有ceph数据,由于启动问题,换一种启动方式即可
systemctl stop prometheus cd /usr/local/prometheus ./prometheus --config.file=/usr/local/prometheus/prometheus.yml &
部署grafana监控页面(stor05节点)
下载并启动,监听3000端口
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-8.3.3-1.x86_64.rpm yum install grafana-enterprise-8.3.3-1.x86_64.rpm -y systemctl start grafana-server # 访问http://$IP:3000
CRUSH运行图
Cluster Map
Monitor Map:监视器运行图
OSD Map:磁盘运行图
PG:PG运行图
CRUSH Map:CRUSH运行图。存储设备列表、故障域树状结构,存储数据时如何利用树状结构的规则
MDS Map:MDS运行图
有效无环图
ceph osd getcrushmap -h
导出的运行图默认是二进制数据(任意ceph集群节点)
ceph osd getcrushmap -o /tmp/mycrushmap.bin
将二进制反编译为人类可读的语言(任意ceph集群节点)
crushtool -d /tmp/mycrushmap.bin -o ./mycrushmap.txt
配置参数
vim mycrushmap.txt ''''
配置完成后反编译为二进制文件
crushtool -c mycrushmap.txt -o mycrushmap-v2.bin
注入回集群
# 先测试 ceph osd setcrushmap -i mycrushmap-v2.bin
rbd存储卷
创建rbd相关的存储池,并创建测试使用image(ceph-admin节点)
ceph osd pool create kube 64 64 ceph osd pool application enable kube rbd pool init -p kube rbd create rbddata/podimg01 --size 2Gi
创建拥有访问相关存储池权限的用户账号(ceph-admin节点)
ceph auth get-or-create client.k8s mon 'allow r' osd 'allow * pool=kube'
保存相关用户的信息至一文件中,并复制到k8s集群中的各节点(ceph-admin节点)
ceph auth get client.k8s -o ceph.client.kube.keyring scp ceph.client.kube.keyring ceph.conf k8s的所有节点
到k8s集群全部节点使用rbd命令,以k8s用户身材测试访问rbd image (k8s集群所有节点)
rpm -ivh https://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch/ceph-release-1-1.el7.noarch.rpm yum install -y epel-release yum install -y ceph-common rbd --user kube -p kube ls rbd showmapped
所有节点自己配置hosts解析
部署yaml(master01)
mkdir /manifests; cd /manifests vim pod-with-rbd-vol.yaml apiVersion: v1 kind: Pod metadata: name: pod-with-rbd-vol spec: containers: - image: busybox name: busybox imagePullPolicy: IfNotPresent command: ["/bin/sh","-c","sleep 84600"] volumeMounts: - name: rbdimg rbd: monitors: - '172.29.0.11:6789' - '172.29.0.12:6789' - '172.29.0.13:6789' pool: kube image: podimg01 fsType: ext4 readOnly: false user: kube keyring: /etc/ceph/ceph.client.kube.keyring # 如果报错,那么执行 rbd feature disable kube/podimg01 object-map fast-diff deep-flatten
# ceph-admin创建第二个镜像。因为锁的特性,不能使用同一个镜像 rbd create kube/podimg02 rbd feature disable kube/podimg02 object-map fast-diff deep-flatten # k8s01使用secret的方法部署 vim ceph-secret.yaml apiVersion: v1 kind: Secret metadata: name: ceph-kube-secret type: "kubernetes.io/rbd" data: key: xxxxxxxxxxxxxx # 在ceph-admin节点使用 ceph auth print-key client.kube | base64 得到 spec: containers: - image: busybox name: busybox imagePullPolicy: IfNotPresent command: ["/bin/sh","-c","sleep 84600"] volumeMounts: - name: rbdimg rbd: monitors: - '172.29.0.11:6789' - '172.29.0.12:6789' - '172.29.0.13:6789' pool: kube image: podimg01 fsType: ext4 readOnly: false user: kube secretRef: name: ceph-kube-secret # 查看镜像信息 rbd ls -p kube -l # 到调度的rbd节点查看挂载情况 rbd showmapped
动态存储卷供给
vim sc-rbd.yaml apiVersion: v1 kind: Secret metadata: name: ceph-admin-secret namespace: kube-system type: "kubernetes.io/rbd" data: key: xxxxxxxxxxxxxx # 在ceph-admin节点使用 ceph auth print-key client.kube | base64 得到 --- apiVersion: v1 kind: Secret name: ceph-kube-secret namespace: default type: "kubernetes.io/rbd" data: key: xxxxxxxxxxxxxx # 在ceph-admin节点使用 ceph auth print-key client.admin | base64 得到 --- apiVersion: storage.k8s.io/v1beta1 kind: StorageClass metadata: name: rbd-dynamic annotations: storageclass.beta.kubernetes.io/is-default-class: "true" provisioner: kubernetes.io/rbd parameters: monitors: 172.29.0.11:6789,172.29.0.12:6789,172.29.0.13:6789 adminId: admin adminSecretName: ceph-admin-secret adminSecretNamespace: kube-system pool: kube userId: kube userSecretName: ceph-kube-secret reclaimPolicy: Retain
vim pvc-claim.yaml kind: PersistenVolumeClaim apiVersion: v1 metadata: name: rbd-claim spec: storageClassName: rbd-dynamic accessModes: - ReadWriteOnce resouces: requests: storage: 2Gi # 到ceph-admin验证是否会生成镜像 rbd ls -p kube
ceph集群部署在k8s中(rook)
官方地址:https://www.rook.io/
git clone https://github.com/rook/rook.git cd cluster/examples/kubernetes/ceph kubectl create -f operator.yaml kubectl get ns vim cluster.yaml ''' image: ceph/ceph:v13.2.4-20190109 storage: useAllNodes: false #directories: #- path: /var/lib/rook nodes: - name: "k8s-node03.ilinux.io" deviceFilter: "^vd[^a]" - name: "k8s-node04.ilinux.io" deviceFilter: "^vd[^a]" - name: "k8s-node05.ilinux.io" deviceFilter: "^vd[^a]" kubectl apply -f cluster.yaml
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)