ceph分布式存储系统

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克隆是完全可以写 ,可以多次来孵化实例,对云平台来说是非常有用的。
相关推荐
天冬忘忧12 分钟前
Kafka 生产者全面解析:从基础原理到高级实践
大数据·分布式·kafka
天冬忘忧1 小时前
Kafka 数据倾斜:原因、影响与解决方案
分布式·kafka
隔着天花板看星星1 小时前
Kafka-Consumer理论知识
大数据·分布式·中间件·kafka
隔着天花板看星星1 小时前
Kafka-副本分配策略
大数据·分布式·中间件·kafka
金刚猿2 小时前
简单理解下基于 Redisson 库的分布式锁机制
分布式·分布式锁·redisson
我一直在流浪2 小时前
Kafka - 消费者程序仅消费一半分区消息的问题
分布式·kafka
张彦峰ZYF3 小时前
投资策略规划最优决策分析
分布式·算法·金融
processflow流程图6 小时前
分布式kettle调度平台v6.4.0新功能介绍
分布式
全栈开发圈6 小时前
干货分享|分布式数据科学工具 Xorbits 的使用
分布式
运维&陈同学8 小时前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列