Ceph是当前非常流行的开源分布式存储系统,具有高扩展性、高性能、高可靠性 等优点,同时提供块存储服务(rbd)、对象存储服务(rgw)以及文件系统存储服务(cephfs),Ceph在存储的时候充分利用存储节点的计算能力,在存储每一个数据时 都会通过计算得出该数据的位置,尽量的分布均衡。。目前也是OpenStack的主流 后端存储,随着OpenStack在云计算领域的广泛使用,ceph也变得更加炙手可热。 国内目前使用ceph搭建分布式存储系统较为成功的企业有x-sky,深圳元核云,上海 UCloud等三家企业。
Ceph使用RADOS提供对象存储,通过librados封装库提供多种存储方式的文件和 对象转换。外层通过RGW(Object,有原生的API,而且也兼容Swift和S3的API, 适合单客户端使用)、RBD(Block,支持精简配置、快照、克隆,适合多客户端有 目录结构)、CephFS(File,Posix接口,支持快照,社会和更新变动少的数据,没 有目录结构不能直接打开)将数据写入存储。
高性能
a. 摒弃了传统的集中式存储元数据寻址的方案,采用CRUSH算法,数据分布 均衡,并行度高
b.考虑了容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机 架感知等
c. 能够支持上千个存储节点的规模,支持TB到PB级的数据
高可扩展性
a. 去中心化
b. 扩展灵活
c. 随着节点增加而线性增长
特性丰富
a. 支持三种存储接口:块存储、文件存储、对象存储
b. 支持自定义接口,支持多种语言驱动
目前来说,ceph在开源社区还是比较热门的,但是更多的是应用于云计算的后端 存储。官方推荐使用ceph的对象式存储,速度和效率都比较高,而cephfs官方并 不推荐直接在生产中使用。以上介绍的只是ceph的沧海一粟,ceph远比上面介绍 的要复杂,而且支持很多特性,比如使用纠删码就行寻址,所以大多数在生产环境 中使用ceph的公司都会有专门的团队对ceph进行二次开发,ceph的运维难度也 比较大。但是经过合理的优化之后,ceph的性能和稳定性都是值得期待的。
RADOS
可靠的、自动化的、分布式对象存储系统。RADOS是Ceph集群的精华,用户 实现数据分配、Failover等集群操作。
Librados
上层的RBD、RGW和CephFS都是通过librados访问的,目前提供PHP、Ruby、 Java、Python、C和C++支持。
Crush
Crush算法在一致性哈希基础上很好的考虑了容灾域的隔离,使得Ceph能够 实现各类负载的副本放置规则,例如跨机房、机架感知等。同时,Crush算法 有相当强大的扩展性,理论上可以支持数千个存储节点,这为Ceph在大规模 云环境中的应用提供了先天的便利。
Pool
Pool是存储对象的逻辑分区,它规定了数据冗余的类型和对应的副本分布策 略,默认存储3份副本;支持两种类型:副本(replicated)和 纠删码( Erasure Code);
PG
放置策略组,它是对象的集合,该集合里的所有对象都具有相同的放置策略, 简单点说就是相同PG内的对象都会放到相同的硬盘上,PG是 ceph的逻辑概 念,服务端数据均衡和恢复的最小粒度就是PG,一个PG包含多个OSD。引入 PG这一层其实是为了更好的分配数据和定位数据;
Object
简单来说块存储读写快,不利于共享,文件存储读写慢,利于共享。能否弄一 个读写快,利于共享的出来呢。于是就有了对象存储。最底层的存储单元,包 含元数据和原始数据。
ceph资源划分
ceph对象元数据
OSD
OSD是负责物理存储的进程,一般配置成和磁盘一一对应,一块磁盘启动一个 OSD进程。主要功能是存储数据、复制数据、平衡数据、恢复数据,以及与其 它OSD间进行心跳检查,负责响应客户端请求返回具体数据的进程等;
Pool、PG和OSD的关系:
一个Pool里有很多PG;
一个PG里包含一堆对象,一个对象只能属于一个PG;
PG有主从之分,一个PG分布在不同的OSD上(针对三副本类型);
pool PG
OSD PG pool
Monitor
一个Ceph集群需要多个Monitor组成的小集群,它们通过Paxos同步数据, 用来保存OSD的元数据。负责监视整个Ceph集群运行的Map视图(如OSD Map、Monitor Map、PG Map和CRUSH Map),维护集群的健康状态,维护展 示集群状态的各种图表,管理集群客户端认证与授权;生产中建议最少要用3 个Monitor,基数个的Monitor组成组件来做高可用。
MDS
CephFS服务依赖的元数据服务。负责保存文件系统的元数据,管理目录结构。 对象存储和块设备存储不需要元数据服务;
Mgr
实现 ceph 集群的管理,为外界提供统一的入口。
RGW
Ceph对外提供的对象存储服务,接口与S3和Swift兼容。
Admin
Ceph常用管理接口通常都是命令行工具,如rados、ceph、rbd等命令,另外 Ceph还有可以有一个专用的管理节点,在此节点上面部署专用的管理工具来 实现近乎集群的一些管理工作,如集群部署,集群组件管理等。
块存储(RBD)
优点:
a.通过Raid与LVM等手段,对数据提供了保护;
b.多块廉价的硬盘组合起来,提高容量;
c.多块磁盘组合出来的逻辑盘,提升读写效率;
缺点:
a.采用SAN架构组网时,光纤交换机,造价成本高;
b.主机之间无法共享数据;
使用场景
a.docker容器、虚拟机磁盘存储分配;
b.日志存储;
c.文件存储;
文件存储(CephFS)
优点:
a.造价低,随便一台机器就可以了;
b.方便文件共享;
缺点:
a.读写速率低;
b.传输速率慢;
使用场景
a.日志存储;
b.FTP、NFS;
c.其它有目录结构的文件存储
对象存储(Object)(适合更新变动较少的数据)
优点:
a.具备块存储的读写高速;
b.具备文件存储的共享等特性;
使用场景
a.图片存储;
b.视频存储;
缓存池原理
缓存分层特性也是在Ceph的Firfly版中正式发布的,这也是Ceph的Firefly版本中 被谈论最多的一个特性。缓存分层是在更快的磁盘(通常是SSD),上创建一 个Ceph池。这个缓存池应放置在一个常规的复制池或erasure池的前端,这 样所有的客户端I/O操作都首先由缓存池处理。之后,再将数据写回到现有的 数据池中。客户端能够在缓存池上享受高性能,而它们的数据显而易见最终是 被写入到常规池中的。
一般来说,缓存层构建在昂贵/速度更快的SSD磁盘上,这样才能为客户提供更好 的I/O性能。在缓存池后端通常是存储层,它由复制或者erasure类型的HDD 组成。在这种类型的设置中,客户端将I/O请求提交到缓存池,不管它是一个 读或写操作,它的请求都能够立即获得响应。速度更快的缓存层为客户端请求 提供服务。一段时间后,缓存层将所有数据写回备用的存储层,以便它可以缓 存来自客户端的新请求。在缓存层和存储层之间的数据迁移都是自动触发且对 客户端是透明的。缓存分层能以两种模式进行配置。
writeback模式:
写操作时,写入缓存池。基于缓存层flushing/evicting策略,数据将从缓存层 迁移到存储层,并由缓存分层代理将其从缓存层中删除。
读操作时,由缓存分层代理将数据从存储层迁移到缓存层,然后再把它提供给 客户。直到数据变得不再活跃或成为冷数据,否则它将一直保留在缓存层 中。
read-only模式:
写操作不涉及缓存分层,所有的客户端写都在存储层上完成。
读操作时,在处理来自客户端的读操作时,缓存分层代理将请求的数据从存储 层复制到缓存层。基于你为缓存层配置的策略,不活跃的对象将会从缓存 层中删除。这种方法非常适合多个客户端需要读取大量类似数据的场景。
缓存层是在速度更快的物理磁盘(通常是SSD),上实现的,它在使用HDD构建 的速度较慢的常规池前部署一个快速的缓存层。在本节中,我们将创建两个独 立的池(一个缓存池和一个常规),分别用作缓存层和存储层。
服务器初始化(参考初始化文档)
安装需要工具
yum install createrepo -y
yum install epel-release -y
yum install lttng-ust -y
关闭NetworkManager
systemctl disable NetworkManager
systemctl stop NetworkManager
升级系统内核
#查看内核版本
uname -r
cd 内核文件/
yum -y install kernel-ml-5.7.8-1.el7.elrepo.x86_64.rpm kernel-ml-devel-5.7.8-1.el7.elrepo.x86_64.rpm
#调整默认启动内核
cat /boot/grub2/grub.cfg | grep menuentry
grub2-set-default "CentOS Linux (5.7.8-1.el7.elrepo.x86_64) 7 (Core)"
#查看是否设置成功
grub2-editenv list
reboot
主机名与IP对应关系(必须配置主机名映射)
vim /etc/hosts
192.168.66.31 ceph-node1
192.168.66.32 ceph-node2
192.168.66.33 ceph-node3
ceph-node1操作节点上安装ceph的yum源共享
安装源
yum install httpd
#上传软件包\ceph到/var/www/html/下
#启动httpd
systemctl restart httpd
systemctl enable httpd
#更新yum源
createrepo --update /var/www/html/ceph/rpm-nautilus
#(官方yum源
vim /etc/yum.repos.d/ceph.repo
[Ceph]
name=Ceph packages for $basearch
baseurl=http://mirrors.163.com/ceph/rpm-nautilus/el7/$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1
[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://mirrors.163.com/ceph/rpm-nautilus/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1
[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.163.com/ceph/rpm-nautilus/el7/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
)
编辑yum源文件
vim /etc/yum.repos.d/ceph.repo
[Ceph]
name=Ceph packages for $basearch
baseurl=http://192.168.66.31/ceph/rpm-nautilus/el7/$basearch
gpgcheck=0
priority=1
[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://192.168.66.31/ceph/rpm-nautilus/el7/noarch
gpgcheck=0
priority=1
[ceph-source]
name=Ceph source packages
baseurl=http://192.168.66.31/ceph/rpm-nautilus/el7/SRPMS
gpgcheck=0
priority=1
[nfs-ganesha]
name=nfs-ganesha
baseurl=http://192.168.66.31/nfs-ganesha/el7/x86_64
gpgcheck=0
priority=1
[ceph-iscsi]
name=ceph-iscsi noarch packages
baseurl=http://192.168.66.31/ceph-iscsi/3/rpm/el7/noarch
gpgcheck=0
priority=1
[ceph-iscsi-source]
name=ceph-iscsi source packages
baseurl=http://192.168.66.31/ceph-iscsi/3/rpm/el7/SRPMS
gpgcheck=0
priority=1
[tcmu-runner]
name=tcmu-runner
baseurl=http://192.168.66.31/tcmu-runner/x86_64
gpgcheck=0
priority=1
[ceph-iscsi-conf]
name=ceph-iscsi-config
baseurl=http://192.168.66.31/ceph-iscsi-config/noarch
gpgcheck=0
priority=1
在每台node上执行
yum makecache
安装基础ceph包每台node
yum -y install ceph
ceph -v
部署安装工具
安装 ceph-deploy在ceph-node1操作节点上
yum install -y ceph-deploy
yum install python-setuptools -y
ceph-deploy --version
创建一个my-cluster目录,所有命令在此目录下进行ceph-node1操作节点上
mkdir /my-cluster
cd /my-cluster
控制端无密码连接所以节点和自己
ssh-keygen
for i in 31 32 33; do ssh-copy-id root@192.168.66.$i; done
创建Ceph集群,生成Ceph配置文件(建议是奇数)ceph-node1操作节点上
ceph-deploy new --public-network 对外网端 --cluster-network 192.168.66.0/24
ceph-node1 ceph-node2 ceph-node3
#--public-network没有就不写
#--cluster-network对内通行网端
#ceph-nodex mon节点
允许删除存储池
ceph-node1操作节点上修改配置文件
vim ceph.conf
[global]
.......
#允许删除存储池
mon_allow_pool_delete = true
安装mon服务,生成monitor检测集群所使用的的秘钥ceph-node1操作节点上
ceph-deploy mon create-initial
安装管理命令Ceph CLIceph-node1操作节点上
如前所示,我们执行admin的命令,要提供admin的key(–keyring ceph.client.admin.keyring)以及配置文件(-c ceph.conf)。在后续的运维中,我们经常 需要在某个node上执行admin命令。每次都提供这些参数比较麻烦。实际上,ceph 会默认地从/etc/ceph/中找keyring和ceph.conf。因此,我们可以把 ceph.client.admin.keyring和ceph.conf放到每个node的/etc/ceph/。ceph-deploy可 以帮做这些
ceph-deploy admin ceph-node1 ceph-node2 ceph-node3
添加osd(添加的磁盘必须是没有被处理过的裸盘)ceph-node1操作节点上
所有操作节点上初始化清空磁盘数据
ceph-volume lvm zap /dev/sdb /dev/sdc /dev/sdd
ceph-deploy osd create --data /dev/sdb ceph-node1
ceph-deploy osd create --data /dev/sdc ceph-node1
ceph-deploy osd create --data /dev/sdd ceph-node1
ceph-deploy osd create --data /dev/sdb ceph-node2
ceph-deploy osd create --data /dev/sdc ceph-node2
ceph-deploy osd create --data /dev/sdd ceph-node2
ceph-deploy osd create --data /dev/sdb ceph-node3
ceph-deploy osd create --data /dev/sdc ceph-node3
ceph-deploy osd create --data /dev/sdd ceph-node3
检查Ceph群集状态。
ceph -s
#使用盘+盘的方式所有节点磁盘创建固态+集群盘组
对固态进行分区
parted /dev/sdb mklabel gpt
parted /dev/sdb mkpart primary 1 50%
parted /dev/sdb mkpart primary 50% 100%
#磁盘分区后的默认权限无法让ceph软件对其进行读写操作
提权
chown ceph.ceph /dev/sdb1
chown ceph.ceph /dev/sdb2
vim /etc/udev/rules.d/70-sdb.rules
ENV{DEVNAME}=="/dev/sdb1",OWNER="ceph",GROUP="ceph"
ENV{DEVNAME}=="/dev/sdb2",OWNER="ceph",GROUP="ceph"
创建OSD存储空间
ceph-deploy osd create --data
/dev/sdc:/dev/sdb1 /dev/sdd:/dev/sdb2 ceph-node1
ceph-deploy osd create --data
ceph-node2:/dev/sdc:/dev/sdb1 ceph-node2:/dev/sdd:/dev/sdb2
ceph-deploy osd create --data
ceph-node3:/dev/sdc:/dev/sdb1 ceph-node3:/dev/sdd:/dev/sdb2
#使用pool+pool的方式(后面说)
部署监控配置mgr,用于管理集群ceph-node1操作节点上
ceph-deploy mgr create ceph-node1
ceph-deploy mgr create ceph-node2
ceph-deploy mgr create ceph-node3
允许删除存储池以做
ceph-node1操作节点上修改配置文件
vim ceph.conf
[global]
.......
#允许删除存储池
mon_allow_pool_delete = true
使用ceph-deploy推配置给所有节点
ceph-deploy --overwrite-conf config push
ceph-node1 ceph-node2 ceph-node3
所有节点重启ceph-mon服务
systemctl restart ceph-mon.target
创建默认pool,ceph-node1操作节点上
```powershell
ceph osd pool create rbd 32 32
ceph osd pool application enable rbd rbd
```
检查状态
OSD状态
ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.29279 root default
-3 0.09760 host cephnode01
0 hdd 0.04880 osd.0 up 1.00000 1.00000
1 hdd 0.04880 osd.1 up 1.00000 1.00000
-5 0.09760 host cephnode02
2 hdd 0.04880 osd.2 up 1.00000 1.00000
3 hdd 0.04880 osd.3 up 1.00000 1.00000
-7 0.09760 host cephnode03
4 hdd 0.04880 osd.4 up 1.00000 1.00000
5 hdd 0.04880 osd.5 up 1.00000 1.00000
整体运行状态
ceph -s
cluster:
id: a4c42290-00ac-4647-9856-a707d5f8f2fd
health: HEALTH_OK
services:
mon: 3 daemons, quorum cephnode01,cephnode02,cephnode03 (age 18m)
mgr: cephnode01(active, since 34m), standbys: cephnode03, cephnode02
mds: 3 up:standby
osd: 6 osds: 6 up (since 27m), 6 in (since 27m)
rgw: 1 daemon active (cephnode01)
data:
pools: 4 pools, 128 pgs
objects: 187 objects, 1.2 KiB
usage: 6.0 GiB used, 294 GiB / 300 GiB avail
pgs: 128 active+clean
检查集群健康状况的命令,后期用来查找故障
ceph health detail
HEALTH_OK
Monitor状态
ceph mon stat
所有节点节点安装
yum -y install ceph-mgr-dashboard
配置ceph-node1操作节点上
禁用 SSL
ceph config set mgr mgr/dashboard/ssl false
#生成并安装自签名的证书ssl
#ceph dashboard create-self-signed-cert
配置监听IP和 port
ceph config set mgr mgr/dashboard/server_addr 0.0.0.0
ceph config set mgr mgr/dashboard/server_port 8888
#IP 不设置,默认绑定 ::,禁用 ssl 之后,PORT 默认8080
创建一个dashboard登录用户名密码
vim dashboard-password
123456
ceph dashboard ac-user-create admin -i ./dashboard-password administrator
#更多操作,查看帮助
ceph dashboard -h
开启功能ceph-node1操作节点上
ceph mgr module enable dashboard
ceph mgr module disable dashboard(注意修改了配置,要先停,在开启)
启用功能
rgw启用
#部署rgw
#安装实现 ceph 集群的管理,为外界提供统一的入口,所有节点
yum install -y ceph-radosgw
#创建rgw实例ceph-node1操作节点上
ceph-deploy rgw create ceph-node1
ceph-deploy rgw create ceph-node2
ceph-deploy rgw create ceph-node3
#Dashboard中启用RGWceph-node1操作节点上
#创建rgw系统账户
radosgw-admin user create --uid=rgw --display-name=rgw --system
#查看
radosgw-admin user info --uid=rgw
#记下输出的access_key 和 secret_key的值
"access_key": "DK81962PKOT9MURYBL3Y",
"secret_key": "OABnPhViCWlYtNCyXxTQ7sr6xUVAYvvSgrTiNUQE"
#为Dashboard设置access_key 和 secret_key
echo DK81962PKOT9MURYBL3Y > access_key
echo OABnPhViCWlYtNCyXxTQ7sr6xUVAYvvSgrTiNUQE > secret_key
ceph dashboard set-rgw-api-access-key -i ./access_key
ceph dashboard set-rgw-api-secret-key -i ./secret_key
#禁用SSL
ceph dashboard set-rgw-api-ssl-verify False
#检测
http://rgw-node:7480
cephfs启用ceph-node1操作节点上
#创建cephfs实例
ceph-deploy mds create ceph-node1
ceph-deploy mds create ceph-node2
ceph-deploy mds create ceph-node3
#创建cephfs池
ceph osd pool create cephfs_data 32
ceph osd pool create cephfs_metadata 32
#创建文件系统
ceph fs new cephfs cephfs_metadata cephfs_data
#查看mds状态
ceph mds stat
查看服务访问方式,查看已开启模块信息ceph-node1操作节点上
ceph mgr services
访问:http://ceph-node1:8888/
首先创建存储池nfs-hmtd
#创建在SSD上
#ceph osd pool create nfs-hmtd on-ssd
ceph osd pool create nfs-hmtd 32 32
ceph osd pool application enable nfs-hmtd nfs
部署NFS服务(这里我放在了appfor117\appfor210):
# ceph orch apply nfs
** ** ** --placement="** [** ...]"
ceph orch apply nfs nfs-hmtd --pool nfs-hmtd nfs-ns --placement="appfor117 appfor210"
为了在dashboard中进行操作,可以进行如下设置:
ceph dashboard set-ganesha-clusters-rados-pool-namespace nfs-hmtd/nfs-ns
Ceph的NFS是基于CephFS提供的,我们首先在CephFS中创建一个/nfs目录,用于作为NFS服务的根目录。
mkdir /mnt/cephfs/nfs
其中mount的时候的secret是/etc/ceph/ceph.client.admin.keyring的值,也可以替换成
secretfile=/etc/ceph/ceph.client.admin.keyring。
创建存储池pool
新建数据池
ceph osd pool create storage_(池名) 64
重命名pool
ceph osd pool rename storage_(旧池名) storage_(新池名)
设置存储池副本数(默认3副本)
ceph osd pool get storage_(池名) size
ceph osd pool setstorage_(池名) size 3
给test使用的pool标识成test
ceph osd pool application enable storage_(池名)/cache_(池名) test
查看存储池
ceph osd lspools
#创建缓存+存储(可以不操作)
#新建数据池
ceph osd pool create storage_(池名) 64
#新建缓冲池
ceph osd pool create cache_(池名) 64
#把缓存层挂接到后端存储池上
ceph osd tier add storage_(池名) cache_(池名)
#设定缓冲池读写策略为写回模式。
ceph osd tier cache-mode cache_(池名) writeback
#将客户端流量指向到缓存存储池
ceph osd tier set-overlay storage_(池名) cache_(池名)
#调整Cache tier配置
#1、设置缓存层hit_set_type使用bloom过滤器
ceph osd pool set cache_(池名) hit_set_type bloom
#2、设置hit_set_count、hit_set_period
#热度数hit_set_count:HitSet 覆盖的时间区间,保留多少个这样的 HitSet,保留一段时间以来的访问记录
#热度周期hit_set_period:判断一客户端在一段时间内访问了某对象 一次、还是多次
#最大缓冲数据target_max_bytes。
ceph osd pool set cache_(池名) hit_set_count 1
ceph osd pool set cache_(池名) hit_set_period 3600
ceph osd pool set cache_(池名) target_max_bytes 1000000000000
#3、设置min_read_recency_for_promete、min_write_recency_for_promote
ceph osd pool set cache_(池名) min_read_recency_for_promote 1
ceph osd pool set cache_(池名) min_write_recency_for_promote 1
#缓存池容量控制
#刷写(flushing):负责把已经被修改的对象写入到后端慢存储,但是对 象依然在缓冲池。
#驱逐(evicting):负责在缓冲池里销毁那些没有被修改的对象。
#(1)驱逐(容量百分比),缓冲池代理就开始把这些数据刷写到后端慢存 储。当缓冲池里被修改的数据达到40%时,则触发刷写动作。
ceph osd pool set cache_(池名) cache_target_dirty_ratio 0.4
#(2)驱逐指定数据对象数量或者确定的数据容量。对缓冲池设定最大的数 据容量
ceph osd pool set cache_(池名) target_max_bytes 1073741824
#(3)驱逐对缓冲池设定最大的对象数量。在默认情况下,RBD的默认对 象大小为 4MB,1GB容量包含256个4MB的对象
ceph osd pool set cache_(池名) target_max_objects 256
#4、对象有最短的刷写周期。
#设定最短的刷写周期:若被修改的对象在缓冲池里超过最短周期,将会被刷写 到慢存储池(分钟)
ceph osd pool set cache_(池名) cache_min_flush_ age 600
#设定对象最短的驱逐周期
ceph osd pool set cache_(池名) cache_min_evict_age 1800
#删除缓存层
#删除readonly缓存
#把缓存模式改为 none 即可禁用
ceph osd tier cache-mode cache_(池名) none
#去除后端存储池的缓存池
ceph osd tier remove storage_(池名) cache_(池名)
#删除writeback缓存
#把缓存模式改为 forward ,这样新的和更改过的对象将直接刷回到 后端存储池
ceph osd tier cache-mode cache_(池名) forward --yes-i-really-mean-it
#确保缓存池已刷回,可能要等数分钟
rados ls -p cache_(池名)
#可以通过以下命令进行手动刷回
rados -p cache_(池名) cache-flush-evict-all
#取消流量指向缓存池
ceph osd tier remove-overlay storage_(池名)
#剥离缓存池
ceph osd tier remove storage cache_(池名)
创建镜像
方法一:默认池中创建镜像
rbd create cxk-image --image-feature layering --size 1G
方法二:指定池中创建镜像
rbd create 池名/cxk-image --image-feature layering --size 1G
查看镜像
rbd list 池名
查看详细信息
rbd info 池名/cxk-image
镜像动态调整
扩容容量
rbd resize --size 2G 池名/cxk-image
缩小容量
rbd resize --size 1G 池名/cxk-image --allow-shrink
删除RBD块设备
rbd rm 池名/cxk-image
镜像快照操作 给镜像创建快照 rbd snap create 池名/cxk-image --snap cxk-snap1 克隆快照
保护快照不让删除:rbd snap protect 池名/cxk-image --snap cxk-snap1 取消保护:rbd snap
unprotect 池名/cxk-image --snap cxk-snap1 rbd clone 池名/cxk-image --snap
cxk-snap1 cxk-snap2 --image-feature layering 还原快照: rbd snap rollback
池名/cxk-image --snap cxk-snap1 把快照脱离父母独立工作 rbd flatten cxk-snap1 删除快照:
rbd snap rm 池名/cxk-image --snap cxk-snap1 查看快照: 查看镜像快照 rbd snap ls
池名/cxk-image 查看克隆镜像与父镜像快照的关系 rbd info 池名/cxk-clone
客户端安装
yum install createrepo -y
yum install epel-release -y
yum install lttng-ust -y
#指定共享的yum
yum -y install ceph-common
客户端拷贝ceph文件到本地、配置文件和连接密钥文件
scp /my-cluster/ceph.conf root@192.168.66.242:/etc/ceph/
scp /my-cluster/ceph.client.admin.kevring root@192.168.66.242:/etc/ceph/
客户端挂载服务端的镜像
rbd map 池名/cxk-image
撤销磁盘挂载:
rbd unmap /dev/rbd0(挂载点)
客户端查看挂载服务端的镜像
rbd showmapped
lsblk
客户端格式化、挂载分区
mkfs.xfs /dev/rbd0
mount /dev/rbd0 /mnt/
要使用 CephFS, 至少就需要一个 metadata server 进程。可以手动创建一个 MDS, 也可以使 用 ceph-deploy 或者 ceph-ansible 来部署 MDS。
给那些osd部署mds服务:
cd /my-cluster
ceph-deploy mds create ceph-node1ceph-node2 ceph-node3 (可以继续添加)
创建存储池
数据:ceph osd pool create cephfs_cxk_data 128
元数据:ceph osd pool create cephfs_cxk_metadata 64
查看:ceph osd lspools
创建Ceph文件系统
ceph fs new myfs-cxk cephfs_cxk_metadata cephfs_cxk_data
查看
ceph fs ls
vim /etc/fstab
ip:6789,ip:6789,ip:6789:/ /mnt/cephfs ceph name=admin,secret=xxxxxx,_netdev 0 0
mount -t ceph MON节点的IP:6789:/ /mnt/cephfs/
-o name=admin,secret=AQC0FaJgu2A2ARAACbXjhYEeZTX+nlUJ+seDGw==
#注意:文件系统类型为ceph
#admin是用户名,secret是密钥
#密钥可以在/etc/ceph/ceph.client.admin.keyring中找到
部署rgw服务:
ceph-deploy rgw create ceph-node1(可以继续添加)
登陆该节点验证服务是否启动
ps aux |grep radosgw
该节点修改服务端口
vim /etc/ceph/ceph.conf
[client.rgw.node5]
host = ceph-node1
rgw_frontends = "civetweb port=8000"
//node5为主机名
//civetweb是RGW内置的一个web服务
该节点重启服务
systemctl status ceph-radosgw@\*
创建radosgw用户
radosgw-admin user create --uid="radosgw" --display-name="radosgw"
{
"user_id": "radosgw",
"display_name": "radosgw",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"auid": 0,
"subusers": [],
"keys": [
{
"user": "radosgw",
"access_key": "DKOORDOMS6YHR2OW5M23",
"secret_key": "OOBNCO0d03oiBaLCtYePPQ7gIeUR2Y7UuB24pBW4"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw"
}
安装
yum install s3cmd
修改软件配置
s3cmd --configure
Access Key: DKOORDOMS6YHR2OW5M23
Secret Key: OOBNCO0d03oiBaLCtYePPQ7gIeUR2Y7UuB24pBW4
Default Region [US]: ZH
S3 Endpoint [s3.amazonaws.com]: 192.168.4.15:8000
[%(bucket)s.s3.amazonaws.com]: %(bucket)s.192.168.4.15:8000
Use HTTPS protocol [Yes]: no
Test access with supplied credentials? [Y/n] n
Save settings? [y/N] y
创建存储数据的bucket(类似于存储数据的目录)创建桶并放入文件
s3cmd ls
s3cmd mb s3://my_bucket
Bucket 's3://my_bucket/' created
s3cmd ls
2018-05-09 08:14 s3://my_bucket
s3cmd put /var/log/messages s3://my_bucket/log/
s3cmd ls s3://my_bucket
DIR s3://my_bucket/log/
s3cmd ls s3://my_bucket/log/
2018-05-09 08:19 309034 s3://my_bucket/log/messages
测试下载功能
s3cmd get s3://my_bucket/log/messages /tmp/
测试删除功能
s3cmd del s3://my_bucket/log/messages
集群整体运行状态
ceph -s
检查集群健康状况的命令,后期用来查找故障
ceph health detail
HEALTH_OK
PG状态
ceph pg dump
ceph pg stat
Pool状态
ceph osd pool stats
OSD状态
ceph osd stat
ceph osd dump
ceph osd tree
ceph osd df
Monitor状态和查看仲裁状态
ceph mon stat
ceph mon dump
ceph quorum_status
集群空间用量
ceph df
ceph df detail
有时候需要更改服务的配置,但不想重启服务,或者是临时修改。这时候就可以使用 tell和daemon子命令来完成此需求。
查看运行配置
#命令格式:
ceph daemon {daemon-type}.{id} config show
#命令举例:
ceph daemon osd.0 config show
tell子命令格式
使用 tell 的方式适合对整个集群进行设置,使用 * 号进行匹配,就可以对整个集 群的角色进行设置。而出现节点异常无法设置时候,只会在命令行当中进行报错, 不太便于查找。
#命令格式:
ceph tell {daemon-type}.{daemon id or *} injectargs
--{name}={value} [--{name}={value}]
#命令举例:
ceph tell osd.0 injectargs --debug-osd 20 --debug-ms 1
#daemon-type:为要操作的对象类型如osd、mon、mds等。
#daemon id:该对象的名称,osd通常为0、1等,mon为ceph -s显示的名称, 这里可以输入*表示全部。
#injectargs:表示参数注入,后面必须跟一个参数,也可以跟多个
daemon子命令
使用 daemon 进行设置的方式就是一个个的去设置,这样可以比较好的反馈,此 方法是需要在设置的角色所在的主机上进行设置。
#命令格式:
ceph daemon {daemon-type}.{id} config set {name}={value}
#命令举例:
ceph daemon mon.ceph-monitor-1 config set mon_allow_pool_delete false
命令包含start、restart、status
启动所有守护进程
systemctl start ceph.target
按类型启动守护进程
systemctl restart ceph-mgr.target
systemctl restart ceph-osd@id
systemctl restart ceph-mon.target
systemctl restart ceph-mds.target
systemctl restart ceph-radosgw.target
更新所有节点的配置文件的命令
ceph-deploy --overwrite-conf config push cephnode01 cephnode02 cephnode03
添加OSD
格式化磁盘
ceph-volume lvm zap /dev/sd
进入到ceph-deploy执行目录/my-cluster,添加OSD
删除OSD
调整osd的crush weight为 0
ceph osd crush reweight osd. 0.0
将osd进程stop
systemctl stop ceph-osd@
将osd设置out
ceph osd out
立即执行删除OSD中数据
ceph osd purge osd. --yes-i-really-mean-it
卸载磁盘
umount /var/lib/ceph/osd/ceph-?
创建
#方法一:默认池中创建镜像
rbd create cxk-image --image-feature layering --size 1G
#方法二:指定池中创建镜像
rbd create 池名/cxk-image --image-feature layering --size 1G
查看
#查看镜像:
rbd list 池名
#查看详细信息:
rbd info 池名/cxk-image
镜像动态调整
#扩容容量
rbd resize --size 2G 池名/cxk-image
#缩小容量
rbd resize --size 1G 池名/cxk-image --allow-shrink
删除RBD块设备
rbd rm 池名/cxk-image
快照操作
#给镜像创建快照
rbd snap create 池名/cxk-image --snap cxk-snap1
#克隆快照
#保护快照不让删除:
rbd snap protect 池名/cxk-image --snap cxk-snap1
#取消保护:
rbd snap unprotect 池名/cxk-image --snap cxk-snap1
rbd clone 池名/cxk-image --snap cxk-snap1 cxk-snap2 --image-feature layering
#还原快照:
rbd snap rollback 池名/cxk-image --snap cxk-snap1
#把快照脱离父母独立工作
rbd flatten cxk-snap1
#删除快照:
rbd snap rm 池名/cxk-image --snap cxk-snap1
#查看快照:
#查看镜像快照
rbd snap ls 池名/cxk-image
#查看克隆镜像与父镜像快照的关系
rbd info 池名/cxk-clone
ceph osd pool set {pool-name} pg_num 128
ceph osd pool set {pool-name} pgp_num 128
1、扩容大小取跟它接近的2的N次方
2、在更改pool的PG数量时,需同时更改PGP的数量。PGP是为了管理placement 而存在的专门的PG,它和PG的数量应该保持一致。如果你增加pool的 pg_num,就需要同时增加pgp_num,保持它们大小一致,这样集群才能正常 rebalancing。
列出存储池
ceph osd lspools
创建存储池
#命令格式:
ceph osd pool create {pool-name} {pg-num} [{pgp-num}]
#命令举例:
ceph osd pool create rbd 32 32
设置存储池配额
#命令格式:
ceph osd pool set-quota {pool-name} [max_objects {obj-count}]
[max_bytes {bytes}]
#命令举例:
ceph osd pool set-quota rbd max_objects 10000
删除存储池
在ceph.conf配置文件中添加如下内容:
[global]
.......
mon_allow_pool_delete = true
使用ceph-deploy推配置给所有节点
ceph-deploy --overwrite-conf config push
cephnode1 cephnode2 cephnode3
重启ceph-mon服务
systemctl restart ceph-mon.target
#执行删除pool命令
ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it
#命令举例:
ceph osd pool delete kube kube --yes-i-really-really-mean-it
重命名存储池
ceph osd pool rename {current-pool-name} {new-pool-name}
查看存储池统计信息
rados df
给存储池做快照
ceph osd pool mksnap {pool-name} {snap-name}
删除存储池的快照
ceph osd pool rmsnap {pool-name} {snap-name}
获取存储池选项值
ceph osd pool get {pool-name} {key}
调整存储池选项值
ceph osd pool set {pool-name} {key} {value}
#size:设置存储池中的对象副本数,详情参见设置对象副本数。仅适用于副本 存储池。
#min_size:设置 I/O 需要的最小副本数,详情参见设置对象副本数。仅适用 于副本存储池。
#pg_num:计算数据分布时的有效 PG 数。只能大于当前 PG 数。
#pgp_num:计算数据分布时使用的有效 PGP 数量。小于等于存储池的 PG 数。
#hashpspool:给指定存储池设置/取消 HASHPSPOOL 标志。
#target_max_bytes:达到 max_bytes 阀值时会触发 Ceph 冲洗或驱逐对象。
#target_max_objects:达到 max_objects 阀值时会触发 Ceph 冲洗或驱逐对象。
#scrub_min_interval:在负载低时,洗刷存储池的最小间隔秒数。如果是 0 , 就按照配置文件里的 osd_scrub_min_interval 。
#scrub_max_interval:不管集群负载如何,都要洗刷存储池的最大间隔秒数。 如果是 0 ,就按照配置文件里的 osd_scrub_max_interval 。
#deep_scrub_interval:“深度”洗刷存储池的间隔秒数。如果是 0 ,就按照配 置文件里的 osd_deep_scrub_interval 。
获取对象副本数
ceph osd dump | grep 'replicated size'
Ceph 把数据以对象的形式存于各存储池中。Ceph 用户必须具有访问存储池的权限才 能够读写数据。另外,Ceph 用户必须具有执行权限才能够使用 Ceph 的管理命令。
查看用户信息
#查看所有用户信息
ceph auth list
#获取所有用户的key与权限相关信息
ceph auth get client.admin
#如果只需要某个用户的key信息,可以使用pring-key子命令
ceph auth print-key client.admin
添加用户
ceph auth add client.john mon 'allow r' osd 'allow rw pool=liverpool'
ceph auth get-or-create client.paul mon 'allow r' osd 'allow rw pool=liverpool'
ceph auth get-or-create client.george mon 'allow r' osd 'allow rw pool=liverpool' -o george.keyring
ceph auth get-or-create-key client.ringo mon 'allow r' osd 'allow rw pool=liverpool' -o ringo.key
修改用户权限
ceph auth caps client.john mon 'allow r' osd 'allow rw pool=liverpool'
ceph auth caps client.paul mon 'allow rw' osd 'allow rwx pool=liverpool'
ceph auth caps client.brian-manager mon 'allow *' osd 'allow *'
ceph auth caps client.ringo mon ' ' osd ' '
删除用户
ceph auth del {TYPE}.{ID}
#其中, {TYPE} 是 client,osd,mon 或 mds 的其中一种。{ID} 是用户的名 字或守护进程的 ID 。
1
health: HEALTH_WARN
1 daemons have recently crashed
#ceph报守护程序最近崩溃了的解决方法
ceph health detail
#新的崩溃可以通过以下方式列出
ceph crash ls-new
#有关特定崩溃的信息可以通过以下方法检查
ceph crash info -id>
#可以通过“存档”崩溃(可能是在管理员检查之后)来消除此警告,从而不会生成 此警告
ceph crash archive -id>
#所有新的崩溃都可以通过以下方式存档
ceph crash archive-all
#通过ceph crash ls仍然可以看到已存档的崩溃
可以通过以下方式完全禁用这些警告
ceph config set mgr/crash/warn_recent_interval 0
2
health: HEALTH_WARN
mons are allowing insecure global_id reclaim
ceph health detail
ceph config set mon auth_allow_insecure_global_id_reclaim false
3
health: HEALTH_WARN
application not enabled on 1 pool(s)
ceph health detail
ceph osd pool application enable rbd rbd
4
HEALTH_WARN
Degraded data redundancy: 187/561 objects degraded (33.333%), 43 pgs degraded, 160 pgs undersized; OSD count 2 < osd_pool_default_size 3; mons are allowing insecure global_id reclaim
默认3副本没满足
扩容mon
环境准备
硬件配置:2C4G
另外每台机器最少挂载三块硬盘
关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
关闭selinux:
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
关闭NetworkManager
systemctl disable NetworkManager
systemctl stop NetworkManager
cephnode1操作机上主机名与IP对应关系
vim /etc/hosts
192.168.66.10 cephnode1
192.168.66.11 cephnode2
192.168.66.12 cephnode3
设置文件描述符
echo "ulimit -SHn 102400" >> /etc/rc.local
vim /etc/security/limits.conf
* soft nofile 655360
* hard nofile 655360
root soft nofile 655360
root hard nofile 655360
* soft core unlimited
* hard core unlimited
root soft core unlimited
内核参数优化
vi /etc/sysctl.conf
#仅在内存不足的情况下--当剩余空闲内存低于vm.min_free_kbytes limit时,使用交换空间。
vm.swappiness = 0
#单个进程可分配的最大文件数
fs.nr_open=2097152
#系统最大文件句柄数
fs.file-max=1048576
#backlog 设置
net.core.somaxconn=32768
net.ipv4.tcp_max_syn_backlog=16384
net.core.netdev_max_backlog=16384
#TCP Socket 读写 Buffer 设置
net.core.rmem_default=262144
net.core.wmem_default=262144
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.core.optmem_max=16777216
net.ipv4.neigh.default.gc_stale_time=120
#TIME-WAIT Socket 最大数量、回收与重用设置
net.ipv4.tcp_max_tw_buckets=1048576
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
#TCP 连接追踪设置
net.nf_conntrack_max=1000000
net.netfilter.nf_conntrack_max=1000000
net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
# FIN-WAIT-2 Socket 超时设置
net.ipv4.tcp_fin_timeout=15
net.ipv4.ip_forward = 1
kernel.pid_max=4194303
sysctl -p
同步网络时间和修改时区
yum -y install chrony
vim /etc/chrony.conf
systemctl restart chronyd
systemctl enable chronyd
chronyc sources
安装createrepo和epel源(传软件包\安装包到服务器上)
yum install createrepo -y
yum install epel-release -y
yum install lttng-ust -y
编辑yum源文件
vim /etc/yum.repos.d/ceph.repo
[Ceph]
name=Ceph packages for $basearch
baseurl=http://192.168.0.6/ceph/rpm-nautilus/el7/$basearch
gpgcheck=0
priority=1
[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://192.168.0.6/ceph/rpm-nautilus/el7/noarch
gpgcheck=0
priority=1
[ceph-source]
name=Ceph source packages
baseurl=http://192.168.0.6/ceph/rpm-nautilus/el7/SRPMS
gpgcheck=0
priority=1
#执行
yum makecache
传软件包\安装包到服务器上
yum -y install ceph
ceph -v
cephnode1操作节点上把新加mon加入集群
for i in 13 14; do ssh-copy-id root@192.168.66.$i; done
cd /my-cluster/
vim ceph.conf
mon_initial_members = cephnode1, cephnode2, cephnode3, cephnode4, cephnode5
mon_host = 192.168.66.10,192.168.66.11,192.168.66.12,192.168.66.13,192.168.66.14
public_network = 192.168.66.0/24
#配置文件推送到各各节点
ceph-deploy --overwrite-conf config push
cephnode1 cephnode2 cephnode3 cephnode4 cephnode5
ceph-deploy mon add cephnode4 --address 节点ip
ceph-deploy mon add cephnode5 --address 节点ip
cephnode1操作节点上安装Ceph CLI,方便执行一些管理命令
如前所示,我们执行admin的命令,要提供admin的key(–keyring ceph.client.admin.keyring)以及配置文件(-c ceph.conf)。在后续的运维中,我们经常 需要在某个node上执行admin命令。每次都提供这些参数比较麻烦。实际上,ceph 会默认地从/etc/ceph/中找keyring和ceph.conf。因此,我们可以把 ceph.client.admin.keyring和ceph.conf放到每个node的/etc/ceph/。ceph-deploy可 以 帮做这些
ceph-deploy admin cephnode4 cephnode5
cephnode1操作节点上部署监控配置mgr,用于管理集群
ceph-deploy mgr create cephnode4 cephnode5
cephnode1操作节点上部署MDS(CephFS)
ceph-deploy mds create cephnode4 cephnode5
cephnode1操作节点上添加osd(添加的磁盘必须是没有被处理过的裸盘)
ceph-deploy osd create --data /dev/sdb cephnode4
ceph-deploy osd create --data /dev/sdc cephnode4
ceph-deploy osd create --data /dev/sdb cephnode5
ceph-deploy osd create --data /dev/sdc cephnode5
检查状态
ceph osd tree
查看Ceph集群概况
ceph -s
喜欢的亲可以关注点赞评论哦!以后每天都会更新的哦!本文为小编原创文章; 文章中用到的文件、安装包等可以加小编联系方式获得;
欢迎来交流小编联系方式VX:CXKLittleBrother 进入运维交流群