存储根据其类型,可分为块存储,对象存储和文件存储。在主流的分布式存储技术中,HDFS/GPFS/GFS属于文件存储,Swift属于对象存储,而Ceph可支持块存储、对象存储和文件存储,故称为统一存储。
Ceph 基本介绍
Ceph是一个分布式存储系统,诞生于2004年,最早致力于开发下一代高性能分布式文件系统的项目。经过多年的发展之后,已得到众多云计算和存储厂商的支持,成为应用最广泛的开源分布式存储平台。Ceph源码下载:http://ceph.com/download/ 。随着云计算的发展,ceph乘上了OpenStack的春风,进而成为了开源社区受关注较高的项目之一。Ceph可以将多台服务器组成一个超大集群,把这些机器中的磁盘资源整合到一块儿,形成一个大的资源池(PB级别),然后按需分配给应用使用。
Ceph的主要架构
<1> Ceph的最底层是RADOS(分布式对象存储系统),它具有可靠、智能、分布式等特性,实现高可靠、高可拓展、高性能、高自动化等功能,并最终存储用户数据。RADOS系统主要由两部分组成,分别是OSD和Monitor。
<2> RADOS之上是LIBRADOS,LIBRADOS是一个库,它允许应用程序通过访问该库来与RADOS系统进行交互,支持多种编程语言,比如C、C++、Python等。
<3> 基于LIBRADOS层开发的有三种接口,分别是RADOSGW、librbd和MDS。
<4> RADOSGW是一套基于当前流行的RESTFUL协议的网关,支持对象存储,兼容S3和Swift。
<5> librbd提供分布式的块存储设备接口,支持块存储。
<6> MDS提供兼容POSIX的文件系统,支持文件存储。
Ceph的功能模块
Ceph的核心组件包括Client客户端、MON监控服务、MDS元数据服务、OSD存储服务,各组件功能如下:
<1> Client客户端:负责存储协议的接入,节点负载均衡。
<2> MON监控服务:负责监控整个集群,维护集群的健康状态,维护展示集群状态的各种图表,如OSD Map、Monitor Map、PG Map和CRUSH Map。
<3> MDS元数据服务:负责保存文件系统的元数据,管理目录结构。
<4> OSD存储服务:主要功能是存储数据、复制数据、平衡数据、恢复数据,以及与其它OSD间进行心跳检查等。一般情况下一块硬盘对应一个OSD。
3. Ceph的资源划分
Ceph采用crush算法,在大规模集群下,实现数据的快速、准确存放,同时能够在硬件故障或扩展硬件设备时,做到尽可能小的数据迁移,其原理如下:
<1> 当用户要将数据存储到Ceph集群时,数据先被分割成多个object,(每个object一个object id,大小可设置,默认是4MB),object是Ceph存储的最小存储单元。
<2> 由于object的数量很多,为了有效减少了Object到OSD的索引表、降低元数据的复杂度,使得写入和读取更加灵活,引入了pg(Placement Group ):PG用来管理object,每个object通过Hash,映射到某个pg中,一个pg可以包含多个object。
<3> Pg再通过CRUSH计算,映射到osd中。如果是三副本的,则每个pg都会映射到三个osd,保证了数据的冗余。
4. Ceph的数据写入
Ceph数据的写入流程
<1> 数据通过负载均衡获得节点动态IP地址;
<2> 通过块、文件、对象协议将文件传输到节点上;
<3> 数据被分割成4M对象并取得对象ID;
<4> 对象ID通过HASH算法被分配到不同的PG;
<5> 不同的PG通过CRUSH算法被分配到不同的OSD
5. Ceph的特点
<1> Ceph支持对象存储、块存储和文件存储服务,故称为统一存储。
<2> 采用CRUSH算法,数据分布均衡,并行度高,不需要维护固定的元数据结构;
<3> 数据具有强一致,确保所有副本写入完成才返回确认,适合读多写少场景;
<4> 去中心化,MDS之间地位相同,无固定的中心节点
Ceph存在一些缺点
<1> 去中心化的分布式解决方案,需要提前做好规划设计,对技术团队的要求能力比较高。
<2> Ceph扩容时,由于其数据分布均衡的特性,会导致整个存储系统性能的下降。
Ceph相比于其他存储方案的优势
<1> CRUSH算法:Crush算法是ceph的两大创新之一,简单来说,Ceph摒弃了传统的集中式存储元数据寻址的方案,转而使用CRUSH算法完成数据的寻址操作。CRUSH在一致性哈希基础上很好的考虑了容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知等。Crush算法有相当强大的扩展性,理论上支持数千个存储节点。
<2> 高可用:Ceph中的数据副本数量可以由管理员自行定义,并可以通过CRUSH算法指定副本的物理存储位置以分隔故障域,支持数据强一致性; Ceph可以忍受多种故障场景并自动尝试并行修复;Ceph支持多份强一致性副本,副本能够垮主机、机架、机房、数据中心存放。所以安全可靠。Ceph存储节点可以自管理、自动修复。无单点故障,容错性强。
<3> 高性能:因为是多个副本,因此在读写操作时候能够做到高度并行化。理论上,节点越多,整个集群的IOPS和吞吐量越高。另外一点Ceph客户端读写数据直接与存储设备(osd) 交互。在块存储和对象存储中无需元数据服务器。
<4> 高扩展性:Ceph不同于Swift,客户端所有的读写操作都要经过代理节点。一旦集群并发量增大时,代理节点很容易成为单点瓶颈。Ceph本身并没有主控节点,扩展起来比较容易,并且理论上,它的性能会随着磁盘数量的增加而线性增长。Ceph扩容方便、容量大。能够管理上千台服务器、EB级的容量。
<5> 特性丰富:Ceph支持三种调用接口:对象存储,块存储,文件系统挂载。三种方式可以一同使用。在国内一些公司的云环境中,通常会采用Ceph作为openstack的唯一后端存储来提升数据转发效率。Ceph是统一存储,虽然它底层是一个分布式文件系统,但由于在上层开发了支持对象和块的接口,所以在开源存储软件中,优势很明显。
Ceph提供3种存储方式分别是对象存储,块存储和文件系统,一般我们主要关心的还是块存储,推荐将虚拟机后端存储从SAN过渡到Ceph。Ceph 现在是云计算、虚拟机部署的最火开源存储解决方案,据统计大概有20%的OpenStack部署存储用的都是Ceph的block storage。
二、Ceph架构详解
Ceph根据场景可分为对象存储、块设备存储和文件存储。Ceph相比其它分布式存储技术,其优势点在于:它不单是存储,同时还充分利用了存储节点上的计算能力,在存储每一个数据时,都会通过计算得出该数据存储的位置,尽量将数据分布均衡。同时,由于采用了CRUSH、HASH等算法,使得它不存在传统的单点故障,且随着规模的扩大,性能并不会受到影响。
<1> Ceph的底层是RADOS,RADOS本身也是分布式存储系统,CEPH所有的存储功能都是基于RADOS实现。RADOS采用C++开发,所提供的原生Librados API包括C和C++两种。Ceph的上层应用调用本机上的librados API,再由后者通过socket与RADOS集群中的其他节点通信并完成各种操作。
<2> RADOS向外界暴露了调用接口,即LibRADOS,应用程序只需要调用LibRADOS的接口,就可以操纵Ceph了。这其中,RADOS GW用于对象存储,RBD用于块存储,它们都属于LibRADOS;CephFS是内核态程序,向外界提供了POSIX接口,用户可以通过客户端直接挂载使用。
<3> RADOS GateWay、RBD其作用是在librados库的基础上提供抽象层次更高、更便于应用或客户端使用的上层接口。其中,RADOS GW是一个提供与Amazon S3和Swift兼容的RESTful API的gateway,以供相应的对象存储应用开发使用。RBD则提供了一个标准的块设备接口,常用于在虚拟化的场景下为虚拟机创建volume。目前,Red Hat已经将RBD驱动集成在KVM/QEMU中,以提高虚拟机访问性能。这两种方式目前在云计算中应用的比较多。
<4> CEPHFS则提供了POSIX接口,用户可直接通过客户端挂载使用。它是内核态程序,所以无需调用用户空间的librados库。它通过内核中net模块来与Rados进行交互。
1. Ceph之RADOS说明
RADOS (Reliable, Autonomic Distributed Object Store) 是Ceph的核心之一,作为Ceph分布式文件系统的一个子项目,特别为Ceph的需求设计,能够在动态变化和异质结构的存储设备机群之上提供一种稳定、可扩展、高性能的单一逻辑对象(Object)存储接口和能够实现节点的自适应和自管理的存储系统。在传统分布式存储架构中,存储节点往往仅作为被动查询对象来使用,随着存储规模的增加,数据一致性的管理会出现很多问题。而新型的存储架构倾向于将基本的块分配决策和安全保证等操作交给存储节点来做,然后通过提倡客户端和存储节点直接交互来简化数据布局并减小io瓶颈。
RADOS就是这样一个可用于PB级规模数据存储集群的可伸缩的、可靠的对象存储服务。它包含两类节点:存储节点、管理节点。它通过利用存储设备的智能性,将诸如一致性数据访问、冗余存储、错误检测、错误恢复分布到包含了上千存储节点的集群中,而不是仅仅依靠少数管理节点来处理。
RADOS中的存储节点被称为OSD(object storage device),它可以仅由很普通的组件来构成,只需要包含CPU、网卡、本地缓存和一个磁盘或者RAID,并将传统的块存储方式替换成面向对象的存储。在PB级的存储规模下,存储系统一定是动态的:系统会随着新设备的部署和旧设备的淘汰而增长或收缩,系统内的设备会持续地崩溃和恢复,大量的数据被创建或者删除。
RADOS通过 cluster map来实现这些,cluster map会被复制到集群中的所有部分(存储节点、控制节点,甚至是客户端),并且通过怠惰地传播小增量更新而更新。Cluster map中存储了整个集群的数据的分布以及成员。通过在每个存储节点存储完整的Cluster map,存储设备可以表现的半自动化,通过peer-to-peer的方式(比如定义协议)来进行数据备份、更新,错误检测、数据迁移等等操作。这无疑减轻了占少数的monitor cluster(管理节点组成的集群)的负担。
RADOS设计如下:
一个RADOS系统包含大量的OSDs 和 很少的用于管理OSD集群成员的monitors。OSD的组成如简介所说。而monitor是一些独立的进程,以及少量的本地存储,monitor之间通过一致性算法保证数据的一致性。
Cluster Map
存储节点集群通过monitor集群操作cluster map来实现成员的管理。cluster map 描述了哪些OSD被包含进存储集群以及所有数据在存储集群中的分布。cluster map不仅存储在monitor节点,它被复制到集群中的每一个存储节点,以及和集群交互的client。当因为一些原因,比如设备崩溃、数据迁移等,cluster map的内容需要改变时,cluster map的版本号被增加,map的版本号可以使通信的双方确认自己的map是否是最新的,版本旧的一方会先将map更新成对方的map,然后才会进行后续操作。
Data Placement
下面总体说下RADOS的存储层次,RADOS中基本的存储单位是对象,一般为2MB或4MB,当一个文件要存入RADOS时,首先会被切分成大小固定的对象(最后一个对象大小可能不同),然后将对象分配到一个PG(Placement Group)中,然后PG会复制几份,伪随机地派给不同的存储节点。当新的存储节点被加入集群,会在已有数据中随机抽取一部分数据迁移到新节点。这种概率平衡的分布方式可以保证设备在潜在的高负载下正常工作。更重要的是,数据的分布过程仅需要做几次随机映射,不需要大型的集中式分配表。如下图是Ceph内部架构:
对于每个层次的详细说明:
<1> File—— 用户需要存储或者访问的文件。
<2> Object—— RADOS的基本存储单元。Object与上面提到的file的区别是,object的最大size由RADOS限定(通常为2MB或4MB),以便实现底层存储的组织管理。因此,当上层应用向RADOS存入size很大的file时,需要将file切分成统一大小的一系列object(最后一个的大小可以不同)进行存储。
<3> PG(Placement Group)—— 对object的存储进行组织和位置映射。具体而言,一个PG负责组织若干个object(可以为数千个甚至更多),但一个object只能被映射到一个PG中,即,PG和object之间是“一对多”映射关系。同时,一个PG会被映射到n个OSD上,而每个OSD上都会承载大量的PG,即,PG和OSD之间是“多对多”映射关系。在实践当中,n至少为2(n代表冗余的份数),如果用于生产环境,则至少为3。一个OSD上的PG则可达到数百个。事实上,PG数量的设置牵扯到数据分布的均匀性问题。
<4> OSD—— 即object storage device,前文已经详细介绍,此处不再展开。唯一需要说明的是,OSD的数量事实上也关系到系统的数据分布均匀性,因此其数量不应太少。在实践当中,至少也应该是数十上百个的量级才有助于Ceph系统的设计发挥其应有的优势。
各层次之间的映射关系:
<1> file -> object
object的最大size是由RADOS配置的,当用户要存储一个file,需要将file切分成几个object。
<2> object -> PG
每个object都会被映射到一个PG中,然后以PG为单位进行备份以及进一步映射到具体的OSD上。
<3> PG -> OSD
根据用户设置的冗余存储的个数r,PG会最终存储到r个OSD上,这个映射是通过一种伪随机的映射算法 CRUSH 来实现的,这个算法的特点是可以进行配置。
Ceph存储过程描述
每台服务器都有好几块磁盘(sda,sdb,sdc等),磁盘又可以进一步分区(sda1,sda2等)。Ceph中最基本的进程就是OSD(对象存储设备),每个磁盘对应一个OSD。如果用户通过客户端想要存储一个文件,那么在RADOS中,该文件实际上会分为一个个4M块大小的对象。每个文件都一个文件ID(例如A),那么这些对象的ID就是(A0,A1,A2等)。然而在分布式储存系统中,有成千上万个对象,光遍历就要花很长的时间,所以对象会先通过hash-取模运算,存放到一个PG(Place Group)中,PG相当于数据库中的索引(PG的数量是固定的,不会随着OSD的增加或者删除而改变),这样只需要首先定位到PG位置,然后在PG中查询对象即可,大大提高了查询效率。之后PG中的对象又会根据设置的副本数量进行复制,并根据Crush算法存储到OSD节点上。
无论使用哪种存储方式(对象、块、挂载),存储的数据都会被切分成对象(Objects)。Objects size大小可以由管理员调整,通常为2M或4M。每个对象都会有一个唯一的OID,由ino与ono生成,虽然这些名词看上去很复杂,其实相当简单。ino即是文件的File ID,用于在全局唯一标示每一个文件,而ono则是分片的编号。比如:一个文件FileID为A,它被切成了两个对象,一个对象编号0,另一个编号1,那么这两个文件的oid则为A0与A1。Oid的好处是可以唯一标示每个不同的对象,并且存储了对象与文件的从属关系。由于ceph的所有数据都虚拟成了整齐划一的对象,所以在读写时效率都会比较高。
但是对象并不会直接存储进OSD中,因为对象的size很小,在一个大规模的集群中可能有几百到几千万个对象。这么多对象光是遍历寻址,速度都是很缓慢的;并且如果将对象直接通过某种固定映射的哈希算法映射到osd上,当这个osd损坏时,对象无法自动迁移至其他osd上面(因为映射函数不允许)。为了解决这些问题,ceph引入了归置组的概念,即PG。
PG是一个逻辑概念,我们linux系统中可以直接看到对象,但是无法直接看到PG。它在数据寻址时类似于数据库中的索引:每个对象都会固定映射进一个PG中,所以当我们要寻找一个对象时,只需要先找到对象所属的PG,然后遍历这个PG就可以了,无需遍历所有对象。而且在数据迁移时,也是以PG作为基本单位进行迁移,ceph不会直接操作对象。
对象时如何映射进PG的?还记得OID么?首先使用静态hash函数对OID做hash取出特征码,用特征码与PG的数量去模,得到的序号则是PGID。由于这种设计方式,PG的数量多寡直接决定了数据分布的均匀性,所以合理设置的PG数量可以很好的提升CEPH集群的性能并使数据均匀分布。
最后PG会根据管理员设置的副本数量进行复制,然后通过crush算法存储到不同的OSD节点上(其实是把PG中的所有对象存储到节点上),第一个osd节点即为主节点,其余均为从节点。
Ceph集群维护
前面已经介绍了,由若干个monitor共同负责整个RADOS集群中所有OSD状态的发现与记录,并且共同形成cluster map的master版本,然后扩散至全体OSD以及client。OSD使用Cluster map进行数据的维护,而client使用Cluster map进行数据的寻址。monitor并不主动轮询各个OSD的当前状态。相反,OSD需要向monitor上报状态信息。常见的上报有两种情况:一是新的OSD被加入集群,二是某个OSD发现自身或者其他OSD发生异常。在收到这些上报信息后,monitor将更新cluster map信息并加以扩散。
Cluster map的实际内容包括:
<1> Epoch,即版本号。cluster map的epoch是一个单调递增序列。epoch越大,则cluster map版本越新。因此,持有不同版本cluster map的OSD或client可以简单地通过比较epoch决定应该遵从谁手中的版本。而monitor手中必定有epoch最大、版本最新的cluster map。当任意两方在通信时发现彼此epoch值不同时,将默认先将cluster map同步至高版本一方的状态,再进行后续操作。
<2> 各个OSD的网络地址。
<3> 各个OSD的状态。OSD状态的描述分为两个维度:up或者down(表明OSD是否正常工作),in或者out(表明OSD是否在至少一个PG中)。因此,对于任意一个OSD,共有四种可能的状态:
- up且in:说明该OSD正常运行,且已经承载至少一个PG的数据。这是一个OSD的标准工作状态;
- up且out:说明该OSD正常运行,但并未承载任何PG,其中也没有数据。一个新的OSD刚刚被加入Ceph集群后,便会处于这一状态。而一个出现故障的OSD被修复后,重新加入Ceph集群时,也是处于这一状态;
- down且in:说明该OSD发生异常,但仍然承载着至少一个PG,其中仍然存储着数据。这种状态下的OSD刚刚被发现存在异常,可能仍能恢复正常,也可能会彻底无法工作;
- down且out:说明该OSD已经彻底发生故障,且已经不再承载任何PG。
<4> CRUSH算法配置参数。表明了Ceph集群的物理层级关系(cluster hierarchy),位置映射规则(placement rules)。
根据cluster map的定义可以看出,其版本变化通常只会由"3"和"4"两项信息的变化触发。而这两者相比,"3"发生变化的概率更高一些。
一个新的OSD上线后,首先根据配置信息与monitor通信。Monitor将其加入cluster map,并设置为up且out状态,再将最新版本的cluster map发给这个新OSD。收到monitor发来的cluster map之后,这个新OSD计算出自己所承载的PG(为简化讨论,此处我们假定这个新的OSD开始只承载一个PG),以及和自己承载同一个PG的其他OSD。然后,新OSD将与这些OSD取得联系。如果这个PG目前处于降级状态(即承载该PG的OSD个数少于正常值,如正常应该是3个,此时只有2个或1个。这种情况通常是OSD故障所致),则其他OSD将把这个PG内的所有对象和元数据复制给新OSD。数据复制完成后,新OSD被置为up且in状态。而cluster map内容也将据此更新。这事实上是一个自动化的failure recovery过程。当然,即便没有新的OSD加入,降级的PG也将计算出其他OSD实现failure recovery。
如果该PG目前一切正常,则这个新OSD将替换掉现有OSD中的一个(PG内将重新选出Primary OSD),并承担其数据。在数据复制完成后,新OSD被置为up且in状态,而被替换的OSD将退出该PG(但状态通常仍然为up且in,因为还要承载其他PG)。而cluster map内容也将据此更新。这事实上是一个自动化的数据re-balancing过程。如果一个OSD发现和自己共同承载一个PG的另一个OSD无法联通,则会将这一情况上报monitor。此外,如果一个OSD deamon发现自身工作状态异常,也将把异常情况主动上报给monitor。在上述情况下,monitor将把出现问题的OSD的状态设为down且in。如果超过某一预订时间期限,该OSD仍然无法恢复正常,则其状态将被设置为down且out。反之,如果该OSD能够恢复正常,则其状态会恢复为up且in。在上述这些状态变化发生之后,monitor都将更新cluster map并进行扩散。这事实上是自动化的failure detection过程。
对于一个RADOS集群而言,即便由数千个甚至更多OSD组成,cluster map的数据结构大小也并不惊人。同时,cluster map的状态更新并不会频繁发生。即便如此,Ceph依然对cluster map信息的扩散机制进行了优化,以便减轻相关计算和通信压力:首先,cluster map信息是以增量形式扩散的。如果任意一次通信的双方发现其epoch不一致,则版本更新的一方将把二者所拥有的cluster map的差异发送给另外一方。其次,cluster map信息是以异步且lazy的形式扩散的。也即,monitor并不会在每一次cluster map版本更新后都将新版本广播至全体OSD,而是在有OSD向自己上报信息时,将更新回复给对方。类似的,各个OSD也是在和其他OSD通信时,将更新发送给版本低于自己的对方。
基于上述机制,Ceph避免了由于cluster map版本更新而引起的广播风暴。这虽然是一种异步且lazy的机制,但对于一个由n个OSD组成的Ceph集群,任何一次版本更新能够在O(log(n))时间复杂度内扩散到集群中的任何一个OSD上。
一个可能被问到的问题是:既然这是一种异步和lazy的扩散机制,则在版本扩散过程中,系统必定出现各个OSD看到的cluster map不一致的情况,这是否会导致问题?答案是:不会。事实上,如果一个client和它要访问的PG内部的各个OSD看到的cluster map状态一致,则访问操作就可以正确进行。而如果这个client或者PG中的某个OSD和其他几方的cluster map不一致,则根据Ceph的机制设计,这几方将首先同步cluster map至最新状态,并进行必要的数据re-balancing操作,然后即可继续正常访问。
2. Ceph基本组件之说明
如上图所示,Ceph主要有三个基本进程:
<1> Osd: 用于集群中所有数据与对象的存储。处理集群数据的复制、恢复、回填、再均衡。并向其他osd守护进程发送心跳,然后向Mon提供一些监控信息。当Ceph存储集群设定数据有两个副本时(一共存两份),则至少需要两个OSD守护进程即两个OSD节点,集群才能达到active+clean状态。
<2> MDS(可选):为Ceph文件系统提供元数据计算、缓存与同步。在ceph中,元数据也是存储在osd节点中的,mds类似于元数据的代理缓存服务器。MDS进程并不是必须的进程,只有需要使用CEPHFS时,才需要配置MDS节点。
<3> Monitor:监控整个集群Cluster map的状态,维护集群的cluster MAP二进制表,保证集群数据的一致性。ClusterMAP描述了对象块存储的物理位置,以及一个将设备聚合到物理位置的桶列表。
通常来说,一块磁盘和该磁盘对应的守护进程称为一个OSD。守护进程的作用是从该磁盘读取和写入数据。该磁盘可以是一个硬盘或者SSD盘或者RAID0,总之是一个逻辑磁盘。如果一个节点只有一个守护进程和对应的磁盘,那么该OSD就成了一个节点。通常一个节点有多个OSD守护进程和多个磁盘,所以通常来说OSD不是一个节点。
Ceph要求必须是奇数个Monitor监控节点,一般建议至少是3个(如果是自己私下测试玩玩的话,可以是1个,但是生产环境绝不建议1个)用于维护和监控整个集群的状态,每个Monitor都有一个Cluster Map,只要有这个Map,就能够清楚知道每个对象存储在什么位置了。客户端会先tcp连接到Monitor,从中获取Cluster Map,并在客户端进行计算,当知道对象的位置后,再直接与OSD通信(去中心化的思想)。OSD节点平常会向Monitor节点发送简单心跳,只有当添加、删除或者出现异常状况时,才会自动上报信息给Monitor。
MDS是可选的,只有需要使用Ceph FS的时候才需要配置MDS节点。在Ceph中,元数据也是存放在OSD中的,MDS只相当于元数据的缓存服务器。
在Ceph中,如果要写数据,只能向主OSD写,然后再由主OSD向从OSD同步地写,只有当从OSD返回结果给主OSD后,主OSD才会向客户端报告写入完成的消息。如果要读数据,不会使用读写分离,而是也需要先向主OSD发请求,以保证数据的强一致性。
[root@iZ2ze2jlupmjlwwfuyg30gZ ~]# hostnamectl set-hostname ceph-admin [root@iZ2ze2jlupmjlwwfuyg30hZ ~]# hostnamectl set-hostname ceph-node1 [root@iZ2ze2jlupmjlwwfuyg30lZ ~]# hostnamectl set-hostname ceph-node2 [root@iZ2ze2jlupmjlwwfuyg30cZ ~]# hostnamectl set-hostname ceph-node3
每个节点绑定主机名映射
cat >> /etc/hosts<<EOF 10.10.1.6 ceph-admin 10.10.1.7 ceph-node1 10.10.1.8 ceph-node2 10.10.1.9 ceph-node3 EOF
每个节点关闭防火墙和selinux
[root@ceph-admin ~]# systemctl stop firewalld [root@ceph-admin ~]# systemctl disable firewalld [root@ceph-admin ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config [root@ceph-admin ~]# setenforce 0 setenforce: SELinux is disabled
每个节点安装和配置NTP(官方推荐的是集群的所有节点全部安装并配置 NTP,需要保证各节点的系统时间一致。没有自己部署ntp服务器,就在线同步NTP)
[root@ceph-admin ~]# yum install ntp ntpdate ntp-doc -y [root@ceph-admin ~]# systemctl restart ntpd [root@ceph-admin ~]# systemctl status ntpd ● ntpd.service - Network Time Service Loaded: loaded (/usr/lib/systemd/system/ntpd.service; disabled; vendor preset: disabled) Active: active (running) since Tue 2020-07-14 14:14:06 CST; 49s ago Process: 1930 ExecStart=/usr/sbin/ntpd -u ntp:ntp $OPTIONS (code=exited, status=0/SUCCESS) Main PID: 1931 (ntpd) Tasks: 1 Memory: 704.0K CGroup: /system.slice/ntpd.service └─1931 /usr/sbin/ntpd -u ntp:ntp -g Jul 14 14:14:06 ceph-admin systemd[1]: Starting Network Time Service... Jul 14 14:14:06 ceph-admin ntpd[1931]: proto: precision = 0.042 usec Jul 14 14:14:06 ceph-admin ntpd[1931]: 0.0.0.0 c01d 0d kern kernel time sync enabled Jul 14 14:14:06 ceph-admin systemd[1]: Started Network Time Service.
添加ceph源
- 因为本身使用的是阿里云服务器,所以yum源不换了。非阿里云服务器,自行更换yum源。
- 每个节点都添加
cat >> /etc/yum.repos.d/ceph.repo <<EOF [ceph] name=ceph baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/ gpgcheck=0 priority =1 [ceph-noarch] name=cephnoarch baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/ gpgcheck=0 priority =1 [ceph-source] name=Ceph source packages baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS gpgcheck=0 priority=1 EOF
- 每个节点创建cephuser用户,设置sudo权限
[root@ceph-admin ~]# useradd -d /home/cephuser -m cephuser [root@ceph-admin ~]# echo "cephuser"|passwd --stdin cephuser Changing password for user cephuser. passwd: all authentication tokens updated successfully. [root@ceph-admin ~]# echo "cephuser ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephuser cephuser ALL = (root) NOPASSWD:ALL [root@ceph-admin ~]# chmod 0440 /etc/sudoers.d/cephuser [root@ceph-admin ~]# sed -i s'/Defaults requiretty/#Defaults requiretty'/g /etc/sudoers
配置相互间的ssh信任关系
- 现在ceph-admin节点上产生公私钥文件,然后将ceph-admin节点的.ssh目录拷贝给其他节点
[root@ceph-admin ~]# su - cephuser [cephuser@ceph-admin ~]$ ssh-keygen -t rsa [cephuser@ceph-admin ~]$ cd .ssh/ [cephuser@ceph-admin .ssh]$ cp id_rsa.pub authorized_keys [cephuser@ceph-admin .ssh]$ scp -r /home/cephuser/.ssh ceph-node1:/home/cephuser/ [cephuser@ceph-admin .ssh]$ scp -r /home/cephuser/.ssh ceph-node2:/home/cephuser/ [cephuser@ceph-admin .ssh]$ scp -r /home/cephuser/.ssh ceph-node3:/home/cephuser/
准备磁盘(ceph-node1、ceph-node2、ceph-node3三个节点)
测试时使用的磁盘不要太小,否则后面添加磁盘时会报错,建议磁盘大小为20G及以上。
三个节点均是在WebvirtMgr上创建的虚拟机,参考:https://www.cnblogs.com/kevingrace/p/8387999.html 文档中创建并挂载虚拟机磁盘。
如下分别在三个节点挂载了一块20G的裸盘.
- 检查磁盘
[cephuser@ceph-admin .ssh]$ sudo fdisk -l /dev/vdb Disk /dev/vdb: 21.5 GB, 21474836480 bytes, 41943040 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes
- 格式化磁盘
[cephuser@ceph-admin .ssh]$ sudo parted -s /dev/vdb mklabel gpt mkpart primary xfs 0% 100% [cephuser@ceph-admin .ssh]$ sudo mkfs.xfs /dev/vdb -f meta-data=/dev/vdb isize=512 agcount=4, agsize=1310720 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=5242880, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0
- 查看磁盘格式(xfs格式)
[cephuser@ceph-admin .ssh]$ sudo blkid -o value -s TYPE /dev/vdb xfs
部署阶段(ceph-admin节点上使用ceph-deploy快速部署)
- 安装ceph-deploy
[root@ceph-admin ~]# su - cephuser Last login: Tue Jul 14 14:21:15 CST 2020 on pts/0 [cephuser@ceph-admin ~]$ sudo yum install ceph-deploy -y
- 创建cluster目录
[cephuser@ceph-admin ~]$ mkdir cluster [cephuser@ceph-admin ~]$ cd cluster/
- 创建集群(后面填写monit节点的主机名,这里monit节点和管理节点是同一台机器,即ceph-admin)
[cephuser@ceph-admin cluster]$ ceph-deploy new ceph-admin [ceph_deploy.conf][DEBUG ] found configuration file at: /home/cephuser/.cephdeploy.conf [ceph_deploy.cli][INFO ] Invoked (1.5.39): /bin/ceph-deploy new ceph-admin [ceph_deploy.cli][INFO ] ceph-deploy options: [ceph_deploy.cli][INFO ] username : None [ceph_deploy.cli][INFO ] func : <function new at 0x7f13b37ec668> [ceph_deploy.cli][INFO ] verbose : False [ceph_deploy.cli][INFO ] overwrite_conf : False [ceph_deploy.cli][INFO ] quiet : False [ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7f13b2f68638> [ceph_deploy.cli][INFO ] cluster : ceph [ceph_deploy.cli][INFO ] ssh_copykey : True [ceph_deploy.cli][INFO ] mon : ['ceph-admin'] [ceph_deploy.cli][INFO ] public_network : None [ceph_deploy.cli][INFO ] ceph_conf : None [ceph_deploy.cli][INFO ] cluster_network : None [ceph_deploy.cli][INFO ] default_release : False [ceph_deploy.cli][INFO ] fsid : None [ceph_deploy.new][DEBUG ] Creating new cluster named ceph [ceph_deploy.new][INFO ] making sure passwordless SSH succeeds [ceph-admin][DEBUG ] connection detected need for sudo [ceph-admin][DEBUG ] connected to host: ceph-admin [ceph-admin][DEBUG ] detect platform information from remote host [ceph-admin][DEBUG ] detect machine type [ceph-admin][DEBUG ] find the location of an executable [ceph-admin][INFO ] Running command: sudo /usr/sbin/ip link show [ceph-admin][INFO ] Running command: sudo /usr/sbin/ip addr show [ceph-admin][DEBUG ] IP addresses found: [u'10.10.1.0'] [ceph_deploy.new][DEBUG ] Resolving host ceph-admin [ceph_deploy.new][DEBUG ] Monitor ceph-admin at 10.10.1.0 [ceph_deploy.new][DEBUG ] Monitor initial members are ['ceph-admin'] [ceph_deploy.new][DEBUG ] Monitor addrs are ['10.10.1.0'] [ceph_deploy.new][DEBUG ] Creating a random mon key... [ceph_deploy.new][DEBUG ] Writing monitor keyring to ceph.mon.keyring... [ceph_deploy.new][DEBUG ] Writing initial config to ceph.conf...
- 修改ceph.conf文件(注意:mon_host必须和public network 网络是同网段内!)
[cephuser@ceph-admin cluster]$ vim ceph.conf #添加下面两行配置内容 [global] fsid = c685bc90-f231-4d05-a9b9-5fafb6c1a6e2 mon_initial_members = ceph-admin mon_host = 10.10.1.6 auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx public network = 10.10.1.6/24 osd pool default size = 3
- 安装ceph(过程有点长,需要等待一段时间....)
[cephuser@ceph-admin cluster]$ ceph-deploy install ceph-admin ceph-node1 ceph-node2 ceph-node3 [ceph-node3][DEBUG ] Dependency Updated: [ceph-node3][DEBUG ] cryptsetup-libs.x86_64 0:2.0.3-6.el7 [ceph-node3][DEBUG ] [ceph-node3][DEBUG ] Complete! [ceph-node3][INFO ] Running command: sudo ceph --version [ceph-node3][DEBUG ] ceph version 10.2.11 (e4b061b47f07f583c92a050d9e84b1813a35671e) [cephuser@ceph-admin cluster]$ sudo ceph --version ceph version 10.2.11 (e4b061b47f07f583c92a050d9e84b1813a35671e)
- 初始化monit监控节点,并收集所有密钥
[cephuser@ceph-admin cluster]$ ceph-deploy mon create-initial [cephuser@ceph-admin cluster]$ ceph-deploy gatherkeys ceph-admin
添加OSD到集群
- 检查OSD节点上所有可用的磁盘
[cephuser@ceph-admin cluster]$ ceph-deploy disk list ceph-node1 ceph-node2 ceph-node3 [ceph_deploy.conf][DEBUG ] found configuration file at: /home/cephuser/.cephdeploy.conf [ceph_deploy.cli][INFO ] Invoked (1.5.39): /bin/ceph-deploy disk list ceph-node1 ceph-node2 ceph-node3 [ceph_deploy.cli][INFO ] ceph-deploy options: [ceph_deploy.cli][INFO ] username : None [ceph_deploy.cli][INFO ] verbose : False [ceph_deploy.cli][INFO ] overwrite_conf : False [ceph_deploy.cli][INFO ] subcommand : list [ceph_deploy.cli][INFO ] quiet : False [ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7f6858b88ea8> [ceph_deploy.cli][INFO ] cluster : ceph [ceph_deploy.cli][INFO ] func : <function disk at 0x7f6858b5c0c8> [ceph_deploy.cli][INFO ] ceph_conf : None [ceph_deploy.cli][INFO ] default_release : False [ceph_deploy.cli][INFO ] disk : [('ceph-node1', None, None), ('ceph-node2', None, None), ('ceph-node3', None, None)] [ceph-node1][DEBUG ] connection detected need for sudo [ceph-node1][DEBUG ] connected to host: ceph-node1 [ceph-node1][DEBUG ] detect platform information from remote host [ceph-node1][DEBUG ] detect machine type [ceph-node1][DEBUG ] find the location of an executable [ceph_deploy.osd][INFO ] Distro info: CentOS Linux 7.8.2003 Core [ceph_deploy.osd][DEBUG ] Listing disks on ceph-node1... [ceph-node1][DEBUG ] find the location of an executable [ceph-node1][INFO ] Running command: sudo /usr/sbin/ceph-disk list [ceph-node1][DEBUG ] /dev/vda : [ceph-node1][DEBUG ] /dev/vda1 other, ext4, mounted on / [ceph-node1][DEBUG ] /dev/vdb other, xfs [ceph-node2][DEBUG ] connection detected need for sudo [ceph-node2][DEBUG ] connected to host: ceph-node2 [ceph-node2][DEBUG ] detect platform information from remote host [ceph-node2][DEBUG ] detect machine type [ceph-node2][DEBUG ] find the location of an executable [ceph_deploy.osd][INFO ] Distro info: CentOS Linux 7.8.2003 Core [ceph_deploy.osd][DEBUG ] Listing disks on ceph-node2... [ceph-node2][DEBUG ] find the location of an executable [ceph-node2][INFO ] Running command: sudo /usr/sbin/ceph-disk list [ceph-node2][DEBUG ] /dev/vda : [ceph-node2][DEBUG ] /dev/vda1 other, ext4, mounted on / [ceph-node2][DEBUG ] /dev/vdb other, xfs [ceph-node3][DEBUG ] connection detected need for sudo [ceph-node3][DEBUG ] connected to host: ceph-node3 [ceph-node3][DEBUG ] detect platform information from remote host [ceph-node3][DEBUG ] detect machine type [ceph-node3][DEBUG ] find the location of an executable [ceph_deploy.osd][INFO ] Distro info: CentOS Linux 7.8.2003 Core [ceph_deploy.osd][DEBUG ] Listing disks on ceph-node3... [ceph-node3][DEBUG ] find the location of an executable [ceph-node3][INFO ] Running command: sudo /usr/sbin/ceph-disk list [ceph-node3][DEBUG ] /dev/vda : [ceph-node3][DEBUG ] /dev/vda1 other, ext4, mounted on / [ceph-node3][DEBUG ] /dev/vdb other, xfs
- 使用zap选项删除所有osd节点上的分区
[cephuser@ceph-admin cluster]$ ceph-deploy disk zap ceph-node1:/dev/vdb ceph-node2:/dev/vdb ceph-node3:/dev/vdb
- 准备OSD(使用prepare命令)
[cephuser@ceph-admin cluster]$ ceph-deploy osd prepare ceph-node1:/dev/vdb ceph-node2:/dev/vdb ceph-node3:/dev/vdb
激活OSD(注意由于ceph对磁盘进行了分区,
/dev/vdb
磁盘分区为
/dev/vdb1
)
[cephuser@ceph-admin cluster]$ ceph-deploy osd activate ceph-node1:/dev/vdb1 ceph-node2:/dev/vdb1 ceph-node3:/dev/vdb1
在三个osd节点上通过命令已显示磁盘已成功
mount
[root@ceph-node1 ~]# su - cephuser [cephuser@ceph-node1 ~]$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 253:0 0 40G 0 disk └─vda1 253:1 0 40G 0 part / vdb 253:16 0 20G 0 disk ├─vdb1 253:17 0 15G 0 part /var/lib/ceph/osd/ceph-0 └─vdb2 253:18 0 5G 0 part [root@ceph-node2 ~]# su - cephuser [cephuser@ceph-node2 ~]$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 253:0 0 40G 0 disk └─vda1 253:1 0 40G 0 part / vdb 253:16 0 20G 0 disk ├─vdb1 253:17 0 15G 0 part /var/lib/ceph/osd/ceph-1 └─vdb2 253:18 0 5G 0 part [root@ceph-node3 ~]# su - cephuser [cephuser@ceph-node3 ~]$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 253:0 0 40G 0 disk └─vda1 253:1 0 40G 0 part / vdb 253:16 0 20G 0 disk ├─vdb1 253:17 0 15G 0 part /var/lib/ceph/osd/ceph-2 └─vdb2 253:18 0 5G 0 part
- 查看OSD,如下显示这两个分区,则表示成功了.
[cephuser@ceph-admin cluster]$ pwd /home/cephuser/cluster [cephuser@ceph-admin cluster]$ ceph-deploy disk list ceph-node1 ceph-node2 ceph-node3 [ceph-node1][DEBUG ] /dev/vdb2 ceph journal, for /dev/vdb1 [ceph-node1][DEBUG ] /dev/vdb1 ceph data, active, cluster ceph, osd.0, journal /dev/vdb2 [ceph-node2][DEBUG ] /dev/vdb2 ceph journal, for /dev/vdb1 [ceph-node2][DEBUG ] /dev/vdb1 ceph data, active, cluster ceph, osd.1, journal /dev/vdb2 [ceph-node3][DEBUG ] /dev/vdb2 ceph journal, for /dev/vdb1 [ceph-node3][DEBUG ] /dev/vdb1 ceph data, active, cluster ceph, osd.2, journal /dev/vdb2
- 用ceph-deploy把配置文件和admin密钥拷贝到管理节点和Ceph节点,这样你每次执行Ceph命令行时就无需指定monit节点地址
[cephuser@ceph-admin cluster]$ ceph-deploy admin ceph-admin ceph-node1 ceph-node2 ceph-node3
- 修改密钥权限
[cephuser@ceph-admin cluster]$ sudo chmod 644 /etc/ceph/ceph.client.admin.keyring
- 检查ceph状态
[cephuser@ceph-admin cluster]$ sudo ceph health HEALTH_OK [cephuser@ceph-admin cluster]$ sudo ceph -s cluster c685bc90-f231-4d05-a9b9-5fafb6c1a6e2 health HEALTH_OK monmap e1: 1 mons at {ceph-admin=10.10.1.6:6789/0} election epoch 3, quorum 0 ceph-admin osdmap e14: 3 osds: 3 up, 3 in flags sortbitwise,require_jewel_osds pgmap v23: 64 pgs, 1 pools, 0 bytes data, 0 objects 322 MB used, 45724 MB / 46046 MB avail 64 active+clean
- 查看ceph osd运行状态
[cephuser@ceph-admin cluster]$ ceph osd stat osdmap e14: 3 osds: 3 up, 3 in flags sortbitwise,require_jewel_osds
- 查看osd的目录树
[cephuser@ceph-admin cluster]$ ceph osd tree ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY -1 0.04376 root default -2 0.01459 host ceph-node1 0 0.01459 osd.0 up 1.00000 1.00000 -3 0.01459 host ceph-node2 1 0.01459 osd.1 up 1.00000 1.00000 -4 0.01459 host ceph-node3 2 0.01459 osd.2 up 1.00000 1.00000
- 查看monit监控节点的服务情况
[cephuser@ceph-admin cluster]$ sudo systemctl status ceph-mon@ceph-admin ● ceph-mon@ceph-admin.service - Ceph cluster monitor daemon Loaded: loaded (/usr/lib/systemd/system/ceph-mon@.service; enabled; vendor preset: disabled) Active: active (running) since Tue 2020-07-14 15:21:50 CST; 13min ago Main PID: 11719 (ceph-mon) CGroup: /system.slice/system-ceph\x2dmon.slice/ceph-mon@ceph-admin.service └─11719 /usr/bin/ceph-mon -f --cluster ceph --id ceph-admin --setuser ceph --setgroup ceph Jul 14 15:21:50 ceph-admin systemd[1]: Started Ceph cluster monitor daemon. Jul 14 15:21:50 ceph-admin ceph-mon[11719]: starting mon.ceph-admin rank 0 at 10.10.1.6:6789/0 mon_data /var/lib/ceph/mon/ceph-ceph-admin fsid c685bc90-f231-4d05-a9b9-5fafb6c1a6e2 [cephuser@ceph-admin cluster]$ ps -ef|grep ceph|grep 'cluster' ceph 11719 1 0 15:21 ? 00:00:00 /usr/bin/ceph-mon -f --cluster ceph --id ceph-admin --setuser ceph --setgroup ceph cephuser 12600 12425 0 15:35 pts/0 00:00:00 grep --color=auto cluster
- 分别查看下ceph-node1、ceph-node2、ceph-node3三个节点的osd服务情况,发现已经在启动中。
[cephuser@ceph-node1 ~]$ sudo systemctl status ceph-osd@0.service ● ceph-osd@0.service - Ceph object storage daemon Loaded: loaded (/usr/lib/systemd/system/ceph-osd@.service; enabled-runtime; vendor preset: disabled) Active: active (running) since Tue 2020-07-14 15:24:48 CST; 11min ago Main PID: 12282 (ceph-osd) CGroup: /system.slice/system-ceph\x2dosd.slice/ceph-osd@0.service └─12282 /usr/bin/ceph-osd -f --cluster ceph --id 0 --setuser ceph --setgroup ceph Jul 14 15:24:47 ceph-node1 systemd[1]: Starting Ceph object storage daemon... Jul 14 15:24:48 ceph-node1 ceph-osd-prestart.sh[12233]: create-or-move updating item name 'osd.0' weight 0.0146 at location {host=ceph-node1,root=default} to crush map Jul 14 15:24:48 ceph-node1 systemd[1]: Started Ceph object storage daemon. Jul 14 15:24:48 ceph-node1 ceph-osd[12282]: starting osd.0 at :/0 osd_data /var/lib/ceph/osd/ceph-0 /var/lib/ceph/osd/ceph-0/journal Jul 14 15:24:48 ceph-node1 ceph-osd[12282]: 2020-07-14 15:24:48.403490 7fec2755dac0 -1 osd.0 0 log_to_monitors {default=true} [cephuser@ceph-node1 ~]$ sudo ps -ef|grep ceph|grep "cluster" ceph 12282 1 0 15:24 ? 00:00:00 /usr/bin/ceph-osd -f --cluster ceph --id 0 --setuser ceph --setgroup ceph cephuser 12847 12715 0 15:36 pts/0 00:00:00 grep --color=auto cluster [cephuser@ceph-node2 ~]$ sudo systemctl status ceph-osd@1.service ● ceph-osd@1.service - Ceph object storage daemon Loaded: loaded (/usr/lib/systemd/system/ceph-osd@.service; enabled-runtime; vendor preset: disabled) Active: active (running) since Tue 2020-07-14 15:24:58 CST; 11min ago Main PID: 2550 (ceph-osd) CGroup: /system.slice/system-ceph\x2dosd.slice/ceph-osd@1.service └─2550 /usr/bin/ceph-osd -f --cluster ceph --id 1 --setuser ceph --setgroup ceph Jul 14 15:24:57 ceph-node2 systemd[1]: Starting Ceph object storage daemon... Jul 14 15:24:58 ceph-node2 ceph-osd-prestart.sh[2501]: create-or-move updating item name 'osd.1' weight 0.0146 at location {host=ceph-node2,root=default} to crush map Jul 14 15:24:58 ceph-node2 systemd[1]: Started Ceph object storage daemon. Jul 14 15:24:58 ceph-node2 ceph-osd[2550]: starting osd.1 at :/0 osd_data /var/lib/ceph/osd/ceph-1 /var/lib/ceph/osd/ceph-1/journal Jul 14 15:24:58 ceph-node2 ceph-osd[2550]: 2020-07-14 15:24:58.153348 7fbd97a07ac0 -1 osd.1 0 log_to_monitors {default=true} [cephuser@ceph-node3 ~]$ sudo systemctl status ceph-osd@2.service ● ceph-osd@2.service - Ceph object storage daemon Loaded: loaded (/usr/lib/systemd/system/ceph-osd@.service; enabled-runtime; vendor preset: disabled) Active: active (running) since Tue 2020-07-14 15:25:07 CST; 11min ago Main PID: 2533 (ceph-osd) CGroup: /system.slice/system-ceph\x2dosd.slice/ceph-osd@2.service └─2533 /usr/bin/ceph-osd -f --cluster ceph --id 2 --setuser ceph --setgroup ceph Jul 14 15:25:06 ceph-node3 systemd[1]: Starting Ceph object storage daemon... Jul 14 15:25:07 ceph-node3 ceph-osd-prestart.sh[2484]: create-or-move updating item name 'osd.2' weight 0.0146 at location {host=ceph-node3,root=default} to crush map Jul 14 15:25:07 ceph-node3 systemd[1]: Started Ceph object storage daemon. Jul 14 15:25:07 ceph-node3 ceph-osd[2533]: starting osd.2 at :/0 osd_data /var/lib/ceph/osd/ceph-2 /var/lib/ceph/osd/ceph-2/journal Jul 14 15:25:07 ceph-node3 ceph-osd[2533]: 2020-07-14 15:25:07.833955 7f2ac0d57ac0 -1 osd.2 0 log_to_monitors {default=true} [cephuser@ceph-node3 ~]$ sudo ps -ef|grep ceph|grep "cluster" ceph 2533 1 0 15:25 ? 00:00:00 /usr/bin/ceph-osd -f --cluster ceph --id 2 --setuser ceph --setgroup ceph cephuser 3098 2966 0 15:37 pts/0 00:00:00 grep --color=auto cluster [cephuser@ceph-node3 ~]$
创建文件系统
- 先查看管理节点状态,默认是没有管理节点的。
[cephuser@ceph-admin cluster]$ ceph mds stat e1:
- 创建管理节点(ceph-admin作为管理节点)。
需要注意:如果不创建mds管理节点,client客户端将不能正常挂载到ceph集群!!
[cephuser@ceph-admin ~]$ pwd /home/cephuser [cephuser@ceph-admin ~]$ cd cluster/ [cephuser@ceph-admin cluster]$ ceph-deploy mds create ceph-admin
- 再次查看管理节点状态,发现已经在启动中
[cephuser@ceph-admin cluster]$ ceph mds stat e2:, 1 up:standby [cephuser@ceph-admin cluster]$ sudo systemctl status ceph-mds@ceph-admin ● ceph-mds@ceph-admin.service - Ceph metadata server daemon Loaded: loaded (/usr/lib/systemd/system/ceph-mds@.service; enabled; vendor preset: disabled) Active: active (running) since Tue 2020-07-14 15:41:44 CST; 1min 16s ago Main PID: 12697 (ceph-mds) CGroup: /system.slice/system-ceph\x2dmds.slice/ceph-mds@ceph-admin.service └─12697 /usr/bin/ceph-mds -f --cluster ceph --id ceph-admin --setuser ceph --setgroup ceph Jul 14 15:41:44 ceph-admin systemd[1]: Started Ceph metadata server daemon. Jul 14 15:41:45 ceph-admin ceph-mds[12697]: starting mds.ceph-admin at :/0 [cephuser@ceph-admin cluster]$ ps -ef|grep cluster|grep ceph-mds ceph 12697 1 0 15:41 ? 00:00:00 /usr/bin/ceph-mds -f --cluster ceph --id ceph-admin --setuser ceph --setgroup ceph
- 创建pool,pool是ceph存储数据时的逻辑分区,它起到namespace的作用(先查看pool)
[cephuser@ceph-admin cluster]$ ceph osd lspools 0 rbd,
- 新创建的ceph集群只有rdb一个pool。这时需要创建一个新的pool
[cephuser@ceph-admin cluster]$ ceph osd pool create cephfs_data 10 #后面的数字是PG的数量 pool 'cephfs_data' created
- 创建pool的元数据
[cephuser@ceph-admin cluster]$ ceph osd pool create cephfs_metadata 10 pool 'cephfs_metadata' created [cephuser@ceph-admin cluster]$ ceph fs new myceph cephfs_metadata cephfs_data new fs with metadata pool 2 and data pool 1
- 再次查看pool状态
[cephuser@ceph-admin cluster]$ ceph osd lspools 0 rbd,1 cephfs_data,2 cephfs_metadata,
- 检查mds管理节点状态
[cephuser@ceph-admin cluster]$ ceph mds stat e5: 1/1/1 up {0=ceph-admin=up:active}
查看ceph集群状态
- 多了行fsmap e5: 1/1/1 up {0=ceph-admin=up:active}
[cephuser@ceph-admin cluster]$ sudo ceph -s cluster c685bc90-f231-4d05-a9b9-5fafb6c1a6e2 health HEALTH_OK monmap e1: 1 mons at {ceph-admin=10.10.1.6:6789/0} election epoch 3, quorum 0 ceph-admin fsmap e5: 1/1/1 up {0=ceph-admin=up:active} osdmap e19: 3 osds: 3 up, 3 in flags sortbitwise,require_jewel_osds pgmap v42: 84 pgs, 3 pools, 2068 bytes data, 20 objects 323 MB used, 45723 MB / 46046 MB avail 84 active+clean
- 查看ceph集群端口
[cephuser@ceph-admin cluster]$ sudo yum install -y lsof [cephuser@ceph-admin cluster]$ sudo lsof -i:6789 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ceph-mon 11719 ceph 10u IPv4 69512 0t0 TCP iZ2ze3telmwflzi7rv6xfyZ:smc-https (LISTEN) ceph-mon 11719 ceph 19u IPv4 71852 0t0 TCP iZ2ze3telmwflzi7rv6xfyZ:smc-https->ceph-node1:58130 (ESTABLISHED) ceph-mon 11719 ceph 20u IPv4 71892 0t0 TCP iZ2ze3telmwflzi7rv6xfyZ:smc-https->ceph-node2:54186 (ESTABLISHED) ceph-mon 11719 ceph 21u IPv4 71932 0t0 TCP iZ2ze3telmwflzi7rv6xfyZ:smc-https->ceph-node3:37142 (ESTABLISHED) ceph-mon 11719 ceph 22u IPv4 74509 0t0 TCP iZ2ze3telmwflzi7rv6xfyZ:smc-https->iZ2ze3telmwflzi7rv6xfyZ:55954 (ESTABLISHED) ceph-mds 12697 ceph 8u IPv4 74508 0t0 TCP iZ2ze3telmwflzi7rv6xfyZ:55954->iZ2ze3telmwflzi7rv6xfyZ:smc-https (ESTABLISHED)
client端挂载ceph存储
- 采用fuse方式,安装ceph-fuse(这里的客户机是centos7系统)
[root@ceph-admin ~]# yum install -y ceph-fuse
- 创建挂载目录
[root@ceph-admin ~]# mkdir /cephfs
- 复制配置文件
将ceph配置文件ceph.conf从管理节点copy到client节点(10.10.1.6为管理节点)
[root@ceph-admin ~]# rsync -e "ssh -p22" -avpgolr root@10.10.1.6:/home/cephuser/cluster/ceph.conf /etc/ceph/
- 复制密钥
[root@ceph-admin ~]# rsync -e "ssh -p22" -avpgolr root@10.10.1.6:/home/cephuser/cluster/ceph.client.admin.keyring /etc/ceph/
- 查看ceph授权
[root@ceph-admin ~]# ceph auth list installed auth entries: mds.ceph-admin key: AQC4YQ1fLvvzMxAAEKqEUX+zx7zebcv/SEju1Q== caps: [mds] allow caps: [mon] allow profile mds caps: [osd] allow rwx osd.0 key: AQC/XQ1fz3TsAxAAMvz3/iK3v8b12FW1fLBWMA== caps: [mon] allow profile osd caps: [osd] allow * osd.1 key: AQDIXQ1fLKfULBAA3mlBHrITpyi9pMTPOUUL1A== caps: [mon] allow profile osd caps: [osd] allow * osd.2 key: AQDSXQ1fqsqvHBAAF6QMflSZKCfqcO6VAq4d6A== caps: [mon] allow profile osd caps: [osd] allow * client.admin key: AQAOXQ1f7h5MIxAAObT+NHIsfPKMFwUZQZsRrw== caps: [mds] allow * caps: [mon] allow * caps: [osd] allow * client.bootstrap-mds key: AQAPXQ1fxQI6AhAAPd+raykW8oXqFjrKDjbBqQ== caps: [mon] allow profile bootstrap-mds client.bootstrap-mgr key: AQARXQ1fKGkTDhAAPkj0a0oPsMKwBgMeKFQWnw== caps: [mon] allow profile bootstrap-mgr client.bootstrap-osd key: AQAOXQ1fkQICLBAA96T6Z9nrCPRL4RmCeCROZA== caps: [mon] allow profile bootstrap-osd client.bootstrap-rgw key: AQAOXQ1fXuzNNBAAPnWdTHLzo9dQw174Imsxfw== caps: [mon] allow profile bootstrap-rgw
将ceph集群存储挂载到客户机的
/cephfs
目录下
[root@ceph-admin ~]# ceph-fuse -m 10.10.1.6:6789 /cephfs ceph-fuse[10805]: starting ceph client2020-07-14 16:10:31.545251 7f0b19bdff00 -1 init, newargv = 0x56402b00a780 newargc=11 ceph-fuse[10805]: starting fuse
- 查看
[root@ceph-admin ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 3.8G 0 3.8G 0% /dev tmpfs 3.8G 0 3.8G 0% /dev/shm tmpfs 3.8G 488K 3.8G 1% /run tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup /dev/vda1 40G 3.0G 35G 8% / /dev/vdb1 200G 49M 200G 1% /home tmpfs 768M 0 768M 0% /run/user/0 ceph-fuse 45G 324M 45G 1% /cephfs
由上面可知,已经成功挂载了ceph存储,三个osd节点,每个节点有15G(在节点上通过
"lsblk"
命令可以查看ceph data分区大小),一共45G!
- 取消ceph存储的挂载
[root@ceph-admin ~]# umount /cephfs
当有一半以上的OSD节点挂掉后,远程客户端挂载的Ceph存储就会使用异常了,即暂停使用。比如本案例中有3个OSD节点,当其中一个OSD节点挂掉后(比如宕机),
客户端挂载的Ceph存储使用正常;但当有2个OSD节点挂掉后,客户端挂载的Ceph存储就不能正常使用了(表现为Ceph存储目录下的数据读写操作一直卡着状态),
当OSD节点恢复后,Ceph存储也会恢复正常使用。OSD节点宕机重新启动后,osd程序会自动起来(通过监控节点自动起来)
评论