ceph存储

ceph

分布式存储

普通存储方案

  • DAS

    • IDE/SATA/SAS/SCSI等块
  • NAS

    • NFS、CIFS、SAMBA等文件系统
  • SAN

    • FibreChannel, iSCSI, FoE存储网络块),Openfiler、FreeNas(ZFS快照复制),贵

集中式存储

  • 指由一台或多台主计算机组成中心节点,数据集中存储于这个中心节点中,并且整个系统的所有业务单元都集中部署在这个中心节点上,系统所有的功能均由其集中处理
  • 最大的特点是部署结构简单,由于集中式系统往往基于底层性能卓越的大型主机,因此无需考虑如何对服务进行多个节点的部署,也就不用考虑多个节点之间的分布式协作问题

分布式存储

  • 概述

    • 是一种数据存储技术,通过网络使用企业中的每台机器上的磁盘空间,并将这些分散的存储资源构成一个虚拟的存储设备,数据分散的存储在企业的各个角落
    • 组件分布在网络计算机上,组件之间仅仅通过消息传递来通信并协调行动
  • 特征

    • 分布性

      • 分布式系统中的多台计算机都会在空间上随意分布,分布情况也会随时变动
    • 对等性

      • 分布式系统中的计算机没有主从之分,组成分布式系统的所有节点都是对等的
      • 数据副本:在不同的节点上持久化同一份数据,解决分布式系统数据丢失问题
      • 服务副本:多个节点提供同样的服务,每个节点都有能力接收来自外部的请求并进行相应的处理
    • 并发性

      • 程序运行过程中的并发性操作,例如多个节点同时操作一些共享的资源,如数据库或分布式存储等
    • 缺乏全局时钟

      • 在分布式系统中很难定义两个事件究竟谁先谁后,因为分布式系统缺乏全局的时钟控制序列
    • 故障总是会发生

      • 组成分布式系统的所有计算机,都有可能发生任何形式的故障
    • 处理单点故障

      • 把这个功能从单机实现变为集群实现,但这种变化一般会比较困难
      • 给这个单点做好备份,能够在出现问题时进行恢复,并且尽量做到自动恢复
      • 降低单点故障的影响范围
  • 出现的意义

    • 升级单机处理能力的性价比越来越低
    • 单机处理能力存在瓶颈
    • 出于稳定性和可用性的考虑
  • 解决的问题

    • 海量数据存储问题
    • 数据高可用问题(冗余备份)问题
    • 较高的读写性能和负载均衡问题
    • 支持多平台多语言问题
    • 高并发问题

主流分布式存储对比

主流分布式存储介绍

开源协议说明

  • GPL

    • 不允许修改后和衍生的代码做为闭源的商业软件发布和销售,修改后该软件产品必须也采用GPL
  • GPLV2

    • 修改文本的整体就必须按照GPL流通,不仅该修改文本的源码必须向社会公开,而且对于这种修改文本的流通不准许附加修改者自己作出的限制
  • GPLV3

    • 要求用户公布修改的源代码,还要求公布相关硬件
  • LGPL

    • 更宽松的GPL

TFS

  • 介绍

    • Taobao File System是由淘宝开发的一个分布式文件系统,其内部经过特殊的优化处理,适用于海量的小文件存储
    • 采用自有的文件系统格式存储,因此需要专用的API接口去访问,目前官方提供的客户端版本有:C++/JAVA/PHP
    • 源代码路径:http://code.taobao.org/p/tfs/src/
  • 特性

    • 在TFS文件系统中,NameServer负责管理文件元数据,通过HA机制实现主备热切换,由于所有元数据都是在内存中,其处理效率非常高效,系统架构也非常简单,管理也很方便
    • TFS的DataServer作为分部署数据存储节点,同时也具备负载均衡和冗余备份的功能,由于采用自有的文件系统,对小文件会采取合并策略,减少数据碎片,从而提升IO性能
    • TFS将元数据信息(BlockID、FileID)直接映射至文件名中,这一设计大大降低了存储元数据的内存空间
  • 优点

    • 针对小文件量身定做,随机IO性能比较高
    • 支持在线扩容机制,增强系统的可扩展性
    • 实现了软RAID,增强系统的并发处理能力及数据容错恢复能力
    • 支持主备热切换,提升系统的可用性
    • 支持主从集群部署,其中从集群主要提供读/备功能
  • 缺点

    • TFS只对小文件做优化,不适合大文件的存储
    • 不支持POSIX通用接口访问,通用性较低
    • 不支持自定义目录结构,及文件权限控制
    • 通过API下载,存在单点的性能瓶颈
    • 官方文档非常少,学习成本高
  • 应用场景

    • 多集群部署的应用
    • 存储后基本不做改动
    • 海量小型文件
    • 根据目前官方提供的材料,对单个集群节点,存储节点在1000台以内可以良好工作,如存储节点扩大可能会出现NameServer的性能瓶颈,目前淘宝线上部署容量已达到1800TB规模(2009年数据)

FastDFS

  • 介绍

    • 是国人开发的一款分布式文件系统,目前社区比较活跃。系统中存在三种节点:Client、Tracker、Storage,在底层存储上通过逻辑的分组概念,使得通过在同组内配置多个Storage,从而实现软RAID10,提升并发IO的性能、简单负载均衡及数据的冗余备份;同时通过线性的添加新的逻辑存储组,从容实现存储容量的线性扩容
    • 文件下载上,除了支持通过API方式,目前还提供了apache和nginx的插件支持,同时也可以不使用对应的插件,直接以Web静态资源方式对外提供下载
    • 目前FastDFS(V4.x)代码量大概6w多行,内部的网络模型使用比较成熟的libevent三方库,具备高并发的处理能力
    • 源码路径:https://github.com/happyfish100/fastdfs
  • 特性

    • Tracker服务器是整个系统的核心枢纽,其完成了访问调度(负载均衡),监控管理Storage服务器,FastDFS支持多个备用的Tracker
    • 在文件同步上,只有同组的Storage才做同步,由文件所在的源Storage服务器push至其它Storage服务器,目前同步是采用Binlog方式实现,由于目前底层对同步后的文件不做正确性校验,因此这种同步方式仅适用单个集群点的局部内部网络,如果在公网上使用肯定会出现损坏文件的情况,需要自行添加文件校验机制
    • 支持主从文件,非常适合存在关联关系的图片,在存储方式上,FastDFS在主从文件ID上做取巧,完成了关联关系的存储
  • 优点

    • 系统无需支持POSIX(可移植操作系统),降低了系统的复杂度,处理效率更高
    • 支持在线扩容机制,增强系统的可扩展性
    • 实现了软RAID,增强系统的并发处理能力及数据容错恢复能力
    • 支持主从文件,支持自定义扩展名
    • 主备Tracker服务,增强系统的可用性
  • 缺点

    • 不支持断点续传,对大文件将是噩梦(FastDFS不适合大文件存储)
    • 不支持POSIX通用接口访问,通用性较低
    • 对跨公网的文件同步,存在较大延迟,需要应用做相应的容错策略
    • 同步机制不支持文件正确性校验,降低了系统的可用性
    • 通过API下载,存在单点的性能瓶颈
  • 应用场景

    • 单集群部署的应用
    • 存储后基本不做改动
    • 小中型文件根据
    • 目前官方提供的材料,现有的使用FastDFS系统存储容量已经达到900T,物理机器已经达到100台(50个组)

