Ceph分布式存储 - 学习总结

 

存储根据其类型,可分为块存储,对象存储和文件存储。在主流的分布式存储技术中,HDFS/GPFS/GFS属于文件存储Swift属于对象存储,而Ceph可支持块存储、对象存储和文件存储,故称为统一存储。html

1、Ceph 基本介绍
Ceph是一个分布式存储系统,诞生于2004年,最先致力于开发下一代高性能分布式文件系统的项目。通过多年的发展以后,已获得众多云计算和存储厂商的支持,成为应用最普遍的开源分布式存储平台。Ceph源码下载:http://ceph.com/download/ 。随着云计算的发展,ceph乘上了OpenStack的春风,进而成为了开源社区受关注较高的项目之一。Ceph能够将多台服务器组成一个超大集群,把这些机器中的磁盘资源整合到一起,造成一个大的资源池(PB级别),而后按需分配给应用使用。node

1.  Ceph的主要架构linux

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的文件系统,支持文件存储。ios

2.  Ceph的功能模块web

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之间地位相同,无固定的中心节点json

Ceph存在一些缺点
1. 去中心化的分布式解决方案,须要提早作好规划设计,对技术团队的要求能力比较高。
2. Ceph扩容时,因为其数据分布均衡的特性,会致使整个存储系统性能的降低。bootstrap

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。

2、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描述了对象块存储的物理位置,以及一个将设备聚合到物理位置的桶列表。

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发请求,以保证数据的强一致性。

OSD
首先描述一下ceph数据的存储过程,以下图:

 

3、Ceph分布式存储环境的简易部署过程(一个ceph cluster机器,至少须要1个mon节点和2个osd节点)

0)基本信息:
这里我只是测试环境,因此使用一个监控节点,两个存储节点,具体以下:
 
ip地址              主机名           ceph磁盘          备注    
192.168.10.200      ceph-node1       20G               做为mds、mon、osd0
192.168.10.201      ceph-node2       20G               做为osd1
192.168.10.202      ceph-node3       20G               做为osd2
192.168.10.203      ceph-client      挂载点:/cephfs   ceph客户端
 
Ceph的文件系统做为一个目录挂载到客户端cephclient的/cephfs目录下,能够像操做普通目录同样对此目录进行操做。
 
1)安装前准备
分别在ceph的三个节点机(ceph-node一、ceph-node二、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.localdomain6
192.168.10.200 ceph-node1
192.168.10.201 ceph-node2
192.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 ms
64 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 ms
64 bytes from ceph-node2 (192.168.10.201): icmp_seq=2 ttl=64 time=0.169 ms
 
分别在ceph的三个节点机(ceph-node一、ceph-node二、ceph-node3)上建立用户ceph,密码统一设置为ceph
[root@ceph-node1 ~]# adduser ceph
[root@ceph-node1 ~]# echo "ceph"|passwd --stdin ceph
Changing password for user ceph.
passwd: all authentication tokens updated successfully.
 
在每一个Ceph节点中为用户增长 root 权限
[root@ceph-node1 ~]# echo "ceph ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ceph
[root@ceph-node1 ~]# chmod 0440 /etc/sudoers.d/ceph
 
测试是否具备sudo权限
[root@ceph-node1 ~]# su - ceph
[ceph@ceph-node1 ~]$ sudo su -
[root@ceph-node1 ~]#
 
关闭防火墙
[root@ceph-node1 ~]# service iptables stop
[root@ceph-node1 ~]# chkconfig iptables off
[root@ceph-node1 ~]# setenforce 0
[root@ceph-node1 ~]# getenforce
Permissive
[root@ceph-node1 ~]# sed -i 's_SELINUX=enforcing_SELINUX=disabled_g' /etc/sysconfig/selinux
 
2)Ceph管理节点部署设置(root用户操做)。这个只须要在ceph-node1监控节点操做便可。
增长Ceph资料库至 ceph-deploy 管理节点,以后安装 ceph-deploy。
[root@ceph-node1 ~]# rpm -Uvh http://download.ceph.com/rpm-hammer/el6/noarch/ceph-release-1-1.el6.noarch.rpm
[root@ceph-node1 ~]# yum install ceph-deploy -y
 
3)数据节点磁盘挂载(root用户)
在ceph-node一、ceph-node二、ceph-node3上分别挂载了一块20G大小的磁盘做为ceph的数据存储测试使用。
须要将它们分区,建立xfs文件系统。
 
因为本案例中的四个虚拟机均是使用WebvirtMgr建立的kvm虚拟机
建立kvm虚拟机,具体参考:http://www.cnblogs.com/kevingrace/p/5737724.html
 
如今须要在宿主机上建立3个20G的盘,而后将这三个盘分别挂载到ceph-node一、ceph-node二、ceph-node3这三个虚拟机上
操做记录以下:
 
