安装ceph

官方文档

0. 部署前的准备

在部署之前需要准备好三台CentOS主机,我这里使用的是CentOS7.5,并将系统内核升级到4.x长期支持版本,相关的配置信息如下:

  1. 节点主机名和IP信息
local-node-1: 10.0.0.1
local-node-2: 10.0.0.2
local-node-3: 10.0.0.3
  1. 配置hosts解析三台节点的主机名,并将三台节点配置为无密码认证模式。

  2. 关闭防火墙和Selinux

  3. 每台主机节点至少添加3块磁盘用于ceph存储,在实际的生产中可以将多块盘做raid,ceph 在添加磁盘时会自动格式化,所以此处不需要格式化。

  4. ceph对节点之间时间的要求很高,需要安装ntp并做好时间同步,配置好epel源。

1. 所有节点安装依赖包

yum install snappy  leveldb gdisk python-argparse gperftools-libs  -y

添加yum 源,导入key,这里我使用最新的mimic版本:

rpm --import 'https://download.ceph.com/keys/release.asc'
su -c 'rpm -Uvh https://download.ceph.com/rpm-mimic/el7/noarch/ceph-release-1-0.el7.noarch.rpm'

由于国内的网络问题,这里可以选择使用阿里云的源,修改ceph.repo文件如下:

[Ceph]
name=Ceph packages for $basearch
baseurl=https://mirrors.aliyun.com/ceph/rpm-mimic/el7/$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-mimic/el7/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

2. 所有节点安装ceph

 yum install ceph -y --disablerepo=epel

3. 检查安装包是否完整

[root@local-node-1 ~]# rpm -qa |egrep -i "ceph|rados|rbd"
ceph-deploy-2.0.1-0.noarch
librados2-13.2.5-0.el7.x86_64
libradosstriper1-13.2.5-0.el7.x86_64
ceph-mgr-13.2.5-0.el7.x86_64
ceph-13.2.5-0.el7.x86_64
python-rados-13.2.5-0.el7.x86_64
libcephfs2-13.2.5-0.el7.x86_64
python-rbd-13.2.5-0.el7.x86_64
ceph-common-13.2.5-0.el7.x86_64
ceph-selinux-13.2.5-0.el7.x86_64
ceph-mon-13.2.5-0.el7.x86_64
ceph-osd-13.2.5-0.el7.x86_64
librbd1-13.2.5-0.el7.x86_64
python-cephfs-13.2.5-0.el7.x86_64
ceph-base-13.2.5-0.el7.x86_64
ceph-mds-13.2.5-0.el7.x86_64

部署ceph集群

一. 部署Monitor

  1. 创建配置文件目录,并创建配置文件
mkdir /etc/ceph/
touch /etc/ceph/ceph.conf
  1. 为集群生成一个FSDI:
[root@local-node-1 ~]# uuidgen
7bd25f8d-b76f-4ff9-89ec-186287bbeaa5

3.集群创建一个钥匙串,为Monitor 服务创建一个密钥:

[root@local-node-1 ~]# ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
creating /tmp/ceph.mon.keyring

4.创建一个管理员钥匙串,生成一个client.admin用户,并将此用户添加到钥匙串中:

[root@local-node-1 ~]# ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *'
creating /etc/ceph/ceph.client.admin.keyring
  1. 创建bootstrap-osd钥匙串,将client.bootstrap-osd 用户添加到此钥匙串中:
[root@local-node-1 ~]# ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd'
creating /var/lib/ceph/bootstrap-osd/ceph.keyring
  1. 将生成的key加入ceph.mon.keyring.
[root@local-node-1 ~]# ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring

[root@local-node-1 ~]# ceph-authtool /tmp/ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
  1. 使用主机名和IP地址以及FSID生成monitor map:
[root@local-node-1 ~]# monmaptool --create --add local-node-1 10.0.0.1  --fsid 7bd25f8d-b76f-4ff9-89ec-186287bbeaa5 /tmp/monmap
monmaptool: monmap file /tmp/monmap
monmaptool: set fsid to 7bd25f8d-b76f-4ff9-89ec-186287bbeaa5
monmaptool: writing epoch 0 to /tmp/monmap (1 monitors)
  1. 创建mon的目录,使用 集群名称-主机名的形式:
 mkdir  /var/lib/ceph/mon/ceph-local-node-1
  1. 填入第一个mon守护进程的信息:
[root@local-node-1 ~]# ceph-mon --mkfs -i local-node-1 --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
  1. 配置/etc/ceph/ceph.conf文件:
[root@local-node-1 ~]# cat /etc/ceph/ceph.conf

[global]
fsid = 7bd25f8d-b76f-4ff9-89ec-186287bbeaa5     # 生成的FSID
mon initial members = local-node-1              # 主机名
mon host = 10.0.0.1                             # 对应的IP
public network = 10.0.0.0/24         
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
osd journal size = 1024
osd pool default size = 3
osd pool default min size = 2
osd pool default pg num = 333
osd pool default pgp num = 333
osd crush chooseleaf type = 1
  1. 由于我们使用使用root操作的,需要设置权限为ceph(也可以修改systemd的启动文件,将ceph用户改为root),并启动Monitor
chown  -R ceph:ceph /var/lib/ceph

systemctl start [email protected]
  1. 确认服务已经正常启动:
[root@local-node-1 ~]# ceph -s
  cluster:
    id:     7bd25f8d-b76f-4ff9-89ec-186287bbeaa5
    health: HEALTH_OK

  services:
    mon: 1 daemons, quorum local-node-1
    mgr: no daemons active
    osd: 0 osds: 0 up, 0 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:     

[root@local-node-1 ~]# netstat -lntp|grep ceph-mon
tcp        0      0 10.0.0.1:6789           0.0.0.0:*               LISTEN      1799/ceph-mon 

二. 部署Manager

当我们配置好ceph-mon服务之后,就需要配置ceph-mgr服务。

  1. 生成一个认证密钥(ceph-mgr为自定义的名称,替换下面的$name):
ceph auth get-or-create mgr.$name mon 'allow profile mgr' osd 'allow *' mds 'allow *'

如:
[root@local-node-1 ~]# ceph auth get-or-create mgr.ceph-mgr mon 'allow profile mgr' osd 'allow *' mds 'allow *'
[mgr.ceph-mgr]
    key = AQBC56VcK2PALhAArjY0icXMK6/Hs0xZm/smPA==
  1. 创建存放此密钥的文件的目录,(目录名称为 集群名-$name):
sudo -u ceph mkdir /var/lib/ceph/mgr/ceph-ceph-mgr
  1. 将上面产生的密钥文件存入此目录下,并命名为keyring:
[root@local-node-1 ~]# cat /var/lib/ceph/mgr/ceph-ceph-mgr/keyring 
[mgr.ceph-mgr]
    key = AQBC56VcK2PALhAArjY0icXMK6/Hs0xZm/smPA==
  1. 启动ceph-mgr服务:
ceph-mgr -i $name

如:
[root@local-node-1 ~]# ceph-mgr -i ceph-mgr
  1. 检查服务是否启动,查看ceph状态,此时应该为mgr: ceph-mgr(active)
[root@local-node-1 ~]# ceph -s
  cluster:
    id:     7bd25f8d-b76f-4ff9-89ec-186287bbeaa5
    health: HEALTH_OK

  services:
    mon: 1 daemons, quorum local-node-1
    mgr: ceph-mgr(active)           # 如果为starting状态需要稍等一会儿
    osd: 0 osds: 0 up, 0 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:     

[root@local-node-1 ~]# netstat -lntp | grep ceph
tcp        0      0 10.0.0.1:6789           0.0.0.0:*               LISTEN      1799/ceph-mon       
tcp        0      0 10.0.0.1:6800           0.0.0.0:*               LISTEN      133336/ceph-mgr     
  1. mgr服务正常之后,我们可以使用如下命令查看当前mgr中可用的模块:
[root@local-node-1 ~]#  ceph mgr module ls
{
    "enabled_modules": [
        "balancer",
        "iostat",
        "restful",
        "status"
    ],
    "disabled_modules": [
        {
            "name": "dashboard",
            "can_run": true,
            "error_string": ""
        },
        {
            "name": "hello",
            "can_run": true,
            "error_string": ""
        },
        {
            "name": "influx",
            "can_run": false,
            "error_string": "influxdb python module not found"
        },
        {
            "name": "localpool",
            "can_run": true,
            "error_string": ""
        },
        {
            "name": "prometheus",
            "can_run": true,
            "error_string": ""
        },
        {
            "name": "selftest",
            "can_run": true,
            "error_string": ""
        },
        {
            "name": "smart",
            "can_run": true,
            "error_string": ""
        },
        {
            "name": "telegraf",
            "can_run": true,
            "error_string": ""
        },
        {
            "name": "telemetry",
            "can_run": true,
            "error_string": ""
        },
        {
            "name": "zabbix",
            "can_run": true,
            "error_string": ""
        }
    ]
}
  1. 如果想开启某个模块,可以使用如下命令:
[root@local-node-1 ~]# ceph mgr module enable dashboard
[root@local-node-1 ~]# ceph mgr module ls
{
    "enabled_modules": [
        "balancer",
        "dashboard",
        "iostat",
        "restful",
        "status"
    ],
...

# 禁用模块
 ceph mgr module disable dashboard
  1. 如果模块可以在加载时发布其地址(如http服务),可以通过如下命令查看开启的服务地址:
[root@local-node-1 ~]# ceph mgr services
{}
  1. 群集第一次启动时,它使用mgr_initial_modules设置来覆盖要启用的模块。 但是,在集群的其余生命周期中忽略此设置:仅将其用于引导。 例如,在第一次启动监视器守护程序之前,您可以在ceph.conf中添加这样的部分:
[mon]
    mgr initial modules = dashboard balancer

ceph-mgr的高可用

通常情况下,我们应该在运行ceph-mon守护程序的每台主机上配置ceph-mgr服务,以实现相同的可用性级别。
默认情况下,首先出现的ceph-mgr实例将由Monitor激活,其他成为是备用节点。ceph-mgr守护进程中不需要仲裁。
如果活动守护程序未能向监视器发送信标超过mon mgr beacon grace(默认为30秒),则它将被备用数据库替换。
如果要抢占故障转移,可以使用ceph mgr fail 将ceph-mgr守护程序显式标记为失败。

相关模块的帮助命令可以使用:

ceph tell mgr help

三. 创建OSD

官方文档

当mon初始化完成并正常运行后,应添加OSD。 在有足够的OSD来处理对象的副本数量之前,群集无法达到active + clean状态(例如,osd池默认大小= 3需要至少三个OSD)。 引导监视器后,您的群集具有默认的CRUSH映射; 但是,CRUSH映射没有映射到Ceph节点的任何Ceph OSD守护进程。

Ceph提供了ceph-volume实用程序,它可以初始化Ceph使用的逻辑卷,磁盘或分区等。 ceph-volume实用程序通过递增索引来创建OSD ID。 此外,ceph-volume会将新的OSD添加到主机下的CRUSH地图中。可以通过执行ceph-volume -h以获取CLI详细信息。 ceph-volume工具可以简化很多手工部署的步骤,如果不使用ceph-volume,就需要手动完成一些配置。 要使用短格式过程创建前三个OSD,请在所有要创建osd的node上执行以下操作:

==ceph OSD的创建有两种不同的架构选择,分为filestore和bluestore,bulestore是社区版本的默认配置,也是旨在对filestore性能方面的优化,两者具体的差异将在ceph原理中介绍。==

BlueStore

方式一:
  1. 创建OSD,如在每个节点上我们都有三块磁盘,分别为sdb,sdc,sdd.
 ceph-volume lvm create --data /dev/sdb
 ceph-volume lvm create --data /dev/sdc
 ceph-volume lvm create --data /dev/sdd
  1. 查看当前的lvm逻辑卷,根据此输出内容进行下一步激活OSD的操作
[root@local-node-1 ~]# ceph-volume lvm list

====== osd.1 =======

  [block]    /dev/ceph-fad16202-18c0-4444-9640-946173373925/osd-block-43a082d5-79c4-4d3f-880e-ecc7eaef6a83

      type                      block
      osd id                    1
      cluster fsid              7bd25f8d-b76f-4ff9-89ec-186287bbeaa5
      cluster name              ceph
      osd fsid                  43a082d5-79c4-4d3f-880e-ecc7eaef6a83
      encrypted                 0
      cephx lockbox secret      
      block uuid                W68QgI-8eHM-bSEr-I9Gs-dQx8-tdf9-lHRbqa
      block device              /dev/ceph-fad16202-18c0-4444-9640-946173373925/osd-block-43a082d5-79c4-4d3f-880e-ecc7eaef6a83
      vdo                       0
      crush device class        None
      devices                   /dev/sdc

====== osd.0 =======

  [block]    /dev/ceph-6c675287-4a42-43f0-8cef-69b0150c3b06/osd-block-f829a5f0-0a11-4ae7-983a-ecd01718a81a

      type                      block
      osd id                    0
      cluster fsid              7bd25f8d-b76f-4ff9-89ec-186287bbeaa5
      cluster name              ceph
      osd fsid                  f829a5f0-0a11-4ae7-983a-ecd01718a81a
      encrypted                 0
      cephx lockbox secret      
      block uuid                E0YDG4-lm1W-WbqE-yRHy-hqGL-H0af-eZzKjr
      block device              /dev/ceph-6c675287-4a42-43f0-8cef-69b0150c3b06/osd-block-f829a5f0-0a11-4ae7-983a-ecd01718a81a
      vdo                       0
      crush device class        None
      devices                   /dev/sdb

====== osd.2 =======

  [block]    /dev/ceph-256d0c82-3d7b-4672-a241-99c9c614809d/osd-block-75c04fb3-90e8-40af-9fb4-1c94b22664be

      type                      block
      osd id                    2
      cluster fsid              7bd25f8d-b76f-4ff9-89ec-186287bbeaa5
      cluster name              ceph
      osd fsid                  75c04fb3-90e8-40af-9fb4-1c94b22664be
      encrypted                 0
      cephx lockbox secret      
      block uuid                fNFmrI-Y1dZ-4cHd-UCVi-ajLD-Uim2-wkcx3y
      block device              /dev/ceph-256d0c82-3d7b-4672-a241-99c9c614809d/osd-block-75c04fb3-90e8-40af-9fb4-1c94b22664be
      vdo                       0
      crush device class        None
      devices                   /dev/sdd
方式二:

这种方式中配置更加细致的参数,分为准备磁盘和激活OSD两步。

  1. 准备OSD

    ceph-volume lvm prepare --data {data-path} {data-path}
    如:
    ceph-volume lvm prepare --data /dev/hdd1
  2. 激活OSD
ceph-volume lvm activate {ID} {FSID}

如:
ceph-volume lvm activate 0 7bd25f8d-b76f-4ff9-89ec-186287bbeaa5
  1. 查看ceph状态:
[root@local-node-1 ~]# ceph -s
  cluster:
    id:     7bd25f8d-b76f-4ff9-89ec-186287bbeaa5
    health: HEALTH_OK

  services:
    mon: 1 daemons, quorum local-node-1
    mgr: ceph-mgr(active)
    osd: 3 osds: 3 up, 3 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   3.0 GiB used, 27 GiB / 30 GiB avail
    pgs:  

[root@local-node-1 ~]# netstat -lntp|grep ceph
tcp        0      0 10.0.0.1:6805           0.0.0.0:*               LISTEN      1132/ceph-osd       
tcp        0      0 10.0.0.1:6806           0.0.0.0:*               LISTEN      1132/ceph-osd       
tcp        0      0 10.0.0.1:6807           0.0.0.0:*               LISTEN      1132/ceph-osd       
tcp        0      0 10.0.0.1:6808           0.0.0.0:*               LISTEN      1126/ceph-osd       
tcp        0      0 10.0.0.1:6809           0.0.0.0:*               LISTEN      1126/ceph-osd       
tcp        0      0 10.0.0.1:6810           0.0.0.0:*               LISTEN      1126/ceph-osd       
tcp        0      0 10.0.0.1:6811           0.0.0.0:*               LISTEN      1126/ceph-osd       
tcp        0      0 10.0.0.1:6812           0.0.0.0:*               LISTEN      1941/ceph-mgr       
tcp        0      0 10.0.0.1:6789           0.0.0.0:*               LISTEN      1093/ceph-mon       
tcp        0      0 10.0.0.1:6800           0.0.0.0:*               LISTEN      1128/ceph-osd       
tcp        0      0 10.0.0.1:6801           0.0.0.0:*               LISTEN      1128/ceph-osd       
tcp        0      0 10.0.0.1:6802           0.0.0.0:*               LISTEN      1128/ceph-osd       
tcp        0      0 10.0.0.1:6803           0.0.0.0:*               LISTEN      1128/ceph-osd       
tcp        0      0 10.0.0.1:6804           0.0.0.0:*               LISTEN      1132/ceph-osd 

FILESTORE(略)

参考此文档:http://docs.ceph.com/docs/master/install/manual-deployment/#filestore

扩展集群

以上在单机上部署了基本的组件,我们需要创建一个高可用的集群,要加入另外的两个节点local-node-2和local-node-3。

一. 扩展MON

  1. 修改node-1节点上的配置:
[root@local-node-1 ~]# cat /etc/ceph/ceph.conf 

[global]
fsid = 7bd25f8d-b76f-4ff9-89ec-186287bbeaa5
public network = 10.0.0.0/24
mon initial members = local-node-1,local-node-2,local-node-3
mon host = 10.0.0.1,10.0.0.2,10.0.0.3
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
osd journal size = 1024
osd pool default size = 3
osd pool default min size = 2
osd pool default pg num = 333
osd pool default pgp num = 333
osd crush chooseleaf type = 1

[mon]
mon allow pool delete = true

[mds.local-node-1]
host = local-node-1
  1. 将配置和密钥文件分发到其它的节点上
scp /etc/ceph/*  10.0.0.2:/etc/ceph/
scp /etc/ceph/*  10.0.0.3:/etc/ceph/
  1. 在新的节点创建ceph相关目录,并添加权限:
mkdir -p  /var/lib/ceph/{bootstrap-mds,bootstrap-mgr,bootstrap-osd,bootstrap-rbd,bootstrap-rgw,mds,mgr,mon,osd}

chown  -R ceph:ceph /var/lib/ceph

sudo -u ceph mkdir /var/lib/ceph/mon/ceph-local-node-2   # 指定node名称ID
  1. 修改本节点的配置文件
[root@local-node-2 ~]# cat /etc/ceph/ceph.conf 
[global]
fsid = 7bd25f8d-b76f-4ff9-89ec-186287bbeaa5
public network = 10.0.0.0/24
mon initial members = local-node-1,local-node-2,local-node-3
mon host = 10.0.0.1,10.0.0.2,10.0.0.3
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
osd journal size = 1024
osd pool default size = 3
osd pool default min size = 2
osd pool default pg num = 333
osd pool default pgp num = 333
osd crush chooseleaf type = 1

[mon]
mon allow pool delete = true

[mon.local-node-2]
mon_addr = 10.0.0.2:6789
host = loacl-node-2
  1. 获取集群中的密钥和map
ceph auth get mon. -o /tmp/monkeyring
ceph mon getmap -o /tmp/monmap
  1. 使用已有的密钥和map添加一个新的Monitor,指定主机名
sudo -u ceph ceph-mon --mkfs -i local-node-2 --monmap /tmp/monmap --keyring /tmp/monkeyring
  1. 启动服务
systemctl start ceph-mon@local-node-2
  1. 使用上述方式添加其他节点,添加成功后查看mon状态:
[root@local-node-3]# ceph -s
  cluster:
    id:     7bd25f8d-b76f-4ff9-89ec-186287bbeaa5
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum local-node-1,local-node-2,local-node-3
    mgr: ceph-mgr(active)
    osd: 3 osds: 3 up, 3 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   3.0 GiB used, 27 GiB / 30 GiB avail
    pgs:     

[root@local-node-3]# ceph mon stat
e3: 3 mons at {local-node-1=10.0.0.1:6789/0,local-node-2=10.0.0.2:6789/0,local-node-3=10.0.0.3:6789/0}, election epoch 28, leader 0 local-node-1, quorum 0,1,2 local-node-1,local-node-2,local-node-3

二. 添加OSD

  1. 从已经运行的ceph 节点上拷贝/etc/ceph下的配置文件和密钥到新的节点上,修改配置为:
[root@local-node-2 ~]# cat /etc/ceph/ceph.conf 

[global]
fsid = 7bd25f8d-b76f-4ff9-89ec-186287bbeaa5
public network = 10.0.0.0/24
mon initial members = local-node-1,local-node-2,local-node-3
mon host = 10.0.0.1,10.0.0.2,10.0.0.3
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
osd journal size = 1024
osd pool default size = 3
osd pool default min size = 2
osd pool default pg num = 333
osd pool default pgp num = 333
osd crush chooseleaf type = 1

[mon]
mon allow pool delete = true

[mon.local-node-2]
mon_addr = 10.0.0.2:6789
host = loacl-node-2
  1. 从已经存在的osd的节点上拷贝初始化的密钥文件:
scp -p  /var/lib/ceph/bootstrap-osd/ceph.keyring  10.0.0.2:/var/lib/ceph/bootstrap-osd/
scp -p  /var/lib/ceph/bootstrap-osd/ceph.keyring  10.0.0.3:/var/lib/ceph/bootstrap-osd/
  1. 在添加osd时,需要考虑是添加bluestore 还是filestore的后端存储集群,需要与原集群保持一致, 这里以bluestore为例:
ceph-volume lvm create --data /dev/sdb
ceph-volume lvm create --data /dev/sdc
ceph-volume lvm create --data /dev/sdd
  1. 按照上述方式添加其他节点,成功后如下所示:
[root@local-node-1 ~]# ceph -s
  cluster:
    id:     7bd25f8d-b76f-4ff9-89ec-186287bbeaa5
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum local-node-1,local-node-2,local-node-3
    mgr: ceph-mgr(active)
    osd: 9 osds: 9 up, 9 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   9.1 GiB used, 81 GiB / 90 GiB avail
    pgs:     

部署CephFS

一. 添加MDS

==只有要使用cephFS的场景下才需要创建MDS服务。==

  1. 创建目录
mkdir -p /var/lib/ceph/mds/{cluster-name}-{id}   # 这里的ID设置为本地主机名

EG:
[root@local-node-1 ~]# sudo -u ceph mkdir -p /var/lib/ceph/mds/ceph-local-node-1
  1. 创建钥匙串:
ceph-authtool --create-keyring /var/lib/ceph/mds/{cluster-name}-{id}/keyring --gen-key -n mds.{id}

eg:
ceph-authtool --create-keyring /var/lib/ceph/mds/ceph-local-node-1/keyring --gen-key -n mds.local-node-1
  1. 导入密钥,并设置caps:
ceph auth add mds.{id} osd "allow rwx" mds "allow" mon "allow profile mds" -i /var/lib/ceph/mds/{cluster}-{id}/keyring

EG:
ceph auth add mds.local-node-1 osd "allow rwx" mds "allow" mon "allow profile mds" -i /var/lib/ceph/mds/ceph-local-node-1/keyring
  1. 添加mds的区域配置
[root@local-node-1 ~]# cat /etc/ceph/ceph.conf
[global]
fsid = 7bd25f8d-b76f-4ff9-89ec-186287bbeaa5
public network = 10.0.0.0/24
mon initial members = local-node-1
mon host = 10.0.0.1
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
osd journal size = 1024
osd pool default size = 3
osd pool default min size = 2
osd pool default pg num = 333
osd pool default pgp num = 333
osd crush chooseleaf type = 1

[mds.local-node-1]            # 添加此处的配置
host = local-node-1
  1. 手动启动服务
[root@local-node-1 ~]# ceph-mds --cluster ceph -i local-node-1 -m local-node-1:6789

如果是使用root启动,需要注意权限问题,最好将服务使用systemd,修改为ceph:

 chown -R ceph:ceph /var/lib/ceph/mds/
 systemctl start ceph-mds@local-node-1
 systemctl enable ceph-mds@local-node-1
  1. 检查服务是否启动
[root@local-node-1 ~]# ps -ef|grep ceph-mds
ceph        2729       1  0 17:32 ?        00:00:00 /usr/bin/ceph-mds -f --cluster ceph --id local-node-1 --setuser ceph --setgroup ceph

[root@local-node-1 ~]# netstat -lntp|grep ceph-mds
tcp        0      0 10.0.0.1:6813           0.0.0.0:*               LISTEN      2729/ceph-mds    

7.检查ceph 集群状态

[root@local-node-1 ~]# ceph -s
  cluster:
    id:     7bd25f8d-b76f-4ff9-89ec-186287bbeaa5
    health: HEALTH_OK

  services:
    mon: 1 daemons, quorum local-node-1
    mgr: ceph-mgr(active)
    osd: 3 osds: 3 up, 3 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   3.0 GiB used, 27 GiB / 30 GiB avail
    pgs:     

[root@local-node-1 ~]# ceph osd tree
ID CLASS WEIGHT  TYPE NAME             STATUS REWEIGHT PRI-AFF 
-1       0.02939 root default                                  
-3       0.02939     host local-node-1                         
 0   hdd 0.00980         osd.0             up  1.00000 1.00000 
 1   hdd 0.00980         osd.1             up  1.00000 1.00000 
 2   hdd 0.00980         osd.2             up  1.00000 1.00000 

二. 创建ceph filesystem

1. 创建pools

CephFS至少需要两个RADOS pool,一个存储数据,另一个存储元数据,当配置这些pool时,我们需要考虑两个问题:

  • 对元数据池使用更高的复制级别,因为此池中的任何数据丢失都可能导致整个文件系统无法访问。
  • 使用较低延迟的存储(如SSD)作为元数据池,因为这将直接影响客户端上文件系统操作的延迟。

使用如下命令创建这两个pool:

ceph osd pool create cephfs_data 
ceph osd pool create cephfs_metadata 

EG:
[root@local-node-1 ~]# ceph osd pool create cephfs_data 64
[root@local-node-1 ~]# ceph osd pool create cephfs_metadata 64

2. 启用cephfs文件系统

[root@local-node-1 ~]# ceph fs new cephfs cephfs_metadata cephfs_data
new fs with metadata pool 2 and data pool 1

查看文件系统状态:

[root@local-node-1 ~]# ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]

[root@local-node-1 ~]# ceph mds stat
cephfs-1/1/1 up  {0=local-node-1=up:active}

如果在系统中创建了多个Ceph filesystem,可以通过使用 ceph fs set-default 设置默认的挂载盘,而不必指定具体要挂载哪个文件系统。

3. 挂载cephfs

==使用ceph-fuse挂载==

这里演示将cephfs挂载到node-4(10.0.0.4)上,先安装ceph-fuse客户端:

yum install ceph-fuse -y --disablerepo=epel  # 非ceph集群中的主机需要开启epel安装依赖包

如果要挂载的客户机不是ceph集群中的成员,需要将ceph集群中的密钥和配置文件拷贝到/etc/ceph目录:

[root@node-4 ~]# mkdir /etc/ceph
[root@local-node-2 ~]# scp /etc/ceph/ceph.conf 10.0.0.4:/etc/ceph/
[root@local-node-2 ~]# scp /etc/ceph/ceph.client.admin.keyring 10.0.0.4:/etc/ceph/

挂载cephfs:

ceph-fuse -m 10.0.0.2:6789 /mnt/cephfs

查看挂载配置:

# df -h |grep cephfs
ceph-fuse        26G     0   26G   0% /mnt/cephfs

通过测试可以发现,可以在任何ceph集群节点上挂载,共享文件:

# 指定的mon必须是正常状态,如果不是active或standby则不能挂载
ceph-fuse -m 10.0.0.3:6789 /mnt/cephfs

[root@local-node-2 cephfs]# ceph -s
  cluster:
    id:     7bd25f8d-b76f-4ff9-89ec-186287bbeaa5
    health: HEALTH_WARN
            1/3 mons down, quorum local-node-2,local-node-3

  services:
    mon: 3 daemons, quorum local-node-2,local-node-3, out of quorum: local-node-1
    mgr: ceph-mgr(active)
    mds: cephfs-1/1/1 up  {0=local-node-1=up:active}
    osd: 9 osds: 9 up, 9 in

  data:
    pools:   2 pools, 128 pgs
    objects: 24  objects, 11 KiB
    usage:   9.1 GiB used, 81 GiB / 90 GiB avail
    pgs:     128 active+clean

==使用内核自带驱动挂载==

使用内核驱动,对于系统内核版本有一定的要求,如果使用Ceph最新的TUNABLES(可调参数)jewel时,官方建议是4.14或者4.9内核,如果是低于4.5版本的内核则会出现挂载错误:

 local-node-1 kernel: libceph: mon0 10.0.0.2:6789 feature set mismatch, my 107b84a842aca < server's 40107b84a842aca, missing 400000000000000
 local-node-1 kernel: libceph: mon0 10.0.0.2:6789 missing required protocol features

更多内核版本支持信息可以参考官方文档

如果是这种情况建议使用ceph-fuse,当然也可以通过以下命令修改为低版本crush tunables(默认default,实际是jewel):

ceph osd crush tunables hammer

# ceph osd crush show-tunables
{
    "choose_local_tries": 0,
    "choose_local_fallback_tries": 0,
    "choose_total_tries": 50,
    "chooseleaf_descend_once": 1,
    "chooseleaf_vary_r": 1,
    "chooseleaf_stable": 0,
    "straw_calc_version": 1,
    "allowed_bucket_algs": 54,
    "profile": "hammer",
    "optimal_tunables": 0,
    "legacy_tunables": 0,
    "minimum_required_version": "hammer",
    "require_feature_tunables": 1,
    "require_feature_tunables2": 1,
    "has_v2_rules": 0,
    "require_feature_tunables3": 1,
    "has_v3_rules": 0,
    "has_v4_buckets": 1,
    "require_feature_tunables5": 0,
    "has_v5_rules": 0
}

hammer 支持4.1或更高版本内核。

使用以下两种方式挂载:

# 方式一:
[root@local-node-1 ~]# mount -t ceph 10.0.0.2:6789:/ /mnt -o name=admin,secret=AQDo1aVcQ+Z0BRAAENyooUgFgokkjw9hBUOseg==

#方式二:
[root@local-node-1 ~]# mount -t ceph 10.0.0.2:6789:/ /mnt -o name=admin,secretfile=/tmp/keyring   
# keyring只包含密钥,不包含其它任何参数

如果挂载失败,需要检查mon和mds服务是否正常。

三. 移除Ceph FS

  1. 关闭mds服务:
# ceph mds stat
cephfs-1/1/1 up  {0=local-node-1=up:creating}

ceph mds fail local-node-1 

# 或者使用
systemctl stop ceph-mds@local-node-1
  1. 删除CephFS
# 列出当前的CephFS
ceph fs ls

# 删除CephFS
ceph fs rm cephfs --yes-i-really-mean-it 

# ceph fs ls
No filesystems enabled
  1. 删除pool
# ceph osd lspools
3 cephfs_data
4 cephfs_metadata

ceph osd pool delete cephfs_data cephfs_data --yes-i-really-really-mean-it
ceph osd pool delete cephfs_metadata cephfs_metadata --yes-i-really-really-mean-it
  1. 确认删除后的状态
# ceph -s
  cluster:
    id:     7bd25f8d-b76f-4ff9-89ec-186287bbeaa5
    health: HEALTH_OK

  services:
    mon: 1 daemons, quorum local-node-1
    mgr: ceph-mgr(active)
    osd: 3 osds: 3 up, 3 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   3.0 GiB used, 27 GiB / 30 GiB avail
    pgs: