1、集群部署工具

1.1、ceph-deploy

ceph原生部署工具,借助于SSH工作,无法处理客户端的配置。可用来安装或清理Ceph集群。本次使用ceph-deploy部署。

1.2、ceph-ansible

redhat推荐部署方式,由redhat维护,通过ansible playbooks实现。
https://github.com/ceph/ceph-ansible

1.2、ceph-chef

Ceph的chef部署工具
https://github.com/ceph/ceph-chef

2、集群拓扑规划

Ceph集群拓扑推荐必要组件节点双网卡。

  • 一块用于集群内部网络Cluster Network(可选),用于处理集群内部事务。
  • 另外一块用于客户端访问网络Public Network,用于处理客户端请求。

本次部署版本为nautilus版。

角色 主机名 Cluster Network Public Network OSD
admin、client ceph-admin.yull.cc 10.37.129.14 10.211.55.100
mon、osd、mgr、mds ceph-mon1.yull.cc 10.37.129.12 10.211.55.101 sdb、sdc
mon、osd、mgr、rgw ceph-mon2.yull.cc 10.37.129.11 10.211.55.102 sdb、sdc
mon、osd、rgw ceph-mon3.yull.cc 10.37.129.13 10.211.55.103 sdb、sdc

3、基础环境设置

各节点需要进行一下系统环境设置:

  • NTP时间同步;
  • DNS或者hosts文件进行主机名解析;
  • 关闭各节点firewalld和iptables;
  • 各节点禁用SELinux;
  • 创建ceph管理用户,并添加sudo权限;
  • 各节点直接需要配置ssh免密认证;
  • 修改主机名;

    3.1、NTP时间同步

    添加NTP时间同步Crontab或者安装启用chronyd服务。

    1. # 启用crontab
    2. ]$ */1 * * * * /usr/sbin/ntpdate cn.pool.ntp.org
    3. # 或者安装chronyd
    4. ]$ yum -y install chrony
    5. ]$ systemctl start chronyd.service
    6. ]$ systemctl enable chronyd.service

    3.2、主机名解析

    1. ]$ cat /etc/hosts
    2. 10.211.55.101 ceph-mon1.yull.cc ceph-mon1 ceph-stor1.yull.cc ceph-stor1
    3. 10.211.55.102 ceph-mon2.yull.cc ceph-mon2 ceph-stor2.yull.cc ceph-stor2
    4. 10.211.55.103 ceph-mon3.yull.cc ceph-mon3 ceph-stor3.yull.cc ceph-stor3

    3.3、关闭防火墙及禁用SELinux

    Centos7上,默认使用firewalld。

    1. ]$ systemctl stop firewalld.service # 停止防火墙
    2. ]$ systemctl disable firewalld.service # 禁用启动
    3. ]$ sed -i 's@^\(SELINUX=\).*@\1disabled@' /etc/sysconfig/selinux # 永久关闭
    4. ]$ setenforce 0 # 临时关闭

    3.4、创建Ceph管理用户及sudo权限

    ceph-deploy建议以普通用户操作各节点,也可以使用”ceph-deploy —username {username}”指定用户,因此需要在各节点创建用于ceph集群管理和启动的用户,例如cephadm,并设置密码。

    1. ]$ useradd cephadm && echo "1234qwer" | passwd --stdin cephadm
    2. ]$ echo "cephadm ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephadm
    3. ]$ chmod 0440 /etc/sudoers.d/cephadm

    3.5、修改主机名

    1. ]$ hostnamectl set-hostname ceph-admin.yull.cc # cpeh-admin执行
    2. ]$ hostnamectl set-hostname ceph-mon1.yull.cc # ceph-mon1
    3. ]$ hostnamectl set-hostname ceph-mon2.yull.cc # ceph-mon2
    4. ]$ hostnamectl set-hostname ceph-mon3.yull.cc # ceph-mon3

    3.6、配置SSH免密认证

    ceph-deploy部署不支持交互式密码输入,因此必须在管理节点配置SSH免密登录。以cephadm用户生成SSH秘钥对并拷贝到各节点。

    1. ]$ ssh-keygen -t rsa
    2. ]$ ssh-copy-id -i .ssh/id_rsa.pub cephadm@ceph-mon1.magedu.com
    3. ]$ ssh-copy-id -i .ssh/id_rsa.pub cephadm@ceph-mon2.magedu.com
    4. ]$ ssh-copy-id -i .ssh/id_rsa.pub cephadm@ceph-mon3.magedu.com

    4、部署Ceph集群

    4.1、准备yum仓库

    Ceph官方仓库路径为http://download.ceph.com/,但因为网络问题,本次使用阿里云仓库。主流版本一般在仓库的noarch目录下。
    在ceph-admin节点上,安装nautilus版本yum仓库配置。

    1. ]$ rpm -ivh https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch/ceph-release-1-1.el7.noarch.rpm

    4.2、在管理节点安装ceph-deploy

    ceph集群部署的全程可以在管理节点通过ceph-deploy进行

    1. ]$ yum -y install ceph-deploy python-setuptools python2-subprocess32

    4.3、部署RADOS存储集群

    部署RADOS存储集群操作均使用cephadm用户。

    4.3.1、初始化RADOS集群
  • 在管理节点上创建集群相关配置文件和秘钥存储目录。集群创建过程中生成的所有文件均保存在此目录,因此创建后一定要cd到此目录,且后续操作均在此目录下完成。

    1. ]$ mkdir ceph-cluster
    2. ]$ cd ceph-cluster
  • 检查各节点环境,初始化命令格式为”ceph-deploy new {initial-monitor-node(s)}”。此操作会在指定节点检查连接状态、检查sudo权限并生成配置文件和秘钥环。

    1. ]$ ceph-deploy new --cluster-network 10.37.129.0/24 --public-network 10.211.55.0/24 ceph-mon{1..3}

    检查完成后,会在ceph-cluster目录生成三个文件: ```bash ]$ ll -rw-rw-r— 1 cephadm cephadm 315 Aug 14 22:43 ceph.conf # ceph配置文件 -rw-rw-r— 1 cephadm cephadm 7571 Aug 14 22:43 ceph-deploy-ceph.log -rw———- 1 cephadm cephadm 73 Aug 14 22:43 ceph.mon.keyring # ceph-mon秘钥环文件 ]$ cat ceph.conf [global] fsid = 817bb5ff-1b92-4734-baa8-f21ede4cb9c2 # 自动生成fsid public_network = 10.211.55.0/24 # public网络 cluster_network = 10.37.129.0/24 # cluster网络 mon_initial_members = ceph-mon1, ceph-mon2, ceph-mon3 mon_host = 10.211.55.101,10.211.55.102,10.211.55.103 # 指定public网络后,mon会自动使用public网络作为mon监听地址 auth_cluster_required = cephx # 集群认证协议 auth_service_required = cephx auth_client_required = cephx

  1. - 安装mon节点
  2. ```bash
  3. ]$ ceph-deploy install ceph-mon{1..3}

