WatchStor.com — 领先的中文存储网络媒体 | 51CTO旗下网站

新闻资讯 > 存储网络 > 正文
让我们了解 Ceph 分布式存储
作者: 佚名 2018-01-31 14:08 【博客园】

前言

最近在学习kubernetes过程中,想实现pod数据的持久化。在调研的过程中,发现ceph在最近几年发展火热,也有很多案例落地企业。在选型方面,个人更加倾向于社区火热的项目,GlusterFS、Ceph都在考虑的范围之内,但是由于GlusterFS只提供对象存储和文件系统存储,而Ceph则提供对象存储、块存储以及文件系统存储。怀着对新事物的向往,果断选择Ceph来实现Ceph块存储对接kubernetes来实现pod的数据持久化。


一、初始Ceph

1.1了解什么是块存储/对象存储/文件系统存储?

直接进入主题,ceph目前提供对象存储(RADOSGW)、块存储RDB以及CephFS文件系统这3种功能。对于这3种功能介绍,分别如下:

1.对象存储,也就是通常意义的键值存储,其接口就是简单的GET、PUT、DEL和其他扩展,代表主要有Swift、S3以及Gluster等;

2.块存储,这种接口通常以QEMUDriver或者KernelModule的方式存在,这种接口需要实现Linux的BlockDevice的接口或者QEMU提供的BlockDriver接口,如Sheepdog,AWS的EBS,青云的云硬盘和阿里云的盘古系统,还有Ceph的RBD(RBD是Ceph面向块存储的接口)。在常见的存储中DAS、SAN提供的也是块存储;

3.文件存储,通常意义是支持POSIX接口,它跟传统的文件系统如Ext4是一个类型的,但区别在于分布式存储提供了并行化的能力,如Ceph的CephFS(CephFS是Ceph面向文件存储的接口),但是有时候又会把GlusterFS,HDFS这种非POSIX接口的类文件存储接口归入此类。当然NFS、NAS也是属于文件系统存储;

1.2Ceph组件介绍

从下面这张图来简单学习下,Ceph的架构组件。(提示:本人在学习过程中所绘,如果发现问题欢迎留言,不要喷我哟)

Monitor,负责监视整个集群的运行状况,信息由维护集群成员的守护程序来提供,各节点之间的状态、集群配置信息。Cephmonitormap主要包括OSDmap、PGmap、MDSmap和CRUSH等,这些map被统称为集群Map。cephmonitor不存储任何数据。下面分别开始介绍这些map的功能:

    ● Monitormap:包括有关monitor节点端到端的信息,其中包括Ceph集群ID,监控主机名和IP以及端口。并且存储当前版本信息以及最新更改信息,通过"cephmondump"查看monitormap。

    ● OSDmap:包括一些常用的信息,如集群ID、创建OSDmap的版本信息和最后修改信息,以及pool相关信息,主要包括pool名字、pool的ID、类型,副本数目以及PGP等,还包括数量、状态、权重、最新的清洁间隔和OSD主机信息。通过命令"cephosddump"查看。

    ● PGmap:包括当前PG版本、时间戳、最新的OSDMap的版本信息、空间使用比例,以及接近占满比例信息,同事,也包括每个PGID、对象数目、状态、OSD的状态以及深度清理的详细信息。通过命令"cephpgdump"可以查看相关状态。

    ● CRUSHmap:CRUSHmap包括集群存储设备信息,故障域层次结构和存储数据时定义失败域规则信息。通过命令"cephosdcrushmap"查看。

    ● MDSmap:MDSMap包括存储当前MDSmap的版本信息、创建当前的Map的信息、修改时间、数据和元数据POOLID、集群MDS数目和MDS状态,可通过"cephmdsdump"查看。

OSD,CephOSD是由物理磁盘驱动器、在其之上的Linux文件系统以及CephOSD服务组成。CephOSD将数据以对象的形式存储到集群中的每个节点的物理磁盘上,完成存储数据的工作绝大多数是由OSDdaemon进程实现。在构建CephOSD的时候,建议采用SSD磁盘以及xfs文件系统来格式化分区。BTRFS虽然有较好的性能,但是目前不建议使用到生产中,目前建议还是处于围观状态。

Ceph元数据,MDS。ceph块设备和RDB并不需要MDS,MDS只为CephFS服务。

RADOS,ReliableAutonomicDistributedObjectStore。RADOS是ceph存储集群的基础。在ceph中,所有数据都以对象的形式存储,并且无论什么数据类型,RADOS对象存储都将负责保存这些对象。RADOS层可以确保数据始终保持一致。

librados,librados库,为应用程度提供访问接口。同时也为块存储、对象存储、文件系统提供原生的接口。

ADOS块设备,它能够自动精简配置并可调整大小,而且将数据分散存储在多个OSD上。

RADOSGW,网关接口,提供对象存储服务。它使用librgw和librados来实现允许应用程序与Ceph对象存储建立连接。并且提供S3和Swift兼容的RESTfulAPI接口。

CephFS,Ceph文件系统,与POSIX兼容的文件系统,基于librados封装原生接口。

简单说下CRUSH,ControlledReplicationUnderScalableHashing,它表示数据存储的分布式选择算法,ceph的高性能/高可用就是采用这种算法实现。CRUSH算法取代了在元数据表中为每个客户端请求进行查找,它通过计算系统中数据应该被写入或读出的位置。CRUSH能够感知基础架构,能够理解基础设施各个部件之间的关系。并且CRUSH保存数据的多个副本,这样即使一个故障域的几个组件都出现故障,数据依然可用。CRUSH算是使得ceph实现了自我管理和自我修复。

RADOS分布式存储相较于传统分布式存储的优势在于:

1.将文件映射到object后,利用ClusterMap通过CRUSH计算而不是查找表方式定位文件数据存储到存储设备的具体位置。优化了传统文件到块的映射和BlockMAp的管理。

2.RADOS充分利用OSD的智能特点,将部分任务授权给OSD,最大程度地实现可扩展。

二、安装Ceph

2.1环境准备

##环境说明

主机IP功能

ceph-node01192.168.58.128deploy、mon*1、osd*3

ceph-node02192.168.58.129mon*1、osd*3

ceph-node03192.168.58.130mon*1、osd*3

##准备yum源

cd /etc/yum.repos.d/ && sudo mkdir bak

sudo mv *.repo bak/

sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

sudo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

sudo sed -i '/aliyuncs/d' /etc/yum.repos.d/CentOS-Base.repo

sudo sed -i '/aliyuncs/d' /etc/yum.repos.d/epel.repo

sudo sed -i 's/$releasever/7/g' /etc/yum.repos.d/CentOS-Base.repo

##添加Ceph源

sudo cat < /etc/yum.repos.d/ceph.repo

[Ceph]

name=Ceph packages for x86_64

baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/

enabled=1

gpgcheck=1

type=rpm-md

gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc

[Ceph-noarch]

name=Ceph noarch packages

baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/

enabled=1

gpgcheck=1

type=rpm-md

gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc

[ceph-source]

name=Ceph source packages

baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS/

enabled=1

gpgcheck=1

type=rpm-md

gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc

EOF

##配置免密钥(略)

提示:如果使用普通用户进行安装,请授予用户相关权限,如下:

a.将yangsheng用户加入到sudo权限(yangshengALL=(ALL)NOPASSWD:ALL)

b.将/etc/sudoers中的“Defaultsrequiretty”注释

2.2开始安装

##安装部署工具(在192.168.58.128执行如下操作)

yum makecache

yum -y install ceph-deploy

ceph-deploy --version

1.5.39

##初始化monitor

mkdir ceph-cluster && cd ceph-cluster

ceph-deploy new ceph-node01 ceph-node02 ceph-node03

根据自己的IP配置向ceph.conf中添加public_network,并稍微增大mon之间时差允许范围(默认为0.05s,现改为2s):

# change default replica 3 to 2

osd pool default size = 2

public network = 192.168.58.0/24

cluster network = 192.168.58.0/24

##安装ceph

ceph-deployinstallceph-node01ceph-node02ceph-node03

##开始部署monitor

ceph-deploy mon create-initial

[root@ceph-node01 ceph]# ls

ceph.bootstrap-mds.keyring ceph.bootstrap-osd.keyring ceph.client.admin.keyring ceph-deploy-ceph.log rbdmap

ceph.bootstrap-mgr.keyring ceph.bootstrap-rgw.keyring ceph.conf ceph.mon.keyring

查看集群状态

[root@ceph-node01 ceph]# ceph -s

cluster b5108a6c-7e3d-4295-88fa-88dc825be3ba

health HEALTH_ERR

no osds

monmap e1: 3 mons at {ceph-node01=192.168.58.128:6789/0,ceph-node02=192.168.58.129:6789/0,ceph-node03=192.168.58.130:6789/0}

election epoch 6, quorum 0,1,2 ceph-node01,ceph-node02,ceph-node03

osdmap e1: 0 osds: 0 up, 0 in

flags sortbitwise,require_jewel_osds

pgmap v2: 64 pgs, 1 pools, 0 bytes data, 0 objects

0 kB used, 0 kB / 0 kB avail

64 creating

提示:Monitor创建成功后,检查集群的状态,此时集群状态并不处于健康状态。

##开始部署OSD

### 列出节点所有磁盘信息

ceph-deploy disk list ceph-node01 ceph-node02 ceph-node03

### 清除磁盘分区和内容

ceph-deploy disk zap ceph-node01:sdb ceph-node02:sdb ceph-node03:sdb

### 分区格式化并激活

ceph-deploy osd create ceph-node01:sdb ceph-node02:sdb ceph-node03:sdb

ceph-deploy osd activate ceph-node01:sdb ceph-node02:sdb ceph-node03:sdb

此时,再次查看集群状态

[root@ceph-node01 ceph-cluster]# ceph -s

cluster 86fb7c8b-9ad1-4eaf-a24c-0d2d9f36ab29

health HEALTH_OK

