一. Ceph简介

一个Ceph存储集群要求至少有一个Ceph监视器和两个Ceph OSD守护进程。当运行Ceph文件系统客户端时,必须要有Ceph元数据服务器。

  • Ceph OSD守护进程(OSDs):Ceph的OSD守护进程(OSD)存储数据,处理数据复制,恢复,回填,重新调整,并通过检查其它Ceph OSD守护程序作为一个心跳 向Ceph的监视器报告一些检测信息。Ceph的存储集群需要至少2个OSD守护进程来保持一个 active + clean状态.(Ceph默认制作2个备份,但你可以调整它)
  • Ceph监视器(Monitors): Ceph的监控保持集群状态映射,包括OSD(守护进程)映射,分组(PG)映射,和CRUSH映射。 Ceph维护一个历史记录(epoch), 保存Monitors, OSDs 守护进程, PGs的状态改变.
  • Ceph元数据服务器(MDS): MDS是Ceph的元数据服务器,代表存储元数据的Ceph文件系统(即Ceph的块设备和Ceph的对象存储不使用MDS)。Ceph的元数据服务器使用POSIX文件系统,用户可以执行基本命令如 ls, find,等,并且不需要在Ceph的存储集群上造成巨大的负载.

    二. 部署架构

    推荐使用ceph-deploy部署一个简单的ceph集群, 包括一个admin node和 3个ceph存储node.

本篇文章的部署架构

node01 ~ node05 5台VM

  • node01 为admin node, mon node
  • node02 ~ node04 为 OSD node
  • node05 为客户端节点

三. 部署CEPH集群

ceph-deploy node 配置

1. 添加软件源

1
2
3
4
5
6
7
8
9
yum install -y epel-release
vim /etc/yum.repos.d/ceph.repo
[ceph-noarch]
name=Ceph noarch packages
baseurl=http://download.ceph.com/rpm-jewel/el7/noarch/
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

2. 安装 ceph-deploy

1
[root@node01 ceph]# yum install ceph-deploy -y

ceph 集群节点配置

1. 安装ntp

在所有ceph 集群节点上安装, 保证时间同步

1
2
[root@node02 ~]# yum install ntp ntpdate ntp-doc -y
[root@node02 ~]# systemctl start ntpd

2.部署 ceph集群

在admin node上建立部署目录

1
2
[root@node01 ~]# mkdir my-cluster
[root@node01 ~]# cd my-cluster/

