runsisi's

technical notes

Ceph 集群手工搭建

2019-01-11 runsisi#ceph

  1. 由于很多操作需要 root 权限,所以这里直接切换成 root 用户执行,而不是通过 sudo,在生产环境时应该使用普通用户 + sudo 的方式,某些涉及到服务进程的文件或文件夹可能会需要 chown 成 ceph 用户,注意不要弄错了;
  2. 基于 CentOS 7.x 系统,Ceph 版本为 Luminous 12.2.2 版本;
  3. 搭建的目标集群为单节点,单副本,但可以扩展成多节点,多副本(参考 IPv6 Ceph 集群手工搭建);
  4. 提供了使用 ceph-disk 和 ceph-volume 两种创建 OSD 的方式;
  5. 一定记得关防火墙,或者自己定制 firewalld 的规则放开 ceph 进程所需的相关端口;

查看节点 hostname,没实际意义,只是为了后面说明 MON/MGR 的名字可以与 hostname 没有关系:

~# hostname
514-20

创建集群配置文件

~# uuidgen
9d1cca5b-5058-4b92-985c-a08b21d7aa43
~# vi /etc/ceph/ceph.conf
[global]
fsid = 9d1cca5b-5058-4b92-985c-a08b21d7aa43  # 填入刚才 uuidgen 生产的 UUID
# 网络参数需要根据机器的实际情况来
# 如果准备部署多个 MON,mon_host 这里需要添加多个 IP 地址
mon_host = 192.8.8.20
public_network = 192.8.8.0/24
cluster_network = 192.8.8.0/24
# 下面三个参数是为了支持单节点,单副本 Ceph 集群而设置
osd_pool_default_size = 1        # 存储池副本数为 1,默认值为 3
osd_pool_default_min_size = 1    # 存储池最小副本数为 1,默认值为 2
osd_crush_chooseleaf_type = 0    # 允许副本数据在单节点内的 OSD 之间分布,默认值为 1,即数据副本必须跨节点分布

创建 MON 服务

~# ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
creating /tmp/ceph.mon.keyring
# 默认 /tmp/ceph.mon.keyring 是 600 权限,如果不给其它用户添加读权限,会导致后面 ceph-mon --mkfs 创建 MON 服务因为
# 权限问题而失败
~# chmod +r /tmp/ceph.mon.keyring
~# ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --set-uid=0 --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *'
creating /etc/ceph/ceph.client.admin.keyring
~# ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'allow profile bootstrap-osd'
creating /var/lib/ceph/bootstrap-osd/ceph.keyring
~# ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
importing contents of /etc/ceph/ceph.client.admin.keyring into /tmp/ceph.mon.keyring
~# ceph-authtool /tmp/ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
importing contents of /var/lib/ceph/bootstrap-osd/ceph.keyring into /tmp/ceph.mon.keyring
~# monmaptool --create --add nodexxx 192.8.8.20 --fsid 9d1cca5b-5058-4b92-985c-a08b21d7aa43 /tmp/monmap
monmaptool: monmap file /tmp/monmap
monmaptool: set fsid to 9d1cca5b-5058-4b92-985c-a08b21d7aa43
monmaptool: writing epoch 0 to /tmp/monmap (1 monitors)
# 下面的命令需要通过 sudo -u ceph 切换成 ceph 用户是因为 ceph 的服务进程在运行时都是使用的 ceph 用户,如果是用 root 用户
# 创建这些目录或文件,会导致 ceph 服务进程因为权限问题而无法启动,下同
# 前面执行的 hostname 命令只是为了说明这里的 nodexxx 可以与机器的 hostname 没什么联系,但是一般的约定是这里用 hostname 会便于识别 MON
# 指定 --monmap 非常重要,这样就可以基于 monmap 中的这一个 mon 建立集群,否则当 mon_host 指定的 mon 数目多于一个时,当前创建的 mon 还需要与其它 mon 建立联系之后才能成功创建集群
~# sudo -u ceph ceph-mon --mkfs -i nodexxx --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring

启动 MON 服务