在宿主机上的操做
[root@kvm-server ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 1     ceph-node1                     running
 2     ceph-node2                     running
 3     ceph-node3                     running
 4     centos6-04                     running
 
[root@zabbix-server ~]# ll /data/kvm/ios/*     #这里的/data/kvm/ios是webvirtmgr里建立虚拟机时定义的镜像存放地址
total 31751800
-rw-r--r--. 1 qemu qemu 3972005888 Jan 16 17:13 CentOS-6.9-x86_64-bin-DVD1.iso
-rw-r--r--. 1 root root 4521459712 Jan 16 17:14 CentOS-7-x86_64-DVD-1708.iso
-rw-------. 1 qemu qemu 4914610176 Feb  6 17:58 ceph-node1.img
-rw-------. 1 qemu qemu 4417716224 Feb  6 17:59 ceph-node2.img
-rw-------. 1 qemu qemu 4405723136 Feb  6 17:58 ceph-node4.img
-rw-------. 1 qemu qemu 3420389376 Feb  6 17:58 disk004.img
 
建立一个20G的新磁盘挂载到ceph-node1虚拟机上
[root@zabbix-server ~]# qemu-img create -f raw /data/kvm/ios/ceph01.img 20G
Formatting '/data/kvm/ios/ceph01.img', fmt=raw size=21474836480
[root@zabbix-server ~]# ll /data/kvm/ios/ceph01.img
-rw-r--r--. 1 root root 21474836480 Feb  6 18:00 /data/kvm/ios/ceph01.img
[root@zabbix-server ~]# du -sh /data/kvm/ios/ceph01.img
0  /data/kvm/ios/ceph01.img
[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 successfully
 
而后到ceph-node1虚拟机上查看,发现新创建的20G的磁盘/dev/vdb已经挂载上来了
[root@ceph-node1 ~]# fdisk -l
.........
 
Disk /dev/vdb: 21.5 GB, 21474836480 bytes
16 heads, 63 sectors/track, 41610 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
 
在虚拟机上对新挂载的磁盘进行建立xfs文件系统操做
[root@ceph-node1 ~]# parted /dev/vdb
GNU Parted 2.1
Using /dev/vdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt                                                  //在此输入mklabel gpt                                        
Warning: The existing disk label on /dev/vdb will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? yes                                                           //在此输入yes                                           
(parted) mkpart primary xfs 0% 100%                                   //在此输入mkpart primary xfs 0% 100%                         
(parted) quit                                                         //在此输入quit                                   
Information: You may need to update /etc/fstab.
 
[root@ceph-node1 ~]# fdisk -l
.......
Disk /dev/vdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
 
   Device Boot      Start         End      Blocks   Id  System
/dev/vdb1               1        2611    20971519+  ee  GPT
 
[root@ceph-node1 ~]# mkfs.xfs /dev/vdb1
meta-data=/dev/vdb1              isize=256    agcount=4, agsize=1310592 blks
         =                       sectsz=512   attr=2, projid32bit=0
data     =                       bsize=4096   blocks=5242368, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0
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
————————————————————————————————————————————————————————————————————————————————————————————
报错:mkfs.xfs error: command not found.
解决办法:yum install -y xfsprogs kmod-xfs
————————————————————————————————————————————————————————————————————————————————————————————
 
另外两台虚拟机ceph-node2和ceph-node3挂载新磁盘以及建立xfs文件系统的方法和上面同样,这里不作赘录了。
 
4)存储集群搭建(ceph用户)
集群规模:1个管理节点,1个监控节点,3个数据节点。
 
---------------首先完成ceph-node一、ceph-node二、ceph-node3三个节点机在ceph用户下的ssh无密码登录的信任关系(ssh无密码操做过程省略)---------------
作完ceph用户之间的ssh信任关系后,能够简单测试下。
[ceph@ceph-node1 ~]$ ssh -p22 ceph@ceph-node2
[ceph@ceph-node1 ~]$ ssh -p22 ceph@ceph-node3
 
[ceph@ceph-node2 ~]$ ssh -p22 ceph@ceph-node1
[ceph@ceph-node2 ~]$ ssh -p22 ceph@ceph-node3
 
[ceph@ceph-node3 ~]$ ssh -p22 ceph@ceph-node1
[ceph@ceph-node3 ~]$ ssh -p22 ceph@ceph-node2
 
---------------接着在管理节点上使用ceph-deploy(管理节点上使用ceph-deploy,因此下面操做都要在ceph-node1机器上完成)---------------
[ceph@ceph-node1 ~]$ mkdir ceph-cluster
[ceph@ceph-node1 ~]$ cd ceph-cluster
[ceph@ceph-node1 ceph-cluster]$
 
建立一个ceph新集群(注意下面命令中ceph-node1是monit监控节点的主机名),设置ceph-node1为mon节点
[ceph@ceph-node1 ceph-cluster]$ ceph-deploy new ceph-node1
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/ceph/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (1.5.37): /usr/bin/ceph-deploy new ceph-node1
[ceph_deploy.cli][INFO  ] ceph-deploy options:
[ceph_deploy.cli][INFO  ]  username                      : None
[ceph_deploy.cli][INFO  ]  func                          : <function new at 0x112b500>
[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 0xf26e18>
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  ssh_copykey                   : True
[ceph_deploy.cli][INFO  ]  mon                           : ['ceph-node1']
[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-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-node1][INFO  ] Running command: sudo /sbin/ip link show
[ceph-node1][INFO  ] Running command: sudo /sbin/ip addr show
[ceph-node1][DEBUG ] IP addresses found: [u'192.168.10.200']
[ceph_deploy.new][DEBUG ] Resolving host ceph-node1
[ceph_deploy.new][DEBUG ] Monitor ceph-node1 at 192.168.10.200
[ceph_deploy.new][DEBUG ] Monitor initial members are ['ceph-node1']
[ceph_deploy.new][DEBUG ] Monitor addrs are ['192.168.10.200']
[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...
Error in sys.exitfunc:
 
[ceph@ceph-node1 ceph-cluster]$ ll
total 28
-rw-rw-r--. 1 ceph ceph   202 Feb  6 10:37 ceph.conf
-rw-rw-r--. 1 ceph ceph 16774 Feb  6 10:55 ceph-deploy-ceph.log
-rw-------. 1 ceph ceph    73 Feb  6 10:37 ceph.mon.keyring
 
---------------安装ceph。这个须要在3台存储节点机器上都要安装ceph(root用户操做)---------------
[ceph@ceph-node1 ~]# yum install -y yum-plugin-prioritie
[ceph@ceph-node1 ~]# rpm -Uvh http://download.ceph.com/rpm-hammer/el6/noarch/ceph-release-1-1.el6.noarch.rpm
[ceph@ceph-node1 ~]# yum -y install ceph
 
[ceph@ceph-node2 ~]# yum install -y yum-plugin-prioritie
[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 ceph
 
[ceph@ceph-node3 ~]# yum install -y yum-plugin-prioritie
[ceph@ceph-node3 ~]# rpm -Uvh http://download.ceph.com/rpm-hammer/el6/noarch/ceph-release-1-1.el6.noarch.rpm
[ceph@ceph-node3 ~]# yum -y install ceph
————————————————————————————————————————————————————————————————————————————————————————————————
报错报错:
安装ceph报错: 
warning: rpmts_HdrFromFdno: Header V4 RSA/SHA1 Signature, key ID 460f3994: NOKEY
Retrieving key from https://download.ceph.com/keys/release.asc
Importing GPG key 0x460F3994:
 Userid: "Ceph.com (release key) <security@ceph.com>"
 From  : https://download.ceph.com/keys/release.asc
warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
 
Public key for libunwind-1.1-3.el6.x86_64.rpm is not installed
 
解决办法:
Centos6.x系统下的处理办法:
yum 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/yum.repos.d/dl.fedoraproject.org*
 
Centos7.x系统下的处理办法:
yum 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/yum.repos.d/dl.fedoraproject.org*
——————————————————————————————————————————————————————————————————————————————————————————————
 
---------------接着建立并初始化监控节点(ceph-deploy是管理节点上的操做,下面操做都要在ceph-node1机器上完成)---------------
[ceph@ceph-node1 ~]$ cd ceph-cluster/
[ceph@ceph-node1 ceph-cluster]$ ceph-deploy mon create-initial
.......
.......
[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
[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
[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-mds
[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-osd
[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-rgw
[ceph_deploy.gatherkeys][INFO  ] Storing ceph.client.admin.keyring
[ceph_deploy.gatherkeys][INFO  ] Storing ceph.bootstrap-mds.keyring
[ceph_deploy.gatherkeys][INFO  ] keyring 'ceph.mon.keyring' already exists
[ceph_deploy.gatherkeys][INFO  ] Storing ceph.bootstrap-osd.keyring
[ceph_deploy.gatherkeys][INFO  ] Storing ceph.bootstrap-rgw.keyring
[ceph_deploy.gatherkeys][INFO  ] Destroy temp directory /tmp/tmp8sI0aU
Error in sys.exitfunc:
 
————————————————————————————————————————————————————————————————————————————————————————————————————
若是出现报错(若是有WARNIN告警信息,则不用理会,不影响结果):
[ERROR] Failed to execute command: /usr/sbin/service ceph -c /etc/ceph/ceph.conf start mon.ceph01
[ERROR] GenericError: Failed to create 1 monitors
 
解决办法以下:
[ceph@ceph-node1 ~]$ sudo yum install redhat-lsb
————————————————————————————————————————————————————————————————————————————————————————————————————
 
执行此命令后会初始化mon结点,而且在mon结点生成ceph.conf等文件,ceph.conf文件中声明了mon结点等信息
[ceph@ceph-node1 ceph-cluster]$ ll
total 76
-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.keyring
-rw-------. 1 ceph ceph   113 Feb  6 11:23 ceph.bootstrap-rgw.keyring
-rw-------. 1 ceph ceph   127 Feb  6 11:23 ceph.client.admin.keyring
-rw-rw-r--. 1 ceph ceph   202 Feb  6 10:37 ceph.conf
-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.keyring
[ceph@ceph-node1 ceph-cluster]$ cat ceph.conf
[global]
fsid = 12d4f209-69ea-4ad9-9507-b00557b42815
mon_initial_members = ceph-node1
mon_host = 192.168.10.200
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
 
查看一下Ceph存储节点的硬盘状况:
[ceph@ceph-node1 ceph-cluster]$ pwd
/home/ceph/ceph-cluster
[ceph@ceph-node1 ceph-cluster]$ ceph-deploy disk list ceph-node1
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/ceph/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (1.5.37): /usr/bin/ceph-deploy disk list ceph-node1
[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 0x18af8c0>
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  func                          : <function disk at 0x18a2488>
[ceph_deploy.cli][INFO  ]  ceph_conf                     : None
[ceph_deploy.cli][INFO  ]  default_release               : False
[ceph_deploy.cli][INFO  ]  disk                          : [('ceph-node1', 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 6.9 Final
[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][WARNIN] WARNING:ceph-disk:Old blkid does not support ID_PART_ENTRY_* fields, trying sgdisk; may not correctly identify ceph volumes with dmcrypt
[ceph-node1][DEBUG ] /dev/sr0 other, iso9660
[ceph-node1][DEBUG ] /dev/vda :
[ceph-node1][DEBUG ]  /dev/vda1 other, ext4, mounted on /boot
[ceph-node1][DEBUG ]  /dev/vda2 other, LVM2_member
[ceph-node1][DEBUG ] /dev/vdb :
[ceph-node1][DEBUG ]  /dev/vdb1 other, xfs
Error in sys.exitfunc:
 
同理查看其它两个ceph节点的硬盘状况
[ceph@ceph-node1 ceph-cluster]$ ceph-deploy disk list ceph-node2
[ceph@ceph-node1 ceph-cluster]$ ceph-deploy disk list ceph-node3
 
——————————————————————————————————————————————————————————————————————————————————————————————————
若是报错:
[ERROR ] RuntimeError: remote connection got closed, ensure ``requiretty`` is disabled for ceph02
 
解决办法:
须要在ceph-node一、ceph-node二、ceph-node3三个osd节点中设置sudo权限(root帐号下),以下:
[root@ceph-node1 ~]# visudo
.......
# Defaults requiretty                     //若有有一行内容,就注释掉
Defaults:ceph !requiretty                 //添加这一行内容
——————————————————————————————————————————————————————————————————————————————————————————————————
 
---------------添加数据节点(在三个osd节点的root帐号下操做)---------------
[root@ceph-node1 ~]# mkdir /data
[root@ceph-node1 ~]# mkdir /data/osd0
[root@ceph-node1 ~]# chmod -R 777 /data/
 
[root@ceph-node2 ~]# mkdir /data
[root@ceph-node2 ~]# mkdir /data/osd1
[root@ceph-node2 ~]# chmod -R 777 /data/
 
[root@ceph-node3 ~]# mkdir /data
[root@ceph-node3 ~]# mkdir /data/osd2
[root@ceph-node3 ~]# chmod -R 777 /data/
 
---------------挂载ceph磁盘---------------
在三个osd节点上将上面各个新建的ceph磁盘分别挂载到对应的目录
[root@ceph-node1 ~]# mount /dev/vdb1 /data/osd0
 
[root@ceph-node2 ~]# mount /dev/vdb1 /data/osd1
 
[root@ceph-node3 ~]# mount /dev/vdb1 /data/osd2
 
--------------在管理节点准备OSD(本案例中的管理节点就是ceph-node1节点),在ceph用户下操做--------------
[ceph@ceph-node1 ~]$ cd ceph-cluster/
[ceph@ceph-node1 ceph-cluster]$ pwd
/home/ceph/ceph-cluster
[ceph@ceph-node1 ceph-cluster]$ ceph-deploy osd prepare ceph-node1:/data/osd0 ceph-node2:/data/osd1 ceph-node3:/data/osd2
.......
.......
[ceph-node3][INFO  ] checking OSD status...
[ceph-node3][DEBUG ] find the location of an executable
[ceph-node3][INFO  ] Running command: sudo /usr/bin/ceph --cluster=ceph osd stat --format=json
[ceph_deploy.osd][DEBUG ] Host ceph-node3 is now ready for osd use.
Error in sys.exitfunc:
 
---------------激活OSD(仍然在管理节点ceph-node1上操做)-----------------
(注意若是osd的目录所在磁盘是ext4格式的文件系统会报错,须要进行额外的设置)
[ceph@ceph-node1 ceph-cluster]$ pwd
/home/ceph/ceph-cluster
[ceph@ceph-node1 ceph-cluster]$ ceph-deploy osd activate ceph-node1:/data/osd0 ceph-node2:/data/osd1 ceph-node3:/data/osd2
.......
.......
[ceph-node3][INFO  ] checking OSD status...
[ceph-node3][DEBUG ] find the location of an executable
[ceph-node3][INFO  ] Running command: sudo /usr/bin/ceph --cluster=ceph osd stat --format=json
[ceph-node3][INFO  ] Running command: sudo chkconfig ceph on
Error in sys.exitfunc:
_______________________________________________________________________________________________________________
若是报错:
[WARNIN] ceph disk: Error: No cluster conf fonud in /etc/ceph with fsid dobbb980-a7a0-4562-ab8b-8d423424234
[ERROR] RuntimeError: command returned non-zero exit status: 1
[ERROR] RuntimeError: Failed to execute command: ceph-disk -v activate --mark-init sysvinit --mount /osd0
 
解决办法:
这是是由于屡次卸载和安装ceph形成磁盘的id和cluster的uuid不一致,须要将ceph-node1的/data/osd0下的文件所有清空
(每台osd节点机对应目录下的文件都要状况,即ceph-node2的/data/osd1下的文件、ceph-node3的/data/osd2下的文件)
——————————————————————————————————————————————————————————————————————————————————————————————————————————————
 
------------------开机挂载磁盘(三台osd节点都要操做)-------------------
挂载好的新磁盘会在下一次重启或开机的时候失效,所以须要在每台机上对新磁盘进行挂载,并编辑/etc/fstab文件
[root@ceph-node1 ~]# cat /etc/fstab
........
/dev/vdb1               /data/osd0                   xfs     defaults        0 0
 
[root@ceph-node2 ~]# cat /etc/fstab
........
/dev/vdb1               /data/osd1                   xfs     defaults        0 0
 
[root@ceph-node3 ~]# cat /etc/fstab
........
/dev/vdb1               /data/osd2                   xfs     defaults        0 0
 
----------------------------分发配置和密钥----------------------------
使用ceph-deploy命令将配置文件和管理密钥复制到管理节点和它的Ceph节点。
[ceph@ceph-node1 ~]$ cd ceph-cluster/
[ceph@ceph-node1 ceph-cluster]$ pwd
/home/ceph/ceph-cluster
[ceph@ceph-node1 ceph-cluster]$ ceph-deploy admin ceph-node1 ceph-node2 ceph-node3
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/ceph/.cephdeploy.conf
[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:
[ceph_deploy.cli][INFO  ]  username                      : None
[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 0x230ca70>
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  client                        : ['ceph-node1', 'ceph-node2', 'ceph-node3']
[ceph_deploy.cli][INFO  ]  func                          : <function admin at 0x2263050>
[ceph_deploy.cli][INFO  ]  ceph_conf                     : None
[ceph_deploy.cli][INFO  ]  default_release               : False
[ceph_deploy.admin][DEBUG ] Pushing admin keys and conf to ceph-node1
[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 ] write cluster configuration to /etc/ceph/{cluster}.conf
[ceph_deploy.admin][DEBUG ] Pushing admin keys and conf to ceph-node2
[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 ] write cluster configuration to /etc/ceph/{cluster}.conf
[ceph_deploy.admin][DEBUG ] Pushing admin keys and conf to ceph-node3
[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 ] write cluster configuration to /etc/ceph/{cluster}.conf
Error in sys.exitfunc:
 
-----------------------------------查看集群状态(ceph用户或root用户下均可以查看)------------------------------
[ceph@ceph-node1 ~]$ ceph health
HEALTH_OK
[ceph@ceph-node1 ~]$ ceph -s
    cluster 12d4f209-69ea-4ad9-9507-b00557b42815
     health HEALTH_OK
     monmap e1: 1 mons at {ceph-node1=192.168.10.200:6789/0}
            election epoch 2, quorum 0 ceph-node1
     osdmap e14: 3 osds: 3 up, 3 in
      pgmap v26: 64 pgs, 1 pools, 0 bytes data, 0 objects
            15459 MB used, 45944 MB / 61404 MB avail
                  64 active+clean
 
出现上面信息就表示ceph分布式存储集群环境已经成功了!!
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
======若是报错1:
2018-02-07 21:53:54.886552 7fdc5cf5a700 -1 monclient(hunting): ERROR: missing keyring, cannot use cephx for authentication
2016-02-07 21:53:54.886584 7fdc5cf5a700  0 librados: client.admin initialization error (2) No such file or directory
Error connecting to cluster: ObjectNotFound
 
是由于普通用户没法读取致使没法进行cephx认证,执行如下命令:
sudo chmod +r /etc/ceph/ceph.client.admin.keyring
 
======若是报错2:
HEALTH_WARN 64 pgs degraded; 64 pgs stuck degraded; 64 pgs stuck unclean; 64 pgs stuck undersized; 64 pgs undersized
 
是由于配置中默认osd=3,备份=2,与实际不符,更改配置文件ceph.conf,增长如下两行:
osd_pool_default_size = 2
osd_pool_default_min_size = 1
(不过没有生效,怀疑须要重启集群,待测试),或者添加一个osd节点(有些说法是要最少3个osd)
 
======若是报错3:
2018-02-07 15:21:05.597951 7fde9cb6b700 -1 monclient(hunting): ERROR: missing keyring, cannot use cephx for authentication
2018-02-07 15:21:05.597963 7fde9cb6b700  0 librados: client.admin initialization error (2) No such file or directory
 
是由于没有权限读取keyring,执行如下命令赋权限:
sudo chmod 777 /etc/ceph/*
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
 
经过上面操做步骤,三个ods节点的ceph服务默认是启动着的。
[root@ceph-node1 ~]# /etc/init.d/ceph status
=== mon.ceph-node1 ===
mon.ceph-node1: running {"version":"0.94.10"}
=== osd.0 ===
osd.0: running {"version":"0.94.10"}
 
[root@ceph-node2 ~]# /etc/init.d/ceph status
=== osd.1 ===
osd.1: running {"version":"0.94.10"}
 
[root@ceph-node3 ~]# /etc/init.d/ceph status
=== osd.2 ===
osd.2: running {"version":"0.94.10"}
 
========================================从新部署(舒适提示)==========================================
部署过程当中若是出现任何奇怪的问题没法解决,能够简单的删除全部节点,一切从头再来:
# ceph-deploy purge ceph-mon1 ceph-mon2 ceph-mon3 ceph-osd1 ceph-osd2
# ceph-deploy purgedata ceph-mon1 ceph-mon2 ceph-mon3 ceph-osd1 ceph-osd2
# ceph-deploy forgetkey
======================================================================================================
 
5)建立文件系统
建立文件系统的步骤参考官网:http://docs.ceph.com/docs/master/cephfs/createfs/
对于一个刚建立的MDS服务,虽然服务是运行的,可是它的状态直到建立 pools 以及文件系统的时候才会变为Active.
 
尚未建立时候的状态
[ceph@ceph-node1 ~]$ ceph mds stat
e1: 0/0/0 up
 
-------------------建立管理节点(ceph-node1节点上)-------------------
[ceph@ceph-node1 ~]$ cd ceph-cluster/
[ceph@ceph-node1 ceph-cluster]$ pwd
/home/ceph/ceph-cluster
[ceph@ceph-node1 ceph-cluster]$ ceph-deploy mds create ceph-node1
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/ceph/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (1.5.37): /usr/bin/ceph-deploy mds create ceph-node1
[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                    : create
[ceph_deploy.cli][INFO  ]  quiet                         : False
[ceph_deploy.cli][INFO  ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf instance at 0xcf0290>
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  func                          : <function mds at 0xcd8398>
[ceph_deploy.cli][INFO  ]  ceph_conf                     : None
[ceph_deploy.cli][INFO  ]  mds                           : [('ceph-node1', 'ceph-node1')]
[ceph_deploy.cli][INFO  ]  default_release               : False
[ceph_deploy.mds][DEBUG ] Deploying mds, cluster ceph hosts ceph-node1:ceph-node1
[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_deploy.mds][INFO  ] Distro info: CentOS 6.9 Final
[ceph_deploy.mds][DEBUG ] remote host will use sysvinit
[ceph_deploy.mds][DEBUG ] deploying mds bootstrap to ceph-node1
[ceph-node1][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[ceph-node1][DEBUG ] create path if it doesn't exist
[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 /var/lib/ceph/mds/ceph-ceph-node1/keyring
[ceph-node1][INFO  ] Running command: sudo service ceph start mds.ceph-node1
[ceph-node1][DEBUG ] === mds.ceph-node1 ===
[ceph-node1][DEBUG ] Starting Ceph mds.ceph-node1 on ceph-node1...
[ceph-node1][DEBUG ] starting mds.ceph-node1 at :/0
[ceph-node1][INFO  ] Running command: sudo chkconfig ceph on
Error in sys.exitfunc:
 
注意:若是不建立mds管理节点,client客户端将不能正常挂载到ceph集群!!
 
[ceph@ceph-node1 ceph-cluster]$ sudo /etc/init.d/ceph status
=== mon.ceph-node1 ===
mon.ceph-node1: running {"version":"0.94.10"}
=== osd.0 ===
osd.0: running {"version":"0.94.10"}
=== mds.ceph-node1 ===
mds.ceph-node1: running {"version":"0.94.10"}
 
[ceph@ceph-node1 ceph-cluster]$ ceph mds stat
e1: 0/0/0 up
 
--------------------建立pool------------------
查看pool。pool是ceph存储数据时的逻辑分区,它起到namespace的做用
[ceph@ceph-node1 ceph-cluster]$ ceph osd lspools
0 rbd,
 
新建立的ceph集群只有rdb一个pool。这时须要建立一个新的pool
新建pool,可参考官网:http://docs.ceph.com/docs/master/rados/operations/pools/ <br>
[ceph@ceph-node1 ceph-cluster]$ ceph osd pool create cephfs_data 10                //后面的数字是PG的数量
pool 'cephfs_data' created
[ceph@ceph-node1 ceph-cluster]$ ceph osd pool create cephfs_metadata 10            //建立pool的元数据
pool 'cephfs_metadata' created
[ceph@ceph-node1 ceph-cluster]$ ceph fs new myceph  cephfs_metadata cephfs_data
new fs with metadata pool 2 and data pool 1
 
再次查看pool
[ceph@ceph-node1 ceph-cluster]$ ceph osd lspools
0 rbd,1 cephfs_data,2 cephfs_metadata,
 
--------------------检验--------------------
[ceph@ceph-node1 ~]$ ceph mds stat
e5: 1/1/1 up {0=ceph-node1=up:active}
 
查看集群状态
[ceph@ceph-node1 ~]$ ceph -s
    cluster 12d4f209-69ea-4ad9-9507-b00557b42815
     health HEALTH_OK
     monmap e1: 1 mons at {ceph-node1=192.168.10.200:6789/0}
            election epoch 2, quorum 0 ceph-node1
     mdsmap e5: 1/1/1 up {0=ceph-node1=up:active}
     osdmap e19: 3 osds: 3 up, 3 in
      pgmap v37: 84 pgs, 3 pools, 1962 bytes data, 20 objects
            15460 MB used, 45943 MB / 61404 MB avail
                  84 active+clean
 
查看ceph集群端口
[root@ceph-node1 ~]# lsof -i:6789
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ceph-mon  568 root   13u  IPv4  65149      0t0  TCP ceph-node1:smc-https (LISTEN)
ceph-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)
ceph-mon  568 root   25u  IPv4  73920      0t0  TCP ceph-node1:smc-https->ceph-node3:42080 (ESTABLISHED)
ceph-mon  568 root   26u  IPv4  76829      0t0  TCP ceph-node1:smc-https->ceph-node1:34354 (ESTABLISHED)
ceph-osd 4566 root   24u  IPv4  73784      0t0  TCP ceph-node1:34280->ceph-node1:smc-https (ESTABLISHED)
ceph-mds 7928 root    9u  IPv4  76828      0t0  TCP ceph-node1:34354->ceph-node1:smc-https (ESTABLISHED)
 
6)client挂载
client挂载方式有两种:内核kernal方式和fuse方式。因为咱们使用的centos6.7内核版本过低,而升级内核时间太长,故直接采用fuse方式进行挂载。
 
特别须要注意的是:
client挂载前须要在client节点安装ceph-fuse,方法参考上面的操做便可!
 
安装ceph-fuse
[root@ceph-client ~]# rpm -Uvh https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@ceph-client ~]# yum install -y ceph-fuse
 
建立挂载目录
[root@ceph-client ~]# mkdir /cephfs
 
复制配置文件
将ceph配置文件ceph.conf从管理节点copy到client节点
[root@ceph-client ~]# rsync -e "ssh -p22" -avp root@192.168.10.200:/etc/ceph/ceph.conf /etc/ceph/
[root@ceph-client ~]# ll /etc/ceph/ceph.conf
-rw-r--r--. 1 root root 202 Feb  7 03:32 /etc/ceph/ceph.conf
 
复制密钥
将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/
[root@ceph-client ~]# ll /etc/ceph/ceph.client.admin.keyring
-rwxrwxrwx. 1 root root 127 Feb  7 02:55 /etc/ceph/ceph.client.admin.keyring
 
查看ceph受权
[root@ceph-client ~]# ceph auth list
installed auth entries:
 
mds.ceph-node1
   key: AQDV/3lasqfVARAAa/eOiCbWQ/ccFLkVD/9UCQ==
   caps: [mds] allow
   caps: [mon] allow profile mds
   caps: [osd] allow rwx
osd.0
   key: AQAB9XlapzMfOxAAfKLo3Z6FZMyqWUW9F5FU4Q==
   caps: [mon] allow profile osd
   caps: [osd] allow *
osd.1
   key: AQAL9XlaT06zLRAABQr9kweLPiHL2Icdgj8YsA==
   caps: [mon] allow profile osd
   caps: [osd] allow *
osd.2
   key: AQAV9XladRLjORAATbxZHpD34ztqJJ3vFGkVOg==
   caps: [mon] allow profile osd
   caps: [osd] allow *
client.admin
   key: AQCnH3lalDbeHhAAC6y7YERqDDGL+f8S+sP1bw==
   caps: [mds] allow
   caps: [mon] allow *
   caps: [osd] allow *
client.bootstrap-mds
   key: AQCoH3laUqT5JRAAiVMRF8ueWQXfgQjIPalNMQ==
   caps: [mon] allow profile bootstrap-mds
client.bootstrap-osd
   key: AQCnH3laBzU7MBAAnreE1I/0Egh8gvMseoy93w==
   caps: [mon] allow profile bootstrap-osd
client.bootstrap-rgw
   key: AQCoH3laziwXDxAAenU6cqw0gRcQ3Y0JtygtPQ==
   caps: [mon] allow profile bootstrap-rgw
 
 
挂载到指定目录
将ceph挂载到/cephfs
[root@ceph-client ~]# ceph-fuse -m 192.168.10.200:6789 /cephfs
ceph-fuse[10466]: starting ceph client
2018-02-07 04:08:47.227156 7fb6afd9e760 -1 init, newargv = 0x33d23e0 newargc=11
ceph-fuse[10466]: starting fuse
 
[root@ceph-client ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda2        48G  1.5G   45G   4% /
tmpfs           1.9G     0  1.9G   0% /dev/shm
/dev/vda1       190M   36M  145M  20% /boot
/dev/vda5        47G   52M   44G   1% /home
ceph-fuse        60G   16G   45G  26% /cephfs
 
如上能够看到,clinet节点已经将三个osd存储节点(每一个20G)的ceph存储挂载上了,总共60G!
能够在/cephfs下存放数据,当ceph的部分osd节点挂掉后,不会影响client对ceph存储数据的读取操做!
 
取消挂载
[root@ceph-client ~]# umount /cephfs

若是client是ubuntu系统,则使用fuse挂载ceph存储的操做方法

安装ceph-fuse
# apt-get install -y ceph-fuse
 
或者手动安装
下载地址:http://mirrors.aliyun.com/ubuntu/pool/main/c/ceph/
下载包ceph-dbg_0.94.1-0ubuntu1_amd64.deb
# dpkg -i ceph-dbg_0.94.1-0ubuntu1_amd64.deb
 
建立挂载目录
# mkdir /cephfs
 
复制配置文件
将ceph配置文件ceph.conf从管理节点copy到client节点
# rsync -e "ssh -p22" -avp root@192.168.10.200:/etc/ceph/ceph.conf /etc/ceph/
  
复制密钥
将ceph的ceph.client.admin.keyring从管理节点copy到client节点
# rsync -e "ssh -p22" -avp root@192.168.10.200:/etc/ceph/ceph.client.admin.keyring /etc/ceph/
  
查看ceph受权
# ceph auth list
  
挂载到指定目录
将ceph挂载到/cephfs
# ceph-fuse -m 192.168.10.200:6789 /cephfs
  
取消挂载
# umount /cephfs

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

4、Ceph平常操做命令

查看状态命令:
查看ceph集群状态:ceph -s
查看mon状态:ceph mon stat
查看msd状态:ceph msd stat
查看osd状态:ceph osd stat
查看osd目录树(能够查看每一个osd挂在哪台机,是否已启动):ceph osd tree
 
启动ceph进程命令:
须要在对应的节点进行启动(若是对应节点没有该服务,会进行提示)
启动mon进程:service ceph start mon.ceph-node1
启动msd进程:service ceph start msd.ceoh-node1
启动osd进程:service ceph start osd.0(在ceph-node1上)
启动osd进程:service ceph start osd.1(在ceph-node2上)
启动osd进程:service ceph start osd.2(在ceph-node3上)
 
查看机器的监控状态
# ceph health
 
查看ceph的实时运行状态
# ceph -w
 
检查信息状态信息
# ceph -s
 
查看ceph存储空间
[root@client ~]# ceph df
 
删除一个节点的全部的ceph数据包
# ceph-deploy purge ceph-node1
# ceph-deploy purgedata ceph-node1
 
为ceph建立一个admin用户并为admin用户建立一个密钥,把密钥保存到/etc/ceph目录下:
# ceph auth get-or-create client.admin mds 'allow' osd 'allow ' mon 'allow ' > /etc/ceph/ceph.client.admin.keyring
或
# ceph auth get-or-create client.admin mds 'allow' osd 'allow ' mon 'allow ' -o /etc/ceph/ceph.client.admin.keyring
 
为osd.0建立一个用户并建立一个key
# ceph auth get-or-create osd.0 mon 'allow rwx' osd 'allow *' -o /var/lib/ceph/osd/ceph-0/keyring
 
为mds.node1建立一个用户并建立一个key(ceph-node1是节点名称)
# ceph auth get-or-create mds.node1 mon 'allow rwx' osd 'allow ' mds 'allow ' -o /var/lib/ceph/mds/ceph-ceph-node1/keyring
 
查看ceph集群中的认证用户及相关的key
ceph auth list
 
删除集群中的一个认证用户
ceph auth del osd.0
 
查看集群的详细配置(ceph-node1是节点名称)
# ceph daemon mon.ceph-node1 config show | more
 
查看集群健康状态细节
# ceph health detail
 
查看ceph log日志所在的目录
# ceph-conf –name mon.node1 –show-config-value log_file
 
=================关于mon节点的相关操做命令====================
查看mon的状态信息
# ceph mon stat
 
查看mon的选举状态
# ceph quorum_status
 
查看mon的映射信息
# ceph mon dump
 
删除一个mon节点
# ceph mon remove node1
 
得到一个正在运行的mon map,并保存在1.txt文件中
# ceph mon getmap -o 1.txt
 
查看上面得到的map
# monmaptool --print 1.txt
 
map注入新加入的节点(如新节点主机名为ceph-node4)
# ceph-mon -i ceph-node4 --inject-monmap 1.txt
 
查看mon的amin socket
# ceph-conf --name mon.ceph-node1 --show-config-value admin_socket
 
查看mon的详细状态(ceph-node1为mon节点主机名)
# ceph daemon mon.ceph-node1 mon_status
 
删除一个mon节点(ceph-node1为mon节点主机名)
# ceph mon remove ceph-node1
 
=================msd节点相关操做命令====================
查看msd状态
# ceph mds stat
 
查看msd的映射信息
# ceph mds dump
 
删除一个mds节点
# ceph mds rm 0 mds.ceph-node1
 
=================osd节点相关操做命令====================
查看ceph osd运行状态
# ceph osd stat
 
查看osd映射信息
# ceph osd dump
 
查看osd的目录树
# ceph osd tree
 
down掉一个osd硬盘(好比down掉osd.0节点磁盘)
# ceph osd down 0    
 
在集群中删除一个osd硬盘
# ceph osd rm 0
 
在集群中删除一个osd 硬盘 crush map
# ceph osd crush rm osd.0
 
在集群中删除一个osd的host节点
# ceph osd crush rm node1
 
查看最大osd的个数(默认最大是4个osd节点)
# ceph osd getmaxosd
 
设置最大的osd的个数(当扩大osd节点的时候必须扩大这个值)
# ceph osd setmaxosd 10
 
设置osd crush的权重为1.0
ceph osd crush set {id} {weight} [{loc1} [{loc2} …]]
例如:
[root@ceph-node1 ~]# ceph osd crush set 3 3.0 host=ceph-node4
set item id 3 name 'osd.3' weight 3 at location {host=node4} to crush map
[root@ceph-node1 ~]# ceph osd tree
# id weight type name up/down reweight
-1 6 root default
-2 1 host ceph-node1
0 1 osd.0 up 1
-3 1 host ceph-node2
1 1 osd.1 up 1
-4 1 host ceph-node3
2 1 osd.2 up 1
-5 3 host ceph-node4
3 3 osd.3 up 0.5
 
或者用下面的方式
[root@ceph-node1 ~]# ceph osd crush reweight osd.3 1.0
reweighted item id 3 name 'osd.3' to 1 in crush map
[root@ceph-node1 ~]# ceph osd tree
# id weight type name up/down reweight
-1 4 root default
-2 1 host node1
0 1 osd.0 up 1
-3 1 host node2
1 1 osd.1 up 1
-4 1 host node3
2 1 osd.2 up 1
-5 1 host node4
3 1 osd.3 up 0.5
 
 
设置osd的权重
 
[root@ceph-node1 ~]# ceph osd reweight 3 0.5
reweighted osd.3 to 0.5 (8327682)
[root@ceph-node1 ~]# ceph osd tree
# id weight type name up/down reweight
-1 4 root default
-2 1 host node1
0 1 osd.0 up 1
-3 1 host node2
1 1 osd.1 up 1
-4 1 host node3
2 1 osd.2 up 1
-5 1 host node4
3 1 osd.3 up 0.5
 
把一个osd节点逐出集群
 
[root@ceph-node1 ~]# ceph osd out osd.3
marked out osd.3.
[root@ceph-node1 ~]# ceph osd tree
# id weight type name up/down reweight
-1 4 root default
-2 1 host node1
0 1 osd.0 up 1
-3 1 host node2
1 1 osd.1 up 1
-4 1 host node3
2 1 osd.2 up 1
-5 1 host node4
3 1 osd.3 up 0
# osd.3的reweight变为0了就再也不分配数据,可是设备仍是存活的
 
把逐出的osd加入集群
 
[root@ceph-node1 ~]# ceph osd in osd.3
marked in osd.3.
[root@ceph-node1 ~]# ceph osd tree
# id weight type name up/down reweight
-1 4 root default
-2 1 host node1
0 1 osd.0 up 1
-3 1 host node2
1 1 osd.1 up 1
-4 1 host node3
2 1 osd.2 up 1
-5 1 host node4
3 1 osd.3 up 1
 
暂停osd (暂停后整个集群再也不接收数据)
[root@ceph-node1 ~]# ceph osd pause
# set pauserd,pausewr
 
再次开启osd (开启后再次接收数据)
[root@ceph-node1 ~]# ceph osd unpause
# unset pauserd,pausewr
 
查看一个集群osd.2参数的配置
# ceph –admin-daemon /var/run/ceph/ceph-osd.2.asok config show | less
 
======================PG组相关操做命令=======================
查看pg组的映射信息
# ceph pg dump
 
查看一个PG的map
 
[root@client ~]# ceph pg map 0.3f
osdmap e88 pg 0.3f (0.3f) -> up [0,2] acting [0,2]
#其中的[0,2]表明存储在osd.0、osd.2节点,osd.0表明主副本的存储位置
 
查看PG状态
[root@client ~]# ceph pg stat
v1164: 448 pgs: 448 active+clean; 10003 MB data, 23617 MB used, 37792 MB / 61410 MB avail
 
查询一个pg的详细信息
[root@client ~]# ceph pg 0.26 query
 
查看pg中stuck的状态
[root@client ~]# ceph pg dump_stuck unclean
ok
[root@client ~]# ceph pg dump_stuck inactive
ok
[root@client ~]# ceph pg dump_stuck stale
ok
 
显示一个集群中的全部的pg统计
# ceph pg dump –format plain
 
恢复一个丢失的pg
# ceph pg {pg-id} mark_unfound_lost revert
 
显示非正常状态的pg
# ceph pg dump_stuck inactive|unclean|stale
 
======================pool相关操做命令========================
查看ceph集群中的pool数量
[root@ceph-node1 ~]# ceph osd lspools
0 data,1 metadata,2 rbd,
 
在ceph集群中建立一个pool
# ceph osd pool create kevin 100
这里的100指的是PG组,kevin是集群名称
 
为一个ceph pool配置配额
# ceph osd pool set-quota data max_objects 10000
 
在集群中删除一个pool(集群名字须要重复两次)
# ceph osd pool delete kevin kevin --yes-i-really-really-mean-it
 
 
显示集群中pool的详细信息
[root@ceph-node1 ~]# rados df
pool name category KB objects clones degraded unfound rd rd KB wr wr KB
data - 475764704 116155 0 0 0 0 0 116379 475764704
metadata - 5606 21 0 0 0 0 0 314 5833
rbd - 0 0 0 0 0 0 0 0 0
total used 955852448 116176
total avail 639497596
total space 1595350044
[root@ceph-node1 ~]#
 
给一个pool建立一个快照
[root@ceph-node1 ~]# ceph osd pool mksnap data date-snap
created pool data snap date-snap
 
删除pool的快照
[root@ceph-node1 ~]# ceph osd pool rmsnap data date-snap
removed pool data snap date-snap
 
查看data池的pg数量
[root@ceph-node1 ~]# ceph osd pool get data pg_num
pg_num: 64
 
设置data池的最大存储空间为100T(默认是1T)
[root@ceph-node1 ~]# ceph osd pool set data target_max_bytes 100000000000000
set pool 0 target_max_bytes to 100000000000000
 
设置data池的副本数是3
[root@ceph-node1 ~]# ceph osd pool set data size 3
set pool 0 size to 3
 
设置data池能接受写操做的最小副本为2
[root@ceph-node1 ~]# ceph osd pool set data min_size 2
set pool 0 min_size to 2
 
查看集群中全部pool的副本尺寸
[root@admin mycephfs]# ceph osd dump | grep 'replicated size'
pool 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 100000000000000 stripe_width 0
pool 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 0
pool 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 0
 
设置一个pool的pg数量
[root@ceph-node1 ~]# ceph osd pool set data pg_num 100
set pool 0 pg_num to 100
 
设置一个pool的pgp数量
[root@ceph-node1 ~]# ceph osd pool set data pgp_num 100
set pool 0 pgp_num to 100
 
=================================rados指令====================================
查看ceph集群中有多少个pool (只是查看pool)
[root@ceph-node1 ~]# rados lspools
rbd
cephfs_data
cephfs_metadata
 
查看ceph集群中有多少个pool,而且每一个pool容量及利用状况
[root@ceph-node1 ~]# rados df
pool name                 KB      objects       clones     degraded      unfound           rd        rd KB           wr        wr KB
cephfs_data                0            0            0            0           0            0            0            0            0
cephfs_metadata           21           20            0            0           0            0            0           45           36
rbd                        0            0            0            0           0            0            0            0            0
  total used        15833064           20
  total avail       47044632
  total space       62877696
 
建立一个pool,名称为kevin
[root@ceph-node1 ~]# rados mkpool kevin
successfully created pool kevin
 
查看ceph pool中的ceph object (这里的object是以块形式存储的)
[root@ceph-node1 ~]# rados ls -p kevin|more
 
建立一个对象object(下面的kevin是pool名称)
[root@ceph-node1 ~]# rados create kevin-object -p kevin
[root@ceph-node1 ~]# rados -p kevin ls
kevin-object
 
删除一个对象
[root@ceph-node1 ~]# rados rm kevin-object -p kevin
[root@ceph-node1 ~]# rados -p kevin ls
 
=================================rbd命令的用法=====================================
查看ceph中一个pool里的全部镜像
# rbd ls kevin     //kevin是一个pool名
或者
# rbd list kevin
 
查看ceph pool中一个镜像的信息(kevin是pool名,wangshibo是镜像名)
[root@ceph ~]# rbd info -p kevin --image wangshibo
 
在kevin池中建立一个命名为wangshibo的10000M的镜像
[root@ceph-node1 ~]# rbd create -p kevin --size 10000 wangshibo
[root@ceph-node1 ~]# rbd -p kevin info wangshibo                 //查看新建的镜像的信息
rbd image 'wangshibo':
   size 10000 MB in 2500 objects
   order 22 (4096 kB objects)
   block_name_prefix: rb.0.1079.2ae8944a
   format: 1
 
删除一个镜像
[root@ceph-node1 ~]# rbd rm -p kevin wangshibo
Removing image: 100% complete...done.
 
调整一个镜像的尺寸(前提是wangshibo镜像已经建立并无被删除)
[root@ceph-node1 ~]# rbd resize -p kevin --size 20000 wangshibo
Resizing image: 100% complete...done.
 
查看调整后的wangshibo镜像大小
[root@ceph-node1 ~]# rbd -p kevin info wangshibo
rbd image 'wangshibo':
   size 20000 MB in 5000 objects
   order 22 (4096 kB objects)
   block_name_prefix: rb.0.107d.2ae8944a
   format: 1
 
给一个镜像建立一个快照(以下,池/镜像@快照 )
[root@ceph-node1 ~]# rbd snap create kevin/wangshibo@wangshibo123
 
查看快照
[root@ceph-node1 ~]# rbd info kevin/wangshibo@wangshibo123
rbd image 'wangshibo':
   size 20000 MB in 5000 objects
   order 22 (4096 kB objects)
   block_name_prefix: rb.0.107d.2ae8944a
   format: 1
   protected: False
 
查看一个镜像文件的快照
[root@ceph-node1 ~]# rbd snap ls -p kevin wangshibo
SNAPID NAME             SIZE
     4 wangshibo123 20000 MB
 
删除一个镜像文件的一个快照
[root@ceph-node1 ~]# rbd snap rm kevin/wangshibo@wangshibo123
[root@ceph-node1 ~]# rbd snap ls -p kevin wangshibo        //wangshibo123快照已经被删除
 
若是发现不能删除显示的报错信息是此快照备写保护了,下面命令是删除写保护后再进行删除。
# rbd snap unprotect kevin/wangshibo@wangshibo123
# rbd snap rm kevin/wangshibo@wangshibo123
 
删除一个镜像文件的全部快照
[root@ceph-node1 ~]# rbd snap purge -p kevin wangshibo
Removing all snapshots: 100% complete...done.
 
把ceph pool中的一个镜像导出
[root@ceph-node1 ~]# rbd export -p kevin --image wangshibo
Exporting image: 100% complete...done.
 
把一个镜像导入ceph中 (可是直接导入是不能用的,由于没有通过openstack,openstack是看不到的)
[root@ceph-node1 ~]# rbd import /root/ceph_test.img -p kevin --image wangshibo