一、Ceph的架构

Ceph Cluster:

  • Heart of Ceph distributed object store   是Ceph分布式对象存储的核心

  • Referred to as reliable autonomic distributed object store (RADOS)  

  • Consists of device nodes and monitor nodes  由OSD节点和Monitor节点组成


Device nodes  OSD节点

  • Servers with multiple disks   X86服务器配置了较多的磁盘

  • Each disk is Ceph object storage device (OSD)   每个磁盘是一个OSD

  • Daemons:进程

    • Join Ceph OSDs to cluster

    • Serve requests for data residing on OSDs

    • Communicate OSD status



Monitor nodes

  • Servers ideally distinct from OSD servers

  • Run intelligent daemons called Ceph MON daemons

  • Daemons monitor system state


二、Ceph的算法与设计


CRUSH数据放置算法

  • 基础设施感知、快速响应故障

  • 计算出数据位置

  • 客户端与存储数据的服务器通信

  • 客户端执行并行I / O以大大提高吞吐量




高度可扩展

  • 支持大量活动/活动元数据服务器

  • 提供高吞吐量和带宽

  • 非常可靠和可用

  • 完整的POSIX语义和一致性保证

  • 有FUSE客户端,集成到Linux内核中


三、Ceph的角色

Monitors

  • 主要作用:维护集群状态,为分布式决策提供共识

  • 管理关键RADOS集群状态和配置信息

  • 维护CRUSH Map的主副本

  • Ceph守护进程/客户端使用监视器检查以确保它们具有最新的映射副本

  • Monitor不向客户端提供存储的对象

  • 必须有奇数

  • 最低:三


Monitors的Quorum作用

  • 在具有偶数Monitors的群集中,群集可能会发生脑裂

  • 要使Ceph集群可操作/可访问,至少有一半以上的Monitors必须正在运行

  • 在关键环境中,请考虑5个Monitors

  • Monitors映射是Ceph集群为操作维护的一个映射



Ceph Journal

  • 为了提高性能/可靠性,Ceph OSD在写入文件系统时使用日志

  • 每个OSD都有专门使用的日志

  • 将每个操作的描述写入日志

  • 写入最少数量的副本日志时,写入RADOS群集

  • 提交对文件系统的操作

  • 进程可以对对象进行原子更新



Journals提高了可靠性

  • 如果OSD或节点出现故障,则重新启动时日志会replay

  • 保留“in-flight”事务,确保磁盘数据的一致性

  • replay序列在上次同步操作完成后开始,因为先前的日志记录被修剪掉了

  • Journals使用设备节点上的原始卷

  • 更好的性能,更高的一致性

  • 小I / O请求为主机文件系统提供了合并写入的时间

  • 每隔几秒,OSD停止写入,同步日志与执行的文件系统提交

  • 从日志修剪完成的操作以回收日志磁盘卷上的空间

  • 默认值:Ceph日志写入与OSD数据相同的磁盘

  • 更好的性能:配置日志以写入自己的高性能硬盘(SSD)



OSD包括:

  • One hard disk

  • One Linux file system

  • One Ceph OSD daemon


文件系统

  • 每个OSD将磁盘和底层文件系统连接到Ceph集群

  • 文件系统必须是xfs或ext4

           后续会支持ZFS

  • 必须支持并启用XATTR

  • 用于存储和检索有关以下内容的信息:

           内部对象状态

           快照元数据

          Ceph网关访问控制列表(ACL)


文件系统选择推荐:从稳定性考虑,建议使用xfs

OSD设计和目标

  • 使计算能力尽可能接近数据

  • 启用计算能力以执行最大程度的处理

  • 当前:OSD处理基于角色作为主要或次要的功能

  • 未来:Ceph利用OSD和数据之间的联系来扩展OSD计算能力



四、Ceph的Storage Pool

存储池:用于存储对象数据的逻辑分区

允许数据:

  • 在逻辑上分类

  • 存储在对象存储系统中时应用规则

对于存储对象,池定义/指定:

  • 所有权和访问权限

  • 对象副本数

  • PG的数量

  • CRUSH规则设置使用


Storage Pool的特性

  • Pool内的PG动态映射到OSD

  • 首次部署集群而不创建池时,Ceph使用默认池来存储数据

  • 为池指定的一个属性:存储在池中的对象的默认副本数

  • 池与CRUSH基于位置的buckets 不同,因为池中没有单个物理位置


Storage Pool的属性:


Ceph集群默认的三个Storage Pool

  • data

  • metadata

  • rbd


如果想创建额外的Storage Pool,需要指定:

  • Name

  • Number of PGs that can belong to pool


五、对Ceph访问方式

对Ceph的访问

  • 所有访问方法都建立在librados之上

  • 提供对Ceph集群(RADOS)的本机访问

  • 适用于C,C ++,Python,PHP,Java™,Erlang

  • 推荐:开发时,直接在应用程序中使用librados

  • librados为Ceph环境提供了访问,可靠性和性能的最佳结果


其他易于使用和实施的访问方法:

  • RADOS块设备(RBD)

  • RADOS网关(RADOSGW)

  • CephFS


CephFS:

  • 并行文件系统

  • 提供可大规模扩展的单层次共享磁盘

  • 元数据服务器(MDS)负责文件系统中文件的元数据信息

        示例:访问,修改,创建日期

                        在Ceph集群中存储数据