MooseFS

  • 介绍

    • 是一个高可用的故障容错分布式文件系统,它支持通过FUSE方式将文件挂载操作,同时其提供的web管理界面非常方便查看当前的文件存储状态
  • 特性

    • 文件系统由四部分组成:Managing Server 、Data Server 、Metadata Backup Server 及Client
    • 其中所有的元数据都是由Managing Server管理,为了提高整个系统的可用性,MetadataBackup Server记录文件元数据操作日志,用于数据的及时恢复
    • Data Server可以分布式部署,存储的数据是以块的方式分布至各存储节点的,因此提升了系统的整体性能,同时Data Server提供了冗余备份的能力,提升系统的可靠性
    • Client通过FUSE方式挂载,提供了类似POSIX的访问方式,从而降低了Client端的开发难度,增强系统的通用性
  • 组成

    • 元数据服务器(master)

      • 负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复
    • 元数据日志服务器(metalogger)

      • 负责备份master服务器的变化日志文件,以便于在master server出问题的时候接替其进行工作
    • 数据存储服务器(chunkserver)

      • 数据实际存储的地方,由多个物理服务器组成,负责连接管理服务器,听从管理服务器调度,提供存储空间,并为客户提供数据传输;多节点拷贝;在数据存储目录,看不见实际的数据
  • 优点

    • 部署安装非常简单,管理方便
    • 支持在线扩容机制,增强系统的可扩展性
    • 实现了软RAID,增强系统的 并发处理能力及数据容错恢复能力
    • 数据恢复比较容易,增强系统的可用性
    • 有回收站功能,方便业务定制
  • 缺点

    • 存在单点性能瓶颈及单点故障
    • MFS Master节点很消耗内存
    • 对于小于64KB的文件,存储利用率较低
  • 应用场景

    • 单集群部署的应用
    • 中、大型文件

GlusterFS

  • 介绍

    • 是Red Hat旗下的一款开源分布式文件系统,它具备高扩展、高可用及高性能等特性,由于其无元数据服务器的设计,使其真正实现了线性的扩展能力,使存储总容量可轻松达到PB级别,支持数千客户端并发访问;对跨集群,其强大的Geo-Replication可以实现集群间数据镜像,而且是支持链式复制,这非常适用于垮集群的应用场景
  • 特性

    • 目前GlusterFS支持FUSE方式挂载,可以通过标准的NFS/SMB/CIFS协议像访问本体文件一样访问文件系统,同时其也支持HTTP/FTP/GlusterFS访问,同时最新版本支持接入Amazon的AWS系统
    • GlusterFS系统通过基于SSH的命令行管理界面,可以远程添加、删除存储节点,也可以监控当前存储节点的使用状态
    • GlusterFS支持集群节点中存储虚拟卷的扩容动态扩容;同时在分布式冗余模式下,具备自愈管理功能,在Geo冗余模式下,文件支持断点续传、异步传输及增量传送等特点
  • 优点

    • 系统支持POSIX(可移植操作系统),支持FUSE挂载通过多种协议访问,通用性比较高
    • 支持在线扩容机制,增强系统的可扩展性
    • 实现了软RAID,增强系统的 并发处理能力及数据容错恢复能力
    • 强大的命令行管理,降低学习、部署成本
    • 支持整个集群镜像拷贝,方便根据业务压力,增加集群节点
    • 官方资料文档专业化,该文件系统由Red Hat企业级做维护,版本质量有保障
  • 缺点

    • 通用性越强,其跨越的层次就越多,影响其IO处理效率
    • 频繁读写下,会产生垃圾文件,占用磁盘空间
  • 应用场景

    • 多集群部署的应用
    • 中大型文件根据目前官方提供的材料,现有的使用GlusterFS系统存储容量可轻松达到PB

Ceph

Ceph分布式存储

网址

  • ceph官方文档

    • http://docs.ceph.org.cn/
  • ceph中文开源社区

    • http://ceph.org.cn/

概述

  • Ceph是可靠的、可扩展的、统一的、开源分布式的存储系统
  • Ceph存储集群至少需要一个Monitor和两个OSD。运行Ceph文件系统客户端时,则必须要有元数据服务器(MDS)

存储方式

  • 块存储RBD(Rados Block Device)

    • 速度快,对存储的数据没有进行组织管理,用户数据读写不方便(以块设备位置offset + 数据的length来记录数据位置、读写数据)
  • 文件系统存储Ceph FS
    (Ceph Filesystem)

    • 文件系统帮助块设备组织管理数据,数据存储对用户更加友好(以文件名来读写数据)
    • 解决了“Ceph块设备+本地文件系统”不支持多客户端共享读写的问题,但由于文件系统结构的复杂性导致了存储性能较Ceph块设备差
  • 对象存储RADOSGW(Reliable、Autonomic、Distributed、Object Storage Gateway)

    • 是一种折中,保证一定的存储性能,同时支持多客户端共享读写

优点

  • 统一存储

    • 虽然ceph底层是一个分布式文件系统,但由于在上层开发了支持对象和块的接口。所以在开源存储软件中,能够一统江湖
  • 高扩展性

    • 扩容方便、容量大。能够管理上千台服务器、EB级的容量
  • 可靠性强

    • 支持多份强一致性副本。副本能够垮主机、机架、机房、数据中心存放, 安全可靠
    • 存储节点可以自管理、自动修复。无单点故障,容错性强
  • 性能高

    • 因为是多个副本,因此在读写操作时候能够做到高度并行化。理论上节点越多,整个集群的IOPS和吞吐量越高
    • ceph客户端读写数据直接与存储设备(osd) 交互

应用场景

  • 对象存储可以对接网盘(owncloud)应用业务等
  • 块设备存储可以对接(IaaS),当前主流的IaaS运平台软件,如:OpenStack、CloudStack、Zstack、Eucalyptus等以及kvm等

核心组件

  • Ceph OSD(Object Storage Device)、Ceph Monitor和Ceph MDS(Ceph MetaData Server)

Ceph OSD

  • 负责物理存储的进程,与其它OSD间进行心跳检查等,并将一些变化情况上报给Ceph Monitor
  • 一般情况下一块硬盘对应一个OSD,由OSD来对硬盘存储进行管理,当然一个分区也可以成为一个OSD
  • Ceph OSD的架构实现由物理磁盘驱动器、Linux文件系统和Ceph OSD服务组成,文件系统推荐使用XFS
  • 当Ceph 存储集群设定为有2个副本(默认3个)时,至少需要2个OSD守护进程,集群才能达到active+clean状态

Ceph Monitor

  • Monitor集群提供了整个存储系统的节点信息等全局的配置信息,通过Paxos算法保持数据的一致性
  • Cluster Map是RADOS的关键数据结构,管理集群中的所有成员、关系、属性等信息以及数据的分发,比如当用户需要存储数据到Ceph集群时,OSD需要先通过Monitor获取最新的Map图,然后根据Map图和object id等计算出数据最终存储的位置

Ceph MDS

  • 主要保存文件系统服务的元数据,但对象存储和块存储设备是不需要使用该服务的
  • 元数据服务器使得POSIX文件系统的用户们,可以在不对Ceph存储集群造成负担的前提下,执行诸如ls、find 等基本命令

Pool

  • 存储池, 存储对象的逻辑分区,它规定了数据冗余的类型和对应的副本分布策略
  • 支持两种类型:副本(replicated)和 纠删码( Erasure Code)
  • http://docs.ceph.org.cn/rados/operations/pools/

