引言:Ceph是目前炙手可热的一个统一分布式存储系统,具有优异的性能、可靠性、可扩展性。其可轻松扩展到数 PB 容量, 支持多种工作负载的高性能(每秒输入/输出操作[IOPS]和带宽),具有极其高的可靠性。Ceph对比HDFS优势在于易扩展,无单点。HDFS是专门为Hadoop这样的云计算而生,在离线批量处理大数据上有先天的优势,而Ceph是一个通用的实时存储系统,具有相当好的超大数量小文件处理能力,且现在Hadoop可以利用Ceph作为存储后端。Ceph最近加入到 Linux 中令人印象深刻的文件系统备选行列,能够在维护 POSIX 兼容性的同时加入了复制和容错功能,成为现在分布式系统的掌上明珠。
——摘自Ceph常见问题百科全书
当前Ceph版本和CentOS版本:
[root@ceph1 ceph]# ceph -v
ceph version 13.2.2 (02899bfda814146b021136e9d8e80eba494e1126) mimic (stable)
[root@ceph1 ceph]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
前提条件:
共有三个节点:ceph1
,ceph2
,ceph3
①已经配置好三个节点的hosts文件,如:
[root@ceph1 ~]# cat /etc/hosts
10.0.86.246 ceph1
10.0.86.221 ceph2
10.0.86.253 ceph3
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
②已经配置好三个节点之间的SSH免密登录
具体方法见:配置ceph集群节点间的SSH免密登录快速方法 由于虚机限制,此处仅搭了三个结点,少一个mon.node1
节点,将该节点 Monitor功能迁移到admin-node
节点上。即此处,ceph1结点即是admin-node
节点又有监视器功能。 所以集群的结构图如下:
1.创建集群
注:以下在admin-node
上的/etc/ceph/
目录下操作。
当前管理节点/etc/ceph/
目录下仅有一个rbdmap
文件:
[root@ceph1 ~]# cd /etc/ceph/
[root@ceph1 ceph]# ls
rbdmap
①直接在三个节点上创建集群
此处按照官网执行的命令是ceph-deploy new ceph1
,但后续官方文档还会再让添加ceph2和ceph3节点,所以不如一行命令一劳永逸~
[root@ceph1 ceph]# ceph-deploy new ceph{1,2,3}
此时,在/etc/ceph/
目录下生成几个文件:
[root@ceph1 ceph]# ls
ceph.conf ceph-deploy-ceph.log ceph.mon.keyring rbdmap
ceph.conf
:ceph配置文件ceph-deploy-ceph.log
:ceph-deploy日志文件ceph.mon.keyring
:ceph monitor的密钥环。如果有多个网卡,还应该在/etc/ceph/ceph.conf配置文件底部空白处中增加:
public network = 10.0.86.0/24
②在三个节点中安装Ceph软件包,即客户端(等待约5~6min)
[root@ceph1 ceph]# ceph-deploy install ceph{1,2,3}
③部署初始监视器并分发key
[root@ceph1 ceph]# ceph-deploy mon create-initial
如果ceph2和ceph3两个结点的配置文件的内容于当前节点不一致则报如下错:
[ceph_deploy.mon][ERROR ] RuntimeError: config file /etc/ceph/ceph.conf exists with different content;
需要增加--overwrite-conf
参数覆盖,具体解决方法见:ceph集群报错解决方案 成功后当前目录下会多出来几个密钥环:
ceph.bootstrap-mds.keyring
ceph.bootstrap-rgw.keyring
ceph.bootstrap-mgr.keyring
ceph.client.admin.keyring
ceph.bootstrap-osd.keyring
此时,可以查看到当前集群状态是HEALTH_OK
[root@ceph1 ceph]# ceph -s
cluster:
id: 13430f9a-ce0d-4d17-a215-272890f47f28
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph2,ceph1,ceph3
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:
④复制当前管理节点上的配置文件和key到其他节点
(此处是ceph2,ceph3)
[root@ceph1 ceph]# ceph-deploy admin ceph{1,2,3}
成功后将在ceph2和ceph3的/etc/ceph/
目录下看到复制过来的配置文件和密钥环。
[root@ceph2 ceph]# ls
ceph.client.admin.keyring ceph.conf rbdmap tmp9MON_a
⑤增加三个OSDs
OSD是最终数据存储的地方,这里我分别在三个ceph节点上创建了三个OSD节点。
1)创建分区(使用parted工具用于对磁盘进行分区及管理)
[root@ceph1 ceph]# parted
GNU Parted 3.1 #当前Parted版本是3.1
Using /dev/vda #使用目录在/dev/vda
Welcome to GNU Parted! Type 'help' to view a list of commands.
输入print
命令可以查看当前分区表(以下分区表是gpt,当前磁盘大小215GB):
(parted) print
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 215GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 17.4kB 2047kB 2030kB bios_grub bios_grub
2 2048kB 51.2GB 51.2GB xfs rootfspart
创建分区,输入分区名字,文件系统类型和起始位置(起始位置不能和已存在分区重叠,否则会报overlapping
错)。
(parted) mkpart
Partition name? []? c1
File system type? [ext2]? ext4
Start? 51.2GB
End? 140GB
再次输入print
命令可以看到当前分区表多出来了刚才创建好的分区。
Number Start End Size File system Name Flags
1 17.4kB 2047kB 2030kB bios_grub bios_grub
2 2048kB 51.2GB 51.2GB xfs rootfspart
3 51.2GB 140GB 88.8GB c1
输入quit
退出parted工具
(parted) quit
退出后列出所有可用块设备信息也可看到多出了vda3
[root@ceph1 ceph]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 200G 0 disk
├─vda1 252:1 0 2M 0 part
├─vda2 252:2 0 47.7G 0 part /
└─vda3 252:3 0 82.7G 0 part
同理分别登录到ceph2,ceph3上执行以上创建分区操作,不再继续赘述,创建好三个节点的分区后退回到管理节点ceph1的/etc/ceph/
目录下。
- 在ceph1上创建一个OSD(该命令必须在管理节点上,即ceph1中的
/etc/ceph/
目录下执行,因为需要ceph.bootstrap-osd.keyring
密钥环,而另外两个节点上没有该密钥环)。
[root@ceph1 ceph]# ceph-deploy osd create --data /dev/vda3 ceph1
查看集群状态可发现出来一个osd守护进程。
[root@ceph1 ceph]# ceph -s
cluster:
id: 13430f9a-ce0d-4d17-a215-272890f47f28
health: HEALTH_WARN
no active mgr
services:
mon: 3 daemons, quorum ceph2,ceph1,ceph3
mgr: no daemons active
osd: 1 osds: 1 up, 1 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
列出所有可用块设备信息也发现在vda3
下成功创建OSD
[root@ceph1 ceph]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 200G 0 disk
├─vda1 252:1 0 2M 0 part
├─vda2 252:2 0 47.7G 0 part /
└─vda3 252:3 0 82.7G 0 part
└─ceph--72a23f8f--b00a--474d--b51e--52393b9840d4-osd--block--de79c41d--8ce4--4473--b767--fe3e88ef2029
253:0 0 82.7G 0 lvm
同理,在当前目录下继续创建另外两个OSD。
[root@ceph1 ceph]# ceph-deploy osd create --data /dev/vda3 ceph2
[root@ceph1 ceph]# ceph-deploy osd create --data /dev/vda3 ceph3
成功后显示当前集群有三个OSD守护进程。
[root@ceph1 ceph]# ceph -s
cluster:
id: 13430f9a-ce0d-4d17-a215-272890f47f28
health: HEALTH_WARN
no active mgr
services:
mon: 3 daemons, quorum ceph2,ceph1,ceph3
mgr: no daemons active
osd: 3 osds: 3 up, 3 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
注:目前集群健康状态是HEALTH_WARN
,原因是没有激活管理器mgr
,先不用着急,后续会添加。
2.扩展集群
在上一步成功建立并运行了一个基本集群后,下一步就是需要提高可靠性和可用性而扩展集群。即向ceph1添加元数据服务器(mds
),然后在ceph2和ceph3中添加监视器(mon
)和管理器(mgr
)
①添加至少一个元数据服务器
(用以使用CephFS,此处在ceph1上添加)
[root@ceph1 ceph]# ceph-deploy mds create ceph1
②为另外两个节点ceph2和ceph3添加监视器Monitor
注:一个ceph集群至少需要一个Monitor和一个Manager,为高可用性,保证一个Monitor坏掉后集群还能正常运转,在三个节点上均添加上Monitor功能和Manager。
[root@ceph1 ceph]# ceph-deploy mon add ceph2
[root@ceph1 ceph]# ceph-deploy mon add ceph3
但细心的读者会发现前面添加Monitor时候我们把三个节点都添加了,所以这里可不用执行以上命令。
可以用ceph quorum_status --format json-pretty
命令查看quorum状态。
[root@ceph1 ceph]# ceph quorum_status --format json-pretty
{
"election_epoch": 10,
"quorum": [
0,
1,
2
],
"quorum_names": [
"ceph2",
"ceph1",
"ceph3"
],
"quorum_leader_name": "ceph2",
"monmap": {
"epoch": 1,
"fsid": "13430f9a-ce0d-4d17-a215-272890f47f28",
"modified": "2018-11-19 10:42:55.478872",
"created": "2018-11-19 10:42:55.478872",
"features": {
"persistent": [
"kraken",
"luminous",
"mimic",
"osdmap-prune"
],
"optional": []
},
"mons": [
{
"rank": 0,
"name": "ceph2",
"addr": "10.0.86.221:6789/0",
"public_addr": "10.0.86.221:6789/0"
},
{
"rank": 1,
"name": "ceph1",
"addr": "10.0.86.246:6789/0",
"public_addr": "10.0.86.246:6789/0"
},
{
"rank": 2,
"name": "ceph3",
"addr": "10.0.86.253:6789/0",
"public_addr": "10.0.86.253:6789/0"
}
]
}
}
③在三个节点上添加管理器Manager
[root@ceph1 ceph]# ceph-deploy mgr create ceph{1,2,3}
查看此时的集群状态发现三个节点均部署了Manager,集群状态HEALTH_OK
也正常了。在usage中也能看到当前磁盘使用情况,3.0 GiB used
显然表示目前已使用3.0 GiB
, 245 GiB / 248 GiB avail
表示剩余/总量。
[root@ceph1 ceph]# ceph -s
cluster:
id: 13430f9a-ce0d-4d17-a215-272890f47f28
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph2,ceph1,ceph3
mgr: ceph1(active), standbys: ceph3, ceph2
osd: 3 osds: 3 up, 3 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 3.0 GiB used, 245 GiB / 248 GiB avail
pgs:
④为ceph1节点添加RGW实例
要使用Ceph Object Gateway(对象网关)组件,需要安装RGW实例。
[root@ceph1 ceph]# ceph-deploy rgw create ceph1
最后一条信息显示RGW在ceph1上默认监听端口是7480
[ceph_deploy.rgw][INFO ] The Ceph Object Gateway (RGW) is now running on host ceph1 and default port 7480
如要修改默认端口为80端口,可以在ceph1节点的/etc/ceph/ceph.conf
配置文件底部添加如下配置:
[client]
rgw frontends = civetweb port=80
如果立即查看当前ceph集群状态,会发现此时的PG正在创建creating
+同步其他节点peering
中。具体PG状态表及详解见:PG状态表
[root@ceph1 ceph]# ceph -s
cluster:
id: 13430f9a-ce0d-4d17-a215-272890f47f28
health: HEALTH_WARN
too few PGs per OSD (8 < min 30)
services:
mon: 3 daemons, quorum ceph2,ceph1,ceph3
mgr: ceph1(active), standbys: ceph3, ceph2
osd: 3 osds: 3 up, 3 in
data:
pools: 1 pools, 8 pgs
objects: 0 objects, 0 B
usage: 3.0 GiB used, 245 GiB / 248 GiB avail
pgs: 100.000% pgs not active
8 creating+peering
稍等片刻再查看最后状态如下,集群状态HEALTH_OK
且PG状态active+clean
,表示PG可以正常处理读写请求并无待修复对象:
[root@ceph1 ceph]# ceph -s
cluster:
id: 13430f9a-ce0d-4d17-a215-272890f47f28
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph2,ceph1,ceph3
mgr: ceph1(active), standbys: ceph3, ceph2
osd: 3 osds: 3 up, 3 in
rgw: 1 daemon active
data:
pools: 4 pools, 32 pgs
objects: 187 objects, 1.1 KiB
usage: 3.0 GiB used, 245 GiB / 248 GiB avail
pgs: 32 active+clean
3.在集群中存储或检索对象数据
要把对象存入Ceph存储集群,客户端需要:
- 指定对象名
- 指定存储池(pool)
①创建一个含有数据的测试文件
例如把Hello World
字符串放入新建好的testfile.txt
文本文件中。
[root@ceph1 ceph]# echo "Hello World" > testfile.txt
[root@ceph1 ceph]# cat testfile.txt
Hello World #可以看到文件中的内容正是Hello World
②创建一个含有8个PG的pool(名字是mytest)
[root@ceph1 ceph]# ceph osd pool create mytest 8
pool 'mytest' created
③使用rados put
命令将数据存储到集群中
以下对象名是test-object-1
,数据文件路径是testfile.txt
,存储到名为mytest
的存储池中。
[root@ceph1 ceph]# rados put test-object-1 testfile.txt --pool=mytest
以下确认该对象确实被存储到了集群中,如果没有则报错:
[root@ceph1 ceph]# rados -p mytest ls
test-object-1
通过ceph -s
能看到当前集群中对象数增加了一个。
objects: 187 objects, 1.1 KiB #存入之前
objects: 188 objects, 1.1 KiB #存入之后
④定位对象
[root@ceph1 ceph]# ceph osd map mytest test-object-1
osdmap e26 pool 'mytest' (5) object 'test-object-1' -> pg 5.74dc35e2 (5.2) -> up ([1,0,2], p1) acting ([1,0,2], p1)
如果此时,查看集群状态是HEALTH_WARN application not enabled on 1 pool(s)
:
[root@ceph1 ceph]# ceph -s
cluster:
id: 13430f9a-ce0d-4d17-a215-272890f47f28
health: HEALTH_WARN
application not enabled on 1 pool(s)
[root@ceph1 ceph]# ceph health detail
HEALTH_WARN application not enabled on 1 pool(s)
POOL_APP_NOT_ENABLED application not enabled on 1 pool(s)
application not enabled on pool 'mytest'
use 'ceph osd pool application enable <pool-name> <app-name>', where <app-name> is 'cephfs', 'rbd', 'rgw', or freeform for custom applications.
运行ceph health detail
命令发现是新加入的存储池mytest
没有被应用程序标记,因为之前添加的是RGW实例,所以此处依提示将mytest
被rgw
标记即可:
[root@ceph1 ceph]# ceph osd pool application enable mytest rgw
enabled application 'rgw' on pool 'mytest'
再次查看集群状态发现恢复正常
[root@ceph1 ceph]# ceph health
HEALTH_OK
⑤从集群中删除对象
删除mytest
存储池中名字为test-object-1
的对象。
[root@ceph1 ceph]# rados rm test-object-1 --pool=mytest
⑥从集群中删除指定存储池(pool)
删除mytest
存储池。
[root@ceph1 ceph]# ceph osd pool rm mytest
[root@ceph1 ceph]# ceph osd pool rm mytest mytest --yes-i-really-really-mean-it
此处如果之前没有在/etc/ceph/ceph.conf
配置文件中设置mon allow pool delete = true
选项时删除存储池会报错。此处报错解决方案请见:ceph集群报错解决方案笔记[第4条]