六、通过Ansible的部署Docker格式的Ceph


本实验,我们使用ansible部署Ceph3(Ceph3是docker image)。使用的镜像是由红帽官网提供:registry.access.redhat.com。


通过Ansible以Docker形式部署Ceph3_java


在实验环境中,有一个部署服务器。我们首先在部署服务器上安装docker-distribution,然后,从红帽官网拉取Ceph的docker imager。然后将Ceph集群节点上的镜像仓库指定到部署服务器上。


首先安装docker-distribution

通过Ansible以Docker形式部署Ceph3_java_02


配置docker-distribution的端口的域名:

通过Ansible以Docker形式部署Ceph3_java_03

生成证书:

启动docker-distribution进程:

在部署服务器上安装docker:


接下来,配置脚本,红帽官网拉取Ceph docker image,并推送到本地仓库:


部署服务器上安装ceph-ansible包

配置Ceph节点的inventory文件:

书写playbook,对节点进行预配置:

对三个节点进行预配置

接下来,创建对三个节点的admin用户ssh信任:


接下来,配置ansible.cfg(该配置文件中定义了ansible的主机的默认配置部分,如默认是否需要输入密码、是否开启sudo认证、action_plugins插件的位置、hosts主机组的位置、是否开启log功能、默认端口、key文件位置等等。)


配置all.yml文件,里面定义了ceph集群的相关参数:


osds.yml定了了OSD的参数配置:

mons.yml定义了和监控相关的参数


根据模板,创建site-docker.yml主playbook(下面贴出了具体内容供参考)

[root@workstation-e6c4 ~]# cat /usr/share/ceph-ansible/site-docker.yml


# Defines deployment design and assigns role to server groups


- hosts:

  - mons

  - agents

  - osds

  - mdss

  - rgws

  - nfss

  - restapis

  - rbdmirrors

  - clients

  - iscsigws

  - mgrs


  gather_facts: false


  tasks:


  become: True


  vars:

    delegate_facts_host: True


  pre_tasks:

    - name: gather facts

      setup:

      when:

        - not delegate_facts_host | bool


    - name: gather and delegate facts

      setup:

      delegate_to: "{{ item }}"

      delegate_facts: True

      with_items: "{{ groups['all'] }}"

      run_once: true

      when:

        - delegate_facts_host | bool


- hosts: mons

  become: True

  gather_facts: false

  roles:

    - ceph-defaults

    - ceph-docker-common

    - ceph-config

    - ceph-mon

  serial: 1 # MUST be '1' WHEN DEPLOYING MONITORS ON DOCKER CONTAINERS


- hosts: mgrs

  become: True

  gather_facts: false

  roles:

    - ceph-defaults

    - ceph-docker-common

    - { role: ceph-config, when: "ceph_release_num.{{ ceph_release }} >= ceph_release_num.luminous" }

    - { role: ceph-mgr, when: "ceph_release_num.{{ ceph_release }} >= ceph_release_num.luminous" }


- hosts: osds

  become: True

  gather_facts: false

  roles:

    - ceph-defaults

    - ceph-docker-common

    - ceph-config

    - ceph-osd


- hosts: mdss

  become: True

  gather_facts: false

  roles:

    - ceph-defaults

    - ceph-docker-common

    - ceph-config

    - ceph-mds


- hosts: rgws

  become: True

  gather_facts: false

  roles:

    - ceph-defaults

    - ceph-docker-common

    - ceph-config

    - ceph-rgw


- hosts: nfss

  become: True

  gather_facts: false

  roles:

    - ceph-defaults

    - ceph-docker-common

    - { role: ceph-config, when: "ceph_release_num.{{ ceph_release }} >= ceph_release_num.luminous" }

    - { role: ceph-nfs, when: "ceph_release_num.{{ ceph_release }} >= ceph_release_num.luminous" }


- hosts: rbdmirrors

  become: True

  gather_facts: false

  roles:

    - ceph-defaults

    - ceph-docker-common

    - ceph-config

    - ceph-rbd-mirror


- hosts: restapis

  become: True

  gather_facts: false

  roles:

    - ceph-defaults

    - ceph-docker-common

    - ceph-config

    - ceph-restapi


- hosts: clients

  become: True

  gather_facts: false

  roles:

  - ceph-defaults

  - ceph-docker-common

  - ceph-config

  - ceph-client


执行Playbook,安装Ceph:

通过Ansible以Docker形式部署Ceph3_java_04

通过Ansible以Docker形式部署Ceph3_java_05

通过Ansible以Docker形式部署Ceph3_java_06


在部署节点上安装 ceph-common 软件:

通过Ansible以Docker形式部署Ceph3_java_07

将管理秘钥复制到部署服务器:

通过Ansible以Docker形式部署Ceph3_java_08

查看Ceph集群的状态:

通过Ansible以Docker形式部署Ceph3_java_09

查看Ceph集群的健康状态:

通过Ansible以Docker形式部署Ceph3_java_10

查看OSD:

通过Ansible以Docker形式部署Ceph3_java_11

接下来,到ceph-node2上检查docker(可以看到mgr、osd、mon角色都是以docker方式在运行)

查看Ceph进程(docker的系统守护进程):

通过Ansible以Docker形式部署Ceph3_java_12

部署成功。