文章目录
  1. 1. cephfs方式
  2. 2. rbd方式
  3. 3. 还原环境

Ceph是一个高性能的PB级分布式文件系统。它能够在一个系统中提供对象存储、块存储和文件存储。本文的主要内容是怎样用docker从零开始搭建ceph环境,并分别以cephfs和rbd的方式加载它。

这是ceph的模块架构图:

最底层的RADOS提供了对象存储的功能,是ceph的根基所在。所有的其他功能都是在RADOS之上构建的。LIBRADOS看名字就能猜到,它提供了一系列语言的接口,可以直接访问RADOS。RADOSGW基于LIBRADOS实现了REST的接口并兼容S3和Swift。RBD也基于LIBRADOS提供了块存储。最后是CEPH FS直接基于RADOS实现了文件存储系统。想要详细了解它的朋友可以看看这篇文章](http://www.wzxue.com/why-ceph-and-how-to-use-ceph/),把ceph介绍得很清楚。笔者的另一篇文章《通过RADOSGW提供ceph的S3和Swift接口》介绍了RADOSGW的使用方法。

cephfs方式

Talk is cheap,让我们来看看如何用最简单的方式来搭建一个ceph环境吧。Ceph提供了一个deph/demo的docker镜像来给我们做实验,注意别在产品环境用它(THIS CONTAINER IS NOT RECOMMENDED FOR PRODUCTION USAGE)。只要装好了docker,跑起来是很容易的:

1
docker run -d --net=host -v /etc/ceph:/etc/ceph -e MON_IP=192.168.0.20 -e CEPH_NETWORK=192.168.0.0/24 --name=ceph ceph/demo

上面的MON_IP可以填写运行这个镜像的机器IP,CEPH_NETWORK填写允许访问这个ceph的IP范围。启动之后,由于挂载了宿主机的/etc/ceph,这个文件夹里面会生成几个配置文件。其中有一个叫ceph.client.admin.keyring的文件里面有一个key,作为cephfs加载的时候认证会用到。

直接作为cephfs来加载就是一句话的事情:

1
sudo mount -t ceph -o name=admin,secret=AEAq5XtW5SLsARBAAh6kwpBmGVVjUwPQmZeuik== 192.168.0.20:/ /mnt/cephfs

用的时候记得事先创建好/mnt/cephfs/这个文件夹,替换secret为你自己的key,再改成用你的ceph服务器ip就好了。

rbd方式

还有一种方式是作为rbd来加载。这边需要啰嗦几句rbd的模型:最外层是pool,相当于一块磁盘,默认的pool名字叫做rbd。每个pool里面可以有多个image,相当于文件夹。每个image可以映射成一个块设备,有了设备就可以加载它。下面我们来尝试一下。如果打算用另一台机器,需要先把/etc/ceph这个文件夹复制过去,这个文件夹里面包含了ceph的连接信息。为了运行ceph的命令,我们还需要安装ceph-common,自己选一个命令吧:

1
2
apt-get install -y ceph-common
yum install -y ceph-common

准备工作做完了,我们首先创建一个名为ggg的pool:

1
ceph osd pool create ggg 128

128代表placement-group的数量。每个pg都是一个虚拟节点,将自己的数据存在不同的位置。这样一旦存储挂了,pg就会选择新的存储,从而保证了自动高可用。运行这个命令就可以看到现在系统中的所有pool:

1
ceph osd lspools

然后在ggg这个pool里创建一个名为qqq的image:

1
rbd create ggg/qqq --size 1024

size的单位是MB,所以这个qqq image的大小为1GB。要是这条命令一直没有响应,试着重启一下ceph/demo容器docker restart ceph,说了这不适合用于生产环境…运行下列命令可以看到ggg的pool中的所有image和查看qqq image的详细信息:

1
2
rbd ls ggg
rbd info ggg/qqq

接下来要把qqq image映射到块设备中,可能需要root权限:

1
sudo rbd map ggg/qqq

运行这个命令就可以看到映射到哪个设备去了,我的是/dev/rbd1

1
rbd showmapped

格式化之:

1
sudo mkfs.ext4 -m0 /dev/rbd1

然后就可以加载了!里面应该有一个lost+found的文件夹:

1
2
3
sudo mkdir -p /mnt/rbd/qqq
sudo mount /dev/rbd1 /mnt/rbd/qqq
ls /mnt/rbd/qqq/

还原环境

最后把我们的环境恢复回去:卸载->解除映射->删除image->删除pool:

1
2
3
4
sudo umount /mnt/rbd/qqq
sudo rbd unmap /dev/rbd1
rbd rm ggg/qqq
ceph osd pool delete ggg

如果严格按照上面的命令,你应该会在最后一步得到一个错误提示:Error EPERM: WARNING: this will PERMANENTLY DESTROY all data stored in pool ggg. If you are ABSOLUTELY CERTAIN that is what you want, pass the pool name twice, followed by –yes-i-really-really-mean-it.

删掉pool,里面的数据就真没有啦,所以要谨慎,除了pool名写两遍(重要的事情不应该是三遍么),还得加上--yes-i-really-really-mean-it的免责声明:

1
ceph osd pool delete ggg ggg --yes-i-really-really-mean-it

最后删掉ceph容器(如果你愿意,还有ceph/demo镜像),就当一切都没有发生过:

1
2
docker rm -f ceph
docker rmi ceph/demo

悄悄的我走了,正如我悄悄的来;我挥一挥衣袖,不带走一个byte。

文章目录
  1. 1. cephfs方式
  2. 2. rbd方式
  3. 3. 还原环境