Ceph 提供了 ceph-deploy 工具可以很方便地部署一个 Ceph 集群,为了更好理解和管理 Ceph 集群, 我们也可以手动部署一个 Ceph 集群。


Table of Contents

  1. 手动部署 Ceph 集群
    1. Monitor 自举
    2. 设置 Ceph Manager
    3. 添加 OSD
      1. 自动模式
      2. BLUSTORE
      3. FILESTORE
      4. 手动模式
    4. 添加 MDS
    5. 总结
  2. 重命名 Ceph 集群

所有的 Ceph 集群都心须有一个 monitor,然后有尽可能多的 OSDs 来存储对象。 Monitors 自举是部署 Ceph 集群的第一步, Monitors 的部署也为整个集群设定了非常重要的条件,比如 Pools 副本数量, 每个 OSD 上的 PG 数, 心跳间隔、是否要求认证等等。 大多数的选项都被设置成默认值。

接下来我们会建立一个有2个 Monitor nodes 同时作为 OSDs nodes 的 Ceph 集群。

手动部署 Ceph 集群

Monitor 自举

一个 Monitor 自举需要以下几个方面:

  • 唯一标志符fsid 是集群的的一个唯一标志符, 当 Ceph 用做 Ceph FileSystem时,也代表着 文件系统 ID。现在 Ceph 支持原生接口,块设备,以及对象存储网关接口等等。所以 fsid 现有点用词不当。
  • 集群名字: Ceph 集群有一个集群名字,是一个没有空格的字符串。 默认的名字是 ceph, 可以指定一个不同的名字。当在管理多个集群时,给集群起一个名字是非常有用的,你需要明确指定你要操作的是哪个集群。 这里我们使用 amito 作为集群名字。
  • Monitor 名字: 每一个 monitor 实例都有一个唯一的名字,一般地, Ceph Monitor 名字就是 host 名字。官方推荐 Ceph 的 OSD 实例不要和 Monitor 在同一个 node 上。
  • Monitor Map: 初始的 Monitors 自举要求我们生成一个 monitor map。 Monitor map 需要 fsid, 集群名字,还有至少一个节点名字与 IP 地址。
  • Monitor Keyring: Ceph 中 Monitors 是使用 keyring 来进行认证的来互相通信的,所以需要一个 keyring, 我们需要生成提供一个 monitor secret。
  • Administrator Keyring: 管理节点也需要一个 keyring 来与集群交互, 使用的用户为 client.admin

前面的要求并不是指 Ceph 配置文件的生成。但为了方便,官方建议创建一个 包含 fsidmon initial membersmon host 的Ceph 配置文件。步骤如下:

  1. 登陆到 初始 monitor 节点上
1
$ ssh mon-host
  1. 确保 /etc/ceph 文件夹存在, 安装 ceph 时会创建这一个文件夹。
1
$ ls /etc/ceph
  1. 创建一个 Ceph 配置文件, 默认为 /etc/ceph/ceph.conf, 这里为 /etc/ceph/amito.conf
1
$ sudo vim /etc/ceph/amito.conf
  1. 为集群生成一个唯一 ID (fsid)
1
2
3
$ uuidgen > uuid.txt
$ cat uuid.txt
17e4176b-29c6-4479-bb8c-72e0918d908c
  1. 将这唯一 ID 加到 amito.conf 中。
1
fsid = 17e4176b-29c6-4479-bb8c-72e0918d908c
  1. 添加初始 monitors 到 Ceph 配置文件中
1
mon initial members = node1, node2
  1. 添加初始 monitors 的 IPs 到 Ceph 配置文件中
1
mon host = 192.168.10.1, 10=92.168.10.2
  1. 为集群生成一个 keyring, 并生成一个 monitor secret key
1
$ ceph-authtool --create-keyring /tmp/amito.mon.keyring --gen-key -n mon. -cap mon 'allow *'
  1. 生成一个 administrator keyring, 一个 client.admin 用户, 并加到 keyring 中