PG

  • placement group归置组, 是一个放置策略组,它是对象的集合,该集合里的所有对象都具有相同的放置策略

  • 相同PG内的对象都会放到相同的硬盘上。PG是 ceph的核心概念, 服务端数据均衡和恢复的最小粒度就是PG

  • 无论使用对象、块或挂载存储,数据都会被切分成Objects。Objects size大小可以由管理员调整,通常为2M或4M

  • OID

    • 每个对象都有唯一的OID,由ino(File ID,用于在全局唯一标识每一个文件)与ono(分片的编号)生成
    • 比如一个文件FileID为A,它被切成了两个对象,一个对象编号0,另一个编号1,这两个对象的oid则为A0与A1
    • Oid的好处是可以唯一标示每个不同的对象,并且存储了对象与文件的从属关系
    • 由于ceph的所有数据都虚拟成了整齐划一的对象,所以在读写时效率都会比较高
  • 每个对象都会固定映射进一个PG中,当要找一个对象时,先找到对象所属的PG,再遍历这个PG即可

  • 在数据迁移时,也是以PG作为基本单位进行迁移,ceph不会直接操作对象

  • 映射

    • 用静态hash函数对OID做hash取出特征码,用特征码与PG的数量取模,得到的序号则是PGID
    • PG的数量多寡决定了数据分布的均匀性,合理设置PG数量可以提升CEPH集群的性能并使数据均匀分布
    • PG会根据管理员设置的副本数量进行复制,然后通过crush算法存储到不同的OSD节点上(其实是把PG中的所有对象存储到节点上),第一个osd节点即为主节点,其余均为从节点

Rool、PG、OSD关系

  • 关系图

  • 一个Pool里有很多PG

  • 一个PG里包含一堆对象;一个对象只能属于一个PG

  • PG有主从之分,一个PG分布在不同的OSD上

端口

  • monitor

    • 6789
  • osd&mds

    • 6800-7300

Ceph存储方式

块存储

  • 什么是块设备

    • 块设备是i/o设备中的一类,是将信息存储在固定大小的块中,每个块都有自己的地址,还可以在设备的任意位置读取一定长度的数据,如硬盘、虚拟硬盘
  • Linux中的块设备

    • /dev/下都是块设备文件。sd开头对应SATA接口的硬盘,hd开头对应IDE接口的硬盘
    • 当给计算机连接块设备后,系统检测到有新的块设备,该类型块设备的驱动程序就在/dev/下创建一个对应的块设备设备文件,用户可以通过设备文件使用该块设备
    • 当系统检测到多个同类型硬盘时,会根据检测到的顺序进行字母顺序的命名(导致盘符漂移问题)
  • rbd

    • 由Ceph集群提供出来的块设备
    • sd和hd都是通过数据线连接到了真实的硬盘,而rbd是通过网络连接到了Ceph集群中的一块存储区域,往rbd设备文件写入数据,最终会被存储到Ceph集群的这块区域中
  • 文件系统

    • 针对不同使用场景,衍生出了各种文件系统,常用的xfs、ext4是读写性能等各方面较均衡的通用文件系统
    • 应用为了强化某种存储特性,一般会定制自己的的数据组织和管理方式,而不使用通用的文件系统
  • Ceph块设备接口使用

    • 在Ceph集群中创建块设备

      • rbd create -s 1G myrbd
      • /etc/ceph/下要有Ceph集群的配置文件ceph.conf和ceph.client.admin.keyring
    • 在用户机上挂载该Ceph块设备

      • rbdmap myrbd

        • 输出: /dev/rbd0
    • 将Ceph块设备格式化成文件系统并挂载

      • mkfs.xfs /dev/rbd0
      • mkdir -p /mnt/ceph_rbd
      • mount /dev/rbd0 /mnt/ceph_rbd
    • 通过/mnt/ceph_rbd读写数据,都是在读写Ceph集群中该块设备对应的存储区域

文件系统存储

  • 介绍

    • Ceph集群实现了自己的文件系统来组织管理集群的存储空间,用户可以直接将Ceph集群的文件系统挂载到用户机上使用
  • 比较

    • Ceph的块设备具有优异的读写性能,但不能多处挂载同时读写,目前主要用在OpenStack上作为虚拟磁盘
    • Ceph的文件系统接口读写性能较块设备接口差,但具有优异的共享性
  • 共享性

    • 块设备接口

      • 文件系统的结构状态是维护在各用户机内存中
      • 假设Ceph块设备同时挂载到了用户机1和用户机2,当在用户机1上写入数据后,更新了用户机1的内存中文件系统状态,最终数据存储到了Ceph集群中
      • 但此时用户机2内存中的文件系统并不能得知底层Ceph集群数据已经变化而维持数据结构不变,因此用户无法从用户机2上读取用户机1上新写入的数据
    • 文件系统接口

      • 文件系统的结构状态是维护在远端Ceph集群中
      • Ceph文件系统同时挂载到了用户机1和用户机2,当往用户机1的挂载点写入数据后,远端Ceph集群中的文件系统状态结构随之更新
      • 当从用户机2的挂载点访问数据时会去远端Ceph集群取数据,由于远端Ceph集群已更新,所有用户机2能够获取最新的数据
  • Ceph的文件系统接口使用

    • 将Ceph的文件系统挂载到用户机目录

      • mkdir -p /mnt/ceph_fuse
      • ceph-fuse /mnt/ceph_fuse
    • 在/mnt/ceph_fuse下读写数据,都是读写远程Ceph集群

  • 总结

    • Ceph的文件系统接口弥补了Ceph的块设备接口在共享性方面的不足,Ceph的文件系统接口符合POSIX标准,用户可以像使用本地存储目录一样使用Ceph的文件系统的挂载目录

对象存储

  • 对象存储接口

    • 通过http协议上传下载删除对象(文件即对象)
    • 具有共享性且存储性能好于文件系统存储
  • 比较

    • 对象存储组织数据的方式相对简单,只有bucket和对象两个层次(对象存储在bucket中),对对象的操作也相对简单
    • 文件系统存储具有复杂的数据组织方式,目录和文件层次可具有无限深度,对目录和文件的操作也复杂的多,因此文件系统存储在维护文件系统的结构数据时会更加繁杂,从而导致文件系统的存储性能偏低
  • 存储空间(Bucket)

    • 存储空间是用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间
    • 可以设置和修改存储空间属性用来控制地域、访问权限、生命周期等,这些属性设置直接作用于该存储空间内所有对象
    • 可以通过灵活创建不同的存储空间来完成不同的管理功能
    • 同一个存储空间的内部是扁平的,没有文件系统的目录等概念,所有的对象都直接隶属于其对应的存储空间
    • 每个用户可以拥有多个存储空间
    • 存储空间的名称在OSS范围内必须是全局唯一的,一旦创建之后无法修改名称
    • 存储空间内部的对象数目没有限制
  • 存储空间命名规范

    • 只能包括小写字母、数字和短横线(-)
    • 必须以小写字母或者数字开头和结尾
    • 长度必须在3-63字节之间
  • Ceph的对象存储接口使用

    • Ceph的对象接口符合亚马逊S3接口标准和OpenStack的Swift接口标准,自学
  • 总结

    • 文件系统存储具有复杂的数据组织结构,能够提供给用户更加丰富的数据操作接口,而对象存储精简了数据组织结构,提供给用户有限的数据操作接口,以换取更好的存储性能。对象接口提供了REST API,非常适用于作为web应用的存储

Ceph集群部署

