ceph是一个开源的,用c++语言编写的分布式的存储系统。存储文件数据。
/dev/sdb
fdisk /dev/sdb
gdisk /dev/sdb
lvm 逻辑卷 可以扩容
raid 磁盘 高可用
基于物理意义上的单机的存储系统。
分布式由多台物理磁盘组成一个集群,在这个基础之上实现高可用,扩展。
ceph是一个统一的存储系统,同时提供块设备存储,文件系统存储和对象存储三种存储
对象存储RGW oss:
对象存储也就是键值对存储,通过接口指令,get put del和其他的命令向对象存储上或者下载数据。
把数据作为对象,按照一定的逻辑和算法,存储到不同的硬盘上(可以是不同机器上的硬盘,依靠网络来进行互相通信)
优点:
使用的是硬盘组,不受目录系统的影响,读写效率高
集群的扩展性很强,支持多副本存储。
可以直接通过URL访问文件。简单好管理
缺点
内容变动较大的文件不适合作为存储对象,每一次变动都要重新上传。
文件系统存储 ceph-fs
ceph集群的存储看做是一个大的分区或者共享文件挂载到客户端的本地
客户端可以在本地直接进行操作。速度快,可以存储的数据类型也没有限制。
内核态和用户态:
mount 内核态 速度快 读写也快
ceph-fuse 用户态 速度慢 读写稍慢
优点
成本低,随便的一台服务器都可以做。
公司内部都使用这种方式。内网云盘就是这种方式
缺点
读写速度和传输速度相对比较慢(本地使用不再此列)
块存储RBD
rbd可以为kvm虚拟化和云服务(openstack)可以提供高性能和无线可扩展的存储后端。
磁盘映射, RAID和lvm提供磁盘空间,多个主机上的raid或者Ivm组成一个逻辑上的RAID和lvm。
优点
多块磁盘组成这种逻辑空间 可以并行的执行读写操作,IO效率比较高
缺点
对网络传输的要求比较高,windows无法访问linux的RDB操作。
ceph的主要特点
1、统一存储:对象 块 文件系统
2、Crush算法,算法来实现数据的寻址。数据完整性的校验和一致性。
3、高扩展性,扩容方便,可靠性比较强。创建数据的时候可以对数据进行副本操作,副本数由管理定义的副本可以跨主机保存,跨架构,跨机房,跨数据中心进行保存。
4、高性能,因为是多副本,读写的时候可以做到并行化处理。
ceph的组件和作用
1、OSD: ceph当中的OSD的守护进程,是集群的基础
主要功能:存储数据,保存副本数据,数据恢复,平衡数据分布
冗余和高可用至少要有3个OSD(三个机器上的三个物理硬盘)
2、Monitors: mon monitors守护进程,监视ceph集群的状态,维护ceph集群的健康
OSD的状态也属于MON的监控范围。
ceph存储集群必须要有一个Monitors进程,和两个OSD进程。
服务器的数量必须是奇数台。2-5
管理节点 mon osd osd
**3、MDS:**也是一个守护进程,保存ceph文件系统的元数据。(文件的权限,所有者,所在组,修改时间等等,在ceph集群当中的inode号)
**4、managers:**也是作为守护进程运行,跟踪集群的运行时间的指标和ceph集群的状态:主要是存储的利用率,性能指标和系统的负载。
**5、RADOS:**分布式存储系统,所有的存储功能都是基于RADOS实现的。高可用可性能也是基于RADOS实现的,他是所有一切的底层,也是整个ceph集群的核心
RADOS由两个部分组成:OSD Monitors
**6、LIBRADOS:**这是一个动态库,用来允许应用程序和RADO5系统进行交互。
通过端口进行通信
存储概念 :
存储数据和object的关系
对象 块 文件系统挂载,都需要odject,存储的数据都会被分成多个object,分成之后每一个数据都有一个object id。
每个数据object的大小是可以调整的,默认是4M
ceph的最小存储吧单位
object和pg的关系:
object数量太多了,在一个集群当中,object的数量太多,遍历和寻址速度都很慢。
pg就是归置组,placcment group 管理objecct
object通过CRUSH算法映射到pg当中,一个pg里面可以包含多个object。
pg与osd之间的关系
pg也是通过CRUSH算法映射到osd当中去存储,如果有副本,每个pg会映射到三个osd当中,三个osd A B C
pg-------->A
pg------------>B
pg--------------->C
PG和PGD的关系
pgd是存放pg的排列组合。
3osd
ABC 副本数2
PGD 1
[A B]
PGD 2
[A B]
[A C]
存储池:pool
ceph的集群进行逻辑划分,设置ceph存储集群的权限,副本数 pg的数量和算法规则
pool是由管理员自定义,相当于一个独立的空间。每个pool之间是独立的,数据也是隔离的。
第一个存储数据的pool
第二个存储元数据的pool
ceph osd pool create cephfs date pg_num
少于5个osd的情况下,pg的数量等于I28
5-10个osd 512
10-50个osd 4096个
Pg总数:750个,不能超过750个
1283=384个 750-384= 366
存储元数据也要pg 1282=256
存储数据
osd* pg值
元数据
2pg值
osdpg值+2pg值<750
pg num=(osd100)/副本数3100/2
设定pg值的目的,通过管理较少的pgceph获取数据,分配,管理数据的效率越高。
pg值越多,数据分布的越多,管理就越复杂。
实验
所有节点做地址映射
[root@test42 ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.65.42 test42
192.168.65.43 test43
192.168.65.44 test44
192.168.65.45 test45
#主节点生成密钥对
[root@test42 ~]# ssh-keygen #一直回车
#将密钥发送到每个从节点
[root@test42 ~]# ssh-copy-id 192.168.65.43
[root@test42 ~]# ssh-copy-id 192.168.65.44
[root@test42 ~]# ssh-copy-id 192.168.65.45
[root@test42 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@test42 ~]# 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
[root@test42 ~]# yum install -y ceph-deploy ceph ceph-radosgw snappy leveldb gdisk python-argparse gperftools-libs
[root@test42 ~]# cd /etc/ceph
[root@test42 ceph]# ls
rbdmap
[root@test42 ceph]# ceph-deploy new test42 test43 test44
[root@test42 ceph]# vim ceph.conf
[global]
fsid = 0c4d7162-092c-4cb7-abe7-61375a99f90b
mon_initial_members = test42, test45, test44
mon_host = 192.168.65.42,192.168.65.45,192.168.65.44
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
osd_pool_default_size = 2
#副本数设置为2或者3
#节点初始化
[root@test42 ceph]# ceph-deploy mon create-initial
[root@test42 ceph]# ceph -s
cluster:
id: 0c4d7162-092c-4cb7-abe7-61375a99f90b
health: HEALTH_OK
services:
mon: 3 daemons, quorum test42,test44,test45
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:
#添加硬盘
[root@test42 ceph]# alias scan='echo "- - -" > /sys/class/scsi_host/host0/scan;echo "- - -" > /sys/class/scsi_host/host1/scan;echo "- - -" > /sys/class/scsi_host/host2/scan'
[root@test42 ceph]# ceph-deploy disk zap test42 /dev/sdc
[root@test42 ceph]# ceph-deploy disk zap test44 /dev/sdc
[root@test42 ceph]# ceph-deploy disk zap test45 /dev/sdb
#三个硬盘做osd
[root@test42 ceph]# ceph-deploy osd create test45 --data /dev/sdb
[root@test42 ceph]# ceph-deploy osd create test44 --data /dev/sdc
[root@test42 ceph]# ceph-deploy osd create test42 --data /dev/sdc
#查看osd节点状态
[root@test42 ceph]# ceph-deploy osd list test42 test44 test45
#部署mgr
[root@test42 ceph]# ceph-deploy mgr create test42 test44 test45
#把主里ceph.mon.keyring传给从
[root@test42 ceph]# ceph-deploy admin test42 test44 test45
#赋权
[root@test42 ceph]# chmod +r /etc/ceph/ceph.client.admin.keyring
[root@test44 ceph]# chmod +r /etc/ceph/ceph.client.admin.keyring
[root@test45 ceph]# chmod +r /etc/ceph/ceph.client.admin.keyring
#安装mds,主上有不用安
[root@test42 ceph]# ceph-deploy mds create test44 test45
[root@test42 ceph]# ceph -s
cluster:
id: 0c4d7162-092c-4cb7-abe7-61375a99f90b
health: HEALTH_OK
services:
mon: 3 daemons, quorum test42,test44,test45
mgr: test42(active), standbys: test45, test44
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:
#创建存储池 文件系统ceph-fs
[root@test42 ceph]# ceph osd pool create cephfs_date 128 #存储数据
pool 'cephfs_date' created
[root@test42 ceph]# ceph osd pool create ceph_metadata 128 #存储元数据
#创建文件系统
[root@test42 ceph]# ceph fs new cephfs ceph_metadata cephfs_date
new fs with metadata pool 2 and data pool 1
[root@test42 ceph]# ceph fs ls
name: cephfs, metadata pool: ceph_metadata, data pools: [cephfs_date ]
名称 元数据 地址池名称
[root@test42 ceph]# ceph fs status cephfs
cephfs - 0 clients
======
+------+--------+--------+---------------+-------+-------+
| Rank | State | MDS | Activity | dns | inos |
+------+--------+--------+---------------+-------+-------+
| 0 | active | test44 | Reqs: 0 /s | 10 | 12 |
+------+--------+--------+---------------+-------+-------+
+---------------+----------+-------+-------+
| Pool | type | used | avail |
+---------------+----------+-------+-------+
| ceph_metadata | metadata | 2246 | 26.9G |
| cephfs_date | data | 0 | 26.9G |
+---------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
| test45 |
+-------------+
MDS version: ceph version 12.2.13 (584a20eb0237c657dc0567da126be145106aa47e) luminous (stable)
#客户端
[root@test43 ~]# mkdir /data
[root@test43 ~]# mount -t ceph 192.168.65.42:6789:/ /data -o name=admin,secret=AQBDF7NmqXt8JRAArNMnEXBScg6Jryvhc5gAUg==
[root@test43 ~]# df -h
192.168.65.42:6789:/ 27G 0 27G 0% /data
#写入100M内容
[root@test43 data]# dd if=/dev/zero of=/data/test1.txt bs=10M count=10
记录了10+0 的读入
记录了10+0 的写出
104857600字节(105 MB)已复制,0.170108 秒,616 MB/秒
[root@test43 data]# ll -lh
总用量 100M
-rw-r--r-- 1 root root 100M 8月 7 15:27 test1.txt
#在主上查看是否成功写入100M
[root@test42 ceph]# ceph fs status cephfs
cephfs - 1 clients
======
+------+--------+--------+---------------+-------+-------+
| Rank | State | MDS | Activity | dns | inos |
+------+--------+--------+---------------+-------+-------+
| 0 | active | test44 | Reqs: 0 /s | 11 | 13 |
+------+--------+--------+---------------+-------+-------+
+---------------+----------+-------+-------+
| Pool | type | used | avail |
+---------------+----------+-------+-------+
| ceph_metadata | metadata | 15.2k | 26.8G |
| cephfs_date | data | 100M | 26.8G |
+---------------+----------+-------+-------+
+-------------+
| Standby MDS |
+-------------+
| test45 |
+-------------+
[root@test43 data]# yum -y install ceph-fuse
[root@test43 ceph]# scp root@192.168.65.42:/etc/ceph/ceph.client.admin.keyring /etc/ceph/
[root@test43 ceph]# scp root@192.168.65.42:/etc/ceph/ceph.conf /etc/ceph/
[root@test43 ceph]# mkdir data1
[root@test43 ceph]# df -h
192.168.65.42:6789:/ 27G 200M 27G 1% /data
ceph-fuse 27G 200M 27G 1% /data1
#data的数据会同步到data1
[root@test43 data]# touch 123
[root@test43 data]# cd /data1/
[root@test43 data1]# ls
123 test1.txt test2.txt