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克隆是完全可以写 ,可以多次来孵化实例,对云平台来说是非常有用的。
相关推荐
数据智能老司机6 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
数据智能老司机7 小时前
CockroachDB权威指南——开始使用
数据库·分布式·架构
数据智能老司机7 小时前
CockroachDB权威指南——CockroachDB 架构
数据库·分布式·架构
IT成长日记8 小时前
【Kafka基础】Kafka工作原理解析
分布式·kafka
州周9 小时前
kafka副本同步时HW和LEO
分布式·kafka
爱的叹息11 小时前
主流数据库的存储引擎/存储机制的详细对比分析,涵盖关系型数据库、NoSQL数据库和分布式数据库
数据库·分布式·nosql
斯普信专业组11 小时前
Ceph异地数据同步之-RBD异地同步复制(下)
linux·服务器·ceph
千层冷面12 小时前
RabbitMQ 发送者确认机制详解
分布式·rabbitmq·ruby
ChinaRainbowSea12 小时前
3. RabbitMQ 的(Hello World) 和 RabbitMQ 的(Work Queues)工作队列
java·分布式·后端·rabbitmq·ruby·java-rabbitmq
敖正炀12 小时前
基于RocketMQ的可靠消息最终一致性分布式事务解决方案
分布式