您好,欢迎来到二三娱乐。
搜索
您的当前位置:首页Ceph分布式存储工作原理及部署介绍(转载)

Ceph分布式存储工作原理及部署介绍(转载)

来源:二三娱乐
Ceph分布式存储⼯作原理及部署介绍(转载)

存储根据其类型,可分为块存储,对象存储和⽂件存储。在主流的分布式存储技术中,HDFS/GPFS/GFS属于⽂件存储,Swift属于对象存储,⽽Ceph可⽀持块存储、对象存储和⽂件存储,故称为统⼀存储。1. 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的⽂件系统,⽀持⽂件存储。2. 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内容也将据此更新。这事实上是⼀个⾃动化的failurerecovery过程。当然,即便没有新的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发请求,以保证数据的强⼀致性。

三、Ceph分布式存储集群简单部署 [⼀个ceph集群⾄少需要3个OSD才能实现冗余和⾼可⽤性,并且⾄少需要⼀个mon和⼀个msd。其中mon和msd可以部署

在其中⼀个osd节点上 ]12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576

0)基本信息:

这⾥我只是测试环境,所以使⽤⼀个监控节点,三个存储节点,具体如下:

ip地址 主机名 ceph磁盘 备注

192.168.10.200 ceph-node1 20G 作为mds、mon、osd0192.168.10.201 ceph-node2 20G 作为osd1192.168.10.202 ceph-node3 20G 作为osd2192.168.10.203 ceph-client 挂载点:/cephfs ceph客户端

Ceph的⽂件系统作为⼀个⽬录挂载到客户端cephclient的/cephfs⽬录下,可以像操作普通⽬录⼀样对此⽬录进⾏操作。

1)安装前准备

分别在ceph的三个节点机(ceph-node1、ceph-node2、ceph-node3)上添加hosts[root@ceph-node1 ~]# cat /etc/hosts

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.10.200 ceph-node1192.168.10.201 ceph-node2192.168.10.202 ceph-node3

添加完hosts后,做下测试,保证使⽤hosts中映射的主机名能ping通。[root@ceph-node3 ~]# ping ceph-node1

PING ceph-node1 (192.168.10.200) 56(84) bytes of data.

64 bytes from ceph-node1 (192.168.10.200): icmp_seq=1 ttl=64 time=0.211 ms64 bytes from ceph-node1 (192.168.10.200): icmp_seq=2 ttl=64 time=0.177 ms

[root@ceph-node3 ~]# ping ceph-node2

PING ceph-node2 (192.168.10.201) 56(84) bytes of data.

64 bytes from ceph-node2 (192.168.10.201): icmp_seq=1 ttl=64 time=1.27 ms64 bytes from ceph-node2 (192.168.10.201): icmp_seq=2 ttl=64 time=0.169 ms

分别在ceph的三个节点机(ceph-node1、ceph-node2、ceph-node3)上创建⽤户ceph,密码统⼀设置为ceph[root@ceph-node1 ~]# adduser ceph

[root@ceph-node1 ~]# echo \"ceph\"|passwd --stdin cephChanging password for user ceph.

77passwd: all authentication tokens updated successfully.78

79在每个Ceph节点中为⽤户增加 root 权限

[root@ceph-node1 ~]# echo \"ceph ALL = (root) NOPASSWD:ALL\" | sudo tee /etc/sudoers.d/ceph80[root@ceph-node1 ~]# chmod 0440 /etc/sudoers.d/ceph81

82测试是否具有sudo权限

83[root@ceph-node1 ~]# su - ceph84[ceph@ceph-node1 ~]$ sudo su -85[root@ceph-node1 ~]#86

关闭防⽕墙

87[root@ceph-node1 ~]# service iptables stop88[root@ceph-node1 ~]# chkconfig iptables off89[root@ceph-node1 ~]# setenforce 090[root@ceph-node1 ~]# getenforce

Permissive

91[root@ceph-node1 ~]# sed -i 's_SELINUX=enforcing_SELINUX=disabled_g' /etc/sysconfig/selinux92

932)Ceph管理节点部署设置(root⽤户操作)。这个只需要在ceph-node1监控节点操作即可。94增加Ceph资料库⾄ ceph-deploy 管理节点,之后安装 ceph-deploy。

95[root@ceph-node1 ~]# rpm -Uvh http://download.ceph.com/rpm-hammer/el6/noarch/ceph-release-1-1.el6.noarch.rpm96[root@ceph-node1 ~]# yum install ceph-deploy -y

97

3)数据节点磁盘挂载(root⽤户)

98在ceph-node1、ceph-node2、ceph-node3上分别挂载了⼀块20G⼤⼩的磁盘作为ceph的数据存储测试使⽤。99需要将它们分区,创建xfs⽂件系统。100

101由于本案例中的四个虚拟机均是使⽤WebvirtMgr创建的kvm虚拟机

102创建kvm虚拟机,具体参考:http://www.cnblogs.com/kevingrace/p/5737724.html103

现在需要在宿主机上创建3个20G的盘,然后将这三个盘分别挂载到ceph-node1、ceph-node2、ceph-node3这三个虚拟机上104操作记录如下:105

106在宿主机上的操作

107[root@kvm-server ~]# virsh list --all108 Id Name State

----------------------------------------------------109 1 ceph-node1 running110 2 ceph-node2 running111 3 ceph-node3 running112 4 centos6-04 running113

[root@zabbix-server ~]# ll /data/kvm/ios/* #这⾥的/data/kvm/ios是webvirtmgr⾥创建虚拟机时定义的镜像存放地址114total 31751800

115-rw-r--r--. 1 qemu qemu 3972005888 Jan 16 17:13 CentOS-6.9-x86_64-bin-DVD1.iso116-rw-r--r--. 1 root root 4521459712 Jan 16 17:14 CentOS-7-x86_64-DVD-1708.iso117-rw-------. 1 qemu qemu 4914610176 Feb 6 17:58 ceph-node1.img118-rw-------. 1 qemu qemu 4417716224 Feb 6 17:59 ceph-node2.img

-rw-------. 1 qemu qemu 4405723136 Feb 6 17:58 ceph-node4.img119-rw-------. 1 qemu qemu 3420389376 Feb 6 17:58 disk004.img120

121创建⼀个20G的新磁盘挂载到ceph-node1虚拟机上

122[root@zabbix-server ~]# qemu-img create -f raw /data/kvm/ios/ceph01.img 20G123Formatting '/data/kvm/ios/ceph01.img', fmt=raw size=21474836480

[root@zabbix-server ~]# ll /data/kvm/ios/ceph01.img

124-rw-r--r--. 1 root root 21474836480 Feb 6 18:00 /data/kvm/ios/ceph01.img125[root@zabbix-server ~]# du -sh /data/kvm/ios/ceph01.img1260 /data/kvm/ios/ceph01.img

127[root@zabbix-server ~]# virsh attach-disk centos6-01 /data/kvm/ios/ceph01.img vdb --cache none # 如果卸载,命令为:virsh detach-disk centos6-01 /data/kvm/ios/ceph01.img

Disk attached successfully128

129然后到ceph-node1虚拟机上查看,发现新建⽴的20G的磁盘/dev/vdb已经挂载上来了130[root@ceph-node1 ~]# fdisk -l131.........132

133Disk /dev/vdb: 21.5 GB, 21474836480 bytes

16 heads, 63 sectors/track, 41610 cylinders134Units = cylinders of 1008 * 512 = 516096 bytes

135Sector size (logical/physical): 512 bytes / 512 bytes136I/O size (minimum/optimal): 512 bytes / 512 bytes137Disk identifier: 0x00000000138

139在虚拟机上对新挂载的磁盘进⾏创建xfs⽂件系统操作140[root@ceph-node1 ~]# parted /dev/vdb

GNU Parted 2.1141Using /dev/vdb

142Welcome to GNU Parted! Type 'help' to view a list of commands.

