ceph_cephfs - CSDN
ceph 订阅
Ceph是第一人称游戏《孤岛危机》系列中一个技术先进的神秘外星物种,该绰号是“Cephalopod(头足类动物)”的简称,因为它们非常类似于地球海洋上的章鱼或乌贼,而人类对这个物种给出的正式名称是“卡律布狄斯(Charybdis)”。它们对人类怀有敌意,对他们发动一场灭绝人类的战争。 [1]  它们是外来殖民者,来自于Messier 33三角座星系α象限中一颗被视为“Ceph Homeworld”的行星,距地球约300万光年。大约6500万年前到达地球,在游戏事件发生之前,它们最近的活动发生在大约200万年前,集体进入了休眠状态。直到它们在灵山岛上被完全唤醒。 [1] 展开全文
Ceph是第一人称游戏《孤岛危机》系列中一个技术先进的神秘外星物种,该绰号是“Cephalopod(头足类动物)”的简称,因为它们非常类似于地球海洋上的章鱼或乌贼,而人类对这个物种给出的正式名称是“卡律布狄斯(Charybdis)”。它们对人类怀有敌意,对他们发动一场灭绝人类的战争。 [1]  它们是外来殖民者,来自于Messier 33三角座星系α象限中一颗被视为“Ceph Homeworld”的行星,距地球约300万光年。大约6500万年前到达地球,在游戏事件发生之前,它们最近的活动发生在大约200万年前,集体进入了休眠状态。直到它们在灵山岛上被完全唤醒。 [1]
信息
登场作品
孤岛危机
定    义
外星生物
中文名
Ceph
其它名称
Charybdis
Ceph孤岛危机1
而后因为地壳运动导致其深埋在地下,无法觉醒。在《孤岛危机》历史中,Ceph与人类的接触可能最早是在1908年,当年通古斯大爆炸后,哈格瑞夫(二代中的罐装人)、卡尔·罗许(三代中的Ceph首脑代理)和沃尔特·古德(二代古德博士的爷爷)秘密组织了一支探险队前往调查大爆炸的遗址,虽然具体过程不明,但结果最后只剩下上述三人生还。后来到了2020年的8月,因为陨石的缘故,深埋在灵山岛下的Ceph机械开始活动,同时朝鲜和美国开始纷纷向岛上派遣部队,随后因为朝鲜人民军的庆将军执意启动Ceph飞船,结果导致灵山岛的Ceph全部苏醒,并在顷刻间几乎将整个岛屿全部冰封,随后美 孤岛危机1 Ceph部队(5张) 国和朝鲜的军队被迫联合抗敌,但在Ceph的优势火力下节节败退,美国军队只好出动宪法号航母上全部的VTOL来撤离部队。随后,美军战斗机向灵山岛发射了一颗核弹,企图用核弹来歼灭整座岛上的Ceph,但因为Ceph拥有可以吸收外来能量并转化为自己能源的恐怖技术,核弹反而使Ceph机械部队更加强大,之后Ceph机械部队攻上了宪法号,在诺曼(一代男主)的反击下,消灭了Ceph Hunter 机甲和Ceph母舰,随后撤离航母,再次飞向灵山岛(救普费)。
收起全文
精华内容
参与话题
  • Ceph是一个可靠的、数据自动重均衡、自动恢复的SDS(软件定义存储)分布式存储系统,功能主要有三大块:块存储、对象存储、文件系统。 Ceph不但是提供了统一存储,并且同时还充分利用了客户端的计算能力,在...
  • 史上最全的Ceph介绍、原理、架构

    万次阅读 多人点赞 2019-07-05 10:18:20
    1. Ceph架构简介及使用场景介绍1.1 Ceph简介Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。Ceph项目最早起源于Sage就读...
        

    1. Ceph架构简介及使用场景介绍


    1.1 Ceph简介


    Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。


    Ceph项目最早起源于Sage就读博士期间的工作(最早的成果于2004年发表),并随后贡献给开源社区。在经过了数年的发展之后,目前已得到众多云计算厂商的支持并被广泛应用。RedHat及OpenStack都可与Ceph整合以支持虚拟机镜像的后端存储。


    1.2 Ceph特点


    • 高性能
      a. 摒弃了传统的集中式存储元数据寻址的方案,采用CRUSH算法,数据分布均衡,并行度高。
      b.考虑了容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知等。
      c. 能够支持上千个存储节点的规模,支持TB到PB级的数据。


    • 高可用性
      a. 副本数可以灵活控制。
      b. 支持故障域分隔,数据强一致性。
      c. 多种故障场景自动进行修复自愈。
      d. 没有单点故障,自动管理。


    • 高可扩展性
      a. 去中心化。
      b. 扩展灵活。
      c. 随着节点增加而线性增长。


    • 特性丰富
      a. 支持三种存储接口:块存储、文件存储、对象存储。
      b. 支持自定义接口,支持多种语言驱动。


    1.3 Ceph架构


    支持三种接口:


    • Object:有原生的API,而且也兼容Swift和S3的API。

    • Block:支持精简配置、快照、克隆。

    • File:Posix接口,支持快照。


      640?wx_fmt=png

      rados


    1.4 Ceph核心组件及概念介绍


    • Monitor
      一个Ceph集群需要多个Monitor组成的小集群,它们通过Paxos同步数据,用来保存OSD的元数据。


    • OSD
      OSD全称Object Storage Device,也就是负责响应客户端请求返回具体数据的进程。一个Ceph集群一般都有很多个OSD。


    • MDS
      MDS全称Ceph Metadata Server,是CephFS服务依赖的元数据服务。


    • Object
      Ceph最底层的存储单元是Object对象,每个Object包含元数据和原始数据。


    • PG
      PG全称Placement Grouops,是一个逻辑的概念,一个PG包含多个OSD。引入PG这一层其实是为了更好的分配数据和定位数据。


    • RADOS
      RADOS全称Reliable Autonomic Distributed Object Store,是Ceph集群的精华,用户实现数据分配、Failover等集群操作。


    • Libradio
      Librados是Rados提供库,因为RADOS是协议很难直接访问,因此上层的RBD、RGW和CephFS都是通过librados访问的,目前提供PHP、Ruby、Java、Python、C和C++支持。


    • CRUSH
      CRUSH是Ceph使用的数据分布算法,类似一致性哈希,让数据分配到预期的地方。


    • RBD
      RBD全称RADOS block device,是Ceph对外提供的块设备服务。


    • RGW
      RGW全称RADOS gateway,是Ceph对外提供的对象存储服务,接口与S3和Swift兼容。


    • CephFS
      CephFS全称Ceph File System,是Ceph对外提供的文件系统服务。


    1.5 三种存储类型-块存储

    640?wx_fmt=png

    rbd


    典型设备: 磁盘阵列,硬盘


    主要是将裸磁盘空间映射给主机使用的。


    优点


    • 通过Raid与LVM等手段,对数据提供了保护。

    • 多块廉价的硬盘组合起来,提高容量。

    • 多块磁盘组合出来的逻辑盘,提升读写效率。


    缺点


    • 采用SAN架构组网时,光纤交换机,造价成本高。

    • 主机之间无法共享数据。


    使用场景


    • docker容器、虚拟机磁盘存储分配。

    • 日志存储。

    • 文件存储。


    1.6 三种存储类型-文件存储


    640?wx_fmt=png

    fs


    典型设备: FTP、NFS服务器


    为了克服块存储文件无法共享的问题,所以有了文件存储。


    在服务器上架设FTP与NFS服务,就是文件存储。


    优点


    • 造价低,随便一台机器就可以了。

    • 方便文件共享。


    缺点


    • 读写速率低。

    • 传输速率慢。


    使用场景


    • 日志存储。

    • 有目录结构的文件存储。


    1.7 三种存储类型-对象存储


    640?wx_fmt=png

    rgw


    典型设备: 内置大容量硬盘的分布式服务器(swift, s3)


    多台服务器内置大容量硬盘,安装上对象存储管理软件,对外提供读写访问功能。


    优点


    • 具备块存储的读写高速。

    • 具备文件存储的共享等特性。


    使用场景: (适合更新变动较少的数据)


    • 图片存储。

    • 视频存储。


    2. Ceph IO流程及数据分布


    640?wx_fmt=png

    rados_io_1


    2.1 正常IO流程图


    640?wx_fmt=png

    ceph_io_2


    步骤


    1. client 创建cluster handler。

    2. client 读取配置文件。

    3. client 连接上monitor,获取集群map信息。

    4. client 读写io 根据crshmap 算法请求对应的主osd数据节点。

    5. 主osd数据节点同时写入另外两个副本节点数据。

    6. 等待主节点以及另外两个副本节点写完数据状态。

    7. 主节点及副本节点写入状态都成功后,返回给client,io写入完成。


    2.2 新主IO流程图


    说明


    如果新加入的OSD1取代了原有的 OSD4成为 Primary OSD, 由于 OSD1 上未创建 PG , 不存在数据,那么 PG 上的 I/O 无法进行,怎样工作的呢?


    640?wx_fmt=png

    ceph_io_3


    步骤


    1. client连接monitor获取集群map信息。

    2. 同时新主osd1由于没有pg数据会主动上报monitor告知让osd2临时接替为主。

    3. 临时主osd2会把数据全量同步给新主osd1。

    4. client IO读写直接连接临时主osd2进行读写。

    5. osd2收到读写io,同时写入另外两副本节点。

    6. 等待osd2以及另外两副本写入成功。

    7. osd2三份数据都写入成功返回给client, 此时client io读写完毕。

    8. 如果osd1数据同步完毕,临时主osd2会交出主角色。

    9. osd1成为主节点,osd2变成副本。


    2.3 Ceph IO算法流程

    640?wx_fmt=png

    ceph_io_4


    1. File用户需要读写的文件。File->Object映射:


    a. ino (File的元数据,File的唯一id)。
    b. ono(File切分产生的某个object的序号,默认以4M切分一个块大小)。
    c. oid(object id: ino + ono)。


    2. Object是RADOS需要的对象。Ceph指定一个静态hash函数计算oid的值,将oid映射成一个近似均匀分布的伪随机值,然后和mask按位相与,得到pgid。Object->PG映射:


    a. hash(oid) & mask-> pgid 。
    b. mask = PG总数m(m为2的整数幂)-1 。


    3. PG(Placement Group),用途是对object的存储进行组织和位置映射, (类似于redis cluster里面的slot的概念) 一个PG里面会有很多object。采用CRUSH算法,将pgid代入其中,然后得到一组OSD。PG->OSD映射:


    a. CRUSH(pgid)->(osd1,osd2,osd3) 。


    2.4 Ceph IO伪代码流程


    locator = object_name
    obj_hash =  hash(locator)
    pg = obj_hash % num_pg
    osds_for_pg = crush(pg)    # returns a list of osdsprimary = osds_for_pg[0]
    replicas = osds_for_pg[1:]


    2.5 Ceph RBD IO流程


    640?wx_fmt=png

    ceph_rbd_io


    步骤


    1. 客户端创建一个pool,需要为这个pool指定pg的数量。


    2. 创建pool/image rbd设备进行挂载。


    3. 用户写入的数据进行切块,每个块的大小默认为4M,并且每个块都有一个名字,名字就是object+序号。


    4. 将每个object通过pg进行副本位置的分配。


    5. pg根据cursh算法会寻找3个osd,把这个object分别保存在这三个osd上。


    6. osd上实际是把底层的disk进行了格式化操作,一般部署工具会将它格式化为xfs文件系统。


    7. object的存储就变成了存储一个文rbd0.object1.file。


    2.6 Ceph RBD IO框架图


    640?wx_fmt=png

    ceph_rbd_io1


    客户端写数据osd过程


    1. 采用的是librbd的形式,使用librbd创建一个块设备,向这个块设备中写入数据。


    2. 在客户端本地同过调用librados接口,然后经过pool,rbd,object、pg进行层层映射,在PG这一层中,可以知道数据保存在哪3个OSD上,这3个OSD分为主从的关系。


    3. 客户端与primay OSD建立SOCKET 通信,将要写入的数据传给primary OSD,由primary OSD再将数据发送给其他replica OSD数据节点。


    2.7 Ceph Pool和PG分布情况


    640?wx_fmt=png

    ceph_pool_pg


    说明


    • pool是ceph存储数据时的逻辑分区,它起到namespace的作用。

    • 每个pool包含一定数量(可配置)的PG。

    • PG里的对象被映射到不同的Object上。

    • pool是分布到整个集群的。

    • pool可以做故障隔离域,根据不同的用户场景不一进行隔离。


    2.8 Ceph 数据扩容PG分布


    场景数据迁移流程


    • 现状3个OSD, 4个PG

    • 扩容到4个OSD, 4个PG


    现状


    640?wx_fmt=png

    ceph_recory_1


    扩容后


    640?wx_fmt=png

    ceph_io_recry2


    说明


    每个OSD上分布很多PG, 并且每个PG会自动散落在不同的OSD上。如果扩容那么相应的PG会进行迁移到新的OSD上,保证PG数量的均衡。


    3. Ceph心跳机制


    3.1 心跳介绍


    心跳是用于节点间检测对方是否故障的,以便及时发现故障节点进入相应的故障处理流程。


    问题


    • 故障检测时间和心跳报文带来的负载之间做权衡。

    • 心跳频率太高则过多的心跳报文会影响系统性能。

    • 心跳频率过低则会延长发现故障节点的时间,从而影响系统的可用性。


    故障检测策略应该能够做到


    • 及时:节点发生异常如宕机或网络中断时,集群可以在可接受的时间范围内感知。

    • 适当的压力:包括对节点的压力,和对网络的压力。

    • 容忍网络抖动:网络偶尔延迟。

    • 扩散机制:节点存活状态改变导致的元信息变化需要通过某种机制扩散到整个集群。


    3.2 Ceph 心跳检测


    640?wx_fmt=png

    ceph_heartbeat_1


    OSD节点会监听public、cluster、front和back四个端口


    • public端口:监听来自Monitor和Client的连接。

    • cluster端口:监听来自OSD Peer的连接。

    • front端口:供客户端连接集群使用的网卡, 这里临时给集群内部之间进行心跳。

    • back端口:供客集群内部使用的网卡。集群内部之间进行心跳。

    • hbclient:发送ping心跳的messenger。


    3.3 Ceph OSD之间相互心跳检测


    640?wx_fmt=png

    ceph_heartbeat_osd


    步骤


    • 同一个PG内OSD互相心跳,他们互相发送PING/PONG信息。

    • 每隔6s检测一次(实际会在这个基础上加一个随机时间来避免峰值)。

    • 20s没有检测到心跳回复,加入failure队列。


    3.4 Ceph OSD与Mon心跳检测


    640?wx_fmt=png

    ceph_heartbeat_mon


    OSD报告给Monitor:


    • OSD有事件发生时(比如故障、PG变更)。

    • 自身启动5秒内。

    • OSD周期性的上报给Monito

      • OSD检查failure_queue中的伙伴OSD失败信息。

      • 向Monitor发送失效报告,并将失败信息加入failure_pending队列,然后将其从failure_queue移除。

      • 收到来自failure_queue或者failure_pending中的OSD的心跳时,将其从两个队列中移除,并告知Monitor取消之前的失效报告。

      • 当发生与Monitor网络重连时,会将failure_pending中的错误报告加回到failure_queue中,并再次发送给Monitor。

    • Monitor统计下线OSD

      • Monitor收集来自OSD的伙伴失效报告。

      • 当错误报告指向的OSD失效超过一定阈值,且有足够多的OSD报告其失效时,将该OSD下线。


    3.5 Ceph心跳检测总结


    Ceph通过伙伴OSD汇报失效节点和Monitor统计来自OSD的心跳两种方式判定OSD节点失效。


    • 及时:伙伴OSD可以在秒级发现节点失效并汇报Monitor,并在几分钟内由Monitor将失效OSD下线。


    • 适当的压力:由于有伙伴OSD汇报机制,Monitor与OSD之间的心跳统计更像是一种保险措施,因此OSD向Monitor发送心跳的间隔可以长达600秒,Monitor的检测阈值也可以长达900秒。Ceph实际上是将故障检测过程中中心节点的压力分散到所有的OSD上,以此提高中心节点Monitor的可靠性,进而提高整个集群的可扩展性。


    • 容忍网络抖动:Monitor收到OSD对其伙伴OSD的汇报后,并没有马上将目标OSD下线,而是周期性的等待几个条件:

      • 目标OSD的失效时间大于通过固定量osd_heartbeat_grace和历史网络条件动态确定的阈值。

      • 来自不同主机的汇报达到mon_osd_min_down_reporters。

      • 满足前两个条件前失效汇报没有被源OSD取消。


    • 扩散:作为中心节点的Monitor并没有在更新OSDMap后尝试广播通知所有的OSD和Client,而是惰性的等待OSD和Client来获取。以此来减少Monitor压力并简化交互逻辑。


    4. Ceph通信框架


    4.1 Ceph通信框架种类介绍


    网络通信框架三种不同的实现方式:


    • Simple线程模式
      特点:每一个网络链接,都会创建两个线程,一个用于接收,一个用于发送。
      缺点:大量的链接会产生大量的线程,会消耗CPU资源,影响性能。

    • Async事件的I/O多路复用模式
      特点:这种是目前网络通信中广泛采用的方式。k版默认已经使用Asnyc了。

    • XIO方式使用了开源的网络通信库accelio来实现
      特点:这种方式需要依赖第三方的库accelio稳定性,目前处于试验阶段。


    4.2 Ceph通信框架设计模式


    设计模式(Subscribe/Publish):


    订阅发布模式又名观察者模式,它意图是“定义对象间的一种一对多的依赖关系,
    当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。


    4.3 Ceph通信框架流程图


    640?wx_fmt=png

    ceph_message


    步骤


    • Accepter监听peer的请求, 调用 SimpleMessenger::add_accept_pipe() 创建新的 Pipe 到 SimpleMessenger::pipes 来处理该请求。


    • Pipe用于消息的读取和发送。该类主要有两个组件,Pipe::Reader,Pipe::Writer用来处理消息读取和发送。


    • Messenger作为消息的发布者, 各个 Dispatcher 子类作为消息的订阅者, Messenger 收到消息之后,  通过 Pipe 读取消息,然后转给 Dispatcher 处理。


    • Dispatcher是订阅者的基类,具体的订阅后端继承该类,初始化的时候通过 Messenger::add_dispatcher_tail/head 注册到 Messenger::dispatchers. 收到消息后,通知该类处理。


    • DispatchQueue该类用来缓存收到的消息, 然后唤醒 DispatchQueue::dispatch_thread 线程找到后端的 Dispatch 处理消息。


    640?wx_fmt=png

    ceph_message_2


    4.4 Ceph通信框架类图


    640?wx_fmt=png

    ceph_message_3


    4.5 Ceph通信数据格式


    通信协议格式需要双方约定数据格式。


    消息的内容主要分为三部分:


    • header              //消息头,类型消息的信封

    • user data          //需要发送的实际数据

      • payload     //操作保存元数据

      • middle      //预留字段

      • data          //读写数据

    • footer             //消息的结束标记

    class Message : public RefCountedObject {
    protected:
      ceph_msg_header  header;      // 消息头
      ceph_msg_footer  footer;      // 消息尾
      bufferlist       payload;  // "front" unaligned blob
      bufferlist       middle;   // "middle" unaligned blob
      bufferlist       data;     // data payload (page-alignment will be preserved where possible)

      /* recv_stamp is set when the Messenger starts reading the
       * Message off the wire */

      utime_t recv_stamp;       //开始接收数据的时间戳
      /* dispatch_stamp is set when the Messenger starts calling dispatch() on
       * its endpoints */

      utime_t dispatch_stamp;   //dispatch 的时间戳
      /* throttle_stamp is the point at which we got throttle */
      utime_t throttle_stamp;   //获取throttle 的slot的时间戳
      /* time at which message was fully read */
      utime_t recv_complete_stamp;  //接收完成的时间戳

      ConnectionRef connection;     //网络连接

      uint32_t magic = 0;           //消息的魔术字

      bi::list_member_hook<> dispatch_q;    //boost::intrusive 成员字段
    };

    struct ceph_msg_header {
        __le64 seq;       // 当前session内 消息的唯一 序号
        __le64 tid;       // 消息的全局唯一的 id
        __le16 type;      // 消息类型
        __le16 priority;  // 优先级
        __le16 version;   // 版本号

        __le32 front_len; // payload 的长度
        __le32 middle_len;// middle 的长度
        __le32 data_len;  // data 的 长度
        __le16 data_off;  // 对象的数据偏移量


        struct ceph_entity_name src; //消息源

        /* oldest code we think can decode this.  unknown if zero. */
        __le16 compat_version;
        __le16 reserved;
        __le32 crc;       /* header crc32c */
    } __attribute__ ((packed));

    struct ceph_msg_footer {
        __le32 front_crc, middle_crc, data_crc; //crc校验码
        __le64  sig; //消息的64位signature
        __u8 flags; //结束标志
    } __attribute__ ((packed));


    5. Ceph CRUSH算法


    5.1 数据分布算法挑战


    • 数据分布和负载均衡:
      a. 数据分布均衡,使数据能均匀的分布到各个节点上。
      b. 负载均衡,使数据访问读写操作的负载在各个节点和磁盘的负载均衡。


    • 灵活应对集群伸缩
      a. 系统可以方便的增加或者删除节点设备,并且对节点失效进行处理。
      b. 增加或者删除节点设备后,能自动实现数据的均衡,并且尽可能少的迁移数据。


    • 支持大规模集群
      a. 要求数据分布算法维护的元数据相对较小,并且计算量不能太大。随着集群规模的增 加,数据分布算法开销相对比较小。


    5.2 Ceph CRUSH算法说明


    • CRUSH算法的全称为:Controlled Scalable Decentralized Placement of Replicated Data,可控的、可扩展的、分布式的副本数据放置算法。


    • pg到OSD的映射的过程算法叫做CRUSH 算法。(一个Object需要保存三个副本,也就是需要保存在三个osd上)。


    • CRUSH算法是一个伪随机的过程,他可以从所有的OSD中,随机性选择一个OSD集合,但是同一个PG每次随机选择的结果是不变的,也就是映射的OSD集合是固定的。


    5.3 Ceph CRUSH算法原理


    CRUSH算法因子:


    • 层次化的Cluster Map
      反映了存储系统层级的物理拓扑结构。定义了OSD集群具有层级关系的 静态拓扑结构。OSD层级使得 CRUSH算法在选择OSD时实现了机架感知能力,也就是通过规则定义, 使得副本可以分布在不同的机 架、不同的机房中、提供数据的安全性 。


    • Placement Rules
      决定了一个PG的对象副本如何选择的规则,通过这些可以自己设定规则,用户可以自定义设置副本在集群中的分布。


    5.3.1 层级化的Cluster Map


    640?wx_fmt=png

    ceph_crush


    CRUSH Map是一个树形结构,OSDMap更多记录的是OSDMap的属性(epoch/fsid/pool信息以及osd的ip等等)。


    叶子节点是device(也就是osd),其他的节点称为bucket节点,这些bucket都是虚构的节点,可以根据物理结构进行抽象,当然树形结构只有一个最终的根节点称之为root节点,中间虚拟的bucket节点可以是数据中心抽象、机房抽象、机架抽象、主机抽象等。


    5.3.2 数据分布策略Placement Rules


    数据分布策略Placement Rules主要有特点


    a. 从CRUSH Map中的哪个节点开始查找
    b. 使用那个节点作为故障隔离域
    c. 定位副本的搜索模式(广度优先 or 深度优先)

    rule replicated_ruleset  #规则集的命名,创建pool时可以指定rule集
    {
        ruleset 0                #rules集的编号,顺序编即可   
        type replicated          #定义pool类型为replicated(还有erasure模式)   
        min_size 1                #pool中最小指定的副本数量不能小1
        max_size 10               #pool中最大指定的副本数量不能大于10       
        step take default         #查找bucket入口点,一般是root类型的bucket    
        step chooseleaf  firstn  0  type  host #选择一个host,并递归选择叶子节点osd     
        step emit        #结束
    }


    5.3.3 Bucket随机算法类型

    640?wx_fmt=png

    ceph_bucket


    • 一般的buckets:适合所有子节点权重相同,而且很少添加删除item。


    • list buckets:适用于集群扩展类型。增加item,产生最优的数据移动,查找item,时间复杂度O(n)。


    • tree buckets:查找负责度是O (log n), 添加删除叶子节点时,其他节点node_id不变。


    • straw buckets:允许所有项通过类似抽签的方式来与其他项公平“竞争”。定位副本时,bucket中的每一项都对应一个随机长度的straw,且拥有最长长度的straw会获得胜利(被选中),添加或者重新计算,子树之间的数据移动提供最优的解决方案。


    5.4 CRUSH算法案例


    说明


    集群中有部分sas和ssd磁盘,现在有个业务线性能及可用性优先级高于其他业务线,能否让这个高优业务线的数据都存放在ssd磁盘上。


    普通用户


    640?wx_fmt=png

    ceph_sas.png


    高优用户


    640?wx_fmt=png

    ssd


    配置规则


    640?wx_fmt=png

    ceph_crush1


    6. 定制化Ceph RBD QOS


    6.1 QOS介绍


    QoS (Quality of Service,服务质量)起源于网络技术,它用来解决网络延迟和阻塞等问题,能够为指定的网络通信提供更好的服务能力。


    问题


    我们总的Ceph集群的iIO能力是有限的,比如带宽,IOPS。如何避免用户争取资源,如果保证集群所有用户资源的高可用性,以及如何保证高优用户资源的可用性。所以我们需要把有限的IO能力合理分配。


    6.2 Ceph IO操作类型


    • ClientOp:来自客户端的读写I/O请求。


    • SubOp:osd之间的I/O请求。主要包括由客户端I/O产生的副本间数据读写请求,以及由数据同步、数据扫描、负载均衡等引起的I/O请求。


    • SnapTrim:快照数据删除。从客户端发送快照删除命令后,删除相关元数据便直接返回,之后由后台线程删除真实的快照数据。通过控制snaptrim的速率间接控制删除速率。


    • Scrub:用于发现对象的静默数据错误,扫描元数据的Scrub和对象整体扫描的deep Scrub。


    • Recovery:数据恢复和迁移。集群扩/缩容、osd失效/从新加入等过程。


    6.3 Ceph 官方QOS原理


    640?wx_fmt=png

    ceph_mclok_qos


    mClock是一种基于时间标签的I/O调度算法,最先被Vmware提出来的用于集中式管理的存储系统。(目前官方QOS模块属于半成品)。


    基本思想:


    • reservation 预留,表示客户端获得的最低I/O资源。

    • weight 权重,表示客户端所占共享I/O资源的比重。

    • limit 上限,表示客户端可获得的最高I/O资源。


    6.4 定制化QOS原理


    6.4.1 令牌桶算法介绍


    640?wx_fmt=png

    ceph_token_qos


    基于令牌桶算法(TokenBucket)实现了一套简单有效的qos功能,满足了云平台用户的核心需求。


    基本思想


    • 按特定的速率向令牌桶投放令牌。


    • 根据预设的匹配规则先对报文进行分类,不符合匹配规则的报文不需要经过令牌桶的处理,直接发送。


    • 符合匹配规则的报文,则需要令牌桶进行处理。当桶中有足够的令牌则报文可以被继续发送下去,同时令牌桶中的令牌量按报文的长度做相应的减少。


    • 当令牌桶中的令牌不足时,报文将不能被发送,只有等到桶中生成了新的令牌,报文才可以发送。这就可以限制报文的流量只能是小于等于令牌生成的速度,达到限制流量的目的。


    6.4.2 RBD令牌桶算法流程


    640?wx_fmt=png

    ceph_token1


    步骤


    • 用户发起请求异步IO到达Image中。

    • 请求到达ImageRequestWQ队列中。

    • 在ImageRequestWQ出队列的时候加入令牌桶算法TokenBucket。

    • 通过令牌桶算法进行限速,然后发送给ImageRequest进行处理。


    6.4.3 RBD令牌桶算法框架图


    现有框架图:


    640?wx_fmt=png

    ceph_qos2


    令牌图算法框架图:


    640?wx_fmt=png

    ceph_qos_token2


    作者:李航,多年的底层开发经验,在高性能nginx开发和分布式缓存redis cluster有着丰富的经验,目前从事Ceph工作两年左右。先后在58同城、汽车之家、优酷土豆集团工作。 目前供职于滴滴基础平台运维部 负责分布式Ceph集群开发及运维等工作。个人主要关注的技术领域:高性能Nginx开发、分布式缓存、分布式存储。


    出处:https://www.jianshu.com/p/cc3ece850433


    版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。


    640?wx_fmt=png

    架构文摘

    ID:ArchDigest

    互联网应用架构丨架构技术丨大型网站丨大数据丨机器学习

    640?wx_fmt=jpeg

    更多精彩文章,请点击下方:阅读原文

    展开全文
  • Ceph介绍(一):基本原理

    千次阅读 2019-04-23 14:38:55
    开源社区的明星项目—Ceph谈 前言 启迪云作为一家知名私有云提供商,面向客户提供一套完整的私有云解决方案。存储作为私有云的重中之重,因此启迪云后端也支持多种存储,包括开源社区的明星项目—Ceph。 启迪云与...
    转载;开源社区的明星项目—Ceph谈

    前言

    启迪云作为一家知名私有云提供商,面向客户提供一套完整的私有云解决方案。存储作为私有云的重中之重,因此启迪云后端也支持多种存储,包括开源社区的明星项目—Ceph。

    启迪云与Ceph实现了无缝对接,不仅优化了原有的功能,而且增加了启迪云特有的定制化的功能,为用户数据提供了可靠性、易用性、一致性。

    简介

    诞生于2006年的Ceph,是开源社区的明星项目,也是私有云事实上的标准-OpenStack的默认存储后端。

    Ceph是一种软件定义存储,可以运行在几乎所有主流的Linux发行版(比如CentOS和Ubuntu)和其它类UNIX操作系统(典型如FreeBSD)。

    Ceph的分布式基因使其可以轻易管理成百上千个节点、PB级及以上存储容量的大规模集群,同时基于计算的扁平寻址设计使得Ceph客户端可以直接和服务端的任意节点通信,从而避免因为存在访问热点而导致性能瓶颈。

    Ceph是一个统一存储系统,即支持传统的块、文件存储协议,例如SAN和NAS;也支持对象存储协议,例如S3和Swift。

     

     

    ❖ Ceph和存储的未来

    所有存储系统的要求都是统一、分布式、可靠、高性能且能够大规模扩展至艾字节,甚至更高级别。Ceph存储系统是一个真正的解决方案,它可以应对这个星球上爆炸式增长的数据。其统一、分布式、高性价比和可扩展的特性使它成为满足今天和将来数据存储需求的潜在解决方案。

     

     

     

     

     Ceph云存储解决方案

    所有想在存储基础设施上省钱的用户最有可能很快就考虑采用软件定义存储(SDS)。SDS可以为在传统存储上有大投入但仍然没有获得必要的灵活性和扩展性的用户提供一个很好的解决方案。Ceph是一个真正的SDS解决方案,它可以从软件层面正确提供所有的企业级存储特性。低成本、可靠性、可扩展性是Ceph的主要特点。

     

    ❖ Ceph统一存储解决方案

    从存储厂商的角度来看,统一存储的定义就是在单一的平台上同时提供基于文件和基于块的访问。企业存储环境在单一平台提供NAS和SAN。

     

    在Ceph中,统一存储这个词涵盖的功能比现在的存储厂商所声称的更多。Ceph是一个真正的统一存储解决方案,它从单一统一软件层提供对象、块和文件存储。

     

    在传统基于文件的存储系统中,文件是通过文件目录进行寻址的。相类似,Ceph中的对象通过唯一的标识符进行寻址,并存储在一个扁平的寻址空间中。剔除了元数据操作之后,对象提供了无限的规模扩展和性能提升。Ceph通过一个算法来动态计算存储和获取某个对象的位置。

     

     

    下一代架构

    传统的存储系统并不具备更智能地管理元数据的方法。传统的存储系统通过维护一张集中的查找表来跟踪它们的元数据。客户端每次发出读写操作请求时,存储系统首先要查找这个巨大的元数据表,得到结果之后它才能执行客户端请求的操作。对于一个小的存储系统而言,也许不会感觉到性能问题,但对于一个大的存储集群来说,你将会受制于这种方法的性能限制,也会限制系统的扩展性。

     

    Ceph引入了一个叫CRUSH的新算法,而不是保存和操纵元数据。

     

    CRUSH是Controlled Replication Under Scalable Hashing的缩写,CRUSH算法在后台计算数据存储和读取的位置,而不是为每个客户端请求执行元数据表的查找。通过动态计算元数据,不需要管理一个集中式的元数据表。

     

    CRUSH使得Ceph能够自我管理和自我治愈。当故障区域中的组件故障时,CRUSH能够感知哪个组件故障了,并确定其对集群的影响。无须管理员的任何干预,CRUSH就会进行自我管理和自我疗愈,为因故障而丢失的数据执行恢复操作。

     

    使用CRUSH,我们能够设计一个没有单点故障的高度可靠的存储基础设施。它也使得Ceph成为一个面向未来的高度可扩展和可靠的存储系统。

     

    兼容性组合

    Ceph是一个完备的企业级存储系统,它支持多种协议以及访问方式。这个统一的存储支持Ceph块、文件和对象存储。

     

    Ceph块存储

    块存储是存储区域网络中使用的一个数据存储类别。

    在这种类型中,数据以块的形式存储在卷里,卷会挂接到节点上。这些块形成的卷会映射到操作系统中,并被文件系统层控制。

     

    Ceph引入了一个新的RBD协议,也就是Ceph块设备。RBD为客户端提供了可靠、分布式、高性能的块存储。RBD已经被Linux内核支持,几乎所有的Linux操作系统发行版都支持RBD。除了可靠性和性能之外,RBD也支持其他的企业级特性,如完整和增量式快照,精简的配置,写时复制式克隆以及全内存是缓存。

     

    Ceph RBD支持的最大镜像为16EB。这些镜像可以作为磁盘映射到物理机裸机、虚拟机或者其他主机用。业界领先的开源hypervisor,例如KVM和Xen完全支持RBD。

     

     

     

    Ceph文件系统

    Ceph文件系统(也就是CephFS)是一个兼容POSIX的文件系统,利用Ceph存储集群来保存用户数据。Linux内核驱动程序支持CephFS,这也使得CephFS高度适用于各大Linux操作系统发行版。CephFS将数据和元数据分开存储,为上层的应用程序提供较高的性能以及可靠性。

    在Ceph集群内部,Ceph文件系统库(libcephfs)运行在RADOS库(librados)之上,后者是Ceph存储集群协议,由文件、块和对象存储共用。要使用CephFS,集群节点上最少要配置一个Ceph元数据服务器(MDS),客户端可以采用多种方式使用CephFS。

     

    如果要把Ceph挂在成文件系统,客户端可以使用本地Linux内核的功能或者使用Ceph社区提供的ceph-fuse驱动。

     

    除此之外,客户端可以使用第三方开源程序,例如NFS的ganesha和SMB/CIFS的Samba。这些程序通过libcephfs将用户数据存入可靠的分布式Ceph存储集群。CephFS可以用来替代HDFS。也是通过libcephfs组件将数据存入Ceph集群。为了无缝实现这个功能,Ceph社区为Hadoop和Hadoop插件提供了必要的CephFS Java接口。

     


    Ceph对象存储

    对象存储是一种以对象形式而不是传统文件和块形式存储数据的方法。基于对象的存储已经引起了行业界的大量关注。为灵活地使用它们的巨量数据,这些组织正快速采用对象存储解决方案。

    Ceph是一个分布式对象存储系统,通过它的对象网关(object gateway),也就是RADOS网关(radosgw)提供对象存储接口。RADOS网关利用librgw(RADOS网关库)和librados这些库,允许应用程序跟Ceph对象存储建立连接。Ceph通过RESTful API提供可访问且最稳定的多租户对象存储解决方案之一。

    RADOS网关提供RESTful接口让用户的应用程序将数据存储到Ceph集群中。RADOS网关接口满足一下特点:

    兼容Swift:为OpenStack Swift API提供的对象存储功能;

    兼容S3:为Amazon S3 API提供的对象存储功能;

    Admin API:这也称为管理API或者原生API,应用程序可以直接使用它来获取访问存储系统的权限以管理存储系统。

     

    要访问Ceph的对象存储系统,也可以绕开RADOS网关层,librados软件库允许用户的应用程序通过C、C++、Java、Python和PHP直接访问Ceph对象存储。

     

    总结

    以上是对Ceph的整体框架做了一些介绍,后续我们将对里面的技术细节进行详细的讨论。

    展开全文
  • 干货|非常详细的 Ceph 介绍、原理、架构

    万次阅读 多人点赞 2019-09-13 00:39:06
    点击上方“民工哥技术之路”选择“星标”每天10点为你分享不一样的干货读者福利!多达 2048G 各种资源免费赠送作者:李航原文:https://www.jianshu....
        

    点击上方民工哥技术之路选择“星标”

    每天10点为你分享不一样的干货

    640?wx_fmt=jpeg

    640 读者福利!多达 2048G 各种资源免费赠送640

    作者:李航

    原文:https://www.jianshu.com/p/cc3ece850433

    1. Ceph架构简介及使用场景介绍


    1.1 Ceph简介

    Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。

    Ceph项目最早起源于Sage就读博士期间的工作(最早的成果于2004年发表),并随后贡献给开源社区。在经过了数年的发展之后,目前已得到众多云计算厂商的支持并被广泛应用。RedHat及OpenStack都可与Ceph整合以支持虚拟机镜像的后端存储。


    1.2 Ceph特点

    • 高性能

    • 高可用性

    • 高可扩展性

    • 特性丰富


    1.3 Ceph架构

    支持三种接口:

    • Object:有原生的API,而且也兼容Swift和S3的API。

    • Block:支持精简配置、快照、克隆。

    • File:Posix接口,支持快照。

      640?wx_fmt=png

      rados

    1.4 Ceph核心组件及概念介绍

    • Monitor

    • OSD

    • MDS

    • Object

    • PG

    • RADOS

    • Libradio

    • CRUSH

    • RBD

    • RGW

    • CephFS


    1.5 三种存储类型-块存储

    640?wx_fmt=png

    rbd

    典型设备:磁盘阵列,硬盘

    主要是将裸磁盘空间映射给主机使用的。

    优点

    • 通过Raid与LVM等手段,对数据提供了保护。

    • 多块廉价的硬盘组合起来,提高容量。

    • 多块磁盘组合出来的逻辑盘,提升读写效率。

    缺点

    • 采用SAN架构组网时,光纤交换机,造价成本高。

    • 主机之间无法共享数据。

    使用场景

    • docker容器、虚拟机磁盘存储分配。

    • 日志存储。

    • 文件存储。


    1.6 三种存储类型-文件存储

    640?wx_fmt=png

    fs

    典型设备:FTP、NFS服务器

    为了克服块存储文件无法共享的问题,所以有了文件存储。

    在服务器上架设FTP与NFS服务,就是文件存储。

    优点

    • 造价低,随便一台机器就可以了。

    • 方便文件共享。

    缺点

    • 读写速率低。

    • 传输速率慢。

    使用场景

    • 日志存储。

    • 有目录结构的文件存储。


    1.7 三种存储类型-对象存储

    640?wx_fmt=png

    rgw

    典型设备:内置大容量硬盘的分布式服务器(swift, s3)

    多台服务器内置大容量硬盘,安装上对象存储管理软件,对外提供读写访问功能。

    优点

    • 具备块存储的读写高速。

    • 具备文件存储的共享等特性。

    使用场景:(适合更新变动较少的数据)

    • 图片存储。

    • 视频存储。

    2. Ceph IO流程及数据分布

    640?wx_fmt=png

    rados_io_1


    2.1 正常IO流程图

    640?wx_fmt=png

    ceph_io_2

    步骤

    1. client 创建cluster handler。

    2. client 读取配置文件。

    3. client 连接上monitor,获取集群map信息。

    4. client 读写io 根据crshmap 算法请求对应的主osd数据节点。

    5. 主osd数据节点同时写入另外两个副本节点数据。

    6. 等待主节点以及另外两个副本节点写完数据状态。

    7. 主节点及副本节点写入状态都成功后,返回给client,io写入完成。


    2.2 新主IO流程图

    说明

    如果新加入的OSD1取代了原有的 OSD4成为 Primary OSD, 由于 OSD1 上未创建 PG , 不存在数据,那么 PG 上的 I/O 无法进行,怎样工作的呢?

    640?wx_fmt=png

    ceph_io_3

    步骤

    1. client连接monitor获取集群map信息。

    2. 同时新主osd1由于没有pg数据会主动上报monitor告知让osd2临时接替为主。

    3. 临时主osd2会把数据全量同步给新主osd1。

    4. client IO读写直接连接临时主osd2进行读写。

    5. osd2收到读写io,同时写入另外两副本节点。

    6. 等待osd2以及另外两副本写入成功。

    7. osd2三份数据都写入成功返回给client, 此时client io读写完毕。

    8. 如果osd1数据同步完毕,临时主osd2会交出主角色。

    9. osd1成为主节点,osd2变成副本。


    2.3 Ceph IO算法流程

    640?wx_fmt=png

    ceph_io_4

    1. File用户需要读写的文件。File->Object映射:

    a. ino (File的元数据,File的唯一id)。

    2. Object是RADOS需要的对象。Ceph指定一个静态hash函数计算oid的值,将oid映射成一个近似均匀分布的伪随机值,然后和mask按位相与,得到pgid。Object->PG映射:

    a. hash(oid) & mask-> pgid 。

    3. PG(Placement Group),用途是对object的存储进行组织和位置映射, (类似于redis cluster里面的slot的概念) 一个PG里面会有很多object。采用CRUSH算法,将pgid代入其中,然后得到一组OSD。PG->OSD映射:

    a. CRUSH(pgid)->(osd1,osd2,osd3) 。


    2.4 Ceph IO伪代码流程

    locator = object_name
    obj_hash =  hash(locator)
    pg = obj_hash % num_pg
    osds_for_pg = crush(pg)    # returns a list of osdsprimary = osds_for_pg[0]
    replicas = osds_for_pg[1:]
    

    2.5 Ceph RBD IO流程

    640?wx_fmt=png

    ceph_rbd_io

    步骤

    1. 客户端创建一个pool,需要为这个pool指定pg的数量。

    2. 创建pool/image rbd设备进行挂载。

    3. 用户写入的数据进行切块,每个块的大小默认为4M,并且每个块都有一个名字,名字就是object+序号。

    4. 将每个object通过pg进行副本位置的分配。

    5. pg根据cursh算法会寻找3个osd,把这个object分别保存在这三个osd上。

    6. osd上实际是把底层的disk进行了格式化操作,一般部署工具会将它格式化为xfs文件系统。

    7. object的存储就变成了存储一个文rbd0.object1.file。


    2.6 Ceph RBD IO框架图

    640?wx_fmt=png

    ceph_rbd_io1

    客户端写数据osd过程

    1. 采用的是librbd的形式,使用librbd创建一个块设备,向这个块设备中写入数据。

    2. 在客户端本地同过调用librados接口,然后经过pool,rbd,object、pg进行层层映射,在PG这一层中,可以知道数据保存在哪3个OSD上,这3个OSD分为主从的关系。

    3. 客户端与primay OSD建立SOCKET 通信,将要写入的数据传给primary OSD,由primary OSD再将数据发送给其他replica OSD数据节点。


    2.7 Ceph Pool和PG分布情况

    640?wx_fmt=png

    ceph_pool_pg

    说明

    • pool是ceph存储数据时的逻辑分区,它起到namespace的作用。

    • 每个pool包含一定数量(可配置)的PG。

    • PG里的对象被映射到不同的Object上。

    • pool是分布到整个集群的。

    • pool可以做故障隔离域,根据不同的用户场景不一进行隔离。


    2.8 Ceph 数据扩容PG分布

    场景数据迁移流程

    • 现状3个OSD, 4个PG

    • 扩容到4个OSD, 4个PG

    现状

    640?wx_fmt=png

    ceph_recory_1

    扩容后

    640?wx_fmt=png

    ceph_io_recry2

    说明

    每个OSD上分布很多PG, 并且每个PG会自动散落在不同的OSD上。如果扩容那么相应的PG会进行迁移到新的OSD上,保证PG数量的均衡。


    3. Ceph心跳机制


    3.1 心跳介绍

    心跳是用于节点间检测对方是否故障的,以便及时发现故障节点进入相应的故障处理流程。

    问题

    • 故障检测时间和心跳报文带来的负载之间做权衡。

    • 心跳频率太高则过多的心跳报文会影响系统性能。

    • 心跳频率过低则会延长发现故障节点的时间,从而影响系统的可用性。

    故障检测策略应该能够做到

    • 及时:节点发生异常如宕机或网络中断时,集群可以在可接受的时间范围内感知。

    • 适当的压力:包括对节点的压力,和对网络的压力。

    • 容忍网络抖动:网络偶尔延迟。

    • 扩散机制:节点存活状态改变导致的元信息变化需要通过某种机制扩散到整个集群。


    3.2 Ceph 心跳检测

    640?wx_fmt=png

    ceph_heartbeat_1

    OSD节点会监听public、cluster、front和back四个端口

    • public端口:监听来自Monitor和Client的连接。

    • cluster端口:监听来自OSD Peer的连接。

    • front端口:供客户端连接集群使用的网卡, 这里临时给集群内部之间进行心跳。

    • back端口:供客集群内部使用的网卡。集群内部之间进行心跳。

    • hbclient:发送ping心跳的messenger。


    3.3 Ceph OSD之间相互心跳检测

    640?wx_fmt=png

    ceph_heartbeat_osd

    步骤

    • 同一个PG内OSD互相心跳,他们互相发送PING/PONG信息。

    • 每隔6s检测一次(实际会在这个基础上加一个随机时间来避免峰值)。

    • 20s没有检测到心跳回复,加入failure队列。


    3.4 Ceph OSD与Mon心跳检测

    640?wx_fmt=png

    ceph_heartbeat_mon

    OSD报告给Monitor:

    • OSD有事件发生时(比如故障、PG变更)。

    • 自身启动5秒内。

    • OSD周期性的上报给Monito

      • OSD检查failure_queue中的伙伴OSD失败信息。

      • 向Monitor发送失效报告,并将失败信息加入failure_pending队列,然后将其从failure_queue移除。

      • 收到来自failure_queue或者failure_pending中的OSD的心跳时,将其从两个队列中移除,并告知Monitor取消之前的失效报告。

      • 当发生与Monitor网络重连时,会将failure_pending中的错误报告加回到failure_queue中,并再次发送给Monitor。

    • Monitor统计下线OSD

      • Monitor收集来自OSD的伙伴失效报告。

      • 当错误报告指向的OSD失效超过一定阈值,且有足够多的OSD报告其失效时,将该OSD下线。


    3.5 Ceph心跳检测总结

    Ceph通过伙伴OSD汇报失效节点和Monitor统计来自OSD的心跳两种方式判定OSD节点失效。

    • 及时:伙伴OSD可以在秒级发现节点失效并汇报Monitor,并在几分钟内由Monitor将失效OSD下线。

    • 适当的压力:由于有伙伴OSD汇报机制,Monitor与OSD之间的心跳统计更像是一种保险措施,因此OSD向Monitor发送心跳的间隔可以长达600秒,Monitor的检测阈值也可以长达900秒。Ceph实际上是将故障检测过程中中心节点的压力分散到所有的OSD上,以此提高中心节点Monitor的可靠性,进而提高整个集群的可扩展性。

    • 容忍网络抖动:Monitor收到OSD对其伙伴OSD的汇报后,并没有马上将目标OSD下线,而是周期性的等待几个条件:

      • 目标OSD的失效时间大于通过固定量osd_heartbeat_grace和历史网络条件动态确定的阈值。

      • 来自不同主机的汇报达到mon_osd_min_down_reporters。

      • 满足前两个条件前失效汇报没有被源OSD取消。

    • 扩散:作为中心节点的Monitor并没有在更新OSDMap后尝试广播通知所有的OSD和Client,而是惰性的等待OSD和Client来获取。以此来减少Monitor压力并简化交互逻辑。


    4. Ceph通信框架


    4.1 Ceph通信框架种类介绍

    网络通信框架三种不同的实现方式:

    • Simple线程模式

    • Async事件的I/O多路复用模式

    • XIO方式使用了开源的网络通信库accelio来实现


    4.2 Ceph通信框架设计模式

    设计模式(Subscribe/Publish):

    订阅发布模式又名观察者模式,它意图是“定义对象间的一种一对多的依赖关系,


    4.3 Ceph通信框架流程图

    640?wx_fmt=png

    ceph_message

    步骤

    • Accepter监听peer的请求, 调用 SimpleMessenger::add_accept_pipe() 创建新的 Pipe 到 SimpleMessenger::pipes 来处理该请求。

    • Pipe用于消息的读取和发送。该类主要有两个组件,Pipe::Reader,Pipe::Writer用来处理消息读取和发送。

    • Messenger作为消息的发布者, 各个 Dispatcher 子类作为消息的订阅者, Messenger 收到消息之后,  通过 Pipe 读取消息,然后转给 Dispatcher 处理。

    • Dispatcher是订阅者的基类,具体的订阅后端继承该类,初始化的时候通过 Messenger::add_dispatcher_tail/head 注册到 Messenger::dispatchers. 收到消息后,通知该类处理。

    • DispatchQueue该类用来缓存收到的消息, 然后唤醒 DispatchQueue::dispatch_thread 线程找到后端的 Dispatch 处理消息。

    640?wx_fmt=png

    ceph_message_2


    4.4 Ceph通信框架类图

    640?wx_fmt=png

    ceph_message_3


    4.5 Ceph通信数据格式

    通信协议格式需要双方约定数据格式。

    消息的内容主要分为三部分:

    • header              //消息头,类型消息的信封

    • user data          //需要发送的实际数据

      • payload     //操作保存元数据

      • middle      //预留字段

      • data          //读写数据

    • footer             //消息的结束标记

    class Message : public RefCountedObject {
    protected:
      ceph_msg_header  header;      // 消息头
      ceph_msg_footer  footer;      // 消息尾
      bufferlist       payload;  // "front" unaligned blob
      bufferlist       middle;   // "middle" unaligned blob
      bufferlist       data;     // data payload (page-alignment will be preserved where possible)
    
      /* recv_stamp is set when the Messenger starts reading the
       * Message off the wire */
      utime_t recv_stamp;       //开始接收数据的时间戳
      /* dispatch_stamp is set when the Messenger starts calling dispatch() on
       * its endpoints */
      utime_t dispatch_stamp;   //dispatch 的时间戳
      /* throttle_stamp is the point at which we got throttle */
      utime_t throttle_stamp;   //获取throttle 的slot的时间戳
      /* time at which message was fully read */
      utime_t recv_complete_stamp;  //接收完成的时间戳
    
      ConnectionRef connection;     //网络连接
    
      uint32_t magic = 0;           //消息的魔术字
    
      bi::list_member_hook<> dispatch_q;    //boost::intrusive 成员字段
    };
    
    struct ceph_msg_header {
        __le64 seq;       // 当前session内 消息的唯一 序号
        __le64 tid;       // 消息的全局唯一的 id
        __le16 type;      // 消息类型
        __le16 priority;  // 优先级
        __le16 version;   // 版本号
    
        __le32 front_len; // payload 的长度
        __le32 middle_len;// middle 的长度
        __le32 data_len;  // data 的 长度
        __le16 data_off;  // 对象的数据偏移量
    
    
        struct ceph_entity_name src; //消息源
    
        /* oldest code we think can decode this.  unknown if zero. */
        __le16 compat_version;
        __le16 reserved;
        __le32 crc;       /* header crc32c */
    } __attribute__ ((packed));
    
    struct ceph_msg_footer {
        __le32 front_crc, middle_crc, data_crc; //crc校验码
        __le64  sig; //消息的64位signature
        __u8 flags; //结束标志
    } __attribute__ ((packed));
    


    5. Ceph CRUSH算法


    5.1 数据分布算法挑战

    • 数据分布和负载均衡:

    • 灵活应对集群伸缩

    • 支持大规模集群


    5.2 Ceph CRUSH算法说明

    • CRUSH算法的全称为:Controlled Scalable Decentralized Placement of Replicated Data,可控的、可扩展的、分布式的副本数据放置算法。

    • pg到OSD的映射的过程算法叫做CRUSH 算法。(一个Object需要保存三个副本,也就是需要保存在三个osd上)。

    • CRUSH算法是一个伪随机的过程,他可以从所有的OSD中,随机性选择一个OSD集合,但是同一个PG每次随机选择的结果是不变的,也就是映射的OSD集合是固定的。


    5.3 Ceph CRUSH算法原理

    CRUSH算法因子:

    • 层次化的Cluster Map

    • Placement Rules


    5.3.1 层级化的Cluster Map

    640?wx_fmt=png

    ceph_crush

    CRUSH Map是一个树形结构,OSDMap更多记录的是OSDMap的属性(epoch/fsid/pool信息以及osd的ip等等)。

    叶子节点是device(也就是osd),其他的节点称为bucket节点,这些bucket都是虚构的节点,可以根据物理结构进行抽象,当然树形结构只有一个最终的根节点称之为root节点,中间虚拟的bucket节点可以是数据中心抽象、机房抽象、机架抽象、主机抽象等。


    5.3.2 数据分布策略Placement Rules

    数据分布策略Placement Rules主要有特点

    a. 从CRUSH Map中的哪个节点开始查找

    rule replicated_ruleset  #规则集的命名,创建pool时可以指定rule集
    {
        ruleset 0                #rules集的编号,顺序编即可   
        type replicated          #定义pool类型为replicated(还有erasure模式)   
        min_size 1                #pool中最小指定的副本数量不能小1
        max_size 10               #pool中最大指定的副本数量不能大于10       
        step take default         #查找bucket入口点,一般是root类型的bucket    
        step chooseleaf  firstn  0  type  host #选择一个host,并递归选择叶子节点osd     
        step emit        #结束
    }
    

    5.3.3 Bucket随机算法类型

    640?wx_fmt=png

    ceph_bucket

    • 一般的buckets:适合所有子节点权重相同,而且很少添加删除item。

    • list buckets:适用于集群扩展类型。增加item,产生最优的数据移动,查找item,时间复杂度O(n)。

    • tree buckets:查找负责度是O (log n), 添加删除叶子节点时,其他节点node_id不变。

    • straw buckets:允许所有项通过类似抽签的方式来与其他项公平“竞争”。定位副本时,bucket中的每一项都对应一个随机长度的straw,且拥有最长长度的straw会获得胜利(被选中),添加或者重新计算,子树之间的数据移动提供最优的解决方案。


    5.4 CRUSH算法案例

    说明

    集群中有部分sas和ssd磁盘,现在有个业务线性能及可用性优先级高于其他业务线,能否让这个高优业务线的数据都存放在ssd磁盘上。

    普通用户

    640?wx_fmt=png

    ceph_sas.png

    高优用户

    640?wx_fmt=png

    ssd

    配置规则

    640?wx_fmt=png

    ceph_crush1


    6. 定制化Ceph RBD QOS


    6.1 QOS介绍

    QoS (Quality of Service,服务质量)起源于网络技术,它用来解决网络延迟和阻塞等问题,能够为指定的网络通信提供更好的服务能力。

    问题

    我们总的Ceph集群的iIO能力是有限的,比如带宽,IOPS。如何避免用户争取资源,如果保证集群所有用户资源的高可用性,以及如何保证高优用户资源的可用性。所以我们需要把有限的IO能力合理分配。


    6.2 Ceph IO操作类型

    • ClientOp:来自客户端的读写I/O请求。

    • SubOp:osd之间的I/O请求。主要包括由客户端I/O产生的副本间数据读写请求,以及由数据同步、数据扫描、负载均衡等引起的I/O请求。

    • SnapTrim:快照数据删除。从客户端发送快照删除命令后,删除相关元数据便直接返回,之后由后台线程删除真实的快照数据。通过控制snaptrim的速率间接控制删除速率。

    • Scrub:用于发现对象的静默数据错误,扫描元数据的Scrub和对象整体扫描的deep Scrub。

    • Recovery:数据恢复和迁移。集群扩/缩容、osd失效/从新加入等过程。


    6.3 Ceph 官方QOS原理

    640?wx_fmt=png

    ceph_mclok_qos

    mClock是一种基于时间标签的I/O调度算法,最先被Vmware提出来的用于集中式管理的存储系统。(目前官方QOS模块属于半成品)。

    基本思想:

    • reservation 预留,表示客户端获得的最低I/O资源。

    • weight 权重,表示客户端所占共享I/O资源的比重。

    • limit 上限,表示客户端可获得的最高I/O资源。


    6.4 定制化QOS原理


    6.4.1 令牌桶算法介绍

    640?wx_fmt=png

    ceph_token_qos

    基于令牌桶算法(TokenBucket)实现了一套简单有效的qos功能,满足了云平台用户的核心需求。

    基本思想

    • 按特定的速率向令牌桶投放令牌。

    • 根据预设的匹配规则先对报文进行分类,不符合匹配规则的报文不需要经过令牌桶的处理,直接发送。

    • 符合匹配规则的报文,则需要令牌桶进行处理。当桶中有足够的令牌则报文可以被继续发送下去,同时令牌桶中的令牌量按报文的长度做相应的减少。

    • 当令牌桶中的令牌不足时,报文将不能被发送,只有等到桶中生成了新的令牌,报文才可以发送。这就可以限制报文的流量只能是小于等于令牌生成的速度,达到限制流量的目的。


    6.4.2 RBD令牌桶算法流程

    640?wx_fmt=png

    ceph_token1

    步骤

    • 用户发起请求异步IO到达Image中。

    • 请求到达ImageRequestWQ队列中。

    • 在ImageRequestWQ出队列的时候加入令牌桶算法TokenBucket。

    • 通过令牌桶算法进行限速,然后发送给ImageRequest进行处理。


    6.4.3 RBD令牌桶算法框架图

    现有框架图:

    640?wx_fmt=png

    ceph_qos2

    令牌图算法框架图:

    640?wx_fmt=png

    ceph_qos_token2

    关注 民工哥技术之路 微信公众号对话框回复关键字:1024 可以获取一份最新整理的技术干货。

    640?wx_fmt=gif

    我在网盘中看到了无数人泄露的私密文件

    sonar+Jenkins 构建代码质量自动化分析平台

    警惕!又一疑似东南亚“黑砖窑”人才输送基地

    不想起标题,只想发红包~|读者福利

    使用 zabbix 监控 tomcat(包含jvm监控)

    怎么选?毕竟可以上网的浏览器只剩下四款了...

    这 8 个 Python 技巧让你的数据分析提升数倍!

    640?wx_fmt=jpeg

    点击【阅读原文】和民工哥一起聊技术、搞事情~~

    不管怎样

    点“在看”一定不能放弃啊!

    展开全文
  • Ceph基础篇

    千人学习 2019-07-18 10:59:31
    本课程主要讲解了以下几个方面:首先讲解了 Ceph 存储和组件的介绍,让大家了解到有哪些功能以及使用的一些地方。随后讲解了 使用 ceph-deploy 怎么去部署一个多节点的Ceph 集群架构,最后又详细的介绍了Ceph的块...
  • 第五篇: Ceph集群运维

    千次阅读 2019-08-05 22:32:07
    本部分介绍了 Ceph 集群的常用操作,包括进程的起停、集群的监控、用户管理、MDS/MON/OSD 的增加和删除、存储池(pool)的操作、修改集群的配置,以及 Crushmap 的管理、修改 Monitor 的 IP 等操作。 1 MDS增删 1.1 ...

    常用操作

    本部分介绍了 Ceph 集群的常用操作,包括进程的起停、集群的监控、用户管理、MDS/MON/OSD 的增加和删除、存储池(pool)的操作、修改集群的配置,以及 Crushmap 的管理、修改 Monitor 的 IP 等操作。

    1 MDS增删

    1.1 新增元数据服务器(metadata server)

    1. 创建一个存储mds的数据节点:/var/lib/ceph/mds/ceph-{$id},id表示元数据服务器的名称,可根据需求自行定义。

      例如:

      sudo mkdir /var/lib/ceph/mds/ceph-`hostname`
      sudo chown ceph:ceph -R /var/lib/ceph/mds/ceph-`hostname`
      
    2. 修改ceph.conf,增加MDS

      [mds.{$id}]
      host = {hostname}
      

      例如:

      [mds.ceph-1]
      host = ceph-1
      
    3. 如果使用了CephX验证,则创建验证密钥;否则调过此步骤

      sudo ceph auth get-or-create mds.{$id} mon 'profile mds' mgr 'profile mds' mds 'allow *' osd 'allow *' > /var/lib/ceph/mds/ceph-{$id}/keyring
      
    4. 启动mds服务

      sudo cp /usr/lib/systemd/system/ceph-mds@.service /usr/lib/systemd/system/ceph-mds@`hostname`.service 
      sudo systemctl start ceph-mds@`hostname`
      sudo systemctl enable ceph-mds@`hostname`
      
    5. 查看mds服务的状态

      ceph mds stat
      
      cephfs-1/1/1 up  {0=ceph-1=up:active}, 2 up:standby
      

    1.2 删除元数据服务器(metadata server)

    注意:在删除元数据服务器之前一定要确保有剩余的备选元数据服务器为ceph客户端提供服务。如果没有的话,那么需要先新增一个元数据服务器(安照上述方法),然后再进行删除。已确保cephfs服务能够正常被使用

    如果有备用的元数据服务器,则可以执行下述的删除操作:

    1. 停止元数据服务

      ceph mds fail <mds name>
      

      例如:

      ceph mds fail ceph-1
      
    2. 删除元数据服务的目录

      sudo rm -rf /var/lib/ceph/mds/ceph-{$id}
      

      例如:

      sudo rm -rf /var/lib/ceph/mds/ceph-ceph-1
      

    2 OSD增删

    2.1 新增osd(不增加新机器)

    2.1.1 创建osd进程相关的disk

    使用fdisk工具格式化磁盘,生成osd进程的磁盘以及journal磁盘

    sudo umount /disk3  #先将挂载在/dev/sde上的disk3 umount掉
    sudo fdisk /dev/sde
    
    WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
    Welcome to fdisk (util-linux 2.23.2).
    
    Changes will remain in memory only, until you decide to write them.
    Be careful before using the write command.
    
    
    Command (m for help): p(显示该磁盘的分区情况)
    Command (m for help): d(删除该磁盘的所有分区)
    Command (m for help): g(将磁盘的文件格式变成gpt)
    Command (m for help): n(创建新分区,创建两个,一个为journal(10G),一个为data)
    Command (m for help): w(保存退出)
    

    2.1.2 创建osd(step by step)

    2.1 添加一个新osd,id可以省略,ceph会自动使用最小可用整数,第一个osd从0开始
    ceph osd create {id}

    ceph osd create
    3
    

    2.2 初始化osd目录

    创建osd.3目录,目录名格式{cluster-name}-{id}
    mkdir /var/lib/ceph/osd/{cluster-name}-{id}

    sudo mkdir /var/lib/ceph/osd/ceph-3
    

    2.3 挂载osd.0的数据盘/dev/sde2

    sudo mkfs.xfs /dev/sdb2
    sudo mount /dev/sdc2 /var/lib/ceph/osd/ceph-3
    

    2.4 初始化osd数据目录

    
    sudo ceph-osd -i 3 --mkfs --mkkey
    --mkkey要求osd数据目录为空
    

    这会创建osd.0的keyring /var/lib/ceph/osd/ceph-0/keyring

    初始化后,默认使用普通文件/var/lib/ceph/osd/ceph-3/journal作为osd.3的journal分区,普通文件作为journal分区性能不高,若只是测试环境,可以跳过更改journal分区这一步骤

    2.5 创建journal

    生成journal分区,一般选ssd盘作为journal分区,这里使用ssd的/dev/sde1分区作为journal

    使用fdisk工分出磁盘/dev/sde1,

    sudo mkfs.xfs /dev/sde1
    sudo rm -f /var/lib/ceph/osd/ceph-3/journal 
    查看分区对应的partuuid, 找出/dev/sdb1对应的partuuid
    
    sudo blkid
    sudo ln -s /dev/disk/by-partuuid/b3897364-8807-48eb-9905-e2c8400d0cd4 /var/lib/ceph/osd/ceph-3/journal
    
    sudo chown ceph:ceph -R /var/lib/ceph/osd/ceph-3
    sudo chown ceph:ceph /var/lib/ceph/osd/ceph-3/journal
    sudo ceph-osd --mkjournal -i 3
    sudo chown ceph:ceph /var/lib/ceph/osd/ceph-3/journal
    

    2.6 注册osd.{id},id为osd编号,默认从0开始
    sudo ceph auth add osd.{id} osd ‘allow *’ mon ‘allow profile osd’ -i /var/lib/ceph/osd/ceph-{id}/keyring

    sudo ceph auth add osd.3 osd 'allow *' mon 'allow profile osd' -i /var/lib/ceph/osd/ceph-3/keyring
    

    2.7 加入crush map
    ceph osd crush add-bucket {hostname} host

    sudo ceph osd crush add-bucket `hostname` host
    

    2.8 然后把osd节点移动到默认的root default下面

    sudo ceph osd crush move `hostname` root=default
    

    2.9 添加osd.3到CRUSH map中的m1节点下面,加入后,osd.3就能够接收数据
    ceph osd crush add osd.{id} 0.4 root=sata rack=sata-rack01 host=sata-node5

    sudo ceph osd crush add osd.3 1.7 root=default host=`hostname`
    

    0.4为此osd在CRUSH map中的权重值,它表示数据落在此osd上的比重,是一个相对值,一般按照1T磁盘比重值为1来计算,这里的osd数据盘1.7,所以值为1.7

    此时osd.0状态是downinin表示此osd位于CRUSH map,已经准备好接受数据,down表示osd进程运行异常,因为我们还没有启动osd.0进程

    2.10 启动ceph-osd进程

    需要向systemctl传递osd的id以启动指定的osd进程,如下,我们准备启动osd.3进程
    systemctl start ceph-osd@{id} id表示osd编号,从数字0开始

    sudo cp /usr/lib/systemd/system/ceph-osd@.service /usr/lib/systemd/system/ceph-osd@3.service
    sudo systemctl start ceph-osd@3
    sudo systemctl enable ceph-osd@3
    

    上面就是添加osd.3的步骤,可以查看集群状态 ceph -s。

    2.2 新增osd(增加新机器)

    2.2.1 配置环境

    2.1 修改yum源

    这里将yum源修改成aliyun的源,指令如下:

    curl http://mirrors.aliyun.com/repo/Centos-7.repo >/etc/yum.repos.d/CentOS-Base.repo
    curl http://mirrors.aliyun.com/repo/epel-7.repo >/etc/yum.repos.d/epel.repo 
    sed -i '/aliyuncs/d' /etc/yum.repos.d/CentOS-Base.repo
    sed -i '/aliyuncs/d' /etc/yum.repos.d/epel.repo
    

    2.2 添加ceph源

    sudo vim /etc/yum.repos.d/ceph.repo
    
    [ceph]
    name=ceph
    baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/x86_64/
    gpgcheck=0
    [ceph-noarch]
    name=cephnoarch
    baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/noarch/
    gpgcheck=0
    [ceph-source]
    name=ceph-source
    baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/SRPMS/
    gpgcheck=0
    

    2.3 安装软件

    sudo yum install ceph ntp ntpdate ntp-doc openssh-server
    

    验证ceph是否正确安装

    ceph -v
    ceph version 12.2.10 (177915764b752804194937482a39e95e0ca3de94) luminous (stable)
    

    2.4 关闭防火墙

    sudo sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
    sudo setenforce 0
    sudo systemctl stop firewalld 
    sudo systemctl disable firewalld
    

    2.2.2 新建osd(同步骤2.1)

    2.3 删除osd

    要想缩减集群尺寸或替换硬件,可在运行时删除 OSD 。在 Ceph 里,一个 OSD 通常是一台主机上的一个 ceph-osd 守护进程、它运行在一个硬盘之上。如果一台主机上有多个数据盘,你得逐个删除其对应 ceph-osd 。通常,操作前应该检查集群容量,看是否快达到上限了,确保删除 OSD 后不会使集群达到 near full 比率。

    警告: 删除 OSD 时不要让集群达到 full ratio 值,删除 OSD 可能导致集群达到或超过 full ratio值。

    1、停止需要剔除的 OSD 进程,让其他的 OSD 知道这个 OSD 不提供服务了。停止 OSD 后,状态变为 down

    ssh {osd-host}
    sudo stop ceph-osd id={osd-num}
    

    2、将 OSD 标记为 out 状态,这个一步是告诉 mon,这个 OSD 已经不能服务了,需要在其他的 OSD 上进行数据的均衡和恢复了。

    sudo ceph osd out {osd-num}
    

    执行完这一步后,会触发数据的恢复过程。此时应该等待数据恢复结束,集群恢复到 HEALTH_OK 状态,再进行下一步操作。

    3、删除 CRUSH Map 中的对应 OSD 条目,它就不再接收数据了。你也可以反编译 CRUSH Map、删除 device 列表条目、删除对应的 host 桶条目或删除 host 桶(如果它在 CRUSH Map 里,而且你想删除主机),重编译 CRUSH Map 并应用它。

    sudo ceph osd crush remove osd.{osd-num}
    

    该步骤会触发数据的重新分布。等待数据重新分布结束,整个集群会恢复到 HEALTH_OK 状态。

    4、删除 OSD 认证密钥:

    ceph auth del osd.{osd-num}
    

    5、删除 OSD 。
    ceph osd rm {osd-num}

    ceph osd rm 1
    

    6、卸载 OSD 的挂载点。

    sudo umount /var/lib/ceph/osd/$cluster-{osd-num}
    

    7、登录到保存 ceph.conf 主拷贝的主机。

    ssh {admin-host}
    cd /etc/ceph
    vim ceph.conf
    

    8、从 ceph.conf 配置文件里删除对应条目。

    [osd.1]
    host = {hostname}
    

    9、从保存 ceph.conf 主拷贝的主机,把更新过的 ceph.conf 拷贝到集群其他主机的 /etc/ceph 目录下。

    如果在 ceph.conf 中没有定义各 OSD 入口,就不必执行第 7 ~ 9 步。

    所有的osd节点下线删除之后:
    ceph osd crush remove {hostname} 将主机条目从crush map中删除
    ceph -s 等待集群变为active+clean状态

    3 MON增删

    3.1 增加MON节点

    在ceph.conf文件中增加mon节点信息

    mon initial members = hostname1,hostname2,new_mon_hostname
    mon host = IP1,IP2,new_mon_ip
    

    创建mon进程

    host_name=`hostname`
    sudo ceph mon getmap -o /tmp/monmap
    sudo rm -rf /var/lib/ceph/mon/ceph-$host_name
    sudo ceph-mon -i $host_name --mkfs --monmap /tmp/monmap
    sudo chown -R ceph:ceph /var/lib/ceph/mon/ceph-$host_name/
    

    启动mon进程

    sudo cp /usr/lib/systemd/system/ceph-mon@.service /usr/lib/systemd/system/ceph-mon@$host_name.service
    sudo systemctl start ceph-mon@$host_name
    sudo systemctl enable ceph-mon@$host_name
    

    4 客户端挂载

    4.1 kernel client挂载

    • 挂载之前需要下载安装ceph-common
    sudo yum install ceph-common
    
    • 挂载命令如下:
    mount -t ceph <monitor1-host-name>:6789,<monitor2-host-name>:6789,<monitor3-host-name>:6789:/ <mount-point>
    

    Example:

    sudo mkdir -p /gruntdata/lipeibao_ceph
    sudo mount -t ceph 11.188.199.210:6789:/ /mnt/mycephfs
    

    4.2 ceph-fuse挂载

    • 挂载之前需要下载安装ceph-common,ceph-fuse
    sudo yum install ceph-common ceph-fuse
    
    • 将monitor上的ceph配置文件拷贝到该客户端

    Example:

    sudo vim /etc/ceph/ceph.conf
    [global]
    fsid = $genuuid
    mon initial members = hostname1
    mon host = IP1,IP2,IP3
    rbd default features = 1
    auth_cluster_required = none
    auth_service_required = none
    auth_client_required = none
    public network = 11.165.0.0/16
    cluster network = 11.165.0.0/16
    osd journal size = 1024
    osd pool default size = 2 
    osd pool default min size = 1
    osd pool default pg num = 1000 
    osd pool default pgp num = 1000
    osd crush chooseleaf type = 1
    mon_max_pg_per_osd = 200
    
    [mon]
    mon allow pool delete = true
    
    [mds.hostname1]
    host = hostname1
    
    • 在管理机或者monitor机器上创建客户端用户及权限、密钥

      ceph auth get-or-create client.<client-name/id> mon 'allow r' mds 'allow r, allow rw path=<directory>' osd 'allow rw pool=<pool>' -o <file_name>
      
      1. client.<client-name/id>:用于指定客户端的名称或者id
      2. mon ‘allow r’: 指定客户端访问mon的权限,只读
      3. mds ‘allow r, allow rw path=’: 指定客户端访问mds的权限,只读,并指定读写的路径
      4. osd ‘allow rw pool=’: 指定客户端访问osdd权限,读写,并指定读写的pool
      5. <file_name>: 客户端的配置信息存放文件

      Example:

      $ ceph auth get-or-create client.1 mon 'allow r' mds 'allow r, allow rw path=/' osd 'allow rw pool=data' -o ceph.client.1.keyring
      [client.1]
      	key = AQACNoZXhrzqIRAABPKHTach4x03JeNadeQ9Uw==
      

    5 客户端剔除

    登录主mds服务器, 查看所有连接的客户端信息:

    sudo ceph daemon mds.`hostname` session ls 
    

    找到需要剔除的客户端id,然后执行下述命令:

    sudo ceph tell mds.`hostname` client evict id=客户端id
    

    这是客户端地址会存在blcaklist中,如果要重新挂载,需要将其从blacklist中删除:

    sudo ceph osd blcaklist ls
    

    删除对应的address

    sudo ceph osd blacklist rm address
    

    6 ceph集群参数调整

    6.1 pool 参数的查看

    1. 查看指定pool的相关参数
    ceph osd pool get {pool_name} pg_num 
    
    1. 设置指定pool的相关参
      set 操作需要慎重,否则会影响集群的服务
    ceph osd pool set {pool_name} pg_num 1024
    

    7 osd集群数据balance处理

    7.1 balancer 插件

    ceph集群在使用过程中,经常会遇到osd存储分布不均衡的情况,如下图是我们线上ceph集群的osd分布情况:
    可参考:https://docs.ceph.com/docs/mimic/mgr/balancer/
    具体操作如下:
    checklist:
    ** 1. all buckets should use straw2:**

    ceph osd getcrushmap -o crush.map; crushtool -d crush.map | grep straw; rm -f crush.map
    253
    tunable straw_calc_version 1
      alg straw2
      alg straw2
      alg straw2
      alg straw2
      alg straw2
      alg straw2
      alg straw2
      alg straw2
      alg straw2
      alg straw2
      alg straw2
      alg straw2
      alg straw2
      alg straw2
      alg straw2
      alg straw2
      alg straw2
    

    如果存在非straw2,update

    ceph osd crush set-all-straw-buckets-to-straw2
    

    2. minimum client version is jewel or higher:

    ceph osd dump|grep require_min_compat_client;
      require_min_compat_client jewel
    

    Ceph distribution balancer:
    Activate balancing:

    ceph mgr module ls
    ceph mgr module enable balancer
    ceph balancer on
    ceph balancer mode crush-compat
    ceph config-key set "mgr/balancer/max_misplaced": "0.01"
    

    Show configuration and state:

    ceph config-key dump
    ceph balancer status
    
    展开全文
  • CEPH简介

    千次阅读 2019-09-30 15:02:10
    无论您是要向Cloud Platform提供Ceph对象存储和/或Ceph块设备服务,部署Ceph文件系统还是将Ceph用于其他目的,所有Ceph Storage Cluster部署都首先要设置每个Ceph节点,您的网络和Ceph。存储集群。一个Ceph存储群集...
  • ceph架构/IO原理分析(齐全)

    千次阅读 2019-03-22 10:07:25
    1. Ceph架构简介及使用场景介绍 1.1 Ceph简介 Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。 Ceph项目最早起源于Sage就读博士期间的工作(最早的成果于2004年发表),并...
  • ceph-部署篇(快速部署)

    千次阅读 2019-05-28 13:18:07
    环境 主机名 IP ... Ceph1 192.168.48.132 Centos7 Ceph2 192.168.48.133 Centos7 ...
  • Ceph -存储部署 ;

    千次阅读 2018-08-17 12:43:14
    一 、 Ceph存储系统概述 Ceph是呼声很高的开源分布式的SDS产品存储系统。 同时提供对象存储、块存储和文件系统存储 三种功能,满足不同应用需求。 Ceph使用C++语言开发,遵循LGPL协议开源。Sage Weil(Ceph论文发表...
  • ceph 快照:可用做备份 一、ceph概述 1.1 什么是分布式文件系统 • &amp;nbsp;分布式文件系统(Distributed File System)是指文 件系统管理的物理存储资源不一定直接连接在本地节 点上,而是通过计算机网络与...
  • ceph

    2018-10-25 10:39:00
    [root@ceph1 ~]# systemctl restart chronyd [root@ceph1 ~]# for i in {2..5} &gt; do &gt; scp /etc/chrony.conf 192.168.4.$i:/etc/chrony.conf  &gt; done chrony.conf ...
  • 【实践】Ceph:创建Cephfs文件

    千次阅读 2017-08-06 22:53:32
    Ceph文件系统(CEPH FS)是一个POSIX兼容的文件系统,使用Ceph的存储集群来存储其数据。
  • ceph常用命令

    千次阅读 2018-06-18 08:47:37
    启动一个ceph进程 启动mon进程 service ceph start mon.node1 启动msd进程 service ceph start mds.node1 启动osd进程 service ceph start osd.0 查看机器的监控状态 ceph health 查看ceph的...
  • 使用ceph的对象存储

    万次阅读 2018-06-01 01:26:50
    Ceph 对象存储 Ceph 对象存储使用 Ceph 对象网关守护进程( radosgw ),它是个与 Ceph 存储集群交互的 FastCGI 模块。因为它提供了与 OpenStack Swift 和 Amazon S3 兼容的接口, RADOS 要有它自己的用户管理。 ...
  • 使用ceph的文件存储CephFS

    万次阅读 2018-05-27 17:23:59
    Ceph FS是一个支持POSIX接口的文件系统,它使用 Ceph 存储集群来存储数据。文件系统对于客户端来说可以方便的挂载到本地使用。Ceph FS构建在RADOS之上,继承RADOS的容错性和扩展性,支持冗余副本和数据高可靠性。 ...
  • ceph新增节点

    千次阅读 2018-05-26 23:27:08
    我们在上一篇文章中已经学习了手动安装cephceph的挂载使用 手动安装ceph和使用 本章记录我们在日常运维中经常遇到的场景,就是如何给这个集群扩容–增加节点。 假如我们新采购了一台服务器想融入到ceph集群中,...
  • 手动安装ceph和使用

    千次阅读 2018-05-19 18:34:28
    我们已经对ceph有了一个大概的了解,现在就进行手动的安装ceph集群。 在我们安装集群之前,首先应该对自己的服务器环境以及集群节点作用做一个规划。 架构设计 Ceph 分布式存储集群有三大组件组成,分为:Ceph ...
  • 案例2:部署ceph集群 案例3:创建Ceph块存储 1 案例1:实验环境 1.1 问题 准备四台KVM虚拟机,其三台作为存储集群节点,一台安装为客户端,实现如下功能: 创建1台客户端虚拟机 创建3台存储集群虚拟机 配置主机名、...
  • Ceph安装部署详解

    千次阅读 2019-09-05 13:14:14
    Ceph介绍 1.1. Ceph 介绍 在过去几年中,数据存储需求急剧增长。研究表明,大型组织中的数据正以每年40%到60%的速度增长,许多公司每年的数据都翻了一番。国际数据公司(IDC)的分析师估计,到2000年,全球共有54.4 ...
1 2 3 4 5 ... 20
收藏数 28,930
精华内容 11,572
关键字:

ceph