1
$ sudo ceph-authtool --create-keyring /etc/ceph/amito.client.admin.keyring --gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *'
  1. 创建一个 bootstrap-osd keyring, 生成一个 bootstrap-osd 用户,并加到 keyring 中
1
sudo ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/amito.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd'
  1. 将生成的 keyrings 加到 amito.mon.keyring
1
2
$ sudo ceph-authtool /tmp/amito.mon.keyring --import-keyring /etc/ceph/amito.client.admin.keyring
$ sudo ceph-authtool /tmp/amito.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/amito.keyring
  1. 使用 节点名IP地址, 和 fsid 生成一个 monitor map, 保存到 /tmp/monmap
1
2
3
4
$ monmaptool --create --add {hostname} {ip-address} --fsid {uuid} /tmp/monmap
### e.g.
$ monmaptool --create --add node1 192.168.10.1 --fsid {uuid} /tmp/monmap
$ monmaptool --add node2 192.168.10.2 --fsid {uuid} /tmp/monmap
  1. 在 monitor 节点上创建默认的数据文件夹
1
2
3
$ sudo mkdir -p /var/lib/ceph/mon/{cluster-name}-{hostname}
### e.g.
$ sudo mkdir -p /var/lib/ceph/mon/amito-node1
  1. 利用 monitor map 和 keyring 配置 Mon 节点.
1
2
3
4
### usage:
$ sudo ceph-mon [--cluster cluster-name] --mkfs -i {hostname} --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
### e.g.
$ sudo ceph-mon --cluster amito --mkfs -i 192.168.10.1 --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
  1. 设置 Ceph 配置文件. 如下是一个例子.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[global]
fsid = 17e4176b-29c6-4479-bb8c-72e0918d908c
mon initial members = node1
mon host = 192.168.10.1
public network = 192.168.0.0/24
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
osd journal size = 1024
osd pool default size = 2
osd pool default min size = 1
osd pool default pg num = 256
osd pool default pgp num = 256
osd crush chooseleaf type = 1
  1. 创建完成文件. 标记 monitor 已经创建完并可以启动.
1
2
3
4
### usage:
$ sudo touch /var/lib/ceph/mon/{cluster-name}-{hostname}/done
### e.g.
$ sudo touch /var/lib/ceph/mon/amito-node1/done
  1. 启动 Ceph Monitor.
1
2
3
4
5
6
7
### systemd
$ sudo su -c 'echo "CLUSTER={cluster-name}" > /etc/sysconfig/ceph'
$ sudo systemctl enable --now ceph-mon@{hostname}
### older debian, centos or rhel
$ sudo /etc/init.d/ceph start mon.{hostname}
### e.g.
$ sudo systemctl enable --now ceph-mon@node1
  1. 查看 Ceph 集群状态.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ ceph -s
cluster:
id: 17e4176b-29c6-4479-bb8c-72e0918d908c
health: HEALTH_OK

services:
mon: 2 daemons, quorum node1, node2
osd: 0 osds: 0 up, 0 in

data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 bytes
usage: 0 kB used, 0 kB / 0 kB avail
pgs:

设置 Ceph Manager

  1. 生成一个认证 Key
1
2
$ name={hostname}
$ ceph --cluster amito auth get-or-create mgr.$name mon 'allow profile mgr' osd 'allow *' mds 'allow *'

将 生成的 Key 放在 mgr data 文件夹, 一般是在 /var/lib/ceph/mgr/{cluster-name}-{name}
2. 启动 ceph-mgr:

1
$ sudo ceph-mgr -i $name
  1. 查看 mgr 状态:
1
2
3
$ ceph -s
...
mgr status: ${name}

一般为了高可用, 每个 mon 节点都应该运行一个 mgr 进程.

添加 OSD

在初始 monitors 开始运行后, 我们就该添加 OSDs 到 集群中了. 集群只有在有足够的 OSDs 来处理对象副本数量时才会达到 active+clean 状态.

自动模式

BLUSTORE

  1. 创建 OSD: 联合模式
1
2
3
4
$ ssh node1
$ sudo ceph-volume lvm create --data {data-path}
### e.g.
$ sudo ceph-volume lvm create --data /dev/sdb1
  1. 创建 OSD: 分裂模式
1
2
3
4
5
6
7
8
9
#### 1. prepare osd
$ sudo ceph-volume lvm prepare --data {data-path}
$ sudo ceph-volume lvm list
### e.g.
$ sudo ceph-volume lvm prepare --data /dev/sdb2
#### 2. activate osd
$ sudo ceph-volume lvm activate {ID} {FSID}
### e.g
$ sudo ceph-volume lvm activate 1 17e4176b-29c6-4479-bb8c-72e0918d908c

FILESTORE

  1. 创建 OSD: 联合模式
1
2
3
4
$ ssh node1
$ sudo ceph-volume lvm create --filestore --data {data-path}
### e.g.
$ sudo ceph-volume lvm create --filestore --data /dev/sdb3
  1. 创建 OSD: 分裂模式
1
2
3
4
5
6
7
8
9
#### 1. prepare osd
$ sudo ceph-volume lvm prepare --filestore --data {data-path}
$ sudo ceph-volume lvm list
### e.g.
$ sudo ceph-volume lvm prepare --filestore --data /dev/sdb4
#### 2. activate osd
$ sudo ceph-volume lvm activate {ID} {FSID}
### e.g
$ sudo ceph-volume lvm activate 4 17e4176b-29c6-4479-bb8c-72e0918d908c

手动模式

  1. 登陆到 OSD 节点:
1
2
$ ssh node1
$ sudo bash
  1. 生成一个 UUID
1
2
$ uuidgen > osd.uuid.txt
$ cat osd.uuid.txt
  1. 创建一个 CephX key:
1
$ OSD_SECRET=$(ceph-authtool --get-print-key)
  1. 创建 OSD.
1
2
3
ID=$(echo "{\"cephx_secret\": \"$OSD_SECRET\"}" | \
ceph osd new $UUID -i - \
-n client.bootstrap-osd -k /var/lib/ceph/bootstrap-osd/ceph.keyring)
  1. 创建 OSD 目录文件.
1
$ mkdir /var/lib/ceph/osd/ceph-$ID

添加 MDS

  1. 创建 MDS 数据文件夹. id 为任意名字, 一般取为 hostname.
1
$ mkdir -p /var/lib/ceph/mds/{cluster-name}-{id}
  1. 生成 Keyring.
1
$ ceph-authtool --create-keyring /var/lib/ceph/mds/{cluster-name}-{id}/keyring --gen-key -n mds.{id}
  1. 导入 Key 并设置 caps.
1
ceph auth add mds.{id} osd "allow rwx" mds "allow" mon "allow profile mds" -i /var/lib/ceph/mds/{cluster}-{id}/keyring
  1. 将设置写入 Ceph 配置文件
1
2
[mds.{id}]
host = {id}
  1. 手动启动 mds
1
2
3
4
### usage:
$ ceph-mds --cluster {cluster-name} -i {id} -m {mon-hostname}:{mon-port} [-f]
### e.g.
$ ceph-mds --cluster ceph -i node1 -m {mon-hostname}:{mon-port} -f
  1. 或者使用 systemd 或者 sysinitv 启动:
1
2
3
### usage:
sudo systemctl enable --now ceph-mds@id
7. 安装 Ceph FileSystem

总结

在设置了 monitor, manager 和 OSDs 后, 可以查看 Ceph 集群的状态:

1
2
3
$ ceph -s
$ ceph -w
$ ceph osd tree

重命名 Ceph 集群

通过上面的手动创建过程可以看到, Ceph 集群名字更多是一个标志名, 没有进行硬编码. 所以可以对 Ceph 集群进行重命名. 具体过程就是将所有的文件夹和文件重命名, 例如从 cephremote. 改完后重启整个集群.