143(parted) mklabel gpt //在此输⼊mklabel gpt

144Warning: The existing disk label on /dev/vdb will be destroyed and all data on this disk will be lost. Do you want to continue?145Yes/No? yes //在此输⼊yes

146(parted) mkpart primary xfs 0% 100% //在此输⼊mkpart primary xfs 0% 100% 147(parted) quit //在此输⼊quit

Information: You may need to update /etc/fstab.148

149[root@ceph-node1 ~]# fdisk -l150.......

151Disk /dev/vdb: 21.5 GB, 21474836480 bytes152255 heads, 63 sectors/track, 2610 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes153Sector size (logical/physical): 512 bytes / 512 bytes154I/O size (minimum/optimal): 512 bytes / 512 bytes155Disk identifier: 0x00000000156

157 Device Boot Start End Blocks Id System158/dev/vdb1 1 2611 20971519+ ee GPT159

160[root@ceph-node1 ~]# mkfs.xfs /dev/vdb1

161meta-data=/dev/vdb1 isize=256 agcount=4, agsize=1310592 blks

= sectsz=512 attr=2, projid32bit=0

162data = bsize=4096 blocks=5242368, imaxpct=25163 = sunit=0 swidth=0 blks164naming =version 2 bsize=4096 ascii-ci=0

165log =internal log bsize=4096 blocks=2560, version=2166 = sectsz=512 sunit=0 blks, lazy-count=1

realtime =none extsz=4096 blocks=0, rtextents=0

167————————————————————————————————————————————————————————————————————————————————————————————168报错:mkfs.xfs error: command not found.169解决办法:yum install -y xfsprogs kmod-xfs

170————————————————————————————————————————————————————————————————————————————————————————————171

172另外两台虚拟机ceph-node2和ceph-node3挂载新磁盘以及创建xfs⽂件系统的⽅法和上⾯⼀样,这⾥不做赘录了。173

1744)存储集群搭建(ceph⽤户)

集群规模:1个管理节点(即安装ceph-deploy的节点),1个监控节点,3个数据节点。175

176---------------⾸先完成ceph-node1、ceph-node2、ceph-node3三个节点机在ceph⽤户下的ssh⽆密码登陆的信任关系(ssh⽆密码操作过程省略)---------------177做完ceph⽤户之间的ssh信任关系后,可以简单测试下。178[ceph@ceph-node1 ~]$ ssh -p22 ceph@ceph-node2179[ceph@ceph-node1 ~]$ ssh -p22 ceph@ceph-node3180

181[ceph@ceph-node2 ~]$ ssh -p22 ceph@ceph-node1182[ceph@ceph-node2 ~]$ ssh -p22 ceph@ceph-node3183

184[ceph@ceph-node3 ~]$ ssh -p22 ceph@ceph-node1185[ceph@ceph-node3 ~]$ ssh -p22 ceph@ceph-node2186

---------------接着在管理节点上使⽤ceph-deploy(管理节点上使⽤ceph-deploy,所以下⾯操作都要在ceph-node1机器上完成)---------------187

[ceph@ceph-node1 ~]$ mkdir ceph-cluster188

[ceph@ceph-node1 ~]$ cd ceph-cluster189[ceph@ceph-node1 ceph-cluster]$190

191创建⼀个ceph新集群(注意下⾯命令中ceph-node1是monit监控节点的主机名),设置ceph-node1为mon节点192[ceph@ceph-node1 ceph-cluster]$ ceph-deploy new ceph-node1

193[ceph_deploy.conf][DEBUG ] found configuration file at: /home/ceph/.cephdeploy.conf194[ceph_deploy.cli][INFO ] Invoked (1.5.37): /usr/bin/ceph-deploy new ceph-node1195[ceph_deploy.cli][INFO ] ceph-deploy options:

[ceph_deploy.cli][INFO ] username : None196

[ceph_deploy.cli][INFO ] func : 197[ceph_deploy.cli][INFO ] verbose : False198[ceph_deploy.cli][INFO ] overwrite_conf : False199[ceph_deploy.cli][INFO ] quiet : False

200[ceph_deploy.cli][INFO ] cd_conf :

[ceph_deploy.cli][INFO ] cluster : ceph201[ceph_deploy.cli][INFO ] ssh_copykey : True

202[ceph_deploy.cli][INFO ] mon : ['ceph-node1']203[ceph_deploy.cli][INFO ] public_network : None204[ceph_deploy.cli][INFO ] ceph_conf : None205[ceph_deploy.cli][INFO ] cluster_network : None

[ceph_deploy.cli][INFO ] default_release : False206[ceph_deploy.cli][INFO ] fsid : None

207[ceph_deploy.new][DEBUG ] Creating new cluster named ceph

208[ceph_deploy.new][INFO ] making sure passwordless SSH succeeds209[ceph-node1][DEBUG ] connection detected need for sudo210[ceph-node1][DEBUG ] connected to host: ceph-node1

[ceph-node1][DEBUG ] detect platform information from remote host211[ceph-node1][DEBUG ] detect machine type

212[ceph-node1][DEBUG ] find the location of an executable

213[ceph-node1][INFO ] Running command: sudo /sbin/ip link show214[ceph-node1][INFO ] Running command: sudo /sbin/ip addr show215[ceph-node1][DEBUG ] IP addresses found: [u'192.168.10.200']216[ceph_deploy.new][DEBUG ] Resolving host ceph-node1

217[ceph_deploy.new][DEBUG ] Monitor ceph-node1 at 192.168.10.200

[ceph_deploy.new][DEBUG ] Monitor initial members are ['ceph-node1']218[ceph_deploy.new][DEBUG ] Monitor addrs are ['192.168.10.200']219[ceph_deploy.new][DEBUG ] Creating a random mon key...

220[ceph_deploy.new][DEBUG ] Writing monitor keyring to ceph.mon.keyring...221[ceph_deploy.new][DEBUG ] Writing initial config to ceph.conf...222Error in sys.exitfunc:223

[ceph@ceph-node1 ceph-cluster]$ ll224total 28

225-rw-rw-r--. 1 ceph ceph 202 Feb 6 10:37 ceph.conf

226-rw-rw-r--. 1 ceph ceph 16774 Feb 6 10:55 ceph-deploy-ceph.log227-rw-------. 1 ceph ceph 73 Feb 6 10:37 ceph.mon.keyring228

229---------------安装ceph。这个需要在3台存储节点机器上都要安装ceph(root⽤户操作)---------------[ceph@ceph-node1 ~]# yum install -y yum-plugin-prioritie

230[ceph@ceph-node1 ~]# rpm -Uvh http://download.ceph.com/rpm-hammer/el6/noarch/ceph-release-1-1.el6.noarch.rpm231[ceph@ceph-node1 ~]# yum -y install ceph232

233[ceph@ceph-node2 ~]# yum install -y yum-plugin-prioritie

234[ceph@ceph-node2 ~]# rpm -Uvh http://download.ceph.com/rpm-hammer/el6/noarch/ceph-release-1-1.el6.noarch.rpm

[ceph@ceph-node2 ~]# yum -y install ceph235

236[ceph@ceph-node3 ~]# yum install -y yum-plugin-prioritie

237[ceph@ceph-node3 ~]# rpm -Uvh http://download.ceph.com/rpm-hammer/el6/noarch/ceph-release-1-1.el6.noarch.rpm238[ceph@ceph-node3 ~]# yum -y install ceph

239————————————————————————————————————————————————————————————————————————————————————————————————

报错报错:

240安装ceph报错:

241warning: rpmts_HdrFromFdno: Header V4 RSA/SHA1 Signature, key ID 460f3994: NOKEY242Retrieving key from https://download.ceph.com/keys/release.asc243Importing GPG key 0x460F3994:

244 Userid: \"Ceph.com (release key) \"

From : https://download.ceph.com/keys/release.asc245

warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY246

247

Public key for libunwind-1.1-3.el6.x86_64.rpm is not installed248

