一 、 Ceph存储系统概述
Ceph是呼声很高的开源分布式的SDS产品存储系统。
同时提供对象存储、块存储和文件系统存储 三种功能,满足不同应用需求。
Ceph使用C++语言开发,遵循LGPL协议开源。Sage Weil(Ceph论文发表者)于2011年创立了以Inktank公司主导Ceph的开发和社区维护。
2014年Redhat收购inktank公司,并发布Inktank Ceph企业版(ICE)软件,业务场景聚焦云、备份和归档,支持对象和块存储应用。
从此出现Ceph开源社区版本和Redhat企业版。
Ceph 的强大足以改变公司的 IT 基础架构、和管理海量数据。
Ceph 可提供极大的伸缩性——供成千用户访问 PB 乃至 EB 级的数据。
Ceph 节点以普通硬件和智能守护进程作为支撑点, Ceph 存储集群组织起了大量节点,
它们之间靠相互通讯来复制数据、并动态地重分布数据。
Cehp的基础服务架构:
Cehp的基础服务架构主要包括了ObjectStorage Device(OSD),Monitor和MDS。
基于此,Ceph提供了Librados原生对象基础库、Librbd块存储库、Librgw基于S3和Swift兼容的对象库和Libceph文件系统库。
OSD(ObjectStorage Device)负责存储数据,处理数据复制、数据恢复、数据再均衡以及通过心跳机制监测其它OSD状况并报告给Ceph Monitors。Monitor负责监控集群状态,包括监控自身状态、集群OSD状态、Placement Group(存储组织和位置映射)状态、
CRUSH状态(Controlled Replication Under Scalable Hashing,一种伪随机数据分布算法)。
同时,Monitor还会记录它们的每一个历史状态改变版本信息,以确定集群该遵循哪个版本。
MDS负责文件系统的元数据存储和管理,也就是如前所说,块存储和对象存储服务是不需要这个模块的。MDS负责提供标准的POSIX文件访问接口。
Ceph集群的物理部署逻辑示意图如下所示 ;
通常Ceph集群由很多OSD组成,OSD部署在不同的服务器上。同时又有若干个Monitor节点(MON),MON之间相互监控,同时又对OSD的状态进行监控。
客户端通过网络建立与Ceph集群的关联,也即访问关系。客户端通过Mon节点获知集群的状态,其中包含OSD节点的分布情况等内容。 图1
二 、 Ceph存储系统的组件 ;
Ceph集群的核心组件是OSD和MON,其中OSD用于数据的具体存储操作,MON用于一些“映射图”,通过该“映射图”客户端可以计算出数据的存放位置,并将数据直接发送给相应的OSD处理。由于OSD和MON之间存在监控关系,并且通过相应的策略进行相关调度,保证自动故障处理和负载均衡等,因此将OSD、MON以及这些策略统称为RADOS。
为了便于对RADOS的管理和使用,在RADOS之上实现了一套动态库(librados),动态库通常位于客户端,通过网络与RADOS交互命令和数据。
Ceph天生就是对象存储,rados本身提供了一套以对象方式存储和访问Ceph集群数据的接口。而Ceph又同时提供了块存储和文件系统存储的功能,该功能基于Ceph的对象存储实现。
2.1 OSD
OSD的全称是Object Storage Device,OSD通常是一个物理的存储设备(例如磁盘),也可以是逻辑的存储设备(例如磁盘上的某个文件夹)。当然,这里的存储设备不限于服务器上的本地硬盘,也可以是通过iSCSI协议或者FC协议映射的LUN。有时候提及的OSD实际上是OSD守护进程,视语境而定。
2.2 OSD守护进程
OSD守护进程是OSD的软件实现,OSD守护进程用来对OSD进行管理(数据读写等),客户端数据交互的对象是OSD守护进程。
2.3 MON
MON是Ceph集群的监控软件,一个守护进程,其中包含若干“映射图”信息。客户端向Ceph集群写数据前通常要向MON请求,获取最新的“映射图”,并通过其计算出数据的存放位置。
2.4 librados
librados是一个动态库程序,其提供了客户端访问Ceph集群的原生态统一接口。其它接口或者命令行工具都基于该动态库实现。
在librados中实现了Crush算法和网络通信等公共功能,数据请求操作在librados计算完成后可以直接与对应的OSD交互进行数据传输。为了便于Ceph集群管理,其提供了很多命令行工具,包括ceph、rados和rbd等等,这些命令行工具都直接或间接基于librados实现。
三 、 CEPH 部署环境 ;
最少三台服务器,每台上至少有一个20G硬盘分区
我这里是把管理节点和客户端也作为了存储节点
因为存储节点最少有三台,如果服务器足够的情况下可以分开来做
CentOS release 6.9 (Final) 3台 , 每台设备需要 20G的硬盘,根据自己情况而定我这里使用虚拟机就给20G了
10.0.0.14(ceph01 adm, mon, osd0)
10.0.0.15(ceph02 osd1 client)
10.0.0.16(ceph03 osd2 )
3.1 配置网卡 ;
[root@ceph01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.14
NETMASK=255.255.255.0
GATEWAY=10.0.0.254
3.2 修改主机名 ;
[root@ceph02 ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=ceph02
3.3 添加本地域名解析 ;
[root@ceph01 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.14 ceph01
10.0.0.15 ceph02
10.0.0.16 ceph03
[root@ceph01 ~]#
3.4 禁用selinux 和关闭iptables ;
[root@ceph01 ~]# cat /etc/selinux/config |grep discabled
# disabled - No SELinux policy is loaded.
SELINUX=disabled #disable 表示禁用
[root@ceph01 ~]#
# service iptables stop --->> 关闭防火墙
# chkconfig iptables off --->>关闭开机启动防火墙
四 、准备部署 Ceph ;
4.1 ;安装 EPEL 软件源 (单台管理节点ceph01 操作 ):
# rpm -Uvh https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# yum update -y --->> 更新一下 yum
4.2 ;安装ceph依赖
# rpm -Uvh http://download.ceph.com/rpm-hammer/el6/noarch/ceph-release-1-0.el6.noarch.rpm
# yum install ceph-deploy -y
4.3. 数据节点磁盘挂载 ;
在ceph01、ceph02、ceph03上分别挂载了一块20g大小的磁盘作为ceph的数据存储测试使用。需要将它们分区,创建xfs文件系统。
4.3.1 ; 分区(三台机),创建xfs文件系统
# parted /dev/sdb
(parted) mklabel gpt
(parted) mkpart primary xfs 0% 100%
(parted) quit
# mkfs.xfs /dev/sdb1
如果出现以下问题:
是因为xfs在默认的系统安装上是不被支持的,需要自己手动安装默认的包。
先修改yum的配置文件
# vim /etc/yum.repos.d/CentOS-Base.repo
[centosplus]
enabled=1 //把0改为1
# yum install -y xfsprogs kmod-xfs ---->>> 安装软件包
然后再执行mkfs.xfs /dev/sdb1就可以了。
五 、搭建存储集群
5.1 免密码登陆(三台机)
在每台机上运行以下命令:
# ssh-keygen -t rsa -P '' (回车) ssh-keygen -t dsa (也可以用这个 ,两种秘钥方式 )
执行完这个命令后,会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
5.2 、下面从admin节点开始使用ceph-deploy
5.2.1 、 在admin上创建集群目录(ceph01)
# mkdir ceph-cluster ---->> 创建目录(可以自定义)
# cd ceph-cluster
5.3 、 创建集群(ceph01)
# ceph-deploy new ceph01
5.4 、 安装ceph(ceph01)
# ceph-deploy install ceph01 ceph02 ceph03
此命令将会按顺序在3台服务器上安装 ceph
如果报错:
RuntimeError: Failed to execute command: rpm -Uvh --replacepkgs http://ceph.com/rpm-hammer/el6/noarch/ceph-release-1-0.el6.noarch.rpm
执行以下命令之后再重新执行一遍安装ceph 的命令 :
# rpm -e ceph-release
如果报错:
[INFO ] Running command: sudo rpm -Uvh --replacepkgs https://download.ceph.com/rpm-infernalis/el6/noarch/ceph-release-1-0.el6.noarch.rpm
[WARNIN] curl: (22) The requested URL returned error: 404 Not Found
[DEBUG ] Retrieving https://download.ceph.com/rpm-infernalis/el6/noarch/ceph-release-1-0.el6.noarch.rpm
[WARNIN] error: skipping https://download.ceph.com/rpm-infernalis/el6/noarch/ceph-release-1-0.el6.noarch.rpm - transfer failed
[ERROR ] RuntimeError: command returned non-zero exit status: 1
[ERROR ] RuntimeError: Failed to execute command: rpm -Uvh --replacepkgs https://download.ceph.com/rpm-infernalis/el6/noarch/ceph-release-1-0.el6.noarch.rpm
这是因为在centos6中,没有infernalis这个版本的rpm包
因为暂时没有找到在哪里修改这个版本信息,故采用手动安装(三台机都需要)
# sudo yum install -y yum-plugin-priorities
# sudo rpm -Uvh http://ceph.com/rpm-hammer/el6/noarch/ceph-release-1-0.el6.noarch.rpm
# sudo yum -y install ceph
如果报错:
[DEBUG ] You could try running: rpm -Va --nofiles --nodigest
[ERROR ] RuntimeError: command returned non-zero exit status: 1
[ERROR ] RuntimeError: Failed to execute command: yum -y install ceph
执行一遍以下命令之后再重新执行一遍:
# rpm -Va --nofiles –nodigest
5.5 、创建并初始化监控节点(ceph01)
# ceph-deploy mon create-initial
执行此命令后会初始化mon结点,并且在mon结点生成ceph.conf等文件,ceph.conf文件中声明了mon结点等信息
如果报错:
在(ceph01)上手动执行以下命令:
#sudo yum install redhat-lsb
之后再执行ceph-deploy mon create-initial
查看一下 Ceph 存储节点的硬盘情况:
# ceph-deploy disk list ceph01
# ceph-deploy disk list ceph02
# ceph-deploy disk list ceph03
如果报错:
[ERROR ] RuntimeError: remote connection got closed, ensure ``requiretty`` is disabled for ceph02
需要在mdsnode,osdnode1,osdnode2三个节点中使用leadorceph用户的身份执行sudo visudo命令,然后修改
Defaults requiretty 为Defaults:ceph !requiretty
5.6 、 添加数据节点(ceph01)
快速安装,为每个Ceph OSD守护进程使用单个目录而非单个磁盘,使用ceph-deply osd命令可查看在分离的磁盘/分区上创建OSD和日志的方法,登陆Ceph节点 并为每个Ceph OSD守护进程创建单个目录。
# ssh root@ceph01
# mkdir -p /data/osd0
# chmod -R 777 /data/
# exit
# ssh root@ceph02
# mkdir -p /data/osd1
# chmod -R 777 /data/
# exit
# ssh root@ceph03
# mkdir -p /data/osd2
# chmod -R 777 /data/
# exit
5.7 、 挂载磁盘(三台机)
将各个磁盘分别挂载到对应的目录(ceph01、ceph02、ceph03)
# mount /dev/sdb1 /data/osd0
(另外两个节点一样的操作,只变更最后相应的目录 osd1,osd2)
5.8 、 在管理节点准备OSD(ceph01)
# ceph-deploy osd prepare ceph01:/data/osd0 ceph02:/data/osd1 ceph03:/data/osd2
5.9 、 激活OSD(ceph01)
(注意:如果osd的目录所在磁盘是ext4格式的文件系统会报错,需要进行额外的设置)
# ceph-deploy osd activate ceph01:/data/osd0 ceph02:/data/osd1 ceph03:/data/osd2
如果报错:
是因为多次卸载和安装ceph造成磁盘的id和cluster的uuid不一致,需要将 /data/osd0下的文件全部清空(3台服务器都需要改)
5.10 、开机挂载磁盘(三台机)
挂载好的新磁盘会在下一次重启或开机的时候失效,因此我们需要在每台机上对新磁盘进行挂载,分别在每台机编辑/etc/fstab文件,在最后添加(以ceph01为例):
# vim /etc/fstab
/dev/sdb1 /osd0 xfs defaults 0 0
5.11 、 分发配置和密钥 ;
使用ceph-deploy命令将配置文件和管理密钥复制到管理节点和你的Ceph节点。
# ceph-deploy admin ceph01 ceph02 ceph03
5.12 、 查看集群状态
# ceph health ---- >>> 当集群完成配对后,应返回active+clean状态
如果报错:
[ceph@ceph03 ceph-cluster]$ ceph health
2016-03-06 21:53:54.886552 7fdc5cf5a700 -1 monclient(hunting): ERROR: missing keyring, cannot use cephx for authentication
2016-03-06 21:53:54.886584 7fdc5cf5a700 0 librados: client.admin initialization error (2) No such file or directory
Error connecting to cluster: ObjectNotFound
是因为普通用户无法读取导致无法进行cephx认证,执行以下命令:
# sudo chmod +r /etc/ceph/ceph.client.admin.keyring
如果出现以下情况:
[ceph@ceph03 ceph-cluster]$ ceph health
HEALTH_WARN 64 pgs degraded; 64 pgs stuck degraded; 64 pgs stuck unclean; 64 pgs stuck undersized; 64 pgs undersized
是因为配置中默认osd=3,备份=2,与实际不符,更改配置文件 ceph.conf, 增加以下两行:
osd_pool_default_size = 2
osd_pool_default_min_size = 1
如果报错:
2016-04-21 15:21:05.597951 7fde9cb6b700 -1 monclient(hunting): ERROR: missing keyring, cannot use cephx for authentication
2016-04-21 15:21:05.597963 7fde9cb6b700 0 librados: client.admin initialization error (2) No such file or directory
执行以下命令赋权限:
# chmod 777 /etc/ceph/*
成功!(这里发现没有启动mds节点,需要手动启动,输入命令 service ceph start mds.ceph01 )
六 、 重新部署(注意!)
部署过程中如果出现任何奇怪的问题无法解决,可以简单的删除一切从头再来:
# ceph-deploy purge ceph-mon1 ceph-mon2 ceph-mon3 ceph-osd1 ceph-osd2
# ceph-deploy purgedata ceph-mon1 ceph-mon2 ceph-mon3 ceph-osd1 ceph-osd2
# ceph-deploy forgetkeys
6.1、 创建文件系统
创建文件系统的步骤参考官网:http://docs.ceph.com/docs/master/cephfs/createfs/
对于一个刚创建的MDS服务,虽然服务是运行的,但是它的状态直到创建 pools 以及文件系统的时候才会变为Active.
还没有创建时候的状态
# ceph mds stat
6.2 、 创建管理节点(ceph01)
# ceph-deploy mds create ceph01
注意:如果不创建mds管理节点,client客户端将不能正常挂载到ceph集群!
6.3 、 查看pool
# ceph osd lspools
新创建的ceph集群只有rdb一个pool。这时我们需要创建一个新的pool
6.4 、 新建pool
# ceph osd pool create cephfs_data 10#用于数据的pool
# ceph osd pool create cephfs_metadata 10#用于元数据的pool
# ceph fs new myceph cephfs_metadata cephfs_data
6.7 、检验
查看mds状态
# ceph mds stat
++++++++++++++++++++++++++++++++ Ceph 的常用命令总结 ++++++++++++++++++++++++++
1. 查看状态命令:
查看ceph集群状态:ceph -s
查看mon状态:ceph mon stat
查看msd状态:ceph msd stat
查看osd状态:ceph osd stat
查看osd目录树(可以查看每个osd挂在哪台机,是否已启动):ceph osd tree
2. 启动节点命令:
需要在对应的节点进行启动(如果对应节点没有该服务,会进行提示)
启动mon进程:service ceph start mon.ceph01
启动msd进程:service ceph start msd.ceoh01(我们集群没有msd节点)
启动osd进程:service ceph start osd.0(在ceph01上)
启动osd进程:service ceph start osd.1(在ceph02上)
启动osd进程:service ceph start osd.2(在ceph03上)
=========================================End==============================================