Ceph案例

举报
小源博客 发表于 2023/04/11 12:31:19 2023/04/11
【摘要】 存储设备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


安装部署

  • 下载地址:https://mirrors.aliyun.com/ceph/

  • 为了安全起见,使用普通用户进行部署,并配置普通用户能使用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集群


  1. 首先在管理节点上以cephadm用户创建集群相关的配置文件目录(ceph-admin节点)

su - cephadm
​
mkdir ceph-cluster
​
cd ceph-cluster


  1. 初始化第一个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


  1. 编辑生成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     # 只需要公共网络的地址即可,不参与集群内部的事务,所以不需要集群网络


  1. 安装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


  1. 配置初始MON节点,并收集所有密钥(ceph-admin节点)

su - cephadm
​
cd ceph-cluster
​
# 不用配置主机,会根据配置文件完成
ceph-deploy mon create-initial


  1. 把配置文件和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


  1. 配置Manager节点,启动ceph-mgr进程(ceph-admin节点)

ceph-deploy mgr create mon03


  1. 在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监控

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





k8s使用ceph集群

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)

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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。