249解决办法:

250Centos6.x系统下的处理办法:

251yum install -y yum-utils && yum-config-manager --add-repo https://dl.fedoraproject.org/pub/epel/6/x86_64/ && yum install --nogpgcheck -y epel-release && rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 && rm -f /etc/yum252

253Centos7.x系统下的处理办法:

254yum install -y yum-utils && yum-config-manager --add-repo https://dl.fedoraproject.org/pub/epel/7/x86_64/ && yum install --nogpgcheck -y epel-release && rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 && rm -f /etc/yum255——————————————————————————————————————————————————————————————————————————————————————————————256

257---------------接着创建并初始化监控节点(ceph-deploy是管理节点上的操作,下⾯操作都要在ceph-node1机器上完成)---------------[ceph@ceph-node1 ~]$ cd ceph-cluster/258

[ceph@ceph-node1 ceph-cluster]$ ceph-deploy mon create-initial259.......260.......

261[ceph-node1][INFO ] Running command: sudo /usr/bin/ceph --connect-timeout=25 --cluster=ceph --admin-daemon=/var/run/ceph/ceph-mon.ceph-node1.asok mon_status

262[ceph-node1][INFO ] Running command: sudo /usr/bin/ceph --connect-timeout=25 --cluster=ceph --name mon. --keyring=/var/lib/ceph/mon/ceph-ceph-node1/keyring auth get client.admin

263[ceph-node1][INFO ] Running command: sudo /usr/bin/ceph --connect-timeout=25 --cluster=ceph --name mon. --keyring=/var/lib/ceph/mon/ceph-ceph-node1/keyring auth get client.bootstrap-mds264[ceph-node1][INFO ] Running command: sudo /usr/bin/ceph --connect-timeout=25 --cluster=ceph --name mon. --keyring=/var/lib/ceph/mon/ceph-ceph-node1/keyring auth get client.bootstrap-osd265[ceph-node1][INFO ] Running command: sudo /usr/bin/ceph --connect-timeout=25 --cluster=ceph --name mon. --keyring=/var/lib/ceph/mon/ceph-ceph-node1/keyring auth get client.bootstrap-rgw266[ceph_deploy.gatherkeys][INFO ] Storing ceph.client.admin.keyring267[ceph_deploy.gatherkeys][INFO ] Storing ceph.bootstrap-mds.keyring

268[ceph_deploy.gatherkeys][INFO ] keyring 'ceph.mon.keyring' already exists

[ceph_deploy.gatherkeys][INFO ] Storing ceph.bootstrap-osd.keyring269[ceph_deploy.gatherkeys][INFO ] Storing ceph.bootstrap-rgw.keyring

270[ceph_deploy.gatherkeys][INFO ] Destroy temp directory /tmp/tmp8sI0aU271Error in sys.exitfunc:272

273————————————————————————————————————————————————————————————————————————————————————————————————————274如果出现报错(如果有WARNIN告警信息,则不⽤理会,不影响结果):

[ERROR] Failed to execute command: /usr/sbin/service ceph -c /etc/ceph/ceph.conf start mon.ceph01

275[ERROR] GenericError: Failed to create 1 monitors276

277解决办法如下:

278[ceph@ceph-node1 ~]$ sudo yum install redhat-lsb

————————————————————————————————————————————————————————————————————————————————————————————————————279

280执⾏此命令后会初始化mon结点,并且在mon结点⽣成ceph.conf等⽂件,ceph.conf⽂件中声明了mon结点等信息281[ceph@ceph-node1 ceph-cluster]$ ll282total 76

283-rw-------. 1 ceph ceph 113 Feb 6 11:23 ceph.bootstrap-mds.keyring

-rw-------. 1 ceph ceph 113 Feb 6 11:23 ceph.bootstrap-osd.keyring284-rw-------. 1 ceph ceph 113 Feb 6 11:23 ceph.bootstrap-rgw.keyring285-rw-------. 1 ceph ceph 127 Feb 6 11:23 ceph.client.admin.keyring286-rw-rw-r--. 1 ceph ceph 202 Feb 6 10:37 ceph.conf

287-rw-rw-r--. 1 ceph ceph 47659 Feb 6 11:23 ceph-deploy-ceph.log

-rw-------. 1 ceph ceph 73 Feb 6 10:37 ceph.mon.keyring288

[ceph@ceph-node1 ceph-cluster]$ cat ceph.conf289[global]

290fsid = 12d4f209-69ea-4ad9-9507-b00557b42815291mon_initial_members = ceph-node1292mon_host = 192.168.10.200293auth_cluster_required = cephx

auth_service_required = cephx294auth_client_required = cephx295

296查看⼀下Ceph存储节点的硬盘情况:297[ceph@ceph-node1 ceph-cluster]$ pwd298/home/ceph/ceph-cluster

[ceph@ceph-node1 ceph-cluster]$ ceph-deploy disk list ceph-node1299

[ceph_deploy.conf][DEBUG ] found configuration file at: /home/ceph/.cephdeploy.conf300

[ceph_deploy.cli][INFO ] Invoked (1.5.37): /usr/bin/ceph-deploy disk list ceph-node1301[ceph_deploy.cli][INFO ] ceph-deploy options:

302[ceph_deploy.cli][INFO ] username : None303[ceph_deploy.cli][INFO ] verbose : False304[ceph_deploy.cli][INFO ] overwrite_conf : False

[ceph_deploy.cli][INFO ] subcommand : list305[ceph_deploy.cli][INFO ] quiet : False

306[ceph_deploy.cli][INFO ] cd_conf : 307[ceph_deploy.cli][INFO ] cluster : ceph

308[ceph_deploy.cli][INFO ] func : 309[ceph_deploy.cli][INFO ] ceph_conf : None

[ceph_deploy.cli][INFO ] default_release : False

310[ceph_deploy.cli][INFO ] disk : [('ceph-node1', None, None)]311[ceph-node1][DEBUG ] connection detected need for sudo312[ceph-node1][DEBUG ] connected to host: ceph-node1

313[ceph-node1][DEBUG ] detect platform information from remote host314[ceph-node1][DEBUG ] detect machine type

315[ceph-node1][DEBUG ] find the location of an executable316[ceph_deploy.osd][INFO ] Distro info: CentOS 6.9 Final

[ceph_deploy.osd][DEBUG ] Listing disks on ceph-node1...317[ceph-node1][DEBUG ] find the location of an executable

318[ceph-node1][INFO ] Running command: sudo /usr/sbin/ceph-disk list

319[ceph-node1][WARNIN] WARNING:ceph-disk:Old blkid does not support ID_PART_ENTRY_* fields, trying sgdisk; may not correctly identify ceph volumes with dmcrypt320[ceph-node1][DEBUG ] /dev/sr0 other, iso9660321[ceph-node1][DEBUG ] /dev/vda :

322[ceph-node1][DEBUG ] /dev/vda1 other, ext4, mounted on /boot323[ceph-node1][DEBUG ] /dev/vda2 other, LVM2_member324[ceph-node1][DEBUG ] /dev/vdb :

325[ceph-node1][DEBUG ] /dev/vdb1 other, xfs326Error in sys.exitfunc:327

328同理查看其它两个ceph节点的硬盘情况

329[ceph@ceph-node1 ceph-cluster]$ ceph-deploy disk list ceph-node2330[ceph@ceph-node1 ceph-cluster]$ ceph-deploy disk list ceph-node3331

——————————————————————————————————————————————————————————————————————————————————————————————————332如果报错:

333[ERROR ] RuntimeError: remote connection got closed, ensure ``requiretty`` is disabled for ceph02334

335解决办法:

336需要在ceph-node1、ceph-node2、ceph-node3三个osd节点中设置sudo权限(root账号下),如下:337[root@ceph-node1 ~]# visudo

.......

338# Defaults requiretty //如有有⼀⾏内容,就注释掉339Defaults:ceph !requiretty //添加这⼀⾏内容

