Ceph 是什么
Ceph 是一个开源的分布式存储系统,提供了对象存储、块存储和文件系统三种存储接口。Ceph 将数据存储在逻辑存储池中,使用 CRUSH 分布式算法决定如何将数据分散存储在集群的各个节点上,以实现高可用性和数据冗余。
特点
- 开源
- 部署简单
- 可靠性好
- 性能高
- 分布式,可扩展性强
- 客户端支持多语言
组件
搭建 Ceph 集群至少要包括一个 MON(Monitor)节点、一个MGR(Manager)节点和多个 OSD(Object Storage Daemon)节点,OSD 节点数量由我们要保存的数据副本数量决定,比如我们要将数据集存储三份,就需要部署至少三个 OSD 节点。
下面是各个节点介绍:
-
OSD(Object Storage Daemon): 集群中所有数据与对象的存储的守护进程。负责管理自盘上的数据块(数据存储、数据复制、数据恢复),起到复制/平衡/恢复数/指定数据读写操作等作用。如果要保证高可用,至少需要部署三个节点。
-
MON(Monitor): 监控集群状态,维护 Ceph 集群的状态信息、配置信息和映射信息,确保集群元数据的一致性,协调集群节点间数据的分布和恢复。维护 cluster MAP 表,保证集群数据一致性。如果要保证高可用,至少需要部署三个节点。
-
MDS(Metadata Server):元数据服务,保存文件系统服务的元数据(OBJ/Block不需要该服务)。负责管理文件系统的目录结构、文件和目录的元数据信息,为 CephFS(Ceph的分布式文件系统)提供元数据服务。块存储和对象存储不需要部署 MDS。
-
MGR(Manager):负责收集 Ceph 集群的状态信息(OSD、MON、MDS 的性能指标、健康状况等),并提供了可视化的仪表板(Ceph Dashboard)方便用户查看。如果要保证高可用,至少需要部署两个节点。
-
RGW(Rados Gateway):提供与Amazon S3和Swift兼容的RESTful API的gateway服务。提供了 RESTful API,允许用户发送 HTTP/HTTPS 请求访问和管理存储在 Ceph 集群中的数据,支持 Amazon S3 API 和 OpenStack Swift API。
环境准备
3台网络互通的 CentOS 7 主机:
主机名称 |
主机IP |
角色 |
说明 |
chaos-1 |
172.20.30.1 |
ceph-admin |
osd、mon、mds、mgr、rgw |
chaos-2 |
172.20.30.2 |
ceph-1 |
osd、mon |
chaos-3 |
172.20.30.3 |
ceph-2 |
osd、mon |
部署
拉取镜像
1
2
|
docker pull ceph/daemon:master-4d96298-nautilus-centos-7-x86_64
docker image tag ceph/daemon:master-4d96298-nautilus-centos-7-x86_64 ceph/daemon:latest
|
初始化ceph挂载目录(每个节点都执行)
1
2
|
rm -rf /etc/ceph /var/lib/ceph /var/log/ceph
mkdir -p /etc/ceph /var/lib/ceph /var/log/ceph
|
启动 Monitor 节点
1、启动第一个 Monitor 节点(在 172.20.30.1 上执行)
1
2
3
4
5
6
7
8
|
docker run -d --net=host --restart always \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph/ \
-v /var/log/ceph/:/var/log/ceph/ \
-e MON_IP=172.20.30.1 \
-e CEPH_PUBLIC_NETWORK=172.20.30.0/24 \
--name="ceph-mon" \
ceph/daemon:latest mon
|
2、然后将 /etc/ceph
目录拷到其他两个节点(172.20.30.2、172.20.30.3),使用 scp
命令远程拷贝:
1
2
|
scp -r /etc/ceph root@172.20.30.2:/etc/
scp -r /etc/ceph root@172.20.30.3:/etc/
|
3、启动第二个 Monitor 节点(在 172.20.30.2 上执行)
1
2
3
4
5
6
7
8
|
docker run -d --net=host --restart always \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph/ \
-v /var/log/ceph/:/var/log/ceph/ \
-e MON_IP=172.20.30.2 \
-e CEPH_PUBLIC_NETWORK=172.20.30.0/24 \
--name="ceph-mon" \
ceph/daemon:latest mon
|
4、启动第三个 Monitor 节点(在 172.20.30.3 上执行)
1
2
3
4
5
6
7
8
|
docker run -d --net=host --restart always \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph/ \
-v /var/log/ceph/:/var/log/ceph/ \
-e MON_IP=172.20.30.3 \
-e CEPH_PUBLIC_NETWORK=172.20.30.0/24 \
--name="ceph-mon" \
ceph/daemon:latest mon
|
5、查看 ceph 集群状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[root@chaos-1 opt]# docker exec ceph-mon ceph -s
cluster:
id: 96711b46-de19-4cdc-b0ba-8b3e5a7960b9
health: HEALTH_WARN
mons are allowing insecure global_id reclaim
services:
mon: 3 daemons, quorum chaos-1,chaos-2,chaos-3 (age 71s)
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@chaos-1 opt]#
|
启动mgr节点(每个节点执行同样的run命令)
1、mgr模块用于分担monitor部分扩展功能,减轻monitor负担
1
2
3
4
5
6
7
|
docker run -d --net=host --restart=always \
--privileged=true \
--pid=host \
--name="ceph-mgr" \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph/ \
ceph/daemon:latest mgr
|
2、查看集群状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
[root@chaos-1 opt]# docker exec ceph-mon ceph -s
cluster:
id: 96711b46-de19-4cdc-b0ba-8b3e5a7960b9
health: HEALTH_WARN
OSD count 0 < osd_pool_default_size 3
mons are allowing insecure global_id reclaim
services:
mon: 3 daemons, quorum chaos-1,chaos-2,chaos-3 (age 8m)
mgr: chaos-1(active, since 2m), standbys: chaos-3, chaos-2
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@chaos-1 opt]#
|
启动 OSD 节点(每个节点执行)
1、往每个 OSD 节点的 /etc/ceph/ceph.conf
文件追加下面内容
1
2
3
4
|
cat >> /etc/ceph/ceph.conf <<EOF
osd max object name len = 256
osd max object namespace len = 64
EOF
|
Ceph osd启动报错osd init failed (36) File name too long
2、导出osd用于连ceph集群的 keyring
1
|
docker exec ceph-mon ceph auth get client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring
|
3、创建osd的存储目录
1
|
mkdir -p /data/ceph/osd/vdb
|
4、启动osd
1
2
3
4
5
6
7
|
docker run -d --privileged=true --name=ceph-osdvdb --net=host \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph/:/var/lib/ceph/ \
-v /data/ceph/osd/vdb:/var/lib/ceph/osd \
-e OSD_TYPE=directory \
-v /etc/localtime:/etc/localtime:ro \
ceph/daemon:latest osd
|
6、查看集群状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[root@chaos-1 opt]# docker exec ceph-mon ceph -s
cluster:
id: 96711b46-de19-4cdc-b0ba-8b3e5a7960b9
health: HEALTH_WARN
mons are allowing insecure global_id reclaim
services:
mon: 3 daemons, quorum chaos-1,chaos-2,chaos-3 (age 25m)
mgr: chaos-1(active, since 19m), standbys: chaos-3, chaos-2
osd: 3 osds: 3 up (since 42s), 3 in (since 42s)
task status:
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 3.0 GiB used, 297 GiB / 300 GiB avail
pgs:
[root@chaos-1 opt]#
|
启动gateway节点
1、导出rgw用于连接集群的keyring
1
|
docker exec ceph-mon ceph auth get client.bootstrap-rgw -o /var/lib/ceph/bootstrap-rgw/ceph.keyring
|
2、运行rgw节点, 可以启动一个或多个
1
2
3
4
5
6
|
docker run -d --net=host --privileged=true --name=ceph-rgw \
-v /var/lib/ceph/:/var/lib/ceph/ \
-v /etc/ceph:/etc/ceph \
-v /etc/localtime:/etc/localtime:ro \
-e RGW_NAME=rgw0 \
ceph/daemon:latest rgw
|
3、查看集群状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
[root@chaos-1 opt]# docker exec ceph-mon ceph -s
cluster:
id: 96711b46-de19-4cdc-b0ba-8b3e5a7960b9
health: HEALTH_WARN
mons are allowing insecure global_id reclaim
services:
mon: 3 daemons, quorum chaos-1,chaos-2,chaos-3 (age 42m)
mgr: chaos-1(active, since 35m), standbys: chaos-3, chaos-2
osd: 3 osds: 3 up (since 17m), 3 in (since 17m)
data:
pools: 4 pools, 128 pgs
objects: 9 objects, 1.2 KiB
usage: 3.0 GiB used, 297 GiB / 300 GiB avail
pgs: 41.406% pgs unknown
75 active+clean
53 unknown
io:
client: 767 B/s rd, 511 B/s wr, 0 op/s rd, 0 op/s wr
[root@chaos-1 opt]#
|
启动dashboard可视化管理页面
1、开启dashboard模块并禁用ssl(也可以用ssl, 需额外配置ssl证书)
1
2
3
4
5
|
docker exec ceph-rgw ceph mgr module enable dashboard
# 关闭https
docker exec ceph-rgw ceph config set mgr mgr/dashboard/ssl false
docker exec ceph-rgw ceph mgr module disable dashboard
docker exec ceph-rgw ceph mgr module enable dashboard
|
2、设置UI管理的host:port, 登录名及密码
我的虚拟主机也是容器环境,为了能在宿主机访问容器中部署的 ceph,我这里设置的IP为 0.0.0.0
1
2
3
4
|
docker exec ceph-rgw ceph config set mgr mgr/dashboard/server_addr 172.20.30.1
或者
docker exec ceph-rgw ceph config set mgr mgr/dashboard/server_addr 0.0.0.0
docker exec ceph-rgw ceph config set mgr mgr/dashboard/server_port 18080
|
验证是否配置成功:
1
|
docker exec ceph-rgw ceph mgr services
|
3、设置登录名及密码
1
2
|
docker exec ceph-rgw ceph dashboard ac-user-create <自定义user> <自定义pwd> administrator
docker exec ceph-rgw ceph dashboard ac-user-create ceph cephpass administrator
|
用户名:ceph
密码:cephpass
设置密码时我遇到下面错误:
1
2
3
|
[root@chaos-1 opt]# docker exec ceph-rgw ceph dashboard ac-user-create ceph cephpass administrator
Error EINVAL: Please specify the file containing the password/secret with "-i" option.
[root@chaos-1 opt]#
|
最新的ceph dashboard不支持直接在命令行里面创建用户的密码,需要先创建一个包含用户密码的文件。进入到 ceph-rgw
容器执行:
1
|
echo "cephpass" > ~/password.txt
|
退出容器重新执行:
1
2
3
|
[root@chaos-1 opt]# docker exec ceph-rgw ceph dashboard ac-user-create ceph -i ~/password.txt administrator
{"username": "ceph", "lastUpdate": 1730350784, "name": null, "roles": ["administrator"], "password": "$2b$12$5oxhctLdKYpz0DpT4WExheYu0tK/mghisrFawUEkoLUpgC0xeX9vy", "email": null}
[root@chaos-1 opt]#
|
4、登录并进入UI首页(http://<server_addr>:18080)

说明:我的虚拟主机也是容器环境,为了能在宿主机访问容器中部署的 ceph,容器的18080端口我映射的宿主机端口是20001。