环境准备

  • 系统

    • CentOS7
  • 配置

    • 1核1G内存,每台node角色的机器至少挂载1块为osd准备的空闲盘(10G)
  • 服务器

    • 1.1.1.21 mon1
    • 1.1.1.22 osd1
    • 1.1.1.23 osd2
    • 1.1.1.24 osd3
  • 时间同步

    • [root@mon1 ~]# yum -y install chrony ntpdate
    • [root@osd ~]# yum -y install ntpdate
    • [root@mon1 ~]# vim /etc/chrony.conf
      allow 1.1.1.0/24
      local stratum 10
    • [root@all ~]# systemctl start chronyd ntpdate;systemctl enable chronyd ntpdate
    • [root@mon1 ~]# crontab -e
      0 * * * * /usr/sbin/ntpdate ntp1.aliyun.com
      @reboot /usr/sbin/ntpdate ntp1.aliyun.com
    • [root@osd ~]# crontab -e
      0 * * * * /usr/sbin/ntpdate mon1
      @reboot /usr/sbin/ntpdate mon1
    • [root@all ~]# ntpdate ntp1.aliyun.com
  • 互相解析

    • [root@all ~]# vim /etc/hosts
      1.1.1.21 mon1
      1.1.1.22 osd1
      1.1.1.23 osd2
      1.1.1.24 osd3

1.准备osd

  • [root@osd* ~]# mkfs.xfs /dev/sdb
    [root@osd* ~]# mkdir /mnt/osd
    [root@osd* ~]# mount /dev/sdb /mnt/osd
    [root@osd* ~]# echo “mount /dev/sdb /mnt/osd” >>/etc/rc.local
    [root@osd* ~]# chmod +x /etc/rc.local

2.配置对其他节点免密登录

  • [root@mon1 ~]# ssh-keygen
    [root@mon1 ~]# ssh-copy-id 1.1.1.22
    [root@mon1 ~]# ssh-copy-id 1.1.1.23
    [root@mon1 ~]# ssh-copy-id 1.1.1.24

3.安装ceph部署工具ceph-deploy

  • 配置yum源

    • [root@all ~]# vim /etc/yum.repos.d/ceph.repo
      [Ceph]
      name=Ceph packages for $basearch
      baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/
      enabled=1
      gpgcheck=0
      type=rpm-md
      priority=1