340——————————————————————————————————————————————————————————————————————————————————————————————————341

342---------------添加数据节点(在三个osd节点的root账号下操作)---------------[root@ceph-node1 ~]# mkdir /data

343[root@ceph-node1 ~]# mkdir /data/osd0344[root@ceph-node1 ~]# chmod -R 777 /data/345

346[root@ceph-node2 ~]# mkdir /data

347[root@ceph-node2 ~]# mkdir /data/osd1348[root@ceph-node2 ~]# chmod -R 777 /data/

349

[root@ceph-node3 ~]# mkdir /data

350[root@ceph-node3 ~]# mkdir /data/osd2351[root@ceph-node3 ~]# chmod -R 777 /data/352

353---------------挂载ceph磁盘---------------354在三个osd节点上将上⾯各个新建的ceph磁盘分别挂载到对应的⽬录

[root@ceph-node1 ~]# mount /dev/vdb1 /data/osd0355

356[root@ceph-node2 ~]# mount /dev/vdb1 /data/osd1357

358[root@ceph-node3 ~]# mount /dev/vdb1 /data/osd2359

360--------------在管理节点准备OSD(本案例中的管理节点就是ceph-node1节点),在ceph⽤户下操作--------------361[ceph@ceph-node1 ~]$ cd ceph-cluster/362[ceph@ceph-node1 ceph-cluster]$ pwd

/home/ceph/ceph-cluster363

[ceph@ceph-node1 ceph-cluster]$ ceph-deploy osd prepare ceph-node1:/data/osd0 ceph-node2:/data/osd1 ceph-node3:/data/osd2364.......365.......

366[ceph-node3][INFO ] checking OSD status...

367[ceph-node3][DEBUG ] find the location of an executable

368[ceph-node3][INFO ] Running command: sudo /usr/bin/ceph --cluster=ceph osd stat --format=json369[ceph_deploy.osd][DEBUG ] Host ceph-node3 is now ready for osd use.370Error in sys.exitfunc:371

372---------------激活OSD(仍然在管理节点ceph-node1上操作)-----------------(注意如果osd的⽬录所在磁盘是ext4格式的⽂件系统会报错,需要进⾏额外的设置)373[ceph@ceph-node1 ceph-cluster]$ pwd

374/home/ceph/ceph-cluster

375[ceph@ceph-node1 ceph-cluster]$ ceph-deploy osd activate ceph-node1:/data/osd0 ceph-node2:/data/osd1 ceph-node3:/data/osd2376.......

.......

377[ceph-node3][INFO ] checking OSD status...

378[ceph-node3][DEBUG ] find the location of an executable

379[ceph-node3][INFO ] Running command: sudo /usr/bin/ceph --cluster=ceph osd stat --format=json380[ceph-node3][INFO ] Running command: sudo chkconfig ceph on381Error in sys.exitfunc:

382_______________________________________________________________________________________________________________383如果报错:

384[WARNIN] ceph disk: Error: No cluster conf fonud in /etc/ceph with fsid dobbb980-a7a0-4562-ab8b-8d423424234385[ERROR] RuntimeError: command returned non-zero exit status: 1

386[ERROR] RuntimeError: Failed to execute command: ceph-disk -v activate --mark-init sysvinit --mount /osd0387

388解决办法:

这是是因为多次卸载和安装ceph造成磁盘的id和cluster的uuid不⼀致,需要将ceph-node1的/data/osd0下的⽂件全部清空389(每台osd节点机对应⽬录下的⽂件都要情况,即ceph-node2的/data/osd1下的⽂件、ceph-node3的/data/osd2下的⽂件)

390———————————————————————————————————————————————————————————————————————————————————————————————————————————391

392------------------开机挂载磁盘(三台osd节点都要操作)-------------------393挂载好的新磁盘会在下⼀次重启或开机的时候失效,因此需要在每台机上对新磁盘进⾏挂载,并编辑/etc/fstab⽂件

[root@ceph-node1 ~]# cat /etc/fstab394........

395/dev/vdb1 /data/osd0 xfs defaults 0 0396

397[root@ceph-node2 ~]# cat /etc/fstab398........

399/dev/vdb1 /data/osd1 xfs defaults 0 0400

401[root@ceph-node3 ~]# cat /etc/fstab402........

/dev/vdb1 /data/osd2 xfs defaults 0 0403

404

----------------------------分发配置和密钥----------------------------405使⽤ceph-deploy命令将配置⽂件和管理密钥复制到管理节点和它的Ceph节点。406[ceph@ceph-node1 ~]$ cd ceph-cluster/407[ceph@ceph-node1 ceph-cluster]$ pwd408/home/ceph/ceph-cluster

409[ceph@ceph-node1 ceph-cluster]$ ceph-deploy admin ceph-node1 ceph-node2 ceph-node3410[ceph_deploy.conf][DEBUG ] found configuration file at: /home/ceph/.cephdeploy.conf

411[ceph_deploy.cli][INFO ] Invoked (1.5.37): /usr/bin/ceph-deploy admin ceph-node1 ceph-node2 ceph-node3

[ceph_deploy.cli][INFO ] ceph-deploy options:

412[ceph_deploy.cli][INFO ] username : None413[ceph_deploy.cli][INFO ] verbose : False414[ceph_deploy.cli][INFO ] overwrite_conf : False415[ceph_deploy.cli][INFO ] quiet : False

[ceph_deploy.cli][INFO ] cd_conf : 416[ceph_deploy.cli][INFO ] cluster : ceph

417[ceph_deploy.cli][INFO ] client : ['ceph-node1', 'ceph-node2', 'ceph-node3']418[ceph_deploy.cli][INFO ] func : 419[ceph_deploy.cli][INFO ] ceph_conf : None420[ceph_deploy.cli][INFO ] default_release : False

[ceph_deploy.admin][DEBUG ] Pushing admin keys and conf to ceph-node1421

[ceph-node1][DEBUG ] connection detected need for sudo422[ceph-node1][DEBUG ] connected to host: ceph-node1

423[ceph-node1][DEBUG ] detect platform information from remote host424[ceph-node1][DEBUG ] detect machine type

