ceph
ceph是一个开源的,用c++语言编写的分布式的存储系统,存储文件数据。
/dev/sdb
fdisk /dev/sdb
gdisk /dev/sdb
lvm 逻辑卷
可以扩容
raid磁盘阵列
高可用
数据流向图:
基于物理意义上的单机的存储
分布式由多台物理磁盘组成一个集群,在这个基础上实现高可用,扩展。
ceph是一个统一的存储系统,同时提供块设备存储,文件系统存储和对象存储三种存储方式
对象存储:
对象存储也就是键值存储,通过接口指令,get put del 和其他的命令向对象存储上传或者下载数据。
把数据作为对象,按照一定的逻辑和算法,存储到不同的硬盘上(可以是不同机器上的硬盘,依靠网络来进行互相通信)
优点:使用的是硬盘组,不受目录影响,读写效率高
集群的扩展性很强,支持多副本存储。
可移直接通过url访问文件。简单,也好管理
缺点:内容变动比较大的文件不适合作为对象存储,每一次变动都要重新上传。静态图片等等不需要变动的数据。
文件系统存储 ceph-fs
ceph集群的存储看做是一个大的分区或者共享文件挂载到客户端的本地
客户端可以在本地之间进行操作。速度快,可以存储的数据类型也没有限制
内核态和用户态:
mount 内核 速度快 读写也快
ceph-fuse 用户态 速度慢 读写稍慢
优点:成本低,随便的一台服务器都可以做。公司内部都会使用这种方式。内网云盘就是这种方式。
缺点:读写速度和传输速度相对较慢(本地使用不在此列)
块存储RDB:
rdb为kvm虚拟化和云服务(OpenStack)提供高性能和无限可扩展的存储后端。磁盘映射,RAID和lvm提供磁盘空间,多个主机上的raid或者lvm组成一个逻辑上的RAID和lvm多块磁盘组成这种逻辑空间,可并行的执行读写操作。IO效率较高
缺点:对网络传输的要求比较高,windows无法访问linux的RDB操作
ceph的主要特点:
统一存储 对象 块 文件系统
crush算法,算法来实现数据的寻址,数据完整性的校验和一致性。理论上可移支持上千个数据存储节点。
高扩展性 扩容方便
可靠性比较强 副本,创建数据的时候可以对数据进行副本操作,副本数由管理定义的
副本可以跨主机保存,跨架构,跨机房,数据中心进行保存
高性能 因为是多副本,读写时候可以做到并行化处理。
ceph的组件和作用
1、OSD ceph当中的OSD的守护进程,是集群的基础
主要功能:存储数据,保存副本数据,数据恢复,平衡数据分布。
冗余和高可用只是要有3个OSD(三个机器上的三个物理硬盘)
2、Monitors mon Monitors守护进程,监视ceph集群的状态,维护ceph集群的健康 OSD的状态也属于MON的监控范围
ceph存储集群必须要一个Monitors进程,和两个OSD进程
服务器的数量必须是奇数台。3-5
管理节点 mon osd osd
3、MDS也是一个守护进程,保存ceph文件系统的元数据。(文件的权限,所有者,所在组,修改时间等等,在ceph集群当中的inode号)
4、managers 也是作为守护进程运行,跟踪集群的运行时间的指标和ceph集群的状态:存储的利用率,性能指标和系统的负载。
5.RADOS:分布式存储系统,所有的存储功能都是基于RADOS实现的。高可用,高性能也是基于RADOS实现的。
他是所有一切的底层 也是整个ceph集群的核心
RADOS由两部分组成:OSD,Monitor
6、LIBRADOS:这是一个动态库,用来允许应用程序和RADOS系统进行交互。通过端口进行通信。
存储的概念:
存储数据和object的关系
对象,块,文件系统挂载,都需要object,存储的数据会被分成多个object,分成之后每一个数据都有object id
每个数据的object的大小可以调整的,默认是4M
object是ceph的最小存储单位
object和pg的关系
object数量太多了,在一个集群当中,object的数量太多,遍历和寻址速度都很慢,PG,就是归置组,placcment group 管理object 通过crush算法映射到PG当中,一个pg里面可以包含多个object
pg与osd之间的关系:
pg也是通过CRUSH算法映射到osd当中去存储,如果有3个副本,每个pg会映射到三个osd当中
三个osd A B C
pg......>A
pg.........>B
pg..............>C
PG和PGD的关系
pgd是存放pg的排列组合
3osd
A B C 副本数2 pgd 1
[A B]
存储池:pool
ceph的集群进行逻辑划分,设置ceph存储集群的权限,副本数,pg的数量和算法的规则
pool是由管理员自定义,相当于一个独立的空间,每个pool之间是独立的,数据也是隔离的。
ceph的安装
实验准备:
|--------------|----------------|-------------------|
| 服务器 | ip | 角色 |
| redis5(管理节点) | 192.168.233.45 | admin、osd、mon、mgr |
| redis6 | 192.168.233.46 | mds、mon、mgr |
| redis7 | 192.168.233.47 | mds、mon、mgr |
| test2 | 192.168.233.20 | client |
#关闭所有点的防火墙和selinux
systemctl stop firewalld
setenforce 0
#添加主机映射关系:
vim /etc/hosts
192.168.233.45 redis5
192.168.233.46 redis6
192.168.233.47 redis7
192.168.233.20 test2
#主节点生成密钥队:
[root@redis5 ~]# ssh-keygen
#一路回车即可
#将密钥发送到每个从节点
192.168.233.45 redis5
192.168.233.46 redis6
192.168.233.47 redis7
192.168.233.20 test2
#所有节点安装源
cat> /etc/yum.repos.d/ceph.repo <<eof
[ceph]
name=ceph
baseurl=http://mirrors.163.com/ceph/rpm-luminous/el7/x86_64/
gpgcheck=0
[ceph-noarch]
name=ceph-noarch
baseurl=http://mirrors.163.com/ceph/rpm-luminous/el7/noarch/
gpgcheck=0
eof
yum clean all && yum makecache
#主节点和从节点添加硬盘
alias scan='echo "- - -" > /sys/class/scsi_host/host0/scan;echo "- - -" > /sys/class/scsi_host/host1/scan;echo "- - -" > /sys/class/scsi_host/host2/scan'
执行scan
#所有节点安装服务
yum install -y ceph-deploy ceph ceph-radosgw snappy leveldb gdisk python-argparse gperftools-libs
#配置集群:(主节点操作redis5)
cd /etc/ceph/
ceph-deploy new test1 test2 test3
# 管理节点,多个mon模式
cd /etc/ceph/
ceph-deploy new redis5 redis6 redis7
执行完毕后,可以看到/etc/ceph目录中生成了三个文件
ceph.conf 为 ceph 配置文件,ceph-deploy-ceph.log 为 ceph-deploy 日志文件,ceph.mon.keyring 为 ceph monitor的密钥环。
把 Ceph 配置文件里的默认副本数从 3 改成 2 ,
这样只有两个 OSD 也可以达到 active + clean 状态。
把下面这行加入 [global] 段:
ceph.conf 配置文件,增加副本数为 2。
[root@redis5 ceph]# echo "osd_pool_default_size = 2" >> ceph.conf
osd_pool_default_size = 2 是 Ceph 存储集群中的一个参数设置。
它指定了在创建新的 Ceph 存储池(pool)时,默认的副本数或者分片数。
在这种情况下,设置为 2 意味着每个对象会有两个副本(或者两个分片,具体取决于 Ceph 的配置方式)。
初始化mon节点并收集所有秘钥
# 管理节点初始化
ceph-deploy mon create-initial
# 查看集群状态
[root@redis5 ceph]# ceph -s
cluster:
id: 7400f7ac-0613-4048-bd80-125ebc02446f
health: HEALTH_OK
#这里ok表示没问题
services:
mon: 3 daemons, quorum test1,test2,test3
mgr: no daemons active
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0B
usage: 0B used, 0B / 0B avail
pgs:
Health Status:
集群的健康状态显示为 HEALTH_OK,这通常表示集群的整体状态是正常的。然而,这并不意味着所有组件都正常运行。
Services:
mon: 有3个监视器(mon)守护进程正在运行,显示quorum的节点是test1、test2、test3,这表示监视器集群是正常的。
mgr: 管理器(mgr)没有活动的守护进程,这可能是一个问题。通常情况下,至少应该有一个活跃的mgr进程来收集和显示集群的状态数据。
osd: 没有OSD(对象存储守护进程)在运行。通常情况下,Ceph集群应该至少有一个OSD守护进程来存储数据。
添加osd服务实验:
Ceph 12版本部署osd格式化命令跟之前不同
添加完硬盘直接使用,不要分区
ceph自动分区
接下来需要创建 OSD 了,OSD 是最终数据存储的地方,这里我们准备了3个 OSD 节点。
官方建议为 OSD 及其日志使用独立硬盘或分区作为存储空间,也可以使用目录的方式创建。
[root@redis5 ceph]# ceph-deploy disk zap test1 /dev/sdb
[root@redis5 ceph]# ceph-deploy disk zap test2 /dev/sdb
[root@redis5 ceph]# ceph-deploy disk zap test3 /dev/sdb
添加osd节点
[root@redis5 ceph]# ceph-deploy osd create test1 --data /dev/sdb
[root@redis5 ceph]# ceph-deploy osd create test2 --data /dev/sdb
[root@redis5 ceph]# ceph-deploy osd create test3 --data /dev/sdb
查看osd节点的状态
[root@test1 ceph]# ceph-deploy osd list test1 test2 test3
#添加mgr服务
ceph-deploy mgr create test1 test2 test3
统一集群配置
用 ceph-deploy 把配置文件和 admin 密钥拷贝到管理节点和 Ceph 节点,
这样你每次执行 Ceph 命令行时就无需指定 monitor 地址和 ceph.client.admin.keyring 了。
# 管理节点
[root@ceph01 ceph]# ceph-deploy admin test1 test2 test3
# 集群每一个节点授权
[root@redis5 ceph]# chmod +r /etc/ceph/ceph.client.admin.keyring
[root@redis6 ceph]# chmod +r /etc/ceph/ceph.client.admin.keyring
[root@redis7 ceph]# chmod +r /etc/ceph/ceph.client.admin.keyring
5、添加mds服务
Mds是ceph集群中的元数据服务器,而通常它都不是必须的,
因为只有在使用cephfs的时候才需要它,而目在云计算中用的更广泛的是另外两种存储方式。
Mds虽然是元数据服务器,但是它不负责存储元数据,
元数据也是被切成对象存在各个osd节点中的
在创建CEPH FS时,要至少创建两个POOL,一个用于存放数据,另一个用于存放元数据。
Mds只是负责接受用户的元数据查询请求,然后从osd中把数据取出来映射进自己的内存中供客户访问。
所以mds其实类似一个代理缓存服务器,替osd分担了用户的访问压力
# 管理节点
[root@redis5 ceph]# ceph-deploy mds create test2 test3
查看mds服务状态
[root@redis5 ceph]# ceph mds stat
, 2 up:standby
# 查看集群状态
[root@test1 ceph]# ceph -s
ceph集群运用
1、文件系统运用
创建文件系统存储池
# 查看文件系统
[root@redis5 ~]# ceph fs ls
No filesystems enabled ## 没有文件系统
# 首先创建存储池
语法:
ceph osd pool create cephfs_data <pg_num>
ceph osd pool create cephfs_metadata <pg_num>
其中:<pg_num> = 128 ,
关于创建存储池
确定 pg_num 取值是强制性的,因为不能自动计算。下面是几个常用的值:
*少于 5 个 OSD 时可把 pg_num 设置为 128
*OSD 数量在 5 到 10 个时,可把 pg_num 设置为 512
*OSD 数量在 10 到 50 个时,可把 pg_num 设置为 4096
*OSD 数量大于 50 时,你得理解权衡方法、以及如何自己计算 pg_num 取值
*自己计算 pg_num 取值时可借助 pgcalc 工具
https://ceph.com/pgcalc/
放置组(PG)的作用
数据分布: PG 是 Ceph 数据分布机制的基本单位。Ceph 会将数据对象映射到 PG 上,
然后再将这些 PG 映射到 OSD(对象存储守护进程)上。
这样,即使对象的数量非常庞大,通过管理较少数量的 PG,Ceph 也能有效地分配和管理数据。
负载均衡: 通过 PG,Ceph 可以将数据均匀地分布在所有 OSD 上,从而实现负载均衡。
增加或减少 OSD 时,Ceph 只需要调整 PG 的映射,从而尽可能减少数据迁移。
选择合适的 pg_num
计算方式: 选择合适的 PG 数量对于系统的性能和效率非常重要。
一般来说,PG 数量越多,数据分布越均匀,但管理的复杂度也会增加。
常用的计算方式是:pg_num = (OSD数量 * 100) / 副本数量。
#CephFS 需要两个 Pools - cephfs-data 和 cephfs-metadata, 分别存储文件数据和文件元数据
[root@redis5 ~]# ceph osd pool create ceph_data 128
pool 'ceph_data' created
[root@redis5 ~]# ceph osd pool create ceph_metadata 64
pool 'ceph_metadata' created
您在创建 ceph_metadata 池时,指定了 128 个 PG(pg_num),副本数为 3。
PG 数量将达到 768(这包括了所有池的 PG 数量乘以副本数),而系统允许的最大 PG 数量是 750。
这个限制是由 mon_max_pg_per_osd 参数(每个 OSD 的最大 PG 数量)和 OSD 数量决定的。
总 PG 数量 = (128 * 3) + (128 * 3) = 768 #不能超过750
创建文件系统
创建好存储池后,你就可以用 fs new 命令创建文件系统了
命令:ceph fs new <fs_name> cephfs_metadata cephfs_data
其中:<fs_name> = cephfs 可自定义
# 给创建的2个存储池创建文件系统
[root@ceph01 ~]# ceph fs new cephfs ceph_metadata ceph_data
new fs with metadata pool 2 and data pool 1
# 查看文件系统
[root@ceph01 ~]# ceph fs ls
name: cephfs, metadata pool: ceph_metadata, data pools: [ceph_data ]
# 查看mds的状态
[root@ceph01 ~]# ceph fs status cephfs
挂载客户端
要挂载 Ceph 文件系统,如果你知道监视器 IP 地址可以用 mount 命令、
或者用 mount.ceph 工具来自动解析监视器 IP 地址。
# 内核驱动的方式挂载文件系统
# 在client创建挂载点
[root@test2 ~]# mkdir /data
# 查看秘钥
[root@ceph01 ~]# cat /etc/ceph/ceph.client.admin.keyring
# 使用秘钥挂载
[root@test2 ~]# mount -t ceph 192.168.233.10:6789:/ /data/ -o name=admin,secret=AQALTDBm6g0FChAApdTfxOY+Y1nP4c2L2XR2qw==
# 取消挂载
[root@test2 ~]# umount /data/
用户空间的方式挂载文件系统
[root@client ~]# yum install -y ceph-fuse
# 挂载
[root@ceph01 ceph]# scp ceph.client.admin.keyring ceph.conf client:/etc/ceph/
ceph.client.admin.keyring 100% 63 52.5KB/s 00:00
ceph.conf 100% 266 266.9KB/s 00:00
[root@test2 ~]# ceph-fuse -m 192.168.233.20:6789 /data/
# 取消挂载
[root@test2 ~]# umount /data/
用户空间的方式挂载文件系统
[root@test2 ~]# yum install -y ceph-fuse
# 挂载
[root@test4 /]# mkdir /etc/ceph
[root@ceph01 ceph]# scp ceph.client.admin.keyring ceph.conf 192.168.233.40:/etc/ceph/
ceph.client.admin.keyring 100% 63 52.5KB/s 00:00
ceph.conf 100% 266 266.9KB/s 00:00
[root@test2 ~]# ceph-fuse -m 192.168.233.10:6789 /data/
# 取消挂载
[root@test2 ~]# umount /data/
mount -t ceph 和 ceph-fuse 都可以用于将 Ceph 文件系统(CephFS)挂载到客户端,但它们有一些关键的区别:
内核支持:
使用 mount -t ceph 需要 Ceph 内核模块(ceph 和 ceph-fuse)来支持内核级挂载。它通过内核实现,通常会提供比用户空间工具更好的性能。
ceph-fuse
用户态实现:
ceph-fuse 是一个用户态工具,通过 FUSE(Filesystem in Userspace)实现 Ceph 文件系统挂载。它不需要内核级支持。
性能: mount -t ceph(内核级)通常提供更好的性能,而 ceph-fuse(用户空间)可能在性能上略逊一筹。
兼容性: ceph-fuse 可以在不支持 Ceph 内核模块的系统上使用,适用于用户空间挂载。
实现: mount -t ceph 是内核级挂载,而 ceph-fuse 是用户空间挂载工具。
ceph osd pool get cephfs_data size #查询副本数
ceph osd pool set cephfs_data size 2 #修改副本数
块存储运用
Ceph支持一个非常好的特性,以COW(写时复制copy-on-write)的方式从RBD快照创建克隆,在Ceph中被称为快照分层。
分层特性允许用户创建多个CEPH RBD克隆实例。
这些特性应用于OpenStack等云平台中,使用快照形式保护ceph RBD 镜像,快照是只读的,
但COW克隆是完全可以写 ,可以多次来孵化实例,对云平台来说是非常有用的。