注意:运行此命令后,会在mon节点自动安装yum仓库配置文件,安装需要的程序包,此过程耗时很久,因此可以手动在mon节点通过yum安装程序包。

  1. ]$ rpm -ivh https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch/ceph-release-1-1.el7.noarch.rpm
  2. ]$ yum install ceph ceph-radosgw

注意:安装后再次运行install时,默认ceph-deploy会重新安装程序包,因此需要使用—no-adjust-repos指定不调整yum配置文件安装集群。

  1. ]$ ceph-deploy install --no-adjust-repos ceph-mon{1..3}
  • 初始化MON节点,并收集所有秘钥
    1. ]$ ceph-deploy mon create-initial
    初始化完成后,会在各mon节点启动ceph-mon进程,并在管理节点的ceph-cluster目录下生成keyring秘钥环文件。 ```bash ]$ ps -ef |grep ceph-mon # 任意mon节点 ceph 2229 1 0 23:02 ? 00:00:00 /usr/bin/ceph-mon -f —cluster ceph —id ceph-mon1 —setuser ceph —setgroup ceph

]$ ll # 管理节点执行 total 156 -rw———- 1 cephadm cephadm 113 Aug 14 23:03 ceph.bootstrap-mds.keyring -rw———- 1 cephadm cephadm 113 Aug 14 23:03 ceph.bootstrap-mgr.keyring -rw———- 1 cephadm cephadm 113 Aug 14 23:03 ceph.bootstrap-osd.keyring -rw———- 1 cephadm cephadm 113 Aug 14 23:03 ceph.bootstrap-rgw.keyring -rw———- 1 cephadm cephadm 151 Aug 14 23:03 ceph.client.admin.keyring

  1. 后续如需要重启mon进程,可使用以下命令:
  2. ```bash
  3. ]$ sudo systemctl start ceph-mon@ceph-mon3
  • 推送配置文件和admin秘钥拷贝到Ceph集群各节点,以免在各节点执行ceph命令时必须要指定mon节点地址和ceph.client.admin.keyring,同时需要在各节点配置允许普通用户读取keyring文件。

    1. ]$ ceph-deploy admin ceph-mon{1..3}
    2. ]$ cd /etc/ceph
    3. ]$ sudo chown cephadm:root ceph.client.admin.keyring

    后续如果修改了配置文件,也可以只推送配置文件到各节点

    1. ceph-deploy --overwrite-conf config push ceph-mon{1,2,3}
  • 配置MGR节点,启动MGR进程

    1. ]$ ceph-deploy mgr create ceph-mon1 ceph-mon2
    2. ]$ ps -ef |grep ceph-mgr # 查看进程是否启动
    3. ceph 2647 1 19 23:13 ? 00:00:02 /usr/bin/ceph-mgr -f --cluster ceph --id ceph-mon1 --setuser ceph --setgroup ceph

    后续如果需要重启mgr,可使用以下命令

    1. ]$ sudo systemctl start ceph-mgr@ceph-mon2
  • 查看集群状态