[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/
enabled=1
gpgcheck=0
type=rpm-md
priority=1

[Ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS/
enabled=1
gpgcheck=0
type=rpm-md
priority=1

[Ceph-aarch64]
name=Ceph aarch64 packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/aarch64/
enabled=1
gpgcheck=0
type=rpm-md

  • 安装ceph-deploy

    • [root@mon1 ~]# yum install -y ceph-deploy

4.创建monitor服务

  • [root@mon1 ~]# mkdir /etc/ceph
    [root@mon1 ~]# cd /etc/ceph
    [root@mon1 ceph]# ceph-deploy new mon1 #mon1为主机名
    [root@mon1 ceph]# ls # 生成Ceph配置文件、一个monitor密钥环和一个日志文件
    ceph.conf ceph-deploy-ceph.log ceph.mon.keyring

5.修改配置文件

  • [root@mon1 ceph]# vim ceph.conf
    osd_pool_default_size = 2 #默认副本数从3改成2,2个osd也能达到active+clean状态

6.安装ceph

  • [root@all ~]# yum -y install ceph
    [root@all ~]# ceph -v
    ceph version 10.2.11 (e4b061b47f07f583c92a050d9e84b1813a35671e)

7.配置初始monitor(s)、并收集所有密钥

  • [root@mon1 ceph]# ceph-deploy mon create-initial

8.激活第1步中的OSD

  • 准备OSD

    • [root@mon1 ceph]# ceph-deploy osd prepare osd1:/mnt/osd osd2:/mnt/osd osd3:/mnt/osd
  • 修改OSD属主属组

    • [root@osd* ~]# chown -R ceph.ceph /mnt/osd
  • 激活OSD

    • [root@mon1 ceph]# ceph-deploy osd activate osd1:/mnt/osd osd2:/mnt/osd osd3:/mnt/osd
  • 查看状态

    • [root@mon1 ceph]# ceph-deploy osd list osd{1…3}
      所有的OSD状态都OK

9.统一配置

  • 用ceph-deploy把配置文件和admin密钥拷贝到管理节点和Ceph节点,这样每次执行ceph命令行时就无需指定monitor地址和 ceph.client.admin.keyring了
  • [root@mon1 ceph]# ceph-deploy admin osd{1…3}
  • [root@mon1 ceph]# chmod +r ceph.client.admin.keyring

10. 检查集群的健康状况

  • [root@mon1 ceph]# ceph health
    HEALTH_OK

使用Ceph集群存储

客户端配置

1.1.1.25 client

  • 安装ceph

    • [root@mon1 ~]# scp /etc/yum.repos.d/ceph.repo 1.1.1.25:/etc/yum.repos.d/
    • [root@client ~]# yum -y install ceph
  • 拷贝配置文件和密钥环

    • [root@mon1 ceph]# ceph-deploy admin 1.1.1.25
  • 修改密钥文件的权限

    • [root@client ~]# cd /etc/ceph
      [root@client ceph]# chmod +r ceph.client.admin.keyring

块设备

  • 创建存储池

    • 语法

      • ceph osd pool create {pool-name} {pg-num}

      • pool-name

        • 存储池名称,必须唯一
      • pg-num

        • 存储池拥有的归置组总数

        • OSD<5

          • pg_num=128
        • 5<=OSD<10

          • pg_num=512
        • 10<=OSD<50

          • pg_num=4096
        • OSD>=50

          • pgcalc工具计算
    • [root@client ceph]# ceph osd pool create mypool 128

  • 创建块设备映像(任意节点均可)
    {pool-name}/{image-name}

    • [root@client ceph]# rbd create --size 1024 mypool/myimage --image-feature layering
      [root@client ceph]# rbd ls mypool
      [root@client ceph]# rbd info mypool/myimage
    • 指定 features: layering,否则map可能出错
    • 也可以将 rbd_default_features = 1 添加到 /etc/ceph/ceph.conf 的 [global]
    • 如果创建映像时不指定存储池,它将使用默认的 rbd 存储池
  • 映射块设备(必须在client)
    {pool-name}/{image-name}

    • [root@client ceph]# rbd map mypool/myimage --id admin
      /dev/rbd0 # 注:rbd0 说明这是映射的第一个块设备
      [root@client ceph]# rbd showmapped
      [root@client ceph]# ll /dev/rbd/mypool/
  • 使用块设备

    • [root@client ceph]# mkfs.xfs /dev/rbd0
      [root@client ceph]# mkfs.xfs /dev/rbd/mypool/myimage

      • 两者皆可
  • 挂载

    • [root@client ceph]# mkdir /mnt/ceph-block
      [root@client ceph]# mount /dev/rbd0 /mnt/ceph-block/
  • 在线扩容

    • 块设备

      • [root@client ceph]# rbd resize --size 2048 mypool/myimage # 调整块设备大小为2G
        Resizing image: 100% complete…done.​
    • 文件系统

      • [root@client ceph]# xfs_growfs /mnt/ceph-block/
  • 删除块设备

    • [root@client ~]# umount /mnt/ceph-block/
      [root@client ~]# rbd unmap /dev/rbd/mypool/myimage # 解除设备映射
      [root@client ~]# rbd showmapped # 再次查看,发现/dev/rbd0已经没有了
      [root@client ~]# rbd rm mypool/myimage # 删除块设备
      Removing image: 100% complete…done.

文件系统

  • 部署MDS服务

    • [root@mon1 ceph]# ceph-deploy mds create osd{1…3}

    • 查看状态

      • [root@mon1 ceph]# ceph mds stat
        e4:, 3 up:standby
    • 查看集群状态

      • [root@mon1 ceph]# ceph -s
  • 创建ceph文件系统

    • 介绍

      • 官方文档: http://docs.ceph.org.cn/cephfs/

      • 一个 Ceph 文件系统需要至少两个 RADOS 存储池,一个用于数据、一个用于元数据

      • 存储池配置考虑

        • 为元数据存储池设置较高的副本水平,因为此存储池丢失任何数据都会导致整个文件系统失效
        • 为元数据存储池分配低延时存储器(像 SSD ),因为它会直接影响到客户端的操作延时
    • 创建存储池

      • [root@mon1 ceph]# ceph osd pool create cephfs_data 128
        [root@mon1 ceph]# ceph osd pool create cephfs_metadata 128
    • 查看存储池

      • [root@mon1 ceph]# ceph osd lspools
        0 rbd,1 cephfs_data,2 cephfs_metadata, #系统默认有一个rbd存储池
    • 创建文件系统

      • 语法: ceph fs new
      • [root@admin ceph]# ceph fs new cephfs cephfs_metadata cephfs_data
        [root@admin ceph]# ceph fs ls
  • 挂载文件系统

    • 两种挂载方式

      • A. 内核驱动挂载Ceph文件系统
      • B. 用户空间文件系统(FUSE)
    • 方式A

      • 安装ceph

      • 创建挂载点

        • [root@client ceph]# mkdir /mnt/cephfs
      • 创建密钥文件

        • [root@mon1 ceph]# cat ceph.client.admin.keyring
          [client.admin]
          key = AQBLR7xdckUIFhAA2G05Hidq5aoSse0nxGNdJQ==
        • [root@client ceph]# vim /etc/ceph/admin.secret
          AQBLR7xdckUIFhAA2G05Hidq5aoSse0nxGNdJQ==
      • 挂载

        • [root@client ceph]# mount.ceph 1.1.1.21:6789:/ /mnt/cephfs/ -o name=admin,secretfile=/etc/ceph/admin.secret
    • 方式B

      • 安装ceph-fuse

        • [root@client ~]# yum install -y ceph-fuse
      • 拷贝密钥环

        • [root@mon1 ceph]# scp ceph.client.admin.keyring 1.1.1.25:/etc/ceph/
      • 挂载

        • [root@client ~]# ceph-fuse -m 1.1.1.21:6789 /mnt/cephfs/
      • 从管理节点而非服务器节点挂载 Ceph FS 文件系统
      • 为了安全, 请将密钥文件设置合适的权限
  • 卸载

    • fusermount -u

对象存储

  • 介绍

    • 官方文档: http://docs.ceph.org.cn/rados/operations/pools/

    • 存储池功能

      • 自恢复力

        • 你可以设置在不丢数据的前提下允许多少 OSD 失效,对多副本存储池来说,此值是一对象应达到的副本数。典型配置存储一个对象和它的一个副本(即 size = 2 ),但你可以更改副本数;对纠删编码的存储池来说,此值是编码块数(即纠删码配置里的 m=2 )
      • 归置组

        • 你可以设置一个存储池的归置组数量。典型配置给每个 OSD 分配大约 100 个归置组,这样,不用过多计算资源就能得到较优的均衡。配置了多个存储池时,要考虑到这些存储池和整个集群的归置组数量要合理
      • CRUSH 规则

        • 当你在存储池里存数据的时候,与此存储池相关联的 CRUSH 规则集可控制 CRUSH 算法,并以此操纵集群内对象及其副本的复制(或纠删码编码的存储池里的数据块)。你可以自定义存储池的 CRUSH 规则
      • 快照

        • 用 ceph osd pool mksnap 创建快照的时候,实际上创建了某一特定存储池的快照
      • 设置所有者

        • 你可以设置一个用户 ID 为一个存储池的所有者
  • 列出存储池

    • [guo@node1 ceph-cluster]$ rados lspools #默认情况下只有一个rbd存储池
      rbd
      [guo@node1 ceph-cluster]$ ceph osd lspools
      0 rbd,
  • 创建存储池

    • [guo@node1 ceph-cluster]$ ceph osd pool create data 128
      pool ‘data’ created
      [guo@node1 ceph-cluster]$ rados lspools
      rbd
      data
  • 设置存储池配额

    • 存储池配额可设置最大字节数或每存储池最大对象数

    • 语法

      • ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}]
    • 例:将data存储池设置只能存储10000个对象
      [guo@node1 ceph-cluster]$ ceph osd pool set-quota data max_objects 10000
      set-quota max_objects = 10000 for pool data

    • 要取消配额,设置为0

  • 相关命令

    • 重命名存储池 ceph osd pool rename {current-pool-name} {new-pool-name}
      删除存储池 ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it]
      查看存储池统计信息 rados df
      创建存储池快照 ceph osd pool mksnap {pool-name} {snap-name}
      删除存储池快照 ceph osd pool rmsnap {pool-name} {snap-name}
      调整存储池选项值 ceph osd pool set {pool-name} {key} {value}
      获取存储池选项值 ceph osd pool get {pool-name} {key}
      设置对象副本数 ceph osd pool set {poolname} size {num-replicas} #{num-replicas}包括对象本身,默认为2
      获取对象副本数 ceph osd dump | grep ‘replicated size’

查看对象 rados ls -p poolname
存储对象 rados put -p poolname
获取对象 rados get -p poolname
删除对象 rados rm -p poolname
复制对象 rados cp [target-obj] -p poolname
截断对象 rados truncate length -p poolname 把对象内容保留多少长度

      1. 在管理端将配置文件和密钥环发送到客户端
        [root@admin ~]# cd /etc/ceph/
        [root@admin ceph]# ceph-deploy admin client client2
  1. 在任意节点创建存储池cephobj
    [root@client2 ceph]# ceph osd pool create cephobj 128

  2. 在其中一个客户端存入一个对象到cephobj
    [root@client2 ceph]# echo “this file upload by client2” > /tmp/a.txt
    [root@client2 ceph]# rados put test-file /tmp/a.txt -p cephobj # 存储对象

  3. 在另外的客户端获取对象
    [root@client ~]# rados ls -p cephobj
    test-file
    [root@client ~]# rados get test-file /opt/a.txt -p cephobj # 取出对象
    [root@client ~]# cat /opt/a.txt
    this file upload by client2

集群扩容

添加OSD

  • 准备工作

    • 在所有节点上修改解析记录,加入osd4

    • 在osd4节点上

      • 配置时间与管理节点admin同步
        配置好yum源并安装好ceph软件
        挂载好一块磁盘
    • 在管理节点mon1上

      • 把ssh公钥传到osd4
  • 配置集群加入OSD

    • [root@osd4 ~]# mkfs.xfs /dev/sdb
      [root@osd4 ~]# mkdir /mnt/osd
      [root@osd4 ~]# mount /dev/sdb /mnt/osd/