425[ceph-node1][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf426[ceph_deploy.admin][DEBUG ] Pushing admin keys and conf to ceph-node2

[ceph-node2][DEBUG ] connection detected need for sudo427

[ceph-node2][DEBUG ] connected to host: ceph-node2

428[ceph-node2][DEBUG ] detect platform information from remote host429[ceph-node2][DEBUG ] detect machine type

430[ceph-node2][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf431[ceph_deploy.admin][DEBUG ] Pushing admin keys and conf to ceph-node3432[ceph-node3][DEBUG ] connection detected need for sudo

[ceph-node3][DEBUG ] connected to host: ceph-node3

433[ceph-node3][DEBUG ] detect platform information from remote host434[ceph-node3][DEBUG ] detect machine type

435[ceph-node3][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf436Error in sys.exitfunc:437

438-----------------------------------查看集群状态(ceph⽤户或root⽤户下都可以查看)------------------------------[ceph@ceph-node1 ~]$ ceph health439HEALTH_OK

440[ceph@ceph-node1 ~]$ ceph -s

441 cluster 12d4f209-69ea-4ad9-9507-b00557b42815442 health HEALTH_OK

monmap e1: 1 mons at {ceph-node1=192.168.10.200:6789/0}443 election epoch 2, quorum 0 ceph-node1444 osdmap e14: 3 osds: 3 up, 3 in

445 pgmap v26: 64 pgs, 1 pools, 0 bytes data, 0 objects446 15459 MB used, 45944 MB / 61404 MB avail447 64 active+clean

448

出现上⾯信息就表⽰ceph分布式存储集群环境已经成功了!!

449———————————————————————————————————————————————————————————————————————————————————————————————————————————450======如果报错1:

4512018-02-07 21:53:54.886552 7fdc5cf5a700 -1 monclient(hunting): ERROR: missing keyring, cannot use cephx for authentication4522016-02-07 21:53:54.886584 7fdc5cf5a700 0 librados: client.admin initialization error (2) No such file or directory453Error connecting to cluster: ObjectNotFound454

455是因为普通⽤户⽆法读取导致⽆法进⾏cephx认证,执⾏以下命令:456sudo chmod +r /etc/ceph/ceph.client.admin.keyring457

======如果报错2:

458HEALTH_WARN 64 pgs degraded; 64 pgs stuck degraded; 64 pgs stuck unclean; 64 pgs stuck undersized; 64 pgs undersized459

460是因为配置中默认osd=3,备份=2,与实际不符,更改配置⽂件ceph.conf,增加以下两⾏:461osd_pool_default_size = 2

462osd_pool_default_min_size = 1

(不过没有⽣效,怀疑需要重启集群,待测试),或者添加⼀个osd节点(有些说法是要最少3个osd)463

464======如果报错3:

4652018-02-07 15:21:05.597951 7fde9cb6b700 -1 monclient(hunting): ERROR: missing keyring, cannot use cephx for authentication4662018-02-07 15:21:05.597963 7fde9cb6b700 0 librados: client.admin initialization error (2) No such file or directory467

468是因为没有权限读取keyring,执⾏以下命令赋权限:469sudo chmod 777 /etc/ceph/*

470———————————————————————————————————————————————————————————————————————————————————————————————————————————471

472通过上⾯操作步骤,三个ods节点的ceph服务默认是启动着的。

[root@ceph-node1 ~]# /etc/init.d/ceph status

473=== mon.ceph-node1 ===

474mon.ceph-node1: running {\"version\":\"0.94.10\

=== osd.0 ===

475osd.0: running {\"version\":\"0.94.10\476

477[root@ceph-node2 ~]# /etc/init.d/ceph status478=== osd.1 ===

479osd.1: running {\"version\":\"0.94.10\480

[root@ceph-node3 ~]# /etc/init.d/ceph status481=== osd.2 ===

482osd.2: running {\"version\":\"0.94.10\483

484========================================重新部署(温馨提⽰)==========================================

485部署过程中如果出现任何奇怪的问题⽆法解决,可以简单的删除所有节点(即把所有的mon节点、osd节点、mds节点全部删除),⼀切从头再来:

# ceph-deploy purge ceph-node1 ceph-node2 ceph-node3486# ceph-deploy purgedata ceph-node1 ceph-node2 ceph-node3487# ceph-deploy forgetkey

488======================================================================================================489

4905)创建⽂件系统

491创建⽂件系统的步骤参考官⽹:http://docs.ceph.com/docs/master/cephfs/createfs/

对于⼀个刚创建的MDS服务,虽然服务是运⾏的,但是它的状态直到创建 pools 以及⽂件系统的时候才会变为Active.492

493还没有创建时候的状态

494[ceph@ceph-node1 ~]$ ceph mds stat495e1: 0/0/0 up496

497-------------------创建管理节点(ceph-node1节点上)-------------------498[ceph@ceph-node1 ~]$ cd ceph-cluster/

499[ceph@ceph-node1 ceph-cluster]$ pwd

/home/ceph/ceph-cluster

500[ceph@ceph-node1 ceph-cluster]$ ceph-deploy mds create ceph-node1

501[ceph_deploy.conf][DEBUG ] found configuration file at: /home/ceph/.cephdeploy.conf502[ceph_deploy.cli][INFO ] Invoked (1.5.37): /usr/bin/ceph-deploy mds create ceph-node1503[ceph_deploy.cli][INFO ] ceph-deploy options:

504[ceph_deploy.cli][INFO ] username : None505[ceph_deploy.cli][INFO ] verbose : False

[ceph_deploy.cli][INFO ] overwrite_conf : False506[ceph_deploy.cli][INFO ] subcommand : create507[ceph_deploy.cli][INFO ] quiet : False

508[ceph_deploy.cli][INFO ] cd_conf : 509[ceph_deploy.cli][INFO ] cluster : ceph

510[ceph_deploy.cli][INFO ] func :

[ceph_deploy.cli][INFO ] ceph_conf : None

511[ceph_deploy.cli][INFO ] mds : [('ceph-node1', 'ceph-node1')]512[ceph_deploy.cli][INFO ] default_release : False

513[ceph_deploy.mds][DEBUG ] Deploying mds, cluster ceph hosts ceph-node1:ceph-node1514[ceph-node1][DEBUG ] connection detected need for sudo515[ceph-node1][DEBUG ] connected to host: ceph-node1

516[ceph-node1][DEBUG ] detect platform information from remote host

[ceph-node1][DEBUG ] detect machine type

517[ceph_deploy.mds][INFO ] Distro info: CentOS 6.9 Final518[ceph_deploy.mds][DEBUG ] remote host will use sysvinit

519[ceph_deploy.mds][DEBUG ] deploying mds bootstrap to ceph-node1

520[ceph-node1][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf521[ceph-node1][DEBUG ] create path if it doesn't exist

522[ceph-node1][INFO ] Running command: sudo ceph --cluster ceph --name client.bootstrap-mds --keyring /var/lib/ceph/bootstrap-mds/ceph.keyring auth get-or-create mds.ceph-node1 osd allow rwx mds allow mon allow profile mds -o

node1/keyring523

[ceph-node1][INFO ] Running command: sudo service ceph start mds.ceph-node1524[ceph-node1][DEBUG ] === mds.ceph-node1 ===

525[ceph-node1][DEBUG ] Starting Ceph mds.ceph-node1 on ceph-node1...526[ceph-node1][DEBUG ] starting mds.ceph-node1 at :/0

527[ceph-node1][INFO ] Running command: sudo chkconfig ceph on528Error in sys.exitfunc:529

530注意:如果不创建mds管理节点,client客户端将不能正常挂载到ceph集群!!531

532[ceph@ceph-node1 ceph-cluster]$ sudo /etc/init.d/ceph status

=== mon.ceph-node1 ===

533mon.ceph-node1: running {\"version\":\"0.94.10\534=== osd.0 ===

535osd.0: running {\"version\":\"0.94.10\536=== mds.ceph-node1 ===

mds.ceph-node1: running {\"version\":\"0.94.10\537

538[ceph@ceph-node1 ceph-cluster]$ ceph mds stat539e1: 0/0/0 up540

541--------------------创建pool------------------542查看pool。pool是ceph存储数据时的逻辑分区,它起到namespace的作⽤543[ceph@ceph-node1 ceph-cluster]$ ceph osd lspools5440 rbd,

545

新创建的ceph集群只有rdb⼀个pool。这时需要创建⼀个新的pool

546新建pool,可参考官⽹:http://docs.ceph.com/docs/master/rados/operations/pools/

547[ceph@ceph-node1 ceph-cluster]$ ceph osd pool create cephfs_data 10 //后⾯的数字是PG的数量548pool 'cephfs_data' created

549[ceph@ceph-node1 ceph-cluster]$ ceph osd pool create cephfs_metadata 10 //创建pool的元数据550pool 'cephfs_metadata' created

551[ceph@ceph-node1 ceph-cluster]$ ceph fs new myceph cephfs_metadata cephfs_data552new fs with metadata pool 2 and data pool 1553

再次查看pool

554[ceph@ceph-node1 ceph-cluster]$ ceph osd lspools5550 rbd,1 cephfs_data,2 cephfs_metadata,556

557--------------------检验--------------------558[ceph@ceph-node1 ~]$ ceph mds stat559e5: 1/1/1 up {0=ceph-node1=up:active}560

查看集群状态

561[ceph@ceph-node1 ~]$ ceph -s

562 cluster 12d4f209-69ea-4ad9-9507-b00557b42815563 health HEALTH_OK

564 monmap e1: 1 mons at {ceph-node1=192.168.10.200:6789/0}

election epoch 2, quorum 0 ceph-node1565

mdsmap e5: 1/1/1 up {0=ceph-node1=up:active}566 osdmap e19: 3 osds: 3 up, 3 in

567 pgmap v37: 84 pgs, 3 pools, 1962 bytes data, 20 objects568 15460 MB used, 45943 MB / 61404 MB avail569 84 active+clean570

571查看ceph集群端⼝

[root@ceph-node1 ~]# lsof -i:6789

572COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

573ceph-mon 568 root 13u IPv4 65149 0t0 TCP ceph-node1:smc-https (LISTEN)

574ceph-mon 568 root 23u IPv4 73785 0t0 TCP ceph-node1:smc-https->ceph-node1:34280 (ESTABLISHED)

ceph-mon 568 root 24u IPv4 73874 0t0 TCP ceph-node1:smc-https->ceph-node2:42094 (ESTABLISHED)575ceph-mon 568 root 25u IPv4 73920 0t0 TCP ceph-node1:smc-https->ceph-node3:42080 (ESTABLISHED)576ceph-mon 568 root 26u IPv4 76829 0t0 TCP ceph-node1:smc-https->ceph-node1:34354 (ESTABLISHED)577ceph-osd 4566 root 24u IPv4 73784 0t0 TCP ceph-node1:34280->ceph-node1:smc-https (ESTABLISHED)578ceph-mds 7928 root 9u IPv4 76828 0t0 TCP ceph-node1:34354->ceph-node1:smc-https (ESTABLISHED)579

6)client挂载

580client挂载⽅式有两种:内核kernal⽅式和fuse⽅式。由于我们使⽤的centos6.7内核版本太低,⽽升级内核时间太长,故直接采⽤fuse⽅式进⾏挂载。581

582特别需要注意的是:

583client挂载前需要在client节点安装ceph-fuse,⽅法参考上⾯的操作即可!584

585安装ceph-fuse

[root@ceph-client ~]# rpm -Uvh https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm586[root@ceph-client ~]# yum install -y ceph-fuse587

588创建挂载⽬录

589[root@ceph-client ~]# mkdir /cephfs590

591复制配置⽂件

592将ceph配置⽂件ceph.conf从管理节点copy到client节点

[root@ceph-client ~]# rsync -e \"ssh -p22\" -avp root@192.168.10.200:/etc/ceph/ceph.conf /etc/ceph/593[root@ceph-client ~]# ll /etc/ceph/ceph.conf

594-rw-r--r--. 1 root root 202 Feb 7 03:32 /etc/ceph/ceph.conf595

596复制密钥

597将ceph的ceph.client.admin.keyring从管理节点copy到client节点

[root@ceph-client ~]# rsync -e \"ssh -p22\" -avp root@192.168.10.200:/etc/ceph/ceph.client.admin.keyring /etc/ceph/598[root@ceph-client ~]# ll /etc/ceph/ceph.client.admin.keyring

599-rwxrwxrwx. 1 root root 127 Feb 7 02:55 /etc/ceph/ceph.client.admin.keyring600

601查看ceph授权

602[root@ceph-client ~]# ceph auth list

installed auth entries:603

604mds.ceph-node1

605 key: AQDV/3lasqfVARAAa/eOiCbWQ/ccFLkVD/9UCQ==606 caps: [mds] allow

607 caps: [mon] allow profile mds

caps: [osd] allow rwx608osd.0

609 key: AQAB9XlapzMfOxAAfKLo3Z6FZMyqWUW9F5FU4Q==610 caps: [mon] allow profile osd611 caps: [osd] allow *612osd.1

key: AQAL9XlaT06zLRAABQr9kweLPiHL2Icdgj8YsA==613 caps: [mon] allow profile osd614 caps: [osd] allow *615osd.2

616 key: AQAV9XladRLjORAATbxZHpD34ztqJJ3vFGkVOg==

caps: [mon] allow profile osd617 caps: [osd] allow *618client.admin

619 key: AQCnH3lalDbeHhAAC6y7YERqDDGL+f8S+sP1bw==620 caps: [mds] allow

caps: [mon] allow *621 caps: [osd] allow *622client.bootstrap-mds

623 key: AQCoH3laUqT5JRAAiVMRF8ueWQXfgQjIPalNMQ==624 caps: [mon] allow profile bootstrap-mds

client.bootstrap-osd

625 key: AQCnH3laBzU7MBAAnreE1I/0Egh8gvMseoy93w==626 caps: [mon] allow profile bootstrap-osd627client.bootstrap-rgw

628 key: AQCoH3laziwXDxAAenU6cqw0gRcQ3Y0JtygtPQ==629 caps: [mon] allow profile bootstrap-rgw

630

631

挂载到指定⽬录

632将ceph挂载到/cephfs

633[root@ceph-client ~]# ceph-fuse -m 192.168.10.200:6789 /cephfs634ceph-fuse[10466]: starting ceph client

6352018-02-07 04:08:47.227156 7fb6afd9e760 -1 init, newargv = 0x33d23e0 newargc=11

ceph-fuse[10466]: starting fuse636

637[root@ceph-client ~]# df -h

638Filesystem Size Used Avail Use% Mounted on639/dev/vda2 48G 1.5G 45G 4% /

640tmpfs 1.9G 0 1.9G 0% /dev/shm641/dev/vda1 190M 36M 145M 20% /boot642/dev/vda5 47G 52M 44G 1% /home643ceph-fuse 60G 16G 45G 26% /cephfs644

如上可以看到,clinet节点已经将三个osd存储节点(每个20G)的ceph存储挂载上了,总共60G!

645可以在/cephfs下存放数据,当ceph的部分osd节点挂掉后,不会影响client对ceph存储数据的读取操作!646

647取消挂载

648[root@ceph-client ~]# umount /cephfs649650651652653654655656657658659660661662663664665666667668669670

671672673674675676677678679680681682683684685686687688689690691692693694695696697如果client是ubuntu系统,则使⽤fuse挂载ceph存储的操作⽅法

12

3安装ceph-fuse

4# apt-get install -y ceph-fuse5

或者⼿动安装

6下载地址:http://mirrors.aliyun.com/ubuntu/pool/main/c/ceph/7下载包ceph-dbg_0.94.1-0ubuntu1_amd64.deb8# dpkg -i ceph-dbg_0.94.1-0ubuntu1_amd64.deb9

10创建挂载⽬录# mkdir /cephfs11

12复制配置⽂件

13将ceph配置⽂件ceph.conf从管理节点copy到client节点

14# rsync -e \"ssh -p22\" -avp root@192.168.10.200:/etc/ceph/ceph.conf /etc/ceph/15

16复制密钥

将ceph的ceph.client.admin.keyring从管理节点copy到client节点

17# rsync -e \"ssh -p22\" -avp root@192.168.10.200:/etc/ceph/ceph.client.admin.keyring /etc/ceph/18

19查看ceph授权20# ceph auth list21

22挂载到指定⽬录

23将ceph挂载到/cephfs

# ceph-fuse -m 192.168.10.200:6789 /cephfs24

25取消挂载

26# umount /cephfs2728

当有⼀半以上的OSD节点挂掉后,远程客户端挂载的Ceph存储就会使⽤异常了,即暂停使⽤。⽐如本案例中有3个OSD节点,当其中⼀个OSD节点挂掉后,客户端挂载的Ceph存储使⽤正常;但当有2个OSD节点挂掉后,客户端挂载的Ceph存储就不能正常使⽤了(表现为Ceph存储⽬录下的数据读写操作⼀直卡着状态),当OSD节点恢复后,Ceph存储也会恢复正常使⽤。

四、Ceph⽇常操作命令

123456789101112131415161718192021222324252627282930313233343536

查看状态命令:

查看ceph集群状态:ceph -s查看mon状态:ceph mon stat查看msd状态:ceph msd stat查看osd状态:ceph osd stat

查看osd⽬录树(可以查看每个osd挂在哪台机,是否已启动):ceph osd tree

37启动ceph进程命令:

38需要在对应的节点进⾏启动(如果对应节点没有该服务,会进⾏提⽰)

启动mon进程:service ceph start mon.ceph-node139启动msd进程:service ceph start msd.ceoh-node1

40启动osd进程:service ceph start osd.0(在ceph-node1上)41启动osd进程:service ceph start osd.1(在ceph-node2上)42启动osd进程:service ceph start osd.2(在ceph-node3上)43

查看机器的监控状态44# ceph health45

46查看ceph的实时运⾏状态47# ceph -w48

49检查信息状态信息

# ceph -s50

51查看ceph存储空间

52[root@client ~]# ceph df53

54删除⼀个节点的所有的ceph数据包55# ceph-deploy purge ceph-node156# ceph-deploy purgedata ceph-node1

57

为ceph创建⼀个admin⽤户并为admin⽤户创建⼀个密钥,把密钥保存到/etc/ceph⽬录下:

58# ceph auth get-or-create client.admin mds 'allow' osd 'allow ' mon 'allow ' > /etc/ceph/ceph.client.admin.keyring59或

60# ceph auth get-or-create client.admin mds 'allow' osd 'allow ' mon 'allow ' -o /etc/ceph/ceph.client.admin.keyring61

62为osd.0创建⼀个⽤户并创建⼀个key

# ceph auth get-or-create osd.0 mon 'allow rwx' osd 'allow *' -o /var/lib/ceph/osd/ceph-0/keyring63

64为mds.node1创建⼀个⽤户并创建⼀个key(ceph-node1是节点名称)

65# ceph auth get-or-create mds.node1 mon 'allow rwx' osd 'allow ' mds 'allow ' -o /var/lib/ceph/mds/ceph-ceph-node1/keyring66

67查看ceph集群中的认证⽤户及相关的key68ceph auth list69

删除集群中的⼀个认证⽤户70ceph auth del osd.071

72查看集群的详细配置(ceph-node1是节点名称)

73# ceph daemon mon.ceph-node1 config show | more74

75查看集群健康状态细节

# ceph health detail76

77查看ceph log⽇志所在的⽬录

78# ceph-conf –name mon.node1 –show-config-value log_file79

80=================关于mon节点的相关操作命令====================81查看mon的状态信息82# ceph mon stat

83

查看mon的选举状态84# ceph quorum_status85

86查看mon的映射信息87# ceph mon dump88

89删除⼀个mon节点

# ceph mon remove node190

91获得⼀个正在运⾏的mon map,并保存在1.txt⽂件中92# ceph mon getmap -o 1.txt93

94查看上⾯获得的map

95# monmaptool --print 1.txt96

map注⼊新加⼊的节点(如新节点主机名为ceph-node4)97# ceph-mon -i ceph-node4 --inject-monmap 1.txt98

99查看mon的amin socket

100# ceph-conf --name mon.ceph-node1 --show-config-value admin_socket101

102查看mon的详细状态(ceph-node1为mon节点主机名)

# ceph daemon mon.ceph-node1 mon_status103

104删除⼀个mon节点(ceph-node1为mon节点主机名)105# ceph mon remove ceph-node1106

107=================msd节点相关操作命令====================108查看msd状态109# ceph mds stat

110

查看msd的映射信息111# ceph mds dump112

113删除⼀个mds节点

114# ceph mds rm 0 mds.ceph-node1115

116=================osd节点相关操作命令====================

查看ceph osd运⾏状态117# ceph osd stat118

119查看osd映射信息120# ceph osd dump121

122查看osd的⽬录树

# ceph osd tree123

124down掉⼀个osd硬盘(⽐如down掉osd.0节点磁盘)125# ceph osd down 0 126

127在集群中删除⼀个osd硬盘128# ceph osd rm 0129

在集群中删除⼀个osd 硬盘 crush map130# ceph osd crush rm osd.0131

132在集群中删除⼀个osd的host节点133# ceph osd crush rm node1134

135查看最⼤osd的个数(默认最⼤是4个osd节点)

# ceph osd getmaxosd

136

137设置最⼤的osd的个数(当扩⼤osd节点的时候必须扩⼤这个值)138# ceph osd setmaxosd 10139

设置osd crush的权重为1.0140

ceph osd crush set {id} {weight} [{loc1} [{loc2} …]]141例如:

142[root@ceph-node1 ~]# ceph osd crush set 3 3.0 host=ceph-node4

143set item id 3 name 'osd.3' weight 3 at location {host=node4} to crush map144[root@ceph-node1 ~]# ceph osd tree145# id weight type name up/down reweight

-1 6 root default

146-2 1 host ceph-node11470 1 osd.0 up 1

148-3 1 host ceph-node21491 1 osd.1 up 1

-4 1 host ceph-node31502 1 osd.2 up 1

151-5 3 host ceph-node41523 3 osd.3 up 0.5153

154或者⽤下⾯的⽅式

155[root@ceph-node1 ~]# ceph osd crush reweight osd.3 1.0

reweighted item id 3 name 'osd.3' to 1 in crush map156

[root@ceph-node1 ~]# ceph osd tree157# id weight type name up/down reweight158-1 4 root default159-2 1 host node11600 1 osd.0 up 1

-3 1 host node21611 1 osd.1 up 1162-4 1 host node31632 1 osd.2 up 1164-5 1 host node4

3 1 osd.3 up 0.5165

166

167设置osd的权重168

169[root@ceph-node1 ~]# ceph osd reweight 3 0.5170reweighted osd.3 to 0.5 (8327682)171[root@ceph-node1 ~]# ceph osd tree

# id weight type name up/down reweight172-1 4 root default173-2 1 host node11740 1 osd.0 up 1175-3 1 host node21761 1 osd.1 up 1

-4 1 host node31772 1 osd.2 up 1178-5 1 host node41793 1 osd.3 up 0.5180

181把⼀个osd节点逐出集群182

[root@ceph-node1 ~]# ceph osd out osd.3183marked out osd.3.

184[root@ceph-node1 ~]# ceph osd tree185# id weight type name up/down reweight186-1 4 root default

-2 1 host node11870 1 osd.0 up 1188-3 1 host node21891 1 osd.1 up 1190-4 1 host node3

2 1 osd.2 up 1191-5 1 host node41923 1 osd.3 up 0

193# osd.3的reweight变为0了就不再分配数据,但是设备还是存活的194

195把逐出的osd加⼊集群196

197[root@ceph-node1 ~]# ceph osd in osd.3

marked in osd.3.198

[root@ceph-node1 ~]# ceph osd tree199# id weight type name up/down reweight200-1 4 root default201-2 1 host node12020 1 osd.0 up 1

-3 1 host node22031 1 osd.1 up 1204-4 1 host node32052 1 osd.2 up 1206-5 1 host node4

3 1 osd.3 up 1207

208暂停osd (暂停后整个集群不再接收数据)209[root@ceph-node1 ~]# ceph osd pause210# set pauserd,pausewr211

212再次开启osd (开启后再次接收数据)

[root@ceph-node1 ~]# ceph osd unpause213# unset pauserd,pausewr214

215查看⼀个集群osd.2参数的配置

216# ceph –admin-daemon /var/run/ceph/ceph-osd.2.asok config show | less217

218======================PG组相关操作命令=======================219查看pg组的映射信息

# ceph pg dump220

221查看⼀个PG的map222

223[root@client ~]# ceph pg map 0.3f

224osdmap e88 pg 0.3f (0.3f) -> up [0,2] acting [0,2]

225#其中的[0,2]代表存储在osd.0、osd.2节点,osd.0代表主副本的存储位置226

查看PG状态

227[root@client ~]# ceph pg stat

228v1164: 448 pgs: 448 active+clean; 10003 MB data, 23617 MB used, 37792 MB / 61410 MB avail229

230查询⼀个pg的详细信息

231[root@client ~]# ceph pg 0.26 query232

查看pg中stuck的状态

233[root@client ~]# ceph pg dump_stuck unclean234ok

235[root@client ~]# ceph pg dump_stuck inactive236ok

[root@client ~]# ceph pg dump_stuck stale237ok238

239显⽰⼀个集群中的所有的pg统计240# ceph pg dump –format plain241

242恢复⼀个丢失的pg

# ceph pg {pg-id} mark_unfound_lost revert243

244显⽰⾮正常状态的pg

245# ceph pg dump_stuck inactive|unclean|stale246

247======================pool相关操作命令========================248查看ceph集群中的pool数量

[root@ceph-node1 ~]# ceph osd lspools2490 data,1 metadata,2 rbd,250

251在ceph集群中创建⼀个pool

252# ceph osd pool create kevin 100

253这⾥的100指的是PG组,kevin是集群名称254

255为⼀个ceph pool配置配额

# ceph osd pool set-quota data max_objects 10000256

257在集群中删除⼀个pool(集群名字需要重复两次)

258# ceph osd pool delete kevin kevin --yes-i-really-really-mean-it259 260

261显⽰集群中pool的详细信息262[root@ceph-node1 ~]# rados df

pool name category KB objects clones degraded unfound rd rd KB wr wr KB263data - 475764704 116155 0 0 0 0 0 116379 475764704264metadata - 5606 21 0 0 0 0 0 314 5833265rbd - 0 0 0 0 0 0 0 0 0

266total used 955852448 116176

total avail 639497596267total space 1595350044268[root@ceph-node1 ~]#269

270给⼀个pool创建⼀个快照

271[root@ceph-node1 ~]# ceph osd pool mksnap data date-snap

created pool data snap date-snap272

273删除pool的快照

274[root@ceph-node1 ~]# ceph osd pool rmsnap data date-snap275removed pool data snap date-snap276

277查看data池的pg数量

278[root@ceph-node1 ~]# ceph osd pool get data pg_num

pg_num: 64279

280设置data池的最⼤存储空间为100T(默认是1T)

281[root@ceph-node1 ~]# ceph osd pool set data target_max_bytes 100000000000000282set pool 0 target_max_bytes to 100000000000000283

284设置data池的副本数是3

285[root@ceph-node1 ~]# ceph osd pool set data size 3286set pool 0 size to 3287

设置data池能接受写操作的最⼩副本为2

288[root@ceph-node1 ~]# ceph osd pool set data min_size 2289set pool 0 min_size to 2290

291查看集群中所有pool的副本尺⼨

292[root@admin mycephfs]# ceph osd dump | grep 'replicated size'

293pool 0 'data' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 26 owner 0 flags hashpspool crash_replay_interval 45 target_bytes 100000000000000294stripe_width 0

295pool 1 'metadata' replicated size 2 min_size 1 crush_ruleset 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 1 owner 0 flags hashpspool stripe_width 0296pool 2 'rbd' replicated size 2 min_size 1 crush_ruleset 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 1 owner 0 flags hashpspool stripe_width 0297

设置⼀个pool的pg数量

298[root@ceph-node1 ~]# ceph osd pool set data pg_num 100299set pool 0 pg_num to 100300

301设置⼀个pool的pgp数量

302[root@ceph-node1 ~]# ceph osd pool set data pgp_num 100303set pool 0 pgp_num to 100304

305=================================rados指令====================================

查看ceph集群中有多少个pool (只是查看pool)306[root@ceph-node1 ~]# rados lspools307rbd

308cephfs_data

309cephfs_metadata310

311查看ceph集群中有多少个pool,并且每个pool容量及利⽤情况

[root@ceph-node1 ~]# rados df

312pool name KB objects clones degraded unfound rd rd KB wr wr KB313cephfs_data 0 0 0 0 0 0 0 0 0314cephfs_metadata 21 20 0 0 0 0 0 45 36315rbd 0 0 0 0 0 0 0 0 0

total used 15833064 20316 total avail 47044632317 total space 62877696318

319创建⼀个pool,名称为kevin

320[root@ceph-node1 ~]# rados mkpool kevin

successfully created pool kevin321

322查看ceph pool中的ceph object (这⾥的object是以块形式存储的)323[root@ceph-node1 ~]# rados ls -p kevin|more324

325创建⼀个对象object(下⾯的kevin是pool名称)

326[root@ceph-node1 ~]# rados create kevin-object -p kevin

[root@ceph-node1 ~]# rados -p kevin ls327kevin-object328

329删除⼀个对象

330[root@ceph-node1 ~]# rados rm kevin-object -p kevin331[root@ceph-node1 ~]# rados -p kevin ls332

333=================================rbd命令的⽤法=====================================

查看ceph中⼀个pool⾥的所有镜像

334# rbd ls kevin //kevin是⼀个pool名335或者

# rbd list kevin336

337查看ceph pool中⼀个镜像的信息(kevin是pool名,wangshibo是镜像名)338[root@ceph ~]# rbd info -p kevin --image wangshibo339

340在kevin池中创建⼀个命名为wangshibo的10000M的镜像

341[root@ceph-node1 ~]# rbd create -p kevin --size 10000 wangshibo

[root@ceph-node1 ~]# rbd -p kevin info wangshibo //查看新建的镜像的信息342rbd image 'wangshibo':

343 size 10000 MB in 2500 objects344 order 22 (4096 kB objects)

345 block_name_prefix: rb.0.1079.2ae8944a346 format: 1347

删除⼀个镜像

348[root@ceph-node1 ~]# rbd rm -p kevin wangshibo349Removing image: 100% complete...done.350

351调整⼀个镜像的尺⼨(前提是wangshibo镜像已经创建并没有被删除)352[root@ceph-node1 ~]# rbd resize -p kevin --size 20000 wangshibo353Resizing image: 100% complete...done.

354

查看调整后的wangshibo镜像⼤⼩

355[root@ceph-node1 ~]# rbd -p kevin info wangshibo356rbd image 'wangshibo':

357 size 20000 MB in 5000 objects358 order 22 (4096 kB objects)

359 block_name_prefix: rb.0.107d.2ae8944a

format: 1360

361给⼀个镜像创建⼀个快照(如下,池/镜像@快照 )

362[root@ceph-node1 ~]# rbd snap create kevin/wangshibo@wangshibo123363

364查看快照

365[root@ceph-node1 ~]# rbd info kevin/wangshibo@wangshibo123

rbd image 'wangshibo':366

size 20000 MB in 5000 objects367 order 22 (4096 kB objects)

368 block_name_prefix: rb.0.107d.2ae8944a369 format: 1

370 protected: False371

查看⼀个镜像⽂件的快照

372[root@ceph-node1 ~]# rbd snap ls -p kevin wangshibo373SNAPID NAME SIZE374 4 wangshibo123 20000 MB375

376删除⼀个镜像⽂件的⼀个快照

377[root@ceph-node1 ~]# rbd snap rm kevin/wangshibo@wangshibo123

[root@ceph-node1 ~]# rbd snap ls -p kevin wangshibo //wangshibo123快照已经被删除378

379如果发现不能删除显⽰的报错信息是此快照备写保护了,下⾯命令是删除写保护后再进⾏删除。380# rbd snap unprotect kevin/wangshibo@wangshibo123381# rbd snap rm kevin/wangshibo@wangshibo123382

383删除⼀个镜像⽂件的所有快照

[root@ceph-node1 ~]# rbd snap purge -p kevin wangshibo384Removing all snapshots: 100% complete...done.385

386把ceph pool中的⼀个镜像导出

387[root@ceph-node1 ~]# rbd export -p kevin --image wangshibo388Exporting image: 100% complete...done.389

把⼀个镜像导⼊ceph中 (但是直接导⼊是不能⽤的,因为没有经过openstack,openstack是看不到的)390[root@ceph-node1 ~]# rbd import /root/ceph_test.img -p kevin --image wangshibo391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yule263.com 版权所有 湘ICP备2023023988号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务