至此一个ceph集群的基本环境就安装好了,可以通过ceph -s查看集群状态

  1. ]$ yum -y install ceph-common # 管理节点需安装
  2. ]$ ceph-deploy admin ceph-admin # 将keyring文件推送到管理节点
  3. ]$ sudo chown cephadm:root ceph.client.admin.keyring
  4. ]$ ceph -s # 查看集群状态
  5. cluster:
  6. id: 817bb5ff-1b92-4734-baa8-f21ede4cb9c2 # 集群ID
  7. health: HEALTH_WARN # 集群运行状态
  8. OSD count 0 < osd_pool_default_size 3
  9. mons are allowing insecure global_id reclaim
  10. services:
  11. mon: 3 daemons, quorum ceph-mon1,ceph-mon2,ceph-mon3 (age 17m) # 监视器仲裁状态
  12. mgr: ceph-mon1(active, since 7m), standbys: ceph-mon2 # mgr管理器运行状态
  13. osd: 0 osds: 0 up, 0 in # OSD状态
  14. data:
  15. pools: 0 pools, 0 pgs # 存储池状态
  16. objects: 0 objects, 0 B
  17. usage: 0 B used, 0 B / 0 B avail # 存储池的数量和使用量
  18. pgs: # PG的数量

注意health警告信息:mons are allowing insecure global_id reclaim,解决办法为禁用不安全模式

  1. ]$ ceph config set mon auth_allow_insecure_global_id_reclaim false