[root@mon1 ~]# cd /etc/ceph/
[root@mon1 ceph-cluster]# ceph-deploy osd prepare osd4:/mnt/osd #准备osd
[root@mon1 ceph-cluster]# ceph-deploy osd activate osd4:/mnt/osd #激活osd
- 一旦新加了OSD,Ceph集群就开始重均衡,把归置组迁移到新 OSD,用ceph -w查看过程

  • 删除OSD

    • 把OSD踢出集群

      • 删除OSD前,它通常是up且in的,要先把它踢出集群,以使Ceph启动重新均衡、把数据拷贝到其他OSD
      • ceph osd out {osd-num}
        [root@mon1 ceph-cluster]# ceph osd out 2
    • 观察数据迁移

      • 一旦把OSD踢出集群, Ceph就会开始重新均衡集群、把归置组迁出将删除的OSD。可以用 ceph -w观察此过程
      • 归置组状态从 active+clean 变为 active, some degraded objects 、迁移完成后最终回到 active+clean 状态
    • 停止OSD进程

      • 把 OSD 踢出集群后,它可能仍在运行,就是说其状态为 up 且 out 。删除前要先停止 OSD 进程
      • 可用kill进程号, 或用systemd结束,结束进程后用ceph osd tree可以看到osd状态已经由up变成了down
    • 删除 OSD

      • 此步骤依次把一个 OSD 移出集群 CRUSH 图、删除认证密钥、删除 OSD 图条目、删除 ceph.conf 条目。如果主机有多个硬盘,每个硬盘对应的 OSD 都得重复此步骤
      • ceph osd crush remove {name} #删除 CRUSH 图的对应 OSD 条目,它就不再接收数据了,name可用ceph osd crush tree查看
        [root@admin ceph-cluster]# ceph osd crush remove osd.2
      • 删除 OSD 认证密钥: ceph auth del osd.{osd-num}
        [root@admin ceph-cluster]# ceph auth del osd.2
      • 删除 OSD: ceph osd rm {osd-num}
        [root@admin ceph-cluster]# ceph osd rm 2
  • 有时候,(通常是只有几台主机的“小”集群,比如小型测试集群)拿出( out )某个 OSD 可能会使 CRUSH 进入临界状态,这时某些 PG 一直卡在 active+remapped 状态.如果遇到了这种情况,你应该把此 OSD 标记为 in :
    ceph osd in {osd-num}

等回到最初的状态后,把它的权重设置为 0 ,而不是标记为 out ,用此命令:
ceph osd crush reweight osd.{osd-num} 0

执行后,你可以观察数据迁移过程,应该可以正常结束。把某一 OSD 标记为 out 和权重改为 0 的区别在于,前者,包含此 OSD 的桶、其权重没变;而后一种情况下,桶的权重变了(降低了此 OSD 的权重)。某些情况下, reweight 命令更适合“小”集群

添加monitor

  • 介绍

    • Ceph 存储集群需要至少一个 Monitor 才能运行
    • 为达到高可用,大型的 Ceph 存储集群会运行多个 Monitors,这样在单个 Monitor 失败时不会影响 Ceph 存储集群的可用性
    • Ceph 使用 PASOX 算法,此算法要求有多半 monitors形成法定人数,因此mon数量要为奇数个
  • 修改配置文件

    • [root@mon1 ceph]# cat /etc/ceph/ceph.conf
      [global]
      fsid = 79fd9245-646a-4a05-aaca-73a8bb7d041b
      mon_initial_members = mon1,mon2,mon3
      mon_host = 1.1.1.21,1.1.1.27,1.1.1.28
      auth_cluster_required = cephx
      auth_service_required = cephx
      auth_client_required = cephx
      osd_pool_default_size = 2
      public_network = 1.0.0.0/8
    • 在一主机上新增监视器时,如果它不是由 ceph-deploy new 命令所定义的,那就必须把 public network 加入 ceph.conf 配置文件
  • 新增monitor成员

    • [root@mon1 ceph]# ceph-deploy --overwrite-conf mon add mon2
      [root@mon1 ceph]# ceph-deploy --overwrite-conf mon add mon3

或 ceph-deploy mon create {host-name [host-name]…}

  • 查看

    • [root@mon1 ceph]# ceph quorum_status --format json-pretty
  • 删除monitor

    • ceph-deploy mon destroy {host-name [host-name]…}

Ceph常用命令

集群维护常用命令概览

1:检查集群健康状况
启动集群后、读写数据前,先检查下集群的健康状态。你可以用下面的命令检查:
ceph health 或者 ceph health detail (输出信息更详细)

要观察集群内正发生的事件,打开一个新终端,然后输入:ceph -w

2:检查集群的使用情况
ceph df 检查集群的数据用量及其在存储池内的分布情况,可以用 df 选项,它和 Linux 上的 df 相似。如下:

输出的 GLOBAL 段展示了数据所占用集群存储空间的概要。
• SIZE: 集群的总容量;
• AVAIL: 集群的可用空间总量;
• RAW USED: 已用存储空间总量;
• % RAW USED: 已用存储空间比率。用此值参照 full ratio 和 near full ratio 来确保不会用尽集群空间
输出的 POOLS 段展示了存储池列表及各存储池的大致使用率。本段没有展示副本、克隆品和快照占用情况。
例如,如果你把 1MB 的数据存储为对象,理论使用率将是 1MB ,但考虑到副本数、克隆数、和快照数,实际使用率可能是 2MB 或更多。
• NAME: 存储池名字;
• ID: 存储池唯一标识符;
• USED: 大概数据量,单位为 KB 、 MB 或 GB ;
• %USED: 各存储池的大概使用率;
• OBJECTS: 各存储池内的大概对象数。

注: POOLS 段内的数字是理论值,它们不包含副本、快照或克隆。
因此,它与 USED 和 %USED 数量之和不会达到 GLOBAL 段中的 RAW USED 和 %RAW USED 数量。

ceph osd df 命令,可以详细列出集群每块磁盘的使用情况,包括大小、权重、使用多少空间、使用率等等

3:检查集群状态
要检查集群的状态,执行下面的命令:
ceph status

输出信息里包含:
• 集群唯一标识符
• 集群健康状况
• 监视器图元版本和监视器法定人数状态
• OSD 版本和 OSD 状态摘要
• 其内存储的数据和对象数量的粗略统计,以及数据总量等。

4:检查MONITOR状态
查看监视器图,执行下面的命令::
ceph mon stat

ceph mon dump

要检查监视器的法定人数状态,执行下面的命令:
ceph quorum_status

5:检查 MDS 状态:
元数据服务器为 Ceph 文件系统提供元数据服务,元数据服务器有两种状态: up | \ down 和 active | inactive ,执行下面的命令查看元数据服务器状态为 up 且 active :
ceph mds stat

要展示元数据集群的详细状态,执行下面的命令:
ceph mds dump

6:集群命令详解
mon 相关
ceph mon stat 查看mon的状态信息
ceph quorum_status 查看mon的选举状态
ceph mon dump 查看mon的映射信息
ceph mon remove cs1 删除一个mon节点
ceph mon getmap -o a.txt 获得一个正在运行的mon map,并保存在a.txt文件中
monmaptool --print a.txt 读取上面获得的map
ceph-mon -i nc3 --inject-monmap a.txt 把上面的mon map注入新加入的节点
ceph-conf --name mon.nc3 --show-config-value admin_socket 查看mon的amin socket
ceph-conf --name mon.nc1 --show-config-value log_file 查看ceph mon log日志所在的目录
ceph --admin-daemon /var/run/ceph/ceph-mon.nc3.asok config show | less 查看一个集群ceph-mon.nc3参数的配置

