ceph集群
ceph集群概述
ceph 是一个统一的分布式存储系统,具有高性能、高可用、高可扩展性的特点
redhat和OpenStack 都可与ceph 整合以支持虚拟镜像的后端存储
支持三种接口
Object:有原生的API,而且也兼容Swift和S3的API。
Block:支持精简配置、快照、克隆。
File:Posix接口,支持快照object
工作原理:
(当客户端向ceph 集群中写入一个file时,首先将file映射为许多object,并将他们编号即oid(ino+id),然后通过hash和crush算法映射三个osd,序号靠前的为primary osd,靠后的为secondary osd 和tertiary osd,知道数据存放在那些osd里面)寻址,首先向Primary OSD发起写请求,然后由Primary OSD同步复制两个副本到其余的OSD中。
当Secondary 和Tertiary完成写入了以后,返回ACK给 Primary,最后由Primary向Client确认Object的写入。
file—>object—>pg—>osd三次映射
File —— 此处的file就是用户需要存储或者访问的文件。对于一个基于Ceph开发的对象存储应用而言,这个file也就对应于应用中的“对象”,也就是用户直接操作的“对象”。
Ojbect —— 此处的object是RADOS所看到的“对象”。Object与上面提到的file的区别是,object的最大size由RADOS限定(通常为2MB或4MB),以便实现底层存储的组织管理。因此,当上层应用向RADOS存入size很大的file时,需要将file切分成统一大小的一系列object(最后一个的大小可以不同)进行存储。为避免混淆,在本文中将尽量避免使用中文的“对象”这一名词,而直接使用file或object进行说明。
PG(Placement Group)—— 顾名思义,PG的用途是对object的存储进行组织和位置映射。具体而言,一个PG负责组织若干个object(可以为数千个甚至更多),但一个object只能被映射到一个PG中,即,PG和object之间是“一对多”映射关系。同时,一个PG会被映射到n个OSD上,而每个OSD上都会承载大量的PG,即,PG和OSD之间是“多对多”映射关系。在实践当中,n至少为2,如果用于生产环境,则至少为3。一个OSD上的PG则可达到数百个。事实上,PG数量的设置牵扯到数据分布的均匀性问题。关于这一点,下文还将有所展开。
OSD —— 即object storage device,前文已经详细介绍,此处不再展开。唯一需要说明的是,OSD的数量事实上也关系到系统的数据分布均匀性,因此其数量不应太少。在实践当中,至少也应该是数十上百个的量级才有助于Ceph系统的设计发挥其应有的优势。
Failure domain —— 这个概念在论文中并没有进行定义,好在对分布式存储系统有一定概念的读者应该能够了解其大意。
基于上述定义,便可以对寻址流程进行解释了。具体而言, Ceph中的寻址至少要经历以下三次映射:
(1)File -> object映射
这次映射的目的是,将用户要操作的file,映射为RADOS能够处理的object。其映射十分简单,本质上就是按照object的最大size对file进行切分,相当于RAID中的条带化过程。这种切分的好处有二:一是让大小不限的file变成最大size一致、可以被RADOS高效管理的object;二是让对单一file实施的串行处理变为对多个object实施的并行化处理。
每一个切分后产生的object将获得唯一的oid,即object id。其产生方式也是线性映射,极其简单。图中,ino是待操作file的元数据,可以简单理解为该file的唯一id。ono则是由该file切分产生的某个object的序号。而oid就是将这个序号简单连缀在该file id之后得到的。举例而言,如果一个id为filename的file被切分成了三个object,则其object序号依次为0、1和2,而最终得到的oid就依次为filename0、filename1和filename2。
这里隐含的问题是,ino的唯一性必须得到保证,否则后续映射无法正确进行。
(2)Object -> PG映射
在file被映射为一个或多个object之后,就需要将每个object独立地映射到一个PG中去。这个映射过程也很简单,如图中所示,其计算公式是:
hash(oid) & mask -> pgid
由此可见,其计算由两步组成。首先是使用Ceph系统指定的一个静态哈希函数计算oid的哈希值,将oid映射成为一个近似均匀分布的伪随机值。然后,将这个伪随机值和mask按位相与,得到最终的PG序号(pgid)。根据RADOS的设计,给定PG的总数为m(m应该为2的整数幂),则mask的值为m-1。因此,哈希值计算和按位与操作的整体结果事实上是从所有m个PG中近似均匀地随机选择一个。基于这一机制,当有大量object和大量PG时,RADOS能够保证object和PG之间的近似均匀映射。又因为object是由file切分而来,大部分object的size相同,因而,这一映射最终保证了,各个PG中存储的object的总数据量近似均匀。
从介绍不难看出,这里反复强调了“大量”。只有当object和PG的数量较多时,这种伪随机关系的近似均匀性才能成立,Ceph的数据存储均匀性才有保证。为保证“大量”的成立,一方面,object的最大size应该被合理配置,以使得同样数量的file能够被切分成更多的object;另一方面,Ceph也推荐PG总数应该为OSD总数的数百倍,以保证有足够数量的PG可供映射。
(3)PG -> OSD映射
第三次映射就是将作为object的逻辑组织单元的PG映射到数据的实际存储单元OSD。如图所示,RADOS采用一个名为CRUSH的算法,将pgid代入其中,然后得到一组共n个OSD。这n个OSD即共同负责存储和维护一个PG中的所有object。前已述及,n的数值可以根据实际应用中对于可靠性的需求而配置,在生产环境下通常为3。具体到每个OSD,则由其上运行的OSD deamon负责执行映射到本地的object在本地文件系统中的存储、访问、元数据维护等操作。
核心组件及其功能
Monitor、OSD、MDS、Object、PG、RADOS、Libradio、CRUSH、RBD、RGW、CephFS
块存储——rbd
典型设备:磁盘阵列,硬盘
主要是将裸磁盘空间映射给主机使用的。
优点:
通过Raid与LVM等手段,对数据提供了保护。
多块廉价的硬盘组合起来,提高容量。
多块磁盘组合出来的逻辑盘,提升读写效率。
缺点:
采用SAN架构组网时,光纤交换机,造价成本高。
主机之间无法共享数据。
使用场景:
docker容器、虚拟机磁盘存储分配。
日志存储、文件存储。
文件存储:FS
典型设备:FTP、NFS服务器
为了克服块存储文件无法共享的问题,所以有了文件存储。
在服务器上架设FTP与NFS服务,就是文件存储。
优点:
造价低,随便一台机器就可以了;方便文件共享。
缺点:
读写速率低;传输速率慢。
使用场景:
日志存储;有目录结构的文件存储
对象存储——RGW
典型设备:内置大容量硬盘的分布式服务器(swift, s3)
多台服务器内置大容量硬盘,安装上对象存储管理软件,对外提供读写访问功能。
优点:
具备块存储的读写高速;具备文件存储的共享等特性。
使用场景:(适合更新变动较少的数据)
图片存储;视频存储。
ceph集群部署
一、准备工作:
IP,主机名,hosts解析,ssh密钥,时间同步,yum源,防火墙,selinux
二、部署ceph:
1.安装软件
ceph-deploy(脚本)
ceph-mon ceph-osd ceph-mds ceph-radosgw(集群)
2.修改配置启动服务mon
mkdir 目录;cd 目录
ceph-deploy new node1 node2 node3 (生成配置文件)
ceph-deploy mon create-initial (启动服务)
3.启动osd共享硬盘
ceph-deploy disk zap 主机名:磁盘名 ... ...
ceph-deploy osd create 主机名:磁盘 ... ...
三、使用Ceph思路:
1.块共享
服务器: rbd create 创建一个共享镜像
客户端: 安装cpeh-common; cp 配置文件和密钥
rbd map | rbd unmap
2.文件系统共享(文件系统由inode和block)
服务器: 创建两个共享池(名称任意)
使用两个共享池合并一个文件系统
安装ceph-mds软件,并启动服务(ceph-deploy mds create node3)
客户端: mount -t MON的IP:6789:/ /挂载点 -o name=用户名,secret=密码
3.对象存储
服务器启动一个radosgw即可(RGW)
ceph-deploy rgw create node3
四、ceph-deploy脚本用法:
ceph-deploy new node1 node2 node3 #生成配置文件
ceph-deploy mon create-initial #远程所有主机启动mon服务
ceph-deploy disk zap 主机名:磁盘名 #初始化磁盘
ceph-deploy osd create 主机名:磁盘名 #远程主机并启动osd服务
ceph-deploy mds create 主机名 #远程主机并启动mds服务
ceph-deploy rgw create 主机名 #远程主机并启动RGW服务
五、删除某个OSD,下面的假设是删除osd.4
ceph osd tree
ceph osd out osd.4
ceph osd crush remove osd.4
ceph auth del osd.4
ceph osd rm osd.4
最后要找到对应的主机,umount把osd.4对应的磁盘卸载