monmap e2: 3 mons at {ceph-node01=192.168.58.128:6789/0,ceph-node02=192.168.58.129:6789/0,ceph-node03=192.168.58.130:6789/0}

election epoch 6, quorum 0,1,2 ceph-node01,ceph-node02,ceph-node03

osdmap e15: 3 osds: 3 up, 3 in

flags sortbitwise,require_jewel_osds

pgmap v32: 64 pgs, 1 pools, 0 bytes data, 0 objects

100 MB used, 45946 MB / 46046 MB avail

64 active+clean

2.3清理环境

如果之前部署失败了,不必删除ceph客户端,或者重新搭建虚拟机,只需要在每个节点上执行如下指令即可将环境清理至刚安装完ceph客户端时的状态!强烈建议在旧集群上搭建之前清理干净环境,否则会发生各种异常情况。

sudo ps aux|grep ceph | grep -v "grep"| awk '{print $2}'|xargs kill -9

sudo ps -ef|grep ceph

sudo umount /var/lib/ceph/osd/*

sudo rm -rf /var/lib/ceph/osd/*

sudo rm -rf /var/lib/ceph/mon/*

sudo rm -rf /var/lib/ceph/mds/*

sudo rm -rf /var/lib/ceph/bootstrap-mds/*

sudo rm -rf /var/lib/ceph/bootstrap-osd/*

sudo rm -rf /var/lib/ceph/bootstrap-rgw/*

sudo rm -rf /var/lib/ceph/tmp/*

sudo rm -rf /etc/ceph/*

sudo rm -rf /var/run/ceph/*

三、配置客户端

3.1安装客户端

ssh-copy-id 192.168.58.131

ceph-deploy install 192.168.58.131

将Ceph配置文件复制到192.168.58.131。

ceph-deploy config push 192.168.58.131

3.2新建用户密钥

客户机需要ceph秘钥去访问ceph集群。ceph创建了一个默认的用户client.admin,它有足够的权限去访问ceph集群。但是不建议把client.admin共享到所有其他的客户端节点。这里我用分开的秘钥新建一个用户(client.rdb)去访问特定的存储池。

cephauthget-or-createclient.rbdmon'allowr'osd'allowclass-readobject_prefixrbd_children,allowrwxpool=rbd'

为192.168.58.131上的client.rbd用户添加秘钥

cephauthget-or-createclient.rbd|ssh192.168.58.131tee/etc/ceph/ceph.client.rbd.keyring

到客户端(192.168.58.131)检查集群健康状态

[root@localhost ~]# cat /etc/ceph/ceph.client.rbd.keyring >> /etc/ceph/keyring

[root@localhost ~]# ceph -s --name client.rbd

cluster 86fb7c8b-9ad1-4eaf-a24c-0d2d9f36ab29

health HEALTH_OK

monmap e2: 3 mons at {ceph-node01=192.168.58.128:6789/0,ceph-node02=192.168.58.129:6789/0,ceph-node03=192.168.58.130:6789/0}

election epoch 6, quorum 0,1,2 ceph-node01,ceph-node02,ceph-node03

osdmap e15: 3 osds: 3 up, 3 in

flags sortbitwise,require_jewel_osds

pgmap v32: 64 pgs, 1 pools, 0 bytes data, 0 objects

100 MB used, 45946 MB / 46046 MB avail

64 active+clean

3.3创建块设备

rbd create foo --size 4096 --name client.rbd # 创建一个 4096MB 大小的RADOS块设备

rbd create rbd01 --size 10240 --name client.rbd # 创建一个 10240MB 大小的RADOS块设备

映射块设备

[root@localhost ceph]# rbd create rbd02 --size 10240 --image-feature layering --name client.rbd

[root@localhost ceph]# rbd map --image rbd02 --name client.rbd /dev/rdb02

/dev/rbd0

提示:在映射块设备的时候,发生了如下错误。

[root@localhost ceph]# rbd map --image rbd01 --name client.rbd /dev/rdb01

rbd: sysfs write failed

RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable".

In some cases useful info is found in syslog - try "dmesg | tail" or so.

rbd: map failed: (6) No such device or address

解决该办法有多种方式,分别如下所示:

1.在创建的过程中加入如下参数"--image-featurelayering"也解决该问题。

2.手动disable掉相关参数,如下所示:

rbdfeaturedisablefooexclusive-lock,object-map,fast-diff,deep-flatten

3.在每个ceph节点的配置文件中,加入该配置项"rbd_default_features=1"。

3.4检查被映射的块设备

[root@localhost ceph]# rbd showmapped --name client.rbd

id pool image snap device

0 rbd rbd02 - /dev/rbd0

创建并挂载该设备

fdisk -l /dev/rbd0

mkfs.xfs /dev/rbd0

mkdir /mnt/ceph-disk1

mount /dev/rbd1 /mnt/ceph-disk1

验证

[root@localhost ceph]# df -h /mnt/ceph-disk1/

文件系统 容量 已用 可用 已用% 挂载点

/dev/rbd0 10G 33M 10G 1% /mnt/ceph-disk1

一个ceph块设备就创建完成。


标签:存储网络 

LecVideo