mds 相关
ceph mds stat 查看msd状态
ceph mds rm 0 mds.nc1 删除一个mds节点
ceph mds rmfailed 设置mds状态为失败
ceph mds add_data_pool 新建pool
mds cluster_down 关闭mds集群
mds cluster_up 启动mds集群
ceph mds set max_file_size 1024000000000 设置cephfs文件系统存储方式最大单个文件尺寸

清除 cephfs 文件系统步骤
ceph mds fail 0 强制mds状态为featrue
ceph fs rm leadorfs --yes-i-really-mean-it 删除mds文件系统
ceph osd pool delete cephfs_data cephfs_data --yes-i-really-really-mean-it 删除fs数据文件夹
ceph osd pool delete cephfs_metadata cephfs_metadata --yes-i-really-really-mean-it 删除元数据文件夹
然后再删除 mds key ,残留文件等
ceph mds rm 0 mds.node242 拆除文件系统前推荐先删除节点,待验证

ceph auth 相关
详见 ceph用户管理

ceph auth list 查看ceph集群中的认证用户及相关的key

为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.nc3创建一个用户并创建一个key
ceph auth get-or-create mds.nc3 mon ‘allow rwx’ osd ‘allow *’ mds ‘allow *’ -o /var/lib/ceph/mds/ceph-cs1/keyring

导入key信息
ceph auth import /var/lib/ceph/mds/ceph-cs1/keyring

删除集群中的一个认证用户
ceph auth del osd.0

osd 相关
ceph osd tree 查看osd列表
ceph osd perf 查看数据延迟
ceph osd df 详细列出集群每块磁盘的使用情况,包括大小、权重、使用多少空间、使用率等等
ceph osd down 0 down掉osd.0节点
ceph osd rm 0 在集群中删除一个osd硬盘
ceph osd crush rm osd.0 在集群中删除一个osd 硬盘 crush map
ceph osd crush rm cs1 在集群中删除一个osd的host节点
ceph osd getmaxosd 查看最大osd的个数
ceph osd setmaxosd 2048 设置最大的osd的个数(当扩大osd节点的时候必须扩大这个值)
ceph osd crush set {id} {weight} [{loc1} [{loc2} …]] 设置osd crush的权重为1.0
例如:
ceph osd crush set osd.1 0.5 host=node241

ceph osd reweight 3 0.5 设置osd的权重
reweighted osd.3 to 0.5 (8327682)
或者用下面的方式
ceph osd crush reweight osd.1 1.0

ceph osd out osd.3: 把一个osd节点逐出集群
3 1 osd.3 up 0 # osd.3的reweight变为0了就不再分配数据,但是设备还是存活的

ceph osd in osd.3 把逐出的osd加入集群
ceph osd pause 暂停osd (暂停后整个集群不再接收数据)
ceph osd unpause 再次开启osd (开启后再次接收数据)

查看一个集群osd.0参数的配置、输出信息特别详细,集群所有配置生效可以在此参数下确认
ceph --admin-daemon /var/run/ceph/ceph-osd.0.asok config show | less

设置标志 flags ,不允许关闭osd、解决网络不稳定,osd 状态不断切换的问题
ceph osd set nodown
取消设置
ceph osd unset nodown

pool 相关
查看ceph集群中的pool数量
ceph osd lspools 或者 ceph osd pool ls

在ceph集群中创建一个pool
ceph osd pool create rbdtest 100 #这里的100指的是PG组:

查看集群中所有pool的副本尺寸
ceph osd dump | grep ‘replicated size’

查看pool 最大副本数量
ceph osd pool get rbdpool size
size: 3

查看pool 最小副本数量
[root@node241 ~]# ceph osd pool get rbdpool min_size
min_size: 2

设置一个pool的pg数量
ceph osd pool set rbdtest pg_num 100

设置一个pool的pgp数量
ceph osd pool set rbdtest pgp_num 100

修改ceph,数据最小副本数、和副本数
ceph osd pool set $pool_name min_size 1
ceph osd pool set $pool_name size 2
示例:
ceph osd pool set rbdpool min_size 1
ceph osd pool set rbdpool size 2
验证:
ceph osd dump
pool 3 ‘rbdpool’ replicated size 2 min_size 1

设置rbdtest池的最大存储空间为100T(默认是1T)
ceph osd pool set rbdtest target_max_bytes 100000000000000

为一个ceph pool配置配额、达到配额前集群会告警,达到上限后无法再写入数据
ceph osd pool set-quota rbdtest max_objects 10000

在集群中删除一个pool,注意删除poolpool 映射的image 会直接被删除,线上操作要谨慎。
ceph osd pool delete rbdtest rbdtest --yes-i-really-really-mean-it #集群名字需要重复两次

给一个pool创建一个快照
ceph osd pool mksnap rbdtest rbdtest-snap20150924

查看快照信息
rados lssnap -p rbdtest
1 rbdtest-snap20150924 2015.09.24 19:58:55
2 rbdtest-snap2015092401 2015.09.24 20:31:21
2 snaps

删除pool的快照
ceph osd pool rmsnap rbdtest rbdtest-snap20150924
验证,剩余一个snap
rados lssnap -p rbdtest
2 rbdtest-snap2015092401 2015.09.24 20:31:21
1 snaps

rados命令相关
rados 是和Ceph的对象存储集群(RADOS),Ceph的分布式文件系统的一部分进行交互是一种实用工具。

查看ceph集群中有多少个pool (只是查看pool)
rados lspools 同 ceph osd pool ls 输出结果一致

显示整个系统和被池毁掉的使用率统计,包括磁盘使用(字节)和对象计数
rados df

创建一个pool
rados mkpool test

创建一个对象object
rados create test-object -p test

查看对象文件
rados -p test ls
test-object

删除一个对象
rados rm test-object-1 -p test

删除foo池 (和它所有的数据)
rados rmpool test test –yes-i-really-really-mean-it

查看ceph pool中的ceph object (这里的object是以块形式存储的)
rados ls -p test | more

为test pool创建快照
rados -p test mksnap testsnap
created pool test snap testsnap

列出给定池的快照
rados -p test lssnap
1 testsnap 2015.09.24 21:14:34

删除快照
rados -p test rmsnap testsnap
removed pool test snap testsnap

上传一个对象到test pool
rados -p test put myobject blah.txt

使用rados 进行性能测试
测试用例如下:
rados bench 600 write rand -t 100 -b 4K -p datapool
选项解释:
测试时间 :600
支持测试类型:write/read ,加rand就是随机,不加就是顺序
并发数( -t选项):100
pool的名字是:datapool

PG 相关
PG =“放置组”。当集群中的数据,对象映射到编程器,被映射到这些PGS的OSD。
查看pg组的映射信息
ceph pg dump 或者 ceph pg ls

查看一个PG的map
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状态
ceph pg stat

查询一个pg的详细信息
ceph pg 0.26 query

要洗刷一个pg组,执行命令:
ceph pg scrub {pg-id}

查看pg中stuck的状态
要获取所有卡在某状态的归置组统计信息,执行命令:
ceph pg dump_stuck inactive|unclean|stale --format
ceph pg dump_stuck unclean
ceph pg dump_stuck inactive
ceph pg dump_stuck stale
Inactive (不活跃)归置组不能处理读写,因为它们在等待一个有最新数据的 OSD 复活且进入集群。
Unclean (不干净)归置组含有复制数未达到期望数量的对象,它们应该在恢复中。
Stale (不新鲜)归置组处于未知状态:存储它们的 OSD 有段时间没向监视器报告了(由 mon_osd_report_timeout 配置)。
可用格式有 plain (默认)和 json 。阀值定义的是,归置组被认为卡住前等待的最小时间(默认 300 秒)