4.4、向RADOS集群添加OSD

  • 检查列出OSD节点可用的磁盘信息

    1. ]$ ceph-deploy disk list ceph-stor{1..3}
    2. [ceph-stor1][INFO ] Disk /dev/sdb: 68.7 GB, 68719476736 bytes, 134217728 sectors
    3. [ceph-stor1][INFO ] Disk /dev/sdc: 68.7 GB, 68719476736 bytes, 134217728 sectors
  • 在管理节点擦除计划用于OSD磁盘上的分区表和数据。

    1. ]$ ceph-deploy disk zap ceph-stor1 /dev/sdb
    2. ]$ ceph-deploy disk zap ceph-stor1 /dev/sdc
    3. ]$ ceph-deploy disk zap ceph-stor2 /dev/sdb
    4. ]$ ceph-deploy disk zap ceph-stor2 /dev/sdc
    5. ]$ ceph-deploy disk zap ceph-stor3 /dev/sdb
    6. ]$ ceph-deploy disk zap ceph-stor3 /dev/sdc
  • 添加OSD,默认使用的存储引擎为bluestor

    1. ]$ ceph-deploy osd create ceph-stor1 --data /dev/sdb
    2. ]$ ceph-deploy osd create ceph-stor2 --data /dev/sdb
    3. ]$ ceph-deploy osd create ceph-stor3 --data /dev/sdb
    4. ]$ ceph-deploy osd create ceph-stor1 --data /dev/sdc
    5. ]$ ceph-deploy osd create ceph-stor2 --data /dev/sdc
    6. ]$ ceph-deploy osd create ceph-stor3 --data /dev/sdc

    使用BlueStor时,如果有不同设备存放不同数据,可以使用—data指定数据存放磁盘,—block-db指定rocksdb存放的位置,—block-wal指定rocksdb日志存放的位置。

    1. ]$ ceph-deploy osd create {node} --data /path/to/data --block-db /path/to/db-device --block-wal /path/to/wal-device

    如果使用FileStor时,仅支持—data指定数据存放目录,—journal指定日志存放目录。

    1. ]$ ceph-deploy osd create {node} --filestore --data /path/to/data --journal /path/to/journal
  • 查看OSD相关信息

    1. # 列出指定节点上的OSD
    2. ]$ ceph-deploy osd list ceph-stor1
    3. # 查看你OSD信息
    4. ]$ ceph osd stat
    5. # 查看OSD dump信息
    6. ]$ ceph osd dump
    7. # 查看OSD编号
    8. ]$ ceph osd ls

    4.5、从RADOS集群中移除OSD

    Ceph集群中一个OSD通常对应一块硬盘,运行专用的守护进程,如果某OSD故障,可能需要移除特定的OSD,需要先停止守护进程,再进行移除。

  1. 停用设备:ceph osd out {osd-num}
  2. 停止进程:sudo systemctl stop ceph-osd@{osd-num}
  3. 移除设备:
    1. ceph osd crush remove osd.{osd-num}
    2. ceph auth del osd.{osd-num}
    3. ceph osd rm osd.{osd-num}
  4. 卸载磁盘

umount /var/lib/ceph/osd/ceph-{osd-num}

4.6、测试上传/下载数据对象

  • 存取数据时,客户端必须先连接至RADOS集群中的某个存储池,然后根据CRUSH算法完成数据对象的寻址,因此需要先创建测试用存储池。

    1. ]$ ceph osd pool create testpool 16
    2. pool 'testpool' created
  • 使用rados命令上传issue文件到ceph中

    1. ]$ rados put issue /etc/issue --pool=testpool
    2. ]$ rados ls --pool=testpool
    3. issue
  • 查看存储池中数据对象的具体位置信息

    1. ]$ ceph osd map testpool issue
    2. osdmap e28 pool 'testpool' (1) object 'issue' -> pg 1.651f88da (1.a) -> up ([5,4,0], p5) acting ([5,4,0], p5)
  • 删除存储池

删除存储池会将存储池内所有数据删除,因此需要输入两次存储池名称和一长串的参数。

  1. ]$ ceph osd pool rm testpool testpool --yes-i-really-really-mean-it
  2. Error EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool

即便如此也会提示删除失败,如果一定要删除,需要先修改配置文件,添加允许删除配置。

  1. ]$ cd ceph-cluster # 管理节点执行
  2. ]$ echo "mon_allow_pool_delete = true" >> ceph.conf
  3. ]$ ceph-deploy --overwrite-conf config push ceph-mon{1..3}
  4. ]$ for i in {1..3}; do ssh ceph-mon${i} "\
  5. sudo systemctl restart ceph-mon.target
  6. "; done

5、扩展Ceph集群

5.1、扩展MON监视器节点

Monitor节点在一个集群中,为实现高可用性,一般需要部署3个或以上,推荐奇数个。

]$ ceph-deploy mon add ceph-mon3

扩展完成后可以在使用ceph quorum_status —format json-pretty查看监视器及选举的相关状态。

5.2、扩展MGR节点

Manager节点在集群中,以Active/Standby模式运行,因此为保证高可用性,一般需要2个或以上。

]$ ceph-deploy mgr create ceph-mon3