ceph集群初始化, ceph-deploy new {initial-monitor-node(s)}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[root@node01 my-cluster]# ceph-deploy new node01
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (1.5.34): /bin/ceph-deploy new node01
[ceph_deploy.cli][INFO ] ceph-deploy options:
[ceph_deploy.cli][INFO ] username : None
[ceph_deploy.cli][INFO ] func : <function new at 0x7f728baf66e0>
[ceph_deploy.cli][INFO ] verbose : False
[ceph_deploy.cli][INFO ] overwrite_conf : False
[ceph_deploy.cli][INFO ] quiet : False
[ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7f728ae5b830>
[ceph_deploy.cli][INFO ] cluster : ceph
[ceph_deploy.cli][INFO ] ssh_copykey : True
[ceph_deploy.cli][INFO ] mon : ['node01']
[ceph_deploy.cli][INFO ] public_network : None
[ceph_deploy.cli][INFO ] ceph_conf : None
[ceph_deploy.cli][INFO ] cluster_network : None
[ceph_deploy.cli][INFO ] default_release : False
[ceph_deploy.cli][INFO ] fsid : None
[ceph_deploy.new][DEBUG ] Creating new cluster named ceph
[ceph_deploy.new][INFO ] making sure passwordless SSH succeeds
[node01][DEBUG ] connected to host: node01
[node01][DEBUG ] detect platform information from remote host
[node01][DEBUG ] detect machine type
[node01][DEBUG ] find the location of an executable
[node01][INFO ] Running command: /usr/sbin/ip link show
[node01][INFO ] Running command: /usr/sbin/ip addr show
[node01][DEBUG ] IP addresses found: ['172.17.0.1', '172.18.0.1', '172.19.0.1', '10.0.2.15', '192.168.33.101']
[ceph_deploy.new][DEBUG ] Resolving host node01
[ceph_deploy.new][DEBUG ] Monitor node01 at 192.168.33.101
[ceph_deploy.new][DEBUG ] Monitor initial members are ['node01']
[ceph_deploy.new][DEBUG ] Monitor addrs are ['192.168.33.101']
[ceph_deploy.new][DEBUG ] Creating a random mon key...
[ceph_deploy.new][DEBUG ] Writing monitor keyring to ceph.mon.keyring...
[ceph_deploy.new][DEBUG ] Writing initial config to ceph.conf...

部署集群

1
[root@node01 my-cluster]# ceph-deploy install node01 node02 node03 node04

初始化 监控节点

1
[root@node01 my-cluster]# ceph-deploy mon create-initial

在 OSD节点创建数据目录

1
2
3
[root@node01 my-cluster]# ssh node02 "mkdir /var/local/osd0;chown ceph:ceph /var/local/osd0"
[root@node01 my-cluster]# ssh node03 "mkdir /var/local/osd1;chown ceph:ceph /var/local/osd1"
[root@node01 my-cluster]# ssh node04 "mkdir /var/local/osd2;chown ceph:ceph /var/local/osd2"

管理节点 初始化OSD守护进程

1
[root@node01 my-cluster]# ceph-deploy osd prepare node02:/var/local/osd0 node03:/var/local/osd1 node04:/var/local/osd2

激活 OSD节点

1
[root@node01 my-cluster]# ceph-deploy osd activate node02:/var/local/osd0 node03:/var/local/osd1 node04:/var/local/osd2

使用ceph-deploy拷贝配置文件和管理密钥到每个节点

1
[root@node01 my-cluster]# ceph-deploy admin node01 node02 node03 node04

确保密钥文件权限

1
2
3
4
[root@node01 my-cluster]# chmod +r /etc/ceph/ceph.client.admin.keyring
[root@node01 my-cluster]# ssh node02 "chmod +r /etc/ceph/ceph.client.admin.keyring"
[root@node01 my-cluster]# ssh node03 "chmod +r /etc/ceph/ceph.client.admin.keyring"
[root@node01 my-cluster]# ssh node04 "chmod +r /etc/ceph/ceph.client.admin.keyring"

检查Ceph集群状态

1
2
3
4
5
6
7
8
9
10
11
12
[root@node01 my-cluster]# ceph health
HEALTH_OK
[root@node01 my-cluster]# ceph --status
cluster 1d3b5179-b9d8-4419-8a4d-07e119027978
health HEALTH_OK
monmap e1: 1 mons at {node01=192.168.33.101:6789/0}
election epoch 3, quorum 0 node01
osdmap e14: 3 osds: 3 up, 3 in
flags sortbitwise
pgmap v39: 64 pgs, 1 pools, 0 bytes data, 0 objects
20950 MB used, 97156 MB / 115 GB avail
64 active+clean

拓展ceph集群,新增OSD节点

在 node01上面新增 OSD守护进程

1
2
3
4
[root@node01 my-cluster]# mkdir /var/local/osd3
[root@node01 my-cluster]# chown ceph:ceph /var/local/osd3
[root@node01 my-cluster]# ceph-deploy osd prepare node01:/var/local/osd3
[root@node01 my-cluster]# ceph-deploy osd activate node01:/var/local/osd3
1
2
3
4
5
6
7
8
9
10
[root@node01 my-cluster]# ceph -s
cluster 1d3b5179-b9d8-4419-8a4d-07e119027978
health HEALTH_OK
monmap e1: 1 mons at {node01=192.168.33.101:6789/0}
election epoch 3, quorum 0 node01
osdmap e19: 4 osds: 4 up, 4 in
flags sortbitwise
pgmap v66: 64 pgs, 1 pools, 0 bytes data, 0 objects
28893 MB used, 125 GB / 153 GB avail
64 active+clean

新增元数据节点(metadata server)

使用CephFS, 你至少要有一个 metadata server. 使用如下命令创建 metadata server

1
[root@node01 my-cluster]# ceph-deploy mds create node01

新增 RGW实例(RGW INSTANCE)

使用 Ceph Object Gateway 组件, 必须部署一个 RGW INSTANCE 服务.

1
[root@node01 my-cluster]# ceph-deploy rgw create node01

RGW instance service 默认监听端口是 7480. 你可以编辑该节点上的 ceph.conf配置文件修改监听端口

1
2
[client]
rgw frontends = civetweb port=80

新增监控节点(MONITORS)

一个Ceph存储集群至少要有一个监控节点,但是为了保证集群高可用,避免单点失败. Ceph 使用 Paxos算法选举Monitors节点.
监控节点数目配置(i.e., 1, 2:3, 3:4, 3:5, 4:6, etc.)

1
2
[root@node01 my-cluster]# ceph-deploy mon add node02
[root@node01 my-cluster]# ceph-deploy mon add node03

1
2
3
4
5
6
7
8
9
10
11
12
[root@node01 my-cluster]# ceph -s
cluster 1d3b5179-b9d8-4419-8a4d-07e119027978
health HEALTH_WARN
clock skew detected on mon.node02, mon.node03
Monitor clock skew detected
monmap e3: 3 mons at {node01=192.168.33.101:6789/0,node02=192.168.33.102:6789/0,node03=192.168.33.103:6789/0}
election epoch 6, quorum 0,1,2 node01,node02,node03
osdmap e28: 4 osds: 4 up, 4 in
flags sortbitwise
pgmap v2124: 112 pgs, 7 pools, 1636 bytes data, 171 objects
28938 MB used, 125 GB / 153 GB avail
112 active+clean

当你添加了监控节点以后, Ceph会开始同步选举信息在所有的监控节点, 可以使用如下命令查看选举状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[root@node01 my-cluster]# ceph quorum_status --format json-pretty

{
"election_epoch": 6,
"quorum": [
0,
1,
2
],
"quorum_names": [
"node01",
"node02",
"node03"
],
"quorum_leader_name": "node01",
"monmap": {
"epoch": 3,
"fsid": "1d3b5179-b9d8-4419-8a4d-07e119027978",
"modified": "2016-07-21 06:16:33.590469",
"created": "2016-07-21 02:56:09.834159",
"mons": [
{
"rank": 0,
"name": "node01",
"addr": "192.168.33.101:6789\/0"
},
{
"rank": 1,
"name": "node02",
"addr": "192.168.33.102:6789\/0"
},
{
"rank": 2,
"name": "node03",
"addr": "192.168.33.103:6789\/0"
}
]
}
}

** NOTE** 当你使用多个监控节点时, 请一定配置NTP服务确保所有监控节点时间同步.

四. 测试CEPH对象存储

存储对象数据, Ceph客户端必须:

  1. 设置一个 对象名字(object name)
  2. 指定一个存储池(pool)

创建 placement group (PG)

创建新pool命令为

1
ceph osd pool create {pool-name} pg_num

pg_num 值需要收工选定, 一般来说:

  • 少于5个OSDs节点 pg_num = 128
  • 5-10个OSDs节点 pg_num = 512
  • 10-50个OSDs节点 pg_num = 4096
  • 多于50 OSDs节点 你需要理解 the tradeoffs 和自己计算pg_num值, 可以使用 pgcalc tool来计算.

创建一个 PG

1
2
[root@node01 my-cluster]# ceph osd pool create data-pool-01 128
pool 'data-pool-01' created

查询pool信息

1
2
3
4
5
6
7
8
9
[root@node01 my-cluster]# ceph osd pool ls
rbd
.rgw.root
default.rgw.control
default.rgw.data.root
default.rgw.gc
default.rgw.log
default.rgw.users.uid
data-pool-01

测试对象存储

新建一个测试文件, 制定一个对象名字test-object-1和存储池data-pool-01, 上传数据到对象存储

1
2
[root@node01 my-cluster]# echo {Test-data1, Test-data2} > testfile.txt
[root@node01 my-cluster]# rados put test-object-1 ./testfile.txt --pool=data-pool-01

查询 Ceph 存储集群 对象数据

1
2
[root@node01 my-cluster]# rados -p data-pool-01 ls
test-object-1

查询 对象位置

1
2
3
#ceph osd map {pool-name} {object-name}
[root@node01 my-cluster]# ceph osd map data-pool-01 test-object-1
osdmap e30 pool 'data-pool-01' (7) object 'test-object-1' -> pg 7.74dc35e2 (7.62) -> up ([3,1,2], p3) acting ([3,1,2], p3)

删除 对象存储数据 rados rm

1
2
[root@node01 my-cluster]# rados rm test-object-1 --pool=data-pool-01
[root@node01 my-cluster]# rados -p data-pool-01 ls

五 CEPH 块存储快速向导

使用ceph存储集群块存储, 你需要在需要挂载块存储的服务器上安装ceph-client

1. 安装 ceph-client

在admin node上使用ceph-deploy 在node05上安装 ceph-client

1
[root@node01 my-cluster]# ceph-deploy install node05

拷贝配置文件和密钥到 node05

1
2
[root@node01 my-cluster]# ceph-deploy admin node05
[root@node01 my-cluster]# ssh node05 "chmod +r /etc/ceph/ceph.client.admin.keyring"

2. 配置一个块存储设备

2.1 在 node05 上创建一个 块设备镜像

1
2
3
4
#rbd create {image-name} --size 4096 [-m {mon-IP}] [-k /path/to/ceph.client.admin.keyring]
[root@node05 ~]# rbd create block-device-02 --size 1024
[root@node05 ~]# rbd list
block-device-02

2.2 映射一个镜像到块设备

1
2
3
#rbd map foo --name client.admin [-m {mon-IP}] [-k /path/to/ceph.client.admin.keyring]
[root@node05 ~]# rbd map block-device-02 --name client.admin
/dev/rbd0

Note http://www.zphj1987.com/2016/06/07/rbd%E6%97%A0%E6%B3%95map(rbd-feature-disable)/

查看map信息

1
2
3
[root@node05 ~]# rbd showmapped
id pool image snap device
0 rbd block-device-02 - /dev/rbd0

2.3 使用块存储设备创建文件系统

1
[root@node05 ~]# mkfs.ext4 -m0 /dev/rbd/rbd/block-device-02

2.4 在node05上挂载文件系统

1
2
3
4
5
[root@node05 ~]# mount /dev/rbd/rbd/block-device-02 /mnt/ceph-block-device
[root@node05 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
...
/dev/rbd0 976M 2.6M 958M 1% /mnt/ceph-block-device

2.5 Ceph 块设备基本命令

2.5.1 创建一个块设备镜像(block device images)

在指定的 pool创建block device images

1
rbd create --size {megabytes} {pool-name}/{image-name}

例如:

1
2
3
4
5
6
7
8
9
10
#创建一个swimming-pool-01 存储池
[root@node01 my-cluster]# ceph osd pool create swimming-pool-01 128
pool 'swimming-pool-01' created
#查询存储池列表
[root@node01 my-cluster]# ceph osd pool ls
rbd
...
swimming-pool-01
#在swimming-pool-01中创建一个bar块设备镜像
[root@node01 my-cluster]# rbd create --size 1024 swimming-pool-01/bar

如果不指定 {pool-name}, 镜像会创建到默认的rbd pool中.
例如:

1
[root@node01 my-cluster]# rbd create --size 1024 foo

2.5.2 查询块设备镜像

1
2
3
[root@node01 my-cluster]# rbd ls
block-device-02
foo

查询存储池中的块设备镜像

1
2
[root@node01 my-cluster]# rbd ls swimming-pool-01
bar

查询块设备镜像信息

1
2
3
4
5
6
7
8
[root@node01 my-cluster]# rbd info foo
rbd image 'foo':
size 1024 MB in 256 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.10dd238e1f29
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:

存储池中块设备镜像信息

1
2
3
4
5
6
7
8
9
# rbd info {pool-name}/{image-name}
[root@node01 my-cluster]# rbd info swimming-pool-01/bar
rbd image 'bar':
size 1024 MB in 256 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.10d7238e1f29
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:

2.5.3 缩放块设备镜像

增加镜像空间

1
2
3
4
5
6
7
8
9
10
[root@node01 my-cluster]# rbd info foo
rbd image 'foo':
size 1024 MB in 256 objects
...
[root@node01 my-cluster]# rbd resize --size 2048 foo
Resizing image: 100% complete...done.
[root@node01 my-cluster]# rbd info foo
rbd image 'foo':
size 2048 MB in 512 objects
...

减小镜像空间

1
2
3
4
5
[root@node01 my-cluster]# rbd resize --size 1024 foo --allow-shrink
Resizing image: 100% complete...done.
[root@node01 my-cluster]# rbd info foo
rbd image 'foo':
size 1024 MB in 256 objects

2.5.4 删除块设备镜像

使用 rbd rm删除块设备镜像

1
2
3
4
5
6
7
#rbd rm {image-name}
[root@node01 my-cluster]# rbd rm foo
Removing image: 100% complete...done.

# rbd rm {pool-name}/{image-name}
[root@node01 my-cluster]# rbd rm swimming-pool-01/bar
Removing image: 100% complete...done.

六 CEPH FS存储快速指南

1. 安装 ceph-client

在admin node上使用ceph-deploy 在node05上安装 ceph-client

1
[root@node01 my-cluster]# ceph-deploy install node05

2. 确保ceph 集群状态正常 和Ceph Metadata server运行

1
2
3
4
5
6
7
8
9
10
11
12
[root@node05 ~]# ceph -s
cluster 1d3b5179-b9d8-4419-8a4d-07e119027978
health HEALTH_WARN
clock skew detected on mon.node02, mon.node03
Monitor clock skew detected
monmap e3: 3 mons at {node01=192.168.33.101:6789/0,node02=192.168.33.102:6789/0,node03=192.168.33.103:6789/0}
election epoch 6, quorum 0,1,2 node01,node02,node03
osdmap e36: 4 osds: 4 up, 4 in
flags sortbitwise
pgmap v7759: 368 pgs, 9 pools, 38193 kB data, 190 objects
28977 MB used, 125 GB / 153 GB avail
368 active+clean

3. 创建一个FS

如果你已经创建了 MDS节点服务(Metadata server), 他会在你创建文件系统pool的时候激活.

1
2
3
ceph osd pool create cephfs_data <pg_num>
ceph osd pool create cephfs_metadata <pg_num>
ceph fs new <fs_name> cephfs_metadata cephfs_data

例子:

1
2
3
4
5
6
[root@node01 my-cluster]# ceph osd pool create cephfs_data 128
pool 'cephfs_data' created
[root@node01 my-cluster]# ceph osd pool create cephfs_metadata 128
pool 'cephfs_metadata' created
[root@node01 my-cluster]# ceph fs new fs_01 cephfs_metadata cephfs_data
new fs with metadata pool 10 and data pool 9

4.创建一个客户端密钥文件

4.1 查看ceph.client.admin.keyring文件密钥

1
2
3
[root@node05 ~]# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
key = AQDKOZBX6qwsHBAALMW9Eo6edy0UJfK5ZLRAzg==

4.2 新建一个文件一用户名命名eg:admin.secret, 内容为密钥

1
2
[root@node05 ~]# echo "AQDKOZBX6qwsHBAALMW9Eo6edy0UJfK5ZLRAzg==" > admin.secret
[root@node05 ~]# chmod +r admin.secret

Note 确保密钥文件有可读权限

5. 挂载FS

使用内核驱动挂载FS

1
2
mkdir /mnt/mycephfs
mount -t ceph {ip-address-of-monitor}:6789:/ /mnt/mycephfs

因为Ceph存储集群默认使用用户授权模式,所以需要制定一个以用户名命名的密钥文件admin.secret.
所以要使用如下命令挂载.

1
2
3
4
5
[root@node05 ~]# mount -t ceph node01:6789:/ /mnt/mycephfs -o name=admin,secretfile=admin.secret
[root@node05 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
...
192.168.33.101:6789:/ 154G 29G 126G 19% /mnt/mycephfs

6. 在用户空间(FUSE)挂载FS

1
2
sudo mkdir ~/mycephfs
sudo ceph-fuse -m {ip-address-of-monitor}:6789 ~/mycephfs

需要指定一个key文件路径, 如果key文件不在默认路径下/etc/ceph

1
sudo ceph-fuse -k ./ceph.client.admin.keyring -m node01:6789 ~/mycephfs