显示一个集群中的所有的pg统计
ceph pg dump --format plain

恢复一个丢失的pg
如果集群丢了一个或多个对象,而且必须放弃搜索这些数据,你就要把未找到的对象标记为丢失( lost )。
如果所有可能的位置都查询过了,而仍找不到这些对象,你也许得放弃它们了。这可能是罕见的失败组合导致的,集群在写入完成前,未能得知写入是否已执行。
当前只支持 revert 选项,它使得回滚到对象的前一个版本(如果它是新对象)或完全忽略它。要把 unfound 对象标记为 lost ,执行命令:
ceph pg {pg-id} mark_unfound_lost revert|delete

查看某个PG内分布的数据状态,具体状态可以使用选项过滤输出
ceph pg ls {} {active|clean|down|replay|splitting|scrubbing|scrubq|degraded|inconsistent|peering|repair|recovering|backfill_wait|incomplete|stale|remapped|deep_scrub|backfill|
backfill_toofull|recovery_wait|undersized [active|clean|down|replay|splitting|scrubbing|scrubq|degraded|inconsistent|peering|repair|recovering|backfill_wait|incomplete|stale|remapped|
deep_scrub|backfill|backfill_toofull|recovery_wait|undersized…]} : list pg with specific pool, osd, state
实例如下:
​ pg号 过滤输出的状态
ceph pg ls 1 clean

查询osd 包含pg 的信息,过滤输出pg的状态信息
pg ls-by-osd list pg on osd [osd]
{} {active|clean|down|replay|splitting|scrubbing|scrubq|degraded|
inconsistent|peering|repair|recovering| backfill_wait|incomplete|stale|remapped|deep_scrub|backfill|backfill_toofull|recovery_wait|undersized[active|clean|down|replay|splitting|
scrubbing|scrubq|degraded|inconsistent| peering|repair|recovering|backfill_ wait|incomplete|stale|remapped|deep_scrub|backfill|backfill_toofull|recovery_wait|undersized…]}
实例如下:
ceph pg ls-by-osd osd.5

查询pool包含pg 的信息,过滤输出pg的状态信息
ceph pg ls-by-pool poolname 选项
ceph pg ls-by-pool {active|clean| down|replay|splitting|scrubbing|scrubq| degraded|inconsistent|peering|repair| recovering|backfill_wait|incomplete| stale|remapped|deep_scrub|backfill|
backfill_toofull|recovery_wait| undersized [active|clean|down|replay| splitting|scrubbing|scrubq|degraded| inconsistent|peering|repair|recovering| backfill_wait|incomplete|stale| remapped|deep_scrub|backfill|backfill_
实例如下:
ceph pg ls-by-pool test

查询某个osd状态为 primary pg ,可以根据需要过滤状态
pg ls-by-primary {} {active|clean|down|replay|splitting|scrubbing|scrubq|degraded|inconsistent|peering|repair|recovering|backfill_wait|incomplete|stale|remapped|deep_scrub|backfill|
backfill_toofull|recovery_wait|undersized [active|clean|down|replay|splitting|scrubbing|scrubq|degraded|inconsistent|peering|repair|recovering|backfill_wait|incomplete|stale|remapped|deep_scrub|backfill|
backfill_toofull|recovery_wait|undersized…]} : list pg with primary = [osd]

实例如下:
​ osd号 过滤输出的状态
ceph pg ls-by-primary osd.3 clean

rbd命令相关
在test池中创建一个命名为kjh的10000M的镜像
rbd create -p test --size 10000 kjh

查看ceph中一个pool里的所有镜像
rbd ls test
kjh

查看新建的镜像的信息
rbd -p test info kjh

查看ceph pool中一个镜像的信息
rbd info -p test --image kjh
rbd image ‘kjh’:
​ size 1000 MB in 250 objects
​ order 22 (4096 kB objects)
​ block_name_prefix: rb.0.92bd.74b0dc51
​ format: 1

删除一个镜像
rbd rm -p test kjh

调整一个镜像的尺寸
rbd resize -p test --size 20000 kjh
rbd -p test info kjh #调整后的镜像大小
rbd image ‘kjh’:
​ size 2000 MB in 500 objects
​ order 22 (4096 kB objects)
​ block_name_prefix: rb.0.92c1.74b0dc51
​ format: 1

rbd pool 快照功能测试
新建个pool叫’ptmindpool’同时在下面创建一个’kjhimage’
ceph osd pool create ptmindpool 256 256
pool ‘ptmindpool’ created

创建镜像
rbd create kjhimage --size 1024 --pool ptmindpool

查看镜像
rbd --pool ptmindpool ls
kjhimage

创建snap,快照名字叫’snapkjhimage’
rbd snap create ptmindpool/kjhimage@snapkjhimage

查看kjhimage的snap
rbd snap ls ptmindpool/kjhimage
SNAPID NAME SIZE
​ 2 snapkjhimage 1024 MB

回滚快照,
rbd snap rollback ptmindpool/kjhimage@snapkjhimage

删除snap 删除snap报(rbd: snapshot ‘snapshot-xxxx’ is protected from removal.)写保护 ,使用 rbd snap unprotect volumes/snapshot-xxx’ 解锁,然后再删除
rbd snap rm ptmindpool/kjhimage@snapkjhimage

删除kjhimage的全部snapshot
rbd snap purge ptmindpool/kjhimage

把ceph pool中的一个镜像导出
导出镜像
rbd export -p ptmindpool --image kjhimage /tmp/kjhimage.img
Exporting image: 100% complete…done.
验证查看导出文件
l /tmp/kjhimage.img
-rw-r–r-- 1 root root 1073741824 Sep 24 23:15 /tmp/kjhimage.img

把一个镜像导入ceph中
rbd import /tmp/kjhimage.img -p ptmindpool --image importmyimage1
Importing image: 100% complete…done
验证查看导入镜像文件
rbd -pptmindpool ls
importmyimage1

问题及解决

安装ceph慢

  • 直接在每个节点上配置yum源并手动安装ceph

重启ceph无法正常运行

  • 查看OSD磁盘是否正常挂载. 注意将OSD设置自动挂载

重新启动ceph后集群警告PG过多

  • 修改ceph.conf文件

    • [root@mon1 ceph]# vim ceph.conf
      mon_pg_warn_max_per_osd = 500 #默认300
  • 将修改push到集群中其他节点

    • [root@mon1 ceph]# ceph-deploy --overwrite-conf config push osd{1…3}
  • 重启ceph-mon服务

    • [root@mon1 ceph]# systemctl restart ceph-mon@admin
  • 再次查看

    • ceph health

清理机器上的ceph相关配置

  • 卸载所有ceph程序

    • ceph-deploy uninstall [{ceph-node}]
  • 删除ceph相关的安装包

    • ceph-deploy purge {ceph-node} [{ceph-data}]
    • ceph-deploy purge ceph-mon1 ceph-osd{1…3}
  • 删除ceph相关的配置

    • ceph-deploy purgedata {ceph-node} [{ceph-data}]
    • ceph-deploy purgedata ceph-mon1 ceph-osd{1…3}
  • 删除key

    • ceph-deploy forgetkeys
  • 卸载ceph-deploy管理

    • yum -y remove ceph-deploy
  • rm -rf /etc/ceph/*
    rm -rf /var/lib/ceph/*

rm -rf /mnt/osdN/*

你可能感兴趣的:(ceph存储)