添加完成后,再次通过ceph -s查看集群状态

]$ ceph -s
  cluster:
    id:     817bb5ff-1b92-4734-baa8-f21ede4cb9c2   
    health: HEALTH_OK   

  services:
    mon: 3 daemons, quorum ceph-mon1,ceph-mon2,ceph-mon3 (age 46m)
    mgr: ceph-mon1(active, since 36m), standbys: ceph-mon2
    osd: 6 osds: 6 up (since 16m), 6 in (since 16m)

  data:
    pools:   1 pools, 16 pgs
    objects: 1 objects, 23 B
    usage:   6.0 GiB used, 378 GiB / 384 GiB avail
    pgs:     16 active+clean

6、Ceph配置文件

6.1、Ceph配置文件加载顺序

  • $CEPH_CONF
  • -c path/to/config
  • /etc/ceph/ceph.conf
  • ~/.ceph/config
  • ./ceph.conf

    6.2、Ceph配置文件可引用的变量

    Ceph集群中引入了元变量,元变量极大的简化了Ceph存储集群的配置,在配置值中设置元变量后,ceph将元变量扩展为具体值。ceph的元变量和Shell脚本中的变量类似:

  • $cluster:当前Ceph集群的名称

  • $type:当前服务的类型名称,可能会展开为osd或mon
  • $id:进程的标识符,如对osd.0来说,标识符为0
  • $host:守护进程所在主机的主机名
  • $name:其值为$type.$id

    7、停止或重启Ceph集群

    7.1、停止集群顺序

  • 告知ceph集群不要将OSD标记位out

    ]$ ceph osd set noout
    
  • 按照一下顺序停止守护进程和节点

    • 存储客户端守护进程(radosgw,mds)
    • 网关
    • 元数据服务器
    • 各节点OSD守护进程
    • 各节点mgr守护进程
    • 各节点mon守护进程

      7.2、启动集群顺序

  • 按照以下顺序启动守护进程和节点

    • 各节点mon守护进程
    • 各节点mgr守护进程
    • 各节点OSD守护进程
    • 元数据服务器
    • 网关
    • 存储客户端守护进程(radosgw,mds)
  • 清楚noout标志

    ]$ ceph osd unset noout
    

    8、启用Ceph集群访问接口

    8.1、启用块设备接口RBD

    Ceph Rados块设备接口,是基于Rados存储支持超配,可伸缩条带化数据存储系统,通过librbd库与OSD交互,RBD为KVM等虚拟化技术提供高性能和无限扩展的存储后端,这些系统使用libvirt和QEMU与RBD进行集成。
    客户端基于librbd库即可将RADOS存储集群用作块设备,不过,用于rbd的存储池需要事先启用rbd功能并进行初始化。

  • 创建一个名为rbddata的存储池,在启用rbd功能后对其进行初始化:

    ]$ ceph osd pool create rbddata 64 
    ]$ ceph osd pool application enable rbddata rbd 
    ]$ rbd pool init -p rbddata
    

    不过,rbd存储池并不能直接用于块设备,而是需要事先在其中按需创建映像(image),并把映像文件作为块设备使用。

  • 创建一个名为img1的映像:

    ]$ rbd create img1 --size 1024 --pool rbddata
    
  • 映像的相关的信息则可以使用“rbd info”命令获取:

    ]$ rbd --image img1 --pool rbddata info
    rbd image 'img1':
      size 1 GiB in 256 objects
      order 22 (4 MiB objects)
      snapshot_count: 0
      id: 5e405878315d
      block_name_prefix: rbd_data.5e405878315d
      format: 2
      features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
      op_features:
      flags:
      create_timestamp: Sun Aug 15 12:35:58 2021
      access_timestamp: Sun Aug 15 12:35:58 2021
      modify_timestamp: Sun Aug 15 12:35:58 2021
    

    在客户端主机上,用户通过内核级的rbd驱动识别相关的设备,即可对其进行分区、创建文件系统并挂载使用。

    8.2、启动对象存储接口RGW

    RGW并非必须的接口,仅在需要用到与S3和Swift兼容的RESTful接口时才需要部署RGW实例,

  • 把mon2和mon3部署为rgw主机:

    ]$ ceph-deploy rgw create ceph-mon1 ceph-mon2
    

    部署完成后会在rgw节点上启动radosgw进程,同时可以使用以下命令进行重启

    ]$ sudo systemctl start ceph-radosgw@rgw.ceph-mon2
    

    默认情况下,RGW实例监听于TCP协议的7480端口,如需修改,可以通过在运行RGW的节点上编辑其主配置文件ceph.conf进行修改:

    [client] 
    rgw_frontends = "civetweb port=8080"
    

    RGW会在RADOS集群上创建以下存储池

    ]$ ceph osd pool ls
    .rgw.root
    default.rgw.control
    default.rgw.meta
    default.rgw.log
    

    RGW提供的是REST接口,客户端通过http与其进行交互,完成数据的增删改查等管理操作。

    8.3、启用文件系统接口CephFS

    CephFS需要至少运行一个元数据服务器(MDS)守护进程(ceph-mds),此进程管理与CephFS上存储的文件相关的元数据,并协调对Ceph存储集群的访问。

  • 在mon1上启用MDS

    ]$ ceph-deploy mds create ceph-mon1
    

    部署完成后会在mds节点上启动ceph-mds进程,同时可以使用以下命令进行重启

    ]$ sudo systemctl start ceph-mds@ceph-mon1
    
  • 查看MDS的相关状态可以发现,刚添加的MDS处于Standby模式

    ]$ ceph mds stat
    1 up:standby
    

    使用CephFS之前需要事先于集群中创建一个文件系统,并为其分别指定元数据和数据相关的存储池。

  • 创建一个名为cephfs的文件系统用于测试,它使用cephfs-metadata为元数据存储池,使用cephfs-data为数据存储池

    ]$ ceph osd pool create cephfs-metadata 32
    ]$ ceph osd pool create cephfs-data 32
    ]$ ceph fs new cephfs cephfs-metadata cephfs-data
    
  • 可使用如下命令“ceph fs status ”查看文件系统的相关状态

    ]$ ceph fs status cephfs
    cephfs - 0 clients
    ======
    +------+--------+-----------+---------------+-------+-------+
    | Rank | State  |    MDS    |    Activity   |  dns  |  inos |
    +------+--------+-----------+---------------+-------+-------+
    |  0   | active | ceph-mon1 | Reqs:    0 /s |   10  |   13  |
    +------+--------+-----------+---------------+-------+-------+
    +-----------------+----------+-------+-------+
    |       Pool      |   type   |  used | avail |
    +-----------------+----------+-------+-------+
    | cephfs-metadata | metadata | 96.0k |  119G |
    |   cephfs-data   |   data   |    0  |  119G |
    +-----------------+----------+-------+-------+
    +-------------+
    | Standby MDS |
    +-------------+
    +-------------+
    ]$ ceph mds stat
    cephfs:1 {0=ceph-mon1=up:active}
    

    客户端通过内核中的cephfs文件系统接口即可挂载使用cephfs文件系统,或者通过FUSE接口与文件系统进行交互。

  • 获取集群的运行状态 ```bash

    查看PG状态

    ]$ ceph pg stat 16 pgs: 16 active+clean; 23 B data, 1.4 MiB used, 378 GiB / 384 GiB avail

    查看存储池状态

    ]$ ceph osd pool stats pool testpool id 1 nothing is going on

    查看ceph存储空间用量

    ]$ ceph df RAW STORAGE: CLASS SIZE AVAIL USED RAW USED %RAW USED ssd 384 GiB 378 GiB 1.4 MiB 6.0 GiB 1.56 TOTAL 384 GiB 378 GiB 1.4 MiB 6.0 GiB 1.56

POOLS: POOL ID PGS STORED OBJECTS USED %USED MAX AVAIL testpool 1 16 23 B 1 12 KiB 0 120 GiB ```

  • ceph df输出由两端内容:Global和Pools
    • Global:存储量概览
    • Pools:存储池列表和每个存储池的理论用量,但不反映副本、克隆数据和快照
  • Global段
    • SIZE:集群的整体存储空间
    • AVAIL:集群中可以使用的空间容量
    • RAW USED:已用的原始存储量
    • %RAW USED:已用的原始存储量百分比