ceph是一个开源的,用c++语言编写的分布式的存储系统,存储文件数据。
/dev/sdb 物理磁盘
lvm 逻辑卷,动态扩容
raid 磁盘阵列,动态扩容,高可用
以上都是基于物理意义上的单机的存储系统
ceph分布式由多台物理磁盘组成一个集群,在这个基础之上实现高可用,扩容
1、远程访问
2、多个服务器组成的虚拟的硬盘
3、分布式存储
4、负载均衡和数据同步
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实现的,高可用,高性能也是基于rados实现的,他是所有一切的底层,也是整个ceph集群的核心
rados由两部组成:OSD和Monitors
6、LIBRADOS:这是一个动态库,用来允许应用程序和RADOS系统进行交互。
通过端口进行通信。
存储的概念:
存储数据和object的关系:
对象存储,块存储,文件系统挂载,都需要object,存储的数据都会被分成多个object,分成之后每一个数据都有一个object id。
每个数据object的大小是可以调整的,默认是4M
ceph的最小存储单位
object和pg的关系:
在一个集群当中object数量太多,遍历和寻址速度都很慢
PG 就是归置组,placcment group 管理object
object通过CRUSH算法映射到PG当中,一个PG里面可以包含多个object
pg与osd之间的关系:
pg也是通过CRUSH算法映射到osd当中去存储,如果有3个副本,每个pg会映射三个osd当中
PG和PGD的关系:
pgd是存放pg的排列组合
存储池 :pool
ceph的集群进行逻辑划分,设置ceph存储集群的权限,副本数 pg的数量和算法的规则
pool是由管理员自定义,相当于一个独立的空间,每个pool之间是独立的,数据也是隔离的。
实验环节:
服务器 ip地址 功能
test1 192.168.124.10 admin、osd、mon、mgr
test2 192.168.124.20 osd、mds、mon、mgr
test3 192.168.124.30 osd、mds、mon、mgr
客户端
nginx1 192.168.124.40
关闭所有点的防火墙和安全机制
1 [root@test1 ~]# systemctl stop firewalld
2 [root@test1 ~]# setenforce 0
添加主机映射关系
1 vim /etc/hosts
2 192.168.124.10 test1
3 192.168.123.20 test2
4 192.168.124.30 test3
主节点生成密钥队
[root@test1 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:TF7xrNIEndEg75ZKltiuJqo4T9lwaznK7GJvwX3NKag root@test1
The key's randomart image is:
+---[RSA 2048]----+
| o.+= |
| +o+. |
| . + o |
| * * o |
| o o o S B |
| B = * B |
| o O . + |
|+= E.... |
|+*Xo o. |
+----[SHA256]-----+
将密钥发送到每个从节点
[root@test1 ~]# ssh-copy-id 192.168.124.20
[root@test1 ~]# ssh-copy-id 192.168.124.30
[root@test1 ~]# ssh-copy-id 192.168.124.40
所有节点安装源
[root@test1 ~]# 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清除缓存并重新生成缓存
所有节点安装服务
yum install -y ceph-deploy ceph ceph-radosgw snappy leveldb gdisk python-argparse gperftools-libs
配置集群:
1 [root@test1 ceph]# cd /etc/ceph/
2 [root@test1 ceph]# ceph-deploy new test1 test2 test3
vim ceph.conf[global]
fsid = 82cf375e-6891-4832-b8db-a243138c31ed
mon_initial_members = test1, test2, test3
mon_host = 192.168.124.10,192.168.124.20,192.168.124.30
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
osd_pool_default_size = 2
管理节点初始化
ceph-deploy mon create-initial
查看集群状态
[root@test1 ceph]# ceph -s
cluster:
id: 82cf375e-6891-4832-b8db-a243138c31ed
health: HEALTH_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守护进程来存储数据。
ceph自动分区 接下来需要创建 OSD 了,OSD 是最终数据存储的地方,这里我们准备了3个 OSD 节点。 官方建议为 OSD 及其日志使用独立硬盘或分区作为存储空间,也可以使用目录的方式创建。
1 [root@test1 ceph]# ceph-deploy disk zap test1 /dev/sdb
2 [root@test1 ceph]# ceph-deploy disk zap test2 /dev/sdb
3 [root@test1 ceph]# ceph-deploy disk zap test3 /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@test1 ceph]# chmod +r /etc/ceph/ceph.client.admin.keyring
[root@test2 ceph]# chmod +r /etc/ceph/ceph.client.admin.keyring
[root@test3 ceph]# chmod +r /etc/ceph/ceph.client.admin.keyring
添加mds服务 Mds是ceph集群中的元数据服务器,而通常它都不是必须的, 因为只有在使用cephfs的时候才需要它,而目在云计算中用的更广泛的是另外两种存储方式。
Mds虽然是元数据服务器,但是它不负责存储元数据, 元数据也是被切成对象存在各个osd节点中的
在创建CEPH FS时,要至少创建两个POOL,一个用于存放数据,另一个用于存放元数据。 Mds只是负责接受用户的元数据查询请求,然后从osd中把数据取出来映射进自己的内存中供客户访问。 所以mds其实类似一个代理缓存服务器,替osd分担了用户的访问压力
管理节点
[root@test1 ceph]# ceph-deploy mds create test2 test3
查看mds服务状态
[root@test11 ceph]# ceph mds stat
, 2 up:standby
查看集群状态
[root@test1 ceph]# ceph -s
cluster:
id: 82cf375e-6891-4832-b8db-a243138c31ed
health: HEALTH_OK
services:
mon: 3 daemons, quorum test1,test2,test3
mgr: test1(active), standbys: test3, test2
osd: 3 osds: 3 up, 3 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0B
usage: 3.01GiB used, 57.0GiB / 60.0GiB avail
pgs:
查看文件系统
[root@test1 ~]# ceph fs ls
No filesystems enabled 没有文件系统
首先创建存储池 语法:
[root@test1 ceph]# ceph osd pool create cephfs_data 128
pool 'cephfs_data' created
[root@test1 ceph]# ceph osd pool create ceph_metadata 128
pool 'ceph_metadata' created
第一个存储数据的pool 第二个存储元数据的pool
ceph osd pool create cephfs date pg_num
少于5个osd的情况下,pg的数量等于128
5-10个osd 512
10-50个osd 4096个
Pg总数:750个,不能超过750个
128 * 3= 384个
750-384= 366
存储元数据也要pg
1282=256
存储数据:
osdpg值
元数据
2pg值
osd pg值+2pg值<750
pg_num=(osd100)/副本数 设定pg值的目的,通过管理较少的pg,ceph获取数据,分配,管理数据的效率越高
pg值越多,数据分布的越多,管理就越复杂。
给创建的2个存储池创建文件系统
[root@test1 ceph]# ceph fs new cephfs ceph_metadata ceph_data
new fs with metadata pool 2 and data pool 1
这里创建文件系统名称的时候可以更改cephfs
查看文件系统
[root@test1 ceph]# ceph fs ls
name: cephfs, metadata pool: ceph_metadata, data pools: [cephfs_data ]
查看mds的状态
[root@test1 ceph]# ceph fs status cephfs
cephfs - 0 clients======
+------+--------+-------+---------------+-------+-------+
| Rank | State | MDS | Activity | dns | inos |
+------+--------+-------+---------------+-------+-------+
| 0 | active | test2 | Reqs: 0 /s | 10 | 12 |
+------+--------+-------+---------------+-------+-------+
+---------------+----------+-------+-------+
| Pool | type | used | avail |
+---------------+----------+-------+-------+
| ceph_metadata | metadata | 2246 | 26.9G |
| cephfs_data | data | 0 | 26.9G |
+---------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
| test3 |
+-------------+
MDS version: ceph version 12.2.13 (584a20eb0237c657dc0567da126be145106aa47e) luminous (stable)
内核驱动的方式挂载文件系统
在client创建挂载点
[root@nginx1 ~]# mkdir /data
查看秘钥
[root@test1 ceph]# cat ceph.client.admin.keyring [client.admin] key = AQBkHLNmMJQjMxAAcT0Avk2vxSJ667mGTxBRhA==
使用秘钥挂载
[root@nginx1 ~]# mount -t ceph 192.168.124.10:6789:/ /data -o name=admin,secret=AQBkHLNmMJQjMxAAcT0Avk2vxSJ667mGTxBRhA==
查看挂载状态
[root@nginx1 ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 37G 9.6G 27G 27% / devtmpfs 2.3G 0 2.3G 0% /dev tmpfs 2.3G 0 2.3G 0% /dev/shm tmpfs 2.3G 13M 2.3G 1% /run tmpfs 2.3G 0 2.3G 0% /sys/fs/cgroup /dev/sda1 1014M 179M 836M 18% /boot /dev/mapper/centos-home 18G 39M 18G 1% /home tmpfs 470M 12K 470M 1% /run/user/42 tmpfs 470M 0 470M 0% /run/user/0 192.168.124.10:6789:/ 27G 0 27G 0% /data
用户空间的方式挂载文件系统
安装用户态挂载的工具
[root@nginx1 data]# yum -y install ceph-fuse
挂载
[root@nginx1 ceph]# mkdir /data1 [root@nginx1 ceph]# ceph-fuse -m 192.168.124.10:6789 /data1 ceph-fuse[16863]: starting ceph client 2024-08-07 16:04:00.717627 7f18da9c5240 -1 init, newargv = 0x5612f406d260 newargc=9 ceph-fuse[16863]: starting fuse [root@nginx1 ceph]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 37G 9.6G 27G 27% / devtmpfs 2.3G 0 2.3G 0% /dev tmpfs 2.3G 0 2.3G 0% /dev/shm tmpfs 2.3G 13M 2.3G 1% /run tmpfs 2.3G 0 2.3G 0% /sys/fs/cgroup /dev/sda1 1014M 179M 836M 18% /boot /dev/mapper/centos-home 18G 39M 18G 1% /home tmpfs 470M 12K 470M 1% /run/user/42 tmpfs 470M 0 470M 0% /run/user/0 192.168.124.10:6789:/ 27G 100M 27G 1% /data ceph-fuse 27G 100M 27G 1% /data1
调整副本数,在命令行输入
ceph osd pool get ceph_date size +数字
总结:
Ceph 是一种强大的分布式存储系统,具有诸多显著特点和优势。
首先,它具备高度的可扩展性。能够轻松应对不断增长的数据存储需求,通过添加新的存储节点实现容量和性能的线性扩展。例如,在一个大型数据中心中,随着业务的发展,可以逐步增加 Ceph 存储节点,而不会对现有系统造成太大影响。
其次,Ceph 提供了出色的数据可靠性和容错能力。它通过数据冗余机制,如副本和纠删码,确保数据的安全性和可用性。即便某些存储节点出现故障,数据仍然能够被访问和恢复。
再者,Ceph 支持多种存储接口,包括块存储、文件存储和对象存储。这使得它能够满足不同应用场景的需求,如虚拟机存储、大数据存储等。
在性能方面,Ceph 经过优化可以提供较好的读写性能。通过合理的配置和调整,能够适应高并发的数据访问请求。
然而,Ceph 也存在一些挑战。其部署和管理相对复杂,需要一定的技术知识和经验。同时,对硬件资源的要求较高,需要进行精心的规划和配置。
总之,Ceph 是一款功能强大但具有一定复杂性的分布式存储系统,在大规模数据存储领域具有广泛的应用前景。