目录
测试使用的Ceph存储集群可由一个MON主机及两个以上的OSD机组成,这些主机可以是物理服务器,也可以运行于vmware、virtualbox或kvm等虚拟化平台上的虚拟机,甚至是公有云上的VPS主机。
本测试环境将由stor01、stor02、stor03和ceph-admin四个独立的主机组成,其中stor01、stor02和stor03是为Ceph存储集群节点,它们分别作为MON节点和OSD节点,各自拥有专用于存储数据的磁盘设备/dev/vdb和/dev/vdc,操作系统环境均为CentOS 7.5 1804。而ceph-admin主机是为管理节点,用于部署ceph-deploy。
主机地址 | 主机名称 | 主机角色 |
---|---|---|
172.20.0.59 | ceph-admin. | admin |
172.20.0.55 | zhc-app-cephfs-dev-01 | mon, osd, mgr, mds |
172.20.0.56 | zhc-app-cephfs-dev-02 | mon, osd, mgr |
172.20.0.57 | zhc-app-cephfs-dev-03 | mon, osd, rgw |
此外,各主机需要预设的系统环境如下:
- ~]# systemctl start chronyd.service
- ~]# systemctl enable chronyd.service
不过,建议用户配置使用本地的的时间服务器,在节点数量众多时尤其如此。存在可用的本地时间服务器时,修改节点的/etc/chrony.conf配置文件,并将时间服务器指向相应的主机即可,配置格式如下:
- 172.20.0.55 zhc-app-cephfs-dev-01 stor01 mon01 mds01
- 172.20.0.56 zhc-app-cephfs-dev-02 stor02 mon02 mgr01
- 172.20.0.57 zhc-app-cephfs-dev-03 stor03 mon03 mgr02
- 172.20.0.59 zhc-harbor-ceph-test-01 ceph-admin
在CentOS7上,iptables或firewalld服务通常只会安装并启动一种,在不确认具体启动状态的前提下,这里通过同时关闭并禁用二者即可简单达到设定目标。
- systemctl stop firewalld.service
- systemctl stop iptables.service
- systemctl disable firewalld.service
- systemctl disable iptables.service
若当前启用了SELinux,则需要编辑/etc/sysconfig/selinux文件,禁用SELinux,并临时设置其当前状态为permissive:
- ~]# sed -i 's@^\(SELINUX=\).*@\1disabled@' /etc/sysconfig/selinux
- ~]# setenforce 0
Ceph官方的仓库路径为http://download.ceph.com/
目前主流版本相关的程序包都在提供,包括kraken、luminous和mimic等,它们分别位于rpm-mimic等一类的目录中。直接安装程序包即可生成相关的yum仓库相关的配置文件,程序包位于相关版本的noarch目录下,例如rpm-mimic/el7/noarch/ceph-release-1-1.el7.noarch.rpm是为负责生成适用于部署mimic版本Ceph的yum仓库配置文件,因此直接在线安装此程序包,也能直接生成yum仓库的相关配置。
~]# rpm -ivh https://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch/ceph-release-1-1.el7.noarch.rpm
部署工具ceph-deploy 必须以普通用户登录到Ceph集群的各目标节点,且此用户需要拥有无密码使用sudo命令的权限,以便在安装软件及生成配置文件的过程中无需中断配置过程。不过,较新版的ceph-deploy也支持用 ”–username“ 选项提供可无密码使用sudo命令的用户名(包括 root ,但不建议这样做)。
另外,使用”ceph-deploy –username {username} “命令时,指定的用户需要能够通过SSH协议自动认证并连接到各Ceph节点,以免ceph-deploy命令在配置中途需要用户输入密码。
- ~]# useradd cephadm
- ~]# echo "test" | passwd --stdin cephadm
- ~]# echo "cephadm ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephadm
- ~]# chmod 0440 /etc/sudoers.d/cephadm
ceph-deploy命令不支持运行中途的密码输入,因此,必须在管理节点(zhc-harbor-ceph-test-01)上生成SSH密钥并将其公钥分发至Ceph集群的各节点上。下面直接以cephadm用户的身份生成SSH密钥对:
~]$ ssh-keygen -t rsa -P ""
- ~]$ ssh-copy-id -i .ssh/id_rsa.pub cephadm@stor01
- ~]$ ssh-copy-id -i .ssh/id_rsa.pub cephadm@stor02
- ~]$ ssh-copy-id -i .ssh/id_rsa.pub cephadm@stor03
另外,为了后续操作之便,建议修改管理节点上cephadm用户的 ~/.ssh/config 文件,设定其访问Ceph集群各节点时默认使用的用户名为,从而避免每次执行ceph-deploy命令时都要指定 使用”–username“选项设置使用的用户名。文件内容示例如下所示:
Ceph存储集群的部署的过程可通过管理节点使用ceph-deploy全程进行,这里首先在管理节点安装ceph-deploy及其依赖到的程序包:
很多时候会有无法yum安装以下提供安装方式
阿里源
配置地址: https://mirrors.aliyun.com/ceph/?spm=a2c6h.13651104.0.0.356c7dd16zzbHB
- #设置key检验的地址
- export CEPH_DEPLOY_GPG_URL=https://mirrors.aliyun.com/ceph/keys/release.asc
- #设置安装的版本
- export CEPH_DEPLOY_REPO_URL=https://mirrors.aliyun.com/ceph/rpm-mimic/el7
执行安装
- [root@ceph-admin ~]# yum update
- [root@ceph-admin ~]# yum install ceph-deploy python-setuptools python2-subprocess32
- ~]$ mkdir ceph-cluster
- ~]$ cd ceph-cluster
初始化第一个MON节点的命令格式为”ceph-deploy new {initial-monitor-node(s)}“,本示例中,stor01即为第一个MON节点名称,其名称必须与节点当前实际使用的主机名称保存一致。运行如下命令即可生成初始配置:
[cephadm@ceph-admin ceph-cluster]$ ceph-deploy new stor01
public network = 172.20.0.0/16
ceph-deploy命令能够以远程的方式连入Ceph集群各节点完成程序包安装等操作,命令格式如下:
ceph-deploy install {ceph-node} [{ceph-node} ...]
[cephadm@ceph-admin ceph-cluster]$ ceph-deploy install stor01 stor02 stor03
rpm包下载地址 : http://download.ceph.com/rpm-mimic/el7/x86_64/
- ~]# yum install -y https://download.ceph.com/rpm-mimic/el7/noarch/ceph-release-1-0.el7.noarch.rpm
- ~]# yum install ceph ceph-radosgw
[cephadm@ceph-admin ceph-cluster]$ ceph-deploy mon create-initial
报错解决
在各个节点上执行sudo pkill ceph,然后再在deploy节点执行ceph-deploy mon create-initial
- [cephadm@zhc-netmis-k8s-master-01 ceph-cluster]$ vim ceph.conf
-
- [global]
- fsid = 4c1783cb-b1d9-4204-8874-b4f5ae74ac2f
- mon_initial_members = zhc-netmis-k8s-ceph-01
- mon_host = 172.16.128.25
- auth_cluster_required = cephx
- auth_service_required = cephx
- auth_client_required = cephx
- public network = 172.16.128.0/24 #指定public 网络检查网段是否正确
- osd pool default size = 2 # 修改的副本数
- cluster network = 1.1.1.0/24 # 指定cluster 网络(需要则加)
- mon_allow_pool_delete = true # 允许删除pool, 需要重启monitor
-
- #推送新的配置文件到各个节点
- ceph-deploy --overwrite-conf config push ceph01 ceph02 ceph03
[cephadm@ceph-admin ceph-cluster]$ ceph-deploy admin stor01 stor02 stor03
而后在Ceph集群中需要运行ceph命令的的节点上(或所有节点上)以root用户的身份设定用户cephadm能够读取/etc/ceph/ceph.client.admin.keyring文件:
~]$ setfacl -m u:cephadm:r /etc/ceph/ceph.client.admin.keyring
[cephadm@ceph-admin ceph-cluster]$ ceph-deploy mgr create stor01
- [cephadm@stor01 ~]$ ceph health
- HEALTH_OK
- [cephadm@stor01 ~]$ ceph -s
- cluster:
- id: fc5b806d-3b43-41f1-974a-c07468b9d9ff
- health: HEALTH_OK
-
- services:
- mon: 1 daemons, quorum stor01
- mgr: stor01(active)
- osd: 0 osds: 0 up, 0 in
-
- data:
- pools: 0 pools, 0 pgs
- objects: 0 objects, 0 B
- usage: 0 B used, 0 B / 0 B avail
- pgs:
1.3.2.1 列出并擦净磁盘
ceph-deploy disk 命令可以检查并列出OSD节点上所有可用的磁盘的相关信息:
[cephadm@ceph-admin ceph-cluster]$ ceph-deploy disk list stor01 stor02 stor03
而后,在管理节点上使用ceph-deploy命令擦除计划专用于OSD磁盘上的所有分区表和数据以便用于OSD,命令格式为”ceph-deploy disk zap {osd-server-name} {disk-name}“,需要注意的是此步会清除目标设备上的所有数据。下面分别擦净stor01、stor02和stor03上用于OSD的一个磁盘设备vdb:
- [cephadm@ceph-admin ceph-cluster]$ ceph-deploy disk zap stor01 /dev/vdb
- [cephadm@ceph-admin ceph-cluster]$ ceph-deploy disk zap stor02 /dev/vdb
- [cephadm@ceph-admin ceph-cluster]$ ceph-deploy disk zap stor03 /dev/vdb
1.3.2.2 添加OSD
早期版本的ceph-deploy命令支持在将添加OSD的过程分为两个步骤:准备OSD和激活OSD,但新版本中,此种操作方式已经被废除,添加OSD的步骤只能由命令”ceph-deploy osd create {node} –data {data-disk}“一次完成,默认使用的存储引擎为bluestore。
- [cephadm@ceph-admin ceph-cluster]$ ceph-deploy osd create stor01 --data /dev/vdb
- [cephadm@ceph-admin ceph-cluster]$ ceph-deploy osd create stor02 --data /dev/vdb
- [cephadm@ceph-admin ceph-cluster]$ ceph-deploy osd create stor03 --data /dev/vdb
[cephadm@ceph-admin ceph-cluster]$ ceph-deploy osd list stor01 stor02 stor03
- ~]$ ceph osd stat
- 3 osds: 3 up, 3 in; epoch: e15
- ~]$ ceph osd dump
- ~]$ ceph osd ls
Ceph集群中的一个OSD通常对应于一个设备,且运行于专用的守护进程。在某OSD设备出现故障,或管理员出于管理之需确实要移除特定的OSD设备时,需要先停止相关的守护进程,而后再进行移除操作。对于Luminous及其之后的版本来说,停止和移除命令的格式分别如下所示:
- #正常优雅的删除osd方式
- #1.需要把这个osd的权重设置为0然后设置成out
-
- #2.关闭运行的osd
- systemctl stop ceph-osd@{osdID}
-
- #3.crush算法中删除你要踢出集群的osd
- ceph osd crush remove {name}
-
- #4.删除osd对应的用户
- ceph auth list
- ceph auth del user
-
- #5.移除OSD的认证key
- ceph auth del osd.{osd-num}
-
- #6.从集群中移除osd
- ceph osd rm {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}
存取数据时,客户端必须首先连接至RADOS集群上某存储池,而后根据对象名称由相关的CRUSH规则完成数据对象寻址。于是,为了测试集群的数据存取功能,这里首先创建一个用于测试的存储池mypool,并设定其PG数量为16个。
- ~]$ ceph osd pool create mypool 16
- pool 'mypool' created
- ~]$ rados put issue /etc/issue --pool=mypool
- ~]$ rados ls --pool=mypool
- ~]$ ceph osd map mypool issue
- osdmap e26 pool 'mypool' (1) object 'issue' -> pg 1.651f88da (1.a) -> up ([2,1,0], p2) acting ([2,1,0], p2)
~]$ rados rm issue --pool=mypool
~]$ ceph osd pool rm mypool mypool --yes-i-really-really-mean-it
Ceph存储集群需要至少运行一个Ceph Monitor和一个Ceph Manager,生产环境中,为了实现高可用性,Ceph存储集群通常运行多个监视器,以免单监视器整个存储集群崩溃。Ceph使用Paxos算法,该算法需要半数以上的监视器(大于n/2,其中n为总监视器数量)才能形成法定人数。尽管此非必需,但奇数个监视器往往更好。
- [cephadm@ceph-admin ceph-cluster]$ ceph-deploy mon add stor02
- [cephadm@ceph-admin ceph-cluster]$ ceph-deploy mon add stor03
-
- #查看monitor票数
- ceph daemon mon.id quorum_status
-
-
- #设置完成后,可以在ceph客户端上查看监视器及法定人数的相关状态:
-
- ~]$ ceph quorum_status --format json-pretty
-
- {
- "election_epoch": 12,
- "quorum": [
- 0,
- 1,
- 2
- ],
- "quorum_names": [
- "stor01",
- "stor02",
- "stor03"
- ],
- "quorum_leader_name": "stor01",
- "monmap": {
- "epoch": 3,
- ……
- },
- "mons": [
- {
- "rank": 0,
- "name": "stor01",
- "addr": "172.20.0.55:6789/0",
- "public_addr": "172.20.0.55:6789/0"
- },
- {
- "rank": 1,
- "name": "stor02",
- "addr": "172.20.0.56:6789/0",
- "public_addr": "172.20.0.56:6789/0"
- },
- {
- "rank": 2,
- "name": "stor03",
- "addr": "172.20.0.57:6789/0",
- "public_addr": "172.20.0.57:6789/0"
- }
- ]
- }
- }
- #停止monitor进程
- systemctl stop ceph-mon@serverc
- #删除monitor
- ceph mon remove serverc
- #删除monitor文件
- rm /var/lib/ceph/mon/ceph-serverc
Ceph Manager守护进程以“Active/Standby”模式运行,部署其它ceph-mgr守护程序可确保在Active节点或其上的ceph-mgr守护进程故障时,其中的一个Standby实例可以在不中断服务的情况下接管其任务。
- [cephadm@ceph-admin ceph-cluster]$ ceph-deploy mgr create stor02
-
-
- 添加完成后,“ceph -s”命令的services一段中会输出相关信息:
-
- ~]$ ceph -s
- cluster:
- id: fc5b806d-3b43-41f1-974a-c07468b9d9ff
- health: HEALTH_OK
-
- services:
- mon: 3 daemons, quorum stor01,stor02,stor03
- mgr: stor01(active), standbys: stor02
- osd: 3 osds: 3 up, 3 in
Ceph块设备,也称为RADOS块设备(简称RBD),是一种基于RADOS存储系统支持超配(thin-provisioned)、可伸缩的条带化数据存储系统,它通过librbd库与OSD进行交互。RBD为KVM等虚拟化技术和云OS(如OpenStack和CloudStack)提供高性能和无限可扩展性的存储后端,这些系统依赖于libvirt和QEMU实用程序与RBD进行集成。
- ~]$ ceph osd pool create rbddata 64
- ~]$ ceph osd pool application enable rbddata rbd
- ~]$ rbd pool init -p rbddata
~]$ rbd create image-01 --size 1024 --pool rbddata01
- ~]$ rbd --image image-01 --pool rbddata01 info
- rbd image 'image-01':
- size 1 GiB in 256 objects
- order 22 (4 MiB objects)
- id: 14016b8b4567
- block_name_prefix: rbd_data.14016b8b4567
- format: 2
- features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
- op_features:
- flags:
- create_timestamp: Wed Nov 6 11:30:03 2019
-
- # 查看在该块设备上创建的镜像
- ~]$ rbd ls -p rbddata01
- image-01
RGW并非必须的接口,仅在需要用到与S3和Swift兼容的RESTful接口时才需要部署RGW实例,相关的命令为“ceph-deploy rgw create {gateway-node}”。例如,下面的命令用于把stor03部署为rgw主机:
- [cephadm@ceph-admin ceph-cluster]$ ceph-deploy rgw create stor03
-
- #添加完成后,“ceph -s”命令的services一段中会输出相关信息:
-
- ~]$ ceph -s
- cluster:
- id: fc5b806d-3b43-41f1-974a-c07468b9d9ff
- health: HEALTH_OK
-
- services:
- mon: 3 daemons, quorum stor01,stor02,stor03
- mgr: stor01(active), standbys: stor02
- osd: 3 osds: 3 up, 3 in
- **rgw: 1 daemon active**
- [client]
- rgw_frontends = "civetweb port=8080"
~]# systemctl status ceph-radosgw@rgw.stor03
- ~]$ ceph osd pool ls
- .rgw.root
- default.rgw.control
- default.rgw.meta
- default.rgw.log
CephFS需要至少运行一个元数据服务器(MDS)守护进程(ceph-mds),此进程管理与CephFS上存储的文件相关的元数据,并协调对Ceph存储集群的访问。因此,若要使用CephFS接口,需要在存储集群中至少部署一个MDS实例。“ceph-deploy mds create {ceph-node}”命令可以完成此功能,例如,在stor01上启用MDS:
[cephadm@ceph-admin ceph-cluster]$ ceph-deploy mds create stor01
- ~]$ ceph mds stat
- , 1 up:standby
- ~]$ ceph osd pool create cephfs-metadata 64
- ~]$ ceph osd pool create cephfs-data 64
- ~]$ ceph fs new cephfs cephfs-metadata cephfs-data
~]$ ceph fs status cephfs
- ~]$ ceph mds stat
- cephfs-1/1/1 up {0=stor01=up:active}
进行相应的授权创建用户信息
- #key和用户名需要单独的存放
- cephadm@zhc-app-cephfs-dev-01:~$ ceph auth get-or-create client.fsclient mon 'allow r' mds 'allow rw' osd 'allow rwx pool=cephfs-data' -o ceph.client.fsclient.keyring
- cephadm@zhc-app-cephfs-dev-01:~$ ceph auth get client.fsclient
- exported keyring for client.fsclient
- [client.fsclient]
- key = AQA9hrpdM+sEHhAARBLjQMR+WYRkYugAur+CjA==
- caps mds = "allow rw"
- caps mon = "allow r"
- caps osd = "allow rwx pool=cephfs-data"
- #查看key
- 方式一: ceph-authtool -p -n client.fsclient ceph.client.fsclient.keyring
- 方式二: ceph auth print-key client.fsclient
- #获取到的key保存fsclient.key提供给客户端使用的
- ceph auth print-key client.fsclient > fsclient.key
客户端要使用要确保内核中用ceph的模块才能够使用
客户端内核挂载
指基于FUSE(FUSE全称是Filesystem in Userspace即用户空间文件系统,是指完全在用户态实现的文件系统,由Linux在内核模块进行支持。通常文件系统作为操作系统的重要组成部分在内核中实现,但缺点是内核态的代码难以调试,特别是一些新兴的网络文件系统更新换代较快的情况下。为了解决上述问题,Linux在2.6.14内核版本开始增加FUSE模块来实现文件系统在用户态的适配)的用户态接口,通过ceph-fuse命令将CephFS挂载到操作系统指定目录下。
- #创建挂载节点
- mkdir /data-harbor
- #挂载指明用户密码/mon可以多个
- mount -t ceph [mon:6789]:/ /data-harbor -o name=name,secretfile=/path
- #查看下挂载信息
- mount/df -h
- #查看下文件系统类型
- stat -f /data-harbor
- #配置开机自动挂载/etc/fstab
- #远端挂载点 #目的挂载点 #文件格式 #参数选项 #超时跳过
- mon:6789,mon1:6789 /habor-data ceph name=fsclient,secretfile=/path,_netdev,noatime 0 0
- mount -a
挂载中遇见的问题
Ceph Luminous CRUSH map 400000000000000 问题
客户端用户态挂载
- #安装程序包
- yum/apt install -y fuse
- #挂载ceph,mon可以一个可多个
- ceph-fuse -n client.fsclient -m mon01:6789,mon02:6789 /path
- #需要将在管理端的生产的秘钥发送到Client的/etc/ceph下,例如
- ceph.client.fsclient.keyring
- #开机自动挂载方式
- none /path fuse.ceph ceph.id=fsclient,ceph.conf=/path,_netdev,defaults 0 0
问题一
描述cephfs的MDS写入报慢查询且无法正常执行解决办法
根据mgr位置查看MDS详细信息
ceph --admin-daemon /var/run/ceph/ceph-mds.ceph03.asok dump_ops_in_flight
- #新建mds很简单
- ceph-deploy mds create nodename
增加Active MDS的数量
- #命令
- ceph fs set <fsname> max_mds <number>
减少Active MDS的数量
ceph mds deactivate {System:rank|FSID:rank|rank}
查询变动后的mds值
- ceph status <fsname>
- ceph fs get <fsname>
出于冗余的目的,每一个CephFS上都应该配置一定数量的Standby状态的Ceph-mds守护进程等着接替故障的失效的Rank,CephFS提供了四个选项用于控制Standby状态的MDS守护进程如何工作
- #配置方式 -> /etc/ceph/ceph.conf
- [mds.ceph01]
- mds_standby_fro_fscid = ceph-harbor
- mds_standby_fro_name = ceph03
- mds_standby_replay = true
Ceph启⽤Dashboard V2
启⽤相关的模块
若使⽤https协议的Dashboard V2,需要以如下步骤⽣成证书及相关配置:
Dashboard要通过https协议提供服务。管理员可配置其使⽤⾃动⽣成的⾃签证书,也可以为其提供⾃定义的证书
⽂件,⼆者先其⼀即可。⽽后通过相关节点的地址和端⼝访问服务。
- ceph mgr module enable dashboard
-
- #若使⽤http协议的Dashboard V2,需要设定禁⽤SSL功能:
- ceph config set mgr mgr/dashboard/ssl false
-
- #若需要使⽤⾃签证书,运⾏如下命令⽣成⾃动⽣成证书即可
- 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
-
- #也可以分别为每个mgr实例配置监听的地址和端⼝,将下⾯命令格式中的$name替换为mgr实例的名称即可
- ceph config set mgr mgr/dashboard/$name/server_addr $IP
- ceph config set mgr mgr/dashboard/$name/server_port $PORT
-
- #确认配置的结果:
- ceph mgr services { "dashboard": "https://0.0.0.0:8443/" }
-
- #重新启⽤Dashboard V2
- ceph mgr module disable dashboard
- ceph mgr module enable dashboard
-
- #配置管理员认证信息,命令格式:
- ceph dashboard set-login-credentials <username> <password>
-
- #为admin设置密码:
- ceph dashboard set-login-credentials admin [passwd]
-
- #查看mgr节点主机
- ceph status
- 1.输出信息
- 2.集群ID
- 3.集群运行状况
- 4.监视器地图版本号和监视器仲裁的状态
- 5.OSD地图版本号和OSD的状态
- 6.归置组地图版本
- 7.归置组和存储池数量
- 8.所存储数据理论上的数量和所存储对象的数量
- 9.所存储数据的总量
192 pgs: 192 active+clean; 29 GiB data, 95 GiB used, 1.4 TiB / 1.5 TiB avail
- pool cephfs-metadata id 1
- nothing is going on
-
- pool cephfs-data id 2
- nothing is going on
-
- pool rbddata01 id 3
- nothing is going on
- # 简介
- 输出两段内容:GLOBAL和POOLS
- ·GLOBAL:存储量概览
- ·POOLS:存储池列表和每个存储池的理论用量,但出不反映副本、克隆数据或快照
- GLOBAL段
- ·SIZE:集群的整体存储容量
- ·AVAILL:集群中可以使用的可用空间容量
- ·RAWUSED:已用的原始存储量
- ·%RAWUSED:已用的原始存储百分比。将此数字与full ratio和near full ratio搭配使”,可确保您不会用完集群的容量。
-
- #实际数值
- GLOBAL:
- SIZE AVAIL RAW USED %RAW USED
- 1.5 TiB 1.4 TiB 95 GiB 6.34
- POOLS:
- NAME ID USED %USED MAX AVAIL OBJECTS
- cephfs-metadata 1 160 MiB 0.04 443 GiB 80
- cephfs-data 2 29 GiB 6.06 443 GiB 19309
- rbddata01 3 133 B 0 443 GiB 5
ceph osd dump #输出完整的详细信息
ceph osd tree #还可以根据OSD在CRUSH地图中的位置查看OSD
Ceph将列显CRUSH树及主机、它的OSD、OSD是否已启动及其权重
集群中存在多个Mon主机时,应该在启动集群之后读取或写入数据之前检查Mon的仲裁状态;事实上,管理员也应该定期检查这种仲裁结果
显示仲裁状态:ceph quorum_status
ceph osd tree #还可以根据OSD在CRUSH地图中的位置查看OSD
Ceph的管理套接字接口常用于查询守护进程
1.套接字默认保存于/var/run/ceph目录
2.此接口的使用不能以远程方式进程
- ceph --admin-daemon/var/run/ceph/socker-name
- #获取使用帮助:ceph--admin-daemon/var/run/ceph/socket-name help
-
- #例子
- ceph --admin-daemon /var/run/ceph/ceph-mgr.zhc-harbor-ceph-test-01.asok status
- {
- "metadata": {},
- "dentry_count": 0,
- "dentry_pinned_count": 0,
- "id": 0,
- "inst": {
- "name": {
- "type": "mgr",
- "num": 4419
- },
- "addr": {
- "nonce": 382839,
- "addr": "10.200.10.145:0"
- }
- },
- "inst_str": "mgr.4419 10.200.10.145:0/382839",
- "addr_str": "10.200.10.145:0/382839",
- "inode_count": 0,
- "mds_epoch": 0,
- "osd_epoch": 23,
- "osd_epoch_barrier": 0,
- "blacklisted": false
- }
启动
- Ceph Monitor
- Ceph Manager
- Ceph OSD
- 元数据服务器
- 网关,例如NFS Ganesha或对象网关
- 存储客户端
-
命令:ceph osd unset noout
停止
命令:ceph osd set noout
Ceph配置文件结构叙述
配置文件可以在启动时配置Ceph存储群集中的所有Ceph守护程序或特定类型的所有Ceph守护程序。
Ceph配置文件使用ini样式语法。 Ceph配置默认以(# ;)来表示注释
可以为守护程序的特定实例指定设置。可以通过输入实例类型(以句点(。)和实例ID分隔)来指定实例。
Ceph OSD守护程序的实例ID始终为数字,但对于Ceph监视器,它可以为字母数字。
要配置一系列守护程序,必须将这些设置包括在将接收配置的过程中,如下所示:
2、[osd]:影响Ceph存储集群中的所有ceph-osd守护进程,并覆盖[global]中的相同设置
3、[mon]:影响Ceph存储集群中的所有ceph-mon守护进程,并覆盖[global]中的相同设置
4、[client]:影响所有Ceph客户端(例如,已安装的Ceph块设备,Ceph对象网关等)
默认配置文件读取的位置
- $CEPH CONF(SCEPH CONF环境变量后的路径)
-
- -c路径/路径(-c命令行参数)
-
- /etc/ceph/ceph.conf
-
- 〜/.ceph/配置
-
- ./ceph.conf(在当前工作目录中)
-
元变量
在配置值中设置了元变量时,Ceph会将其扩展为具体值。
在[globall,[osd],[mon]或Ceph配置文件的[client]部分。
但是,也可以将它们与管理套接字一起使用。Ceph元变量类似于Bash shell扩展。
常用的元参数
- Scluster:当前Ceph集群的名称
-
- Stype:当前服务的类型名称,可能会展开为osd或mon
-
- Sid:进程的标识符,例如对osd.0来说,其标识符为0
-
- Shost:守护进程所在主机的主机名
-
- Sname:其值为$type.$id
RADOS存储集群提供的基础存储服务需要由<存储池(Pool)>,分割为逻辑存储区域,此类的逻辑区或者谁对象数据的名称空间
存储池的类型
副本池I/O工作逻辑图
CRUSH(Controlled Replication Under Scalable Hashing) 它是一种数据分布式算法,类似于一致性哈希算法用于RADOS存储集群控制数据的分布
正常的情况下如果把一个对象直接映射到OSD之上会导致二者之间紧密的耦合性关系,在OSD设备变动时候不可避免的会对整个集群产生干扰,于是Ceph将一个对象映射进RADOS集群分成两步
- #列出存储池
- ceph osd pool ls (detail 加它更详细)
-
- #查看指定的存储池的详细信息
- ceph osd pool get pool_name all
-
- #获取存储池的统计数据
- ceph osd pool stats [pool-name]
-
- #显示存储池的用量(好用查看现用量)
- rados df
-
- #重命名存储池
- ceph osd pool rename old-name new-name
意外的删除存储池会导致数据丢失,因此Ceph实施了两个机制来防止删除存储池,要删除存储池,必须先禁用两个机制
1.第一个机制NODELETE标志,该值需要设置为false,默认为false
2.第二个机制集群范围的配置参数mon allow pool delete,默认为false,表示不能删除存储池
- #机制一解决,查看命令
- ceph osd pool get pool-name nodelete
-
- #修改命令
- ceph osd pool set pool-name nodelete false
-
- #机制二解决,临时解决(建议删除之前将这个值设置为true,删除后再改会false)
- ceph tell mon.* injectargs --mon-allow-pool-delete={true/false}
-
- #永久方式编辑ceph.conf文件加入一下内容
- [mon]
- mon_allow_pool_delete = true
-
- #更新覆盖每个节点的配置文件
- ceph-deploy --overwrite-conf config push mon01 mon02 mon03
-
- #重启mon才能执行删除
- systemctl restart ceph-mon.target
Ceph支持为存储池设置可以存储对象的最大数量(Max_objects)和可以占用的最大空间(Max_bytes)两个维度的配额
命令格式
: ceph osd pool set-quota max_objects|max_bytes获取存储池相关配额信息
: ceph osd pool get-quota
配置存储池参数
获取配置
: ceph osd pool get设定配置
: ceph osd pool set
常用参数 | 参数作用描述 |
---|---|
-size | 存储池中的对象副本数 |
-min_size | I/O所需要的最小副本数 |
-pg_num | 存储池的PG数量 |
-pgpnum | 计算数据归置时要使用的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参数 |
创建存储池快照
列出存储池快照
删除存储池快照
回滚存储到指定的快照
存储池的名称空间不常用,但是每一个存储池都是有自己的名称空间的
namespace是池中对象的逻辑组,可以限制用户对池的访问,使得用户只能存储或检索这个namespace内的对象,默认情况下每一个池包含一个具有空名称的namespace
librados
的应用
如果要在命名空间内存储对象,客户端应用必须提供池和名称空间的名称
rados命令可以使用 -N name 或者 –namespace= 来选择存储池和检索池中指定的名称空间对象
- #例如向对象存储的poolname池中的-N system上传一个名为srv的本地路径为path的对象(namespace不需要手动创建)
- rados -p poolname -N system put srv path
-
- #查看当前创建的namespace下的对象
- rados -p poolname -N system ls
-
- #查看当前存储池中的所有namespacce的对象
- rados -p poolname --all ls
-
- #使用python转换成json查看
- rados -p poolname --all ls --format=json | python -jsob.tool
- - fromat=json 返回json格式的结果
BlueStore存储引擎提供即时的数据压缩,来节省磁盘空间压缩的算法有none,zlib,lz4,zstd,snappy等
zstd有较好的压缩比,但比较消耗CPU
lz4和snappy对CPU占用比例较低
不建议使用zlib
其他使用参数
全局压缩选项
可在ceph配置文件中设置压缩属性,它将对所有的存储池生效
- bluestore_compression_algorithm
- bluestore_compression_mode
- bluestore_compression_required_ratio
- bluestore_compression_min_blob_size
- bluestore_compression_max_blob_size
- bluestore_compression_min_blob_size_ssd
- bluestore_compression_max_blob_size_ssd
- bluestore_compression_min_blob_size_hdd
- bluestore_compression_max_blob_size_hdd
纠删码池使用的不是复制来保护对象的数据方式,相对于复制池,纠删码池会节约存储空间,但是需要更多的计算资源且纠删码池只支持对象存储,不支持快照。空间利用率高:K/N , K为数据块量,N为加上编码块量的总块数
纠删码的工作原理
纠删码的存储方式是将每一个object划分成更小的数据块,每一个数据块叫做
data chunk
,再用编码快coding chunk
对它们进行编码,最后将这些数据块和编码块存储到ceph集群的不同故障域中,从而保证数据的安全,纠删码概念的核心:n=k+m
- - k -> 原始object被划分成的数据块的个数
-
- - m -> 附加到所有原始数据块的额外编码块的个数
-
- - n -> 执行纠删码处理后,所创建的块的总数
创建纠删码存储池
- #示例
- ceph osd erasure-code-profile set EC-profile cursh-failure-domain=osd k=3 m=2
-
- #参数解析
- k:一个对象拆成多少个数据块。默认值为 2
- m:允许最大故障的OSD数目。默认值为1
- directory:插件库的位置。默认值为 /usr/lib64/ceph/erasure-code
- plugin:定义要使用的纠删代码插件。默认值为jerasure
- crush-failure-domain:定义CRUSH故障域,它控制区块放置。默认情况下,为host,这可以确保对象的区块放置到不同主机的OSD上。如果设置为osd,则对象的区块可以放置到同一主机的OSD上。将故障域设置为osd时弹性欠佳,如果主机出现故障,则该主机上的所有OSD都会失败。设置为rack可以确保ceph不会将两个区块存储在同一个机架中。
- crush-device-class:仅将某一类别设备支持的OSD用于池。典型的类别可能包括hdd、ssd 或nvme
- crush-root:设置CRUSH规则集的根节点
- key=value:自定义键值对
- technique:每个插件提供一组不同的技术来实施不同的算法。对于Jerasure插件,默认的技术是reed_sol_van。还提供其他的技术:reed_sol_r6_op、cauchy_orig、cauchy_good、liberation、blaum_roth和liber8tion
-
- # 例如,如果所需的体系结构必须承受两个OSD的丢失,并且存储开销为40%
- ceph osd erasure-code-profile set myprofile k=4 m=2 crush-failure-domain=osd
纠删码常用命令
- #列出现有的配置
- ceph osd erasure-code-profile ls
-
- #删除现有的配置
- ceph osd erasure-code-profile rm profile-name
-
- #查看现有的配置
- ceph osd erasure-code-profile get profile-name
-
- #查看纠删码池状态(纠删码池的操作)
- ceph osd dump |grep -i EC-pool
-
- #添加数据到纠删码池(纠删码池的操作)
- rados -p EC-pool ls
- rados -p EC-pool put object1 hello.txt
-
- #查看数据状态(纠删码池的操作)
- ceph osd map EC-pool object1
-
- #读取数据(纠删码池的操作)
- rados -p EC-pool get object1 /tmp/object1
纠删码插件
Ceph支持以插件方式加载使用的纠删编码插件,存储管理员可根据存储场景的需 要优化选择合用的插件。目前,Ceph支持的插件jerasure/lrc/isa
例如,把包含数据”ABCDEFGHI”的对象NYAN保存到存储池中时,假设纠删码算法会将内容分割为三个数据块:第一个包含”ABC”,第二个为”DEF”,最后一个为”GHI”,并为这三个数据块额外创建两个编码块:第四个”YXY”和第五个”GQC”在有着两个编码块配置的存储池中,它容许至多两个OSD不可用而不影响数据的可用性。假设,在某个时刻OSD1和OSD3因故无法正常响应客户端请求,这意味着客户端仅能读取到”ABC”、”DEF”和”OGC”,此时纠删编码算法会通过计算重那家出”GHI”和”YXY”
通过将K块的数据转换成N块,假设N=K+M,其中的M代表纠删码算法添加的额外冗余或冗余块的数量以提供冗余机制(既编码块),而N则表示在纠删码后要创建的块的总数,其可以故障的总块数量为M(N-K个).类似RAID 5
纠删码池减少了确保数据持久性所需的磁盘空间量,但计算量上却比副本存储池要更贵一此
RGW可以使用纠删码存储池,但RBD不支持
- #将osd的map信息输出到osdmap文件中
- ceph osd getmap -o osdmap
-
- #将crushmap信息输出
- ceph osd getcrushmap -o crushmap
-
- #使用工具找到指定的池上的pg具体在osd上的分布信息
- osdmaptool osdmap --import-cursh crushmap --test-map-pgs --pool 16
归置组(Placement Group)是用于跨OSD将数据存储在某个存储池中的内部数据结构.在OSD守护进程和Ceph客户端之间生成了一个中间层,CRUSH算法负责将每个对象动态映射到一个归置组,然后再将每个归置组动态映射到一个或多个OSD守护进程,从而能够支持在新的OSD设备上线时动态进行数据重新平衡
出于规模伸缩及性能方面的考虑,Ceph将存储池细分为归置组,把每个单独的对象映射到归置组,并将归置组分配给一个主OSD
存储池由一系列的归置组组成,而CRUSH算法则根据集群运行图和集群状态,将各PG均匀、伪随机地分布到集群中的OSD之上
若某OSD失败或需要对集群进行重新平衡,Ceph则移动或复制整个归置组而无需单独寻址每个对象
生产情况下归置组的使用
CRUSH将pg动态映射到OSDs。
当Ceph客户端存储对象时,CRUSH会将每个对象映射到一个放置组。
归置组的数量由管理员在创建存储池的时候指定,然后由CRUSH负责创建和使用,通常PG的数量应该是数据的合理粒度的子集,例如: 一个包含256个PG的储存池意味着每个PG包含大约1/256的存储池数据.当需要将PG从一个OSD移动到另外一个OSD时候,PG的数量会对性能产生影响.PG的数量在集群分发和数据平衡中扮演重要作用
PG对集群的影响
PG数量的建议
依据PG当前的工作特性或工作进程所处的阶段,它总是处于某个或某些个状态中,常见的状态为Actice+clean
客户端IO简要流程
Ceph客户端使用以下步骤来计算PG ID
默认情况下,无论是ceph的服务端还是客户端,配置文件都存储在/etc/ceph/ceph.conf文件中
如果修改了配置参数,必须使用/etc/ceph/ceph.conf文件在所有节点(包括客户端)上保持一致。
配置文件使用#和;来注释
参数名称可以使用空格、下划线、中横线来作为分隔符。如osd journal size 、 osd_jounrnal_size 、 osd-journal-size是有效且等同的参数名称
- #通过中括号将特定守护进程的设置分组在一起
- [global] 部分,存储所有守护进程之间通用配置。它应用到读取配置文件的所有进程,包括客户端。可以在更为具体的部分中覆盖此处设置的参数
- [mon] 部分,监视器 (MON) 相关的配置
- [osd] 部分,OSD 守护进程相关的配置
- [mgr] 部分,管理器 (MGR) 相关的配置
- [mds] 部分,元数据服务器 (MDS) 相关的配置
- [client] 部分,所有客户端的配置
所谓元变量是即ceph内置的变量。可以用它来简化ceph.conf文件的配置:
scluster
:Ceph存储集群的名称。默认为ceph,在/etc/sysconfig/ceph文件中定义。例如,1ogfi1le参数的默认值是/var/log/ceph/scluster-sname.1og。在扩展之后,它变为/var/log/seph/ceph-mon.ceph-node1.1og
stype
:守护进程类型。监控器使用mon;osd使用osd,元数据服务器使用mds,管理器使用mgr,客户端应用使用client。
- 如在tglobal1部分中将pid file参数设定义为/vax/run/scluster/stype.sid.pid
- 它会扩展为/var/run/ceph/osd.o.pid,表示ID为0的osD。
- 对于在ceph-node1上运行的MoN守护进程,它扩展为/vax/run/ceph/mon.ceph-node1.pid
sid
:守护进程实例rD。对于ceph-nodei上的MON,设置为ceph-node1。对于osd.1,它设置为1。如果是客户端应用,这是用户名
sname
:守护进程名称和实例ID。这是stype.sid的快捷方式
shost
:其上运行了守护进程的主机的名称
- #列出所有参数及其当前值
- 语法:ceph daemon type.id config show
- 示例:ceph daemon osd.0 config show
-
- #获取具体参数的值
- 语法:ceph daemon type.id config get parameter
- 示例:ceph daemon mds.servera config get mds_data
管理ceph的系统守护进程 | 具体命令 |
---|---|
Stop a specific daemon | systemct1 stop ceph-Stype@sid |
Stop all OSD daemons | systemct1 stop ceph-osd.target |
Stop all daemons | systemct1 stop ceph.target |
Start a specific daemon | systemct1 start ceph-Stype@sid |
Start all OSD daemons | systemct1 start ceph-osd.target |
Start all daemons | systemct1 start ceph.target |
Restart a specific daemon | systemct1 restart ceph-stype@sid |
Restart all OSD daemons | systemctl restart ceph-osd.target |
Restart all daemons | systemct1 restart ceph.target |