~# systemctl start ceph-mon@nodexxx

确认集群创建成功

MON 服务创建并启动成功就表明集群已创建成功

# -m 选项用于指定 mon 进行连接,如果 mon_host 中只有一个 mon ip,则 -m 选项不是必须的
~# ceph -s -m 192.8.8.20
cluster:
id: 9d1cca5b-5058-4b92-985c-a08b21d7aa43
health: HEALTH_OK
...

在其它节点创建第二个 mon

将单个 mon 扩展至多个 mon

首先将配置文件和 mon 所需的 keyring 文件拷贝到目标节点上(ceph.client.admin.keyring 对于创建 mon 而言不是必须的,但对于后续的管理操作会更方便):

~# scp /etc/ceph/ceph.conf 192.8.8.21:/etc/ceph
~# scp /etc/ceph/ceph.client.admin.keyring 192.8.8.21:/etc/ceph/
~# scp /tmp/ceph.mon.keyring 192.8.8.21:/tmp

然后登陆目标节点创建 mon:

~# sudo -u ceph ceph-mon --mkfs -i b --keyring /tmp/ceph.mon.keyring
~# systemctl start ceph-mon@b

创建 MGR 服务

# 同样的,这里的 nodeyyy 只是说明 MGR 的名字可以任意,一般推荐和机器的 hostname 一致,或者类似 a b c,或者使用 UUID 等,
# 如果和 hostname 一致,则每台机器同类型的服务(MON/MGR)只起一个
~# ceph auth get-or-create mgr.nodeyyy mon 'allow profile mgr' osd 'allow *' mds 'allow *'
[mgr.nodeyyy]
key = AQC95jFaPa2GNBAA2chrrZIgqvAdpzmm1dBVJQ==
~# sudo -u ceph mkdir /var/lib/ceph/mgr/ceph-nodeyyy
~# ceph auth export mgr.nodeyyy -o /var/lib/ceph/mgr/ceph-nodeyyy/keyring
export auth(auid = 18446744073709551615 key=AQC95jFaPa2GNBAA2chrrZIgqvAdpzmm1dBVJQ== with 3 caps)
~# chown ceph.ceph /var/lib/ceph/mgr/ceph-nodeyyy/keyring
~# chmod 600 /var/lib/ceph/mgr/ceph-nodeyyy/keyring
~# systemctl start ceph-mgr@nodeyyy

确认 MGR 服务启动成功

~# ceph -s
...
services:
mon: 1 daemons, quorum nodexxx
mgr: nodeyyy(active)
...

使用 ceph-disk 创建 OSD

# 使用文件夹模拟 OSD,注意不要直接在 /var/lib/ceph/osd/ 下创建 ceph-0 目录
~# mkdir -p /ceph-test-data/osd0
~# chown ceph.ceph /ceph-test-data/osd0/
# 从 12.2.2 开始 ceph-disk 已废弃,所以有下面的告警,推荐使用 ceph-volume 创建 OSD
~# ceph-disk prepare /ceph-test-data/osd0
...
warnings.warn(DEPRECATION_WARNING)

~# ceph-disk activate /ceph-test-data/osd0
...
warnings.warn(DEPRECATION_WARNING)

使用 ceph-volume 创建 OSD

ceph-volume 不支持基于文件夹创建 osd,因此我们需要使用真实的块设备。这里我们假设 /dev/sdb 是 SSD,基于它创建 wal 和 db 分区, 在 ceph-volume 中一切分区都是 lvm 逻辑卷,因此先基于 /dev/sdb 创建逻辑卷:

~# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
~# vgcreate waldb /dev/sdb
Volume group "waldb" successfully created
~# lvcreate -L 50G -n wal-a waldb
Logical volume "wal-a" created.
~# lvcreate -L 50G -n db-a waldb
Logical volume "db-a" created.

创建 osd 通常分成 prepare 和 activate 两个步骤,其中 prepare 准备必须的符号链接、权限、以及向 ceph 集群分配一个 osd id:

~# ceph-volume lvm prepare --bluestore --data /dev/sdc --block.wal waldb/wal-a --block.db waldb/db-a
Running command: ceph-authtool --gen-print-key
Running command: ceph --cluster ceph --name client.bootstrap-osd --keyring /var/lib/ceph/bootstrap-osd/ceph.keyring -i - osd new f7a89604-c30e-4b69-989a-da945ac59007
...
--> ceph-volume lvm prepare successful for: /dev/sdc

然后进行 activate 操作,该步骤即启动 osd 进程,activate 命令需要 osd id 和 osd fsid 两个参数,因此先通过 list 命令得到这个两个信息:

~# ceph-volume lvm list

====== osd.0 =======
[block] /dev/ceph-c48680f3-81a6-47e7-844b-2b1dcf260402/osd-block-f7a89604-c30e-4b69-989a-da945ac59007
type block
osd id 0
cluster fsid c48680f3-81a6-47e7-844b-2b1dcf260402
cluster name ceph
wal uuid cwDlXe-ABen-OMXo-Mct2-O3jb-ZQjN-LJRWZd
osd fsid f7a89604-c30e-4b69-989a-da945ac59007
db device /dev/waldb/db-a
encrypted 0
...

最后根据上一步骤得到的信息真正执行 activate 命令:

~# ceph-volume lvm activate 0 f7a89604-c30e-4b69-989a-da945ac59007
Running command: ceph-bluestore-tool --cluster=ceph prime-osd-dir --dev /dev/ceph-c48680f3-81a6-47e7-844b-2b1dcf260402/osd-block-f7a89604-c30e-4b69-989a-da945ac59007 --path /var/lib/ceph/osd/ceph-0
Running command: ln -snf /dev/ceph-c48680f3-81a6-47e7-844b-2b1dcf260402/osd-block-f7a89604-c30e-4b69-989a-da945ac59007 /var/lib/ceph/osd/ceph-0/block
Running command: chown -R ceph:ceph /dev/dm-5
...
--> ceph-volume lvm activate successful for osd ID: 0
--> ceph-volume lvm activate successful for osd ID: 0

确认 OSD 服务启动成功

~# ceph -s
...
services:
mon: 1 daemons, quorum nodexxx
mgr: nodeyyy(active)
osd: 1 osds: 1 up, 1 in

创建存储池

~# ceph osd pool create rbd 4

确认存储池 rbd 创建成功

~# ceph -s
...
data:
pools: 1 pools, 4 pgs
objects: 0 objects, 0 bytes
usage: 1053 MB used, 9186 MB / 10240 MB avail
pgs: 4 active+clean

在其它节点创建 OSD

将单节点集群扩展至多个节点

~# scp /etc/ceph/ceph.conf 192.8.8.21:/etc/ceph
~# scp /var/lib/ceph/bootstrap-osd/ceph.keyring 192.8.8.21:/var/lib/ceph/bootstrap-osd/
~# ssh 192.8.8.21
~# ceph-disk prepare /dev/vdc
~# ceph-disk activate /dev/vdc1

创建 MDS 服务

# 这里的 mdsabc 只是个名字,可以随意修改,一般推荐和机器的 hostname 一致,或者类似 a b c,或者使用 UUID 等
~# sudo -u ceph mkdir /var/lib/ceph/mds/ceph-mdsabc
~# ceph-authtool --create-keyring /var/lib/ceph/mds/ceph-mdsabc/keyring --gen-key -n mds.mdsabc
creating /var/lib/ceph/mds/ceph-mdsabc/keyring
~# ceph auth add mds.mdsabc osd "allow rwx" mds "allow" mon "allow profile mds" -i /var/lib/ceph/mds/ceph-mdsabc/keyring
added key for mds.mdsabc
~# chown ceph.ceph /var/lib/ceph/mds/ceph-mdsabc/keyring
~# chmod 600 /var/lib/ceph/mds/ceph-mdsabc/keyring

启动 MDS 服务

~# systemctl start ceph-mds@mdsabc

创建 CephFS 文件系统

~# ceph fs new fsabc metadata rbd
new fs with metadata pool 2 and data pool 1