从本篇文章开始介绍一款如今很是火的分布式文件系统Ceph,包括这款文件系统的安装、基本使用场景、经常使用管理命令和重要工做原理。特别是讨论了PaxOS算法的基本理后,就更容易理解Ceph分布式文件系统中各类角色的工做原理。java
本文将介绍Ceph分布式文件系统如何在CentOS 7.X版本上一步一步完成安装,使读者在阅读过程当中了解Ceph有哪些重要的子系统/工做模块,以及它们是如何关联工做的。请注意Ceph在Ubuntu等Linux操做系统上的安装过程和注意点大体相同,但若是读者和笔者一样选择在CentOS上安装Ceph,那么就请使用CentOS 7.X的版本,由于这个版本是Ceph官方介绍中推荐的,更重要的是CentOS 6.X已经不受支持了。node
本文的演示中咱们将按照如下表格安装一个三节点的Ceph分布式文件系统,并绑定一个文件系统的客户端进行文件读写操做。web
节点 | IP地址 | 角色说明 |
---|---|---|
vmnode1 | 172.16.71.182 | MDN、MDS、OSD |
vmnode2 | 172.16.71.183 | MDN、MDS、OSD |
vmnode3 | 172.16.71.184 | MDN、MDS、OSD |
client | 172.16.71.1 | Client |
以上表格中的角色缩写若是目前看不懂也无所谓,在后续的安装介绍中咱们将说明这些功能角色的做用。Ceph的安装准备工做相对而言有一些繁琐,若是每个节点都是全新的操做系统,那么这些节点至少须要通过建立用户、设置用户无密码登陆权限、变动Ceph下载仓库、更新软件仓库等工做才能完成准备动做。其过程当中每每会出现一些错误,须要在安装过程当中耐心解决,下面咱们就开始Ceph安装前的准备工做。算法
不管是测试环境仍是正式环境,安装Ceph都不建议使用root帐号。因此第一步咱们须要专门建立一个用户和用户组,并为这个用户给定管理员权限。咱们建立一个用户组ceph和一个专门用来运行Ceph各个模块的用户,用户名也叫作cephsql
[......]# groupadd ceph [......]# useradd ceph -g ceph [......]# passwd ceph // 修改为你想要的密码 ......
记得为用户设置root权限,既是在sudoers文件中加入相关配置信息:json
[......]# vim /etc/sudoers
// 加入ceph的sudo权限
...... root ALL=(ALL) ALL ceph ALL=(ALL) NOPASSWD:ALL ......
参与Ceph构建的每一个节点都要设置相同的用户信息,而且设置该用户在各个节点间的无密码登陆功能——这是由于后面Ceph-deploy的工做过程当中,将登陆到各个节点上执行命令。bootstrap
[ceph@vmnode1 ~]$ ssh-keygen
// 操做系统会出现一些提示,回车就好了
[ceph@vmnode1 ~]$ cd ~/.ssh/
[ceph@vmnode1 .ssh]$ cat ./id_rsa.pub >> ./authorized_keys
// 必定要更改authorized_keys的访问权限,否则无密码登陆要失败
[ceph@vmnode1 ~]$ chmod 600 ./authorized_keys
// 将authorized_keys copy到你将要登陆的操做系统上,注意用户的home目录要作对应
关于无密码登陆的设置过程就再也不深刻讲解了,由于是很基本的ssh设置。主要原则就是保证authorized_keys文件的公钥记录信息和这个文件在几个节点间的一致性。若是后续有新的节点加入到Ceph集群中,而且也要承担MDS Follower角色的工做,则一样要设置这个新节点到各个节点的相互无密码登陆功能。vim
Ceph官网的下载速度奇慢(“https://download.ceph.com/“),这实际上不怪Ceph,缘由你们也都懂,呵呵。一个办法是设置国外的代理服务,有免费的,不过好用的仍是付费的。另外一个好消息是,Ceph有国内镜像,例如163的和aliyun的。根据笔者观察163的镜像同步要比aliyun的镜像同步及时,好比163的镜像中已经有rpm-hammer/ceph-deploy-1.5.37的下载,可是aliyun的镜像中最高版本只有ceph-deploy-1.5.36。经过如下环境变量的设置就可使用国内的镜像(这个过程不会影响后续的任何安装步骤):缓存
# 你也能够改为国内其它Ceph镜像
export CEPH_DEPLOY_REPO_URL=http://mirrors.163.com/ceph/rpm-hammer/el7;
export CEPH_DEPLOY_GPG_URL=http://mirrors.163.com/ceph/keys/release.asc;
另外Ceph的安装过程还须要至关的第三方组件依赖,其中一些第三方组件在CentOS yum.repo Base等官方源中是没有的(例如LevelDB),因此读者在安装过程当中会有必定的概率遇到各类依赖关系异常,并要求先行安装XXX第三方组件的提示(例如提示先安装liblevel.so)。虽然咱们后文将会介绍的Ceph辅助部署工具,Ceph-deploy的工做本质仍是经过yum命令去安装管理组件,可是既然CentOS yum.repo Base官方源中并无某些须要依赖的第三方组件,因此一旦遇到相似的组件依赖问题安装过程就无法自动继续了。解决这个问题,本示例中建议引入CentOS的第三方扩展源Epel。ruby
# 关于Epel 扩展源的引入这里不过作介绍了,网络上的资料一大把。这里给出一个“目前可用”(不保证多年后依然可用)的安装地址,以及安装后生成的repo配置片断(本示例中的第三方扩展源匹配CentOS 7.X操做系统)。
http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm
# repo文件的名字叫作epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
......
为了保证扩展源中的组件与CentOS官方源中的组件不冲突,能够调低扩展源的优先级。固然读者也能够自行手动解决Ceph安装过程提示的组件依赖问题——使用rpm命令的方式。笔者试过,深入的体会到什么叫生不如死。。。
设置仓库后,须要更新仓库缓存,以下:
[......]$ yum makecache [......]$ yum update
Ceph是一种分布式文件系统,既然是文件系统,那么不管它的上层如何设计如何划分,始终须要对数据持久化存储进行落地。因此Ceph须要操做块存储设备(关于块存储的相关介绍,能够参看本专题最初的几篇文章),Ceph要求块存储设备的文件系统必须为XFS、BTRFS或者EXT4,且必须在操做系统上有独立挂载点。
Ceph的安装有两种方式,第一种是使用Ceph官方提供的Ceph-deploy(部署工具)进行安装,这种方式咱们须要首先yum Ceph-deploy,而后再使用Ceph-deploy提供的各类命令来安装Ceph的各个节点,但好处也很明显——Ceph的安装过程基本上是半自动化的,除了一些操做系统层面的问题须要解决外(例如用户对某个目录的读写权限设定错误,再例如防火墙的端口没有打开等等)整个过程还算比较顺利。另一种是全人工安装,除非你的操做系统存在特殊应用场景,或者有须要特别保护的组件须要进行独立设定,不然仍是建议使用前一种Ceph-deploy的方式。
首先安装ceph-deploy软件本省。请注意这个软件并非ceph工做的一部分,它只一个增长简便性的工具。
...... [......]$ yum -y install ceph-deploy // NTP时钟同步服务 [......]$ yum install -y ntp ntpdate ntp-doc //使用一个亚洲公用时间同步节点进行时间同步 [......]$ ntpdate 0.asia.pool.ntp.org ......
只须要在某个节点上安装ceph-deploy就行,可是NTP服务是每个节点都要安装和进行同步,它主要是保证各节点的物理时钟同步。接下来咱们使用ceph-deploy工具在将要参与Ceph分布式文件系统的各个节点上,安装Ceph软件。注意,只是安装软件,并非说完成后就可让这些节点承担相应的工做职责了。如下命令只须要在安装了ceph-deploy的节点上执行就好了,ceph-deploy会帮助技术人员在指定的各个节点上使用yum命令安装ceph软件。接着使用如下命令在以上各个节点上正式安装Ceph软件:
[ceph@vmnode1 ~]$ ceph-deploy install vmnode1 vmnode2 vmnode3
// 命令格式为:
ceph-deploy install {ceph-node}[{ceph-node} ...]
安装Ceph软件的过程当中,有必定几率会出现各类警告信息。警告信息有的是能够忽略的,有的则是必须进行处理的。这些问题通常分为几类:镜像源和下载问题,依赖问题,权限问题。如何来处理这些问题,除了须要具有必定的玩转Linux系统的经验外,主要仍是细心,切忌急躁。
MON是Monitor的简称,字面意义为监控、监视。是的,它的做用是监控、管理和协调整个分布式系统环境中其它各个OSD/PG、Client、MDS角色的工做,保证整个分布环境中的数据一致性。注意,为了保证节点故障的状况下,整个Ceph分布式文件系统依然能够稳定工做,咱们必须设置多个MON角色。例如在本示例中,就设置参与Ceph分布式系统的三个节点上,都安装MON角色:
// 更名了意味新的MON节点
[ceph@vmnode1 ~]$ ceph-deploy new vmnode1 vmnode2 vmnode3
// 命令格式为:
ceph-deploy new {initial-monitor-node(s)}
以上命令运行后,ceph-deploy工具会在本节点生成一些文件,包括:
ceph.conf
ceph.log
ceph.mon.keyring
最重要的文件固然就是ceph.conf文件了(实际上ceph.mon.keyring也很重要),观察这个文件内容:
[ceph@vmnode1 ~]$ cat ./ceph.conf
[global]
fsid = 50c157eb-6d74-4d7d-b8e8-959a7b855b55
mon_initial_members = vmnode1, vmnode2, vmnode3
mon_host = 172.16.71.182,172.16.71.183,172.16.71.184
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
能够看到ceph.conf文件中已经设置好了咱们将要运行MON角色的三个节点信息。接下来咱们还须要在ceph.conf文件中增长一些信息,以下(后文还会详细讲解ceph中的重要参数):
[ceph@vmnode1 ~]$ vim ./ceph.conf
...... # 后续的文章会详细讲解ceph中重要的配置项 osd pool default size = 2 osd pool default min size = 2 max open files = 655350 cephx cluster require signatures = false cephx service require signatures = false ......
接着使用如下命令,就能够在conf文件中已配置的MON节点上启动MON服务了(前提是,这些节点已经成功安装了Ceph软件):
# 开始初始化运行mon节点。
[ceph@vmnode1 ~]$ceph-deploy mon create-initial
# 若是须要指定一些自定义的配置参数,能够采用以下格式(命令有详细的帮助信息)来启动
[ceph@vmnode1 ~]$ceph-deploy --overwrite-conf --cluster ceph mon create-initial
每个Ceph分布式系统都会有一个名字,若是在建立MON时不给定这个名字就会默认为“ceph”。完成以上步骤后,ceph-deploy工具会在当前运行命令的目录下生成几个文件,这些文件都很是重要,请不要擅自改动。在随后的安装过程当中ceph-deploy工具将按需将这些文件复制到对应角色的对应目录中去。
{cluster-name}.client.admin.keyring
{cluster-name}.bootstrap-osd.keyring
{cluster-name}.bootstrap-mds.keyring
{cluster-name}.bootstrap-rgw.keyring
在Ceph中,最终进行块存储落地操做的节点叫作OSD(Object Storage Device),实际上OSD只是Ceph中进行块存储操做的若干技术的一个载体,基于它工做的RADOS、PG等模块的设计思路才更值得学习借鉴(后续的文章会着重讨论)。可是,咱们要是都不先行把OSD安装好并让它运行起来,又怎么进行学些呢?上文已经提到Ceph的对于块存储设备的操做,只能基于XFS、BTRFS或者EXT4,,而且须要是独立的磁盘分区和挂载点。
咱们须要在vmnode一、vmnode二、vmnode3三个测试节点上安装Ceph,这三个节点上提供给Ceph使用的磁盘分区都是/dev/sdb1,使用文件系统格式都为XFS,磁盘挂载点都是/user/cephdata。这里就不在上图,不在讲解如何进行磁盘分区和格式化了,读者能够根据本身的实际状况进行操做。如下命令用于使用ceph-deploy建立和初始化OSD节点:
[ceph@vmnode1 ~]$ ceph-deploy osd create vmnode1:/user/cephdata vmnode2:/user/cephdata vmnode3:/user/cephdata ...... [ceph@vmnode1 ~]$ ceph-deploy osd prepare vmnode1:/user/cephdata vmnode2:/user/cephdata vmnode3:/user/cephdata # 命令格式以下: # ceph-deploy osd create {ceph-node}:{path} ... # ceph-deploy osd prepare {ceph-node}:{path} ...
ceph-node表明节点host名字,也能够直接使用IP,Path为挂载点的起始路径。若是有多个OSD节点的信息,则依次书写就好了。完成后使用如下命令启动这些OSD节点:
#启动OSD节点
[ceph@vmnode1 ~]$ ceph-deploy osd activate vmnode1:/user/cephdata vmnode2:/user/cephdata vmnode3:/user/cephdata
# 命令格式以下:
# ceph-deploy osd activate {ceph-node}:{path} ...
# 或者使用如下语句启动单个OSD节点也行
# ceph-disk -v activate --mark-init sysvinit --mount /user/cephdata/
# 你也可使用如下命令,检查整个系统中OSD节点的状态
# sudo ceph --cluster=ceph osd stat --format=json
OSD节点启动成功后还能够经过不少方式检查它(们)是否正常工做。例如使用如下命令进行检查:
[ceph@vmnode1 ~]$ sudo ceph osd stat
osdmap e11: 3 osds: 3 up, 3 in
以上输出的信息很好理解了,惟一可能不清楚的就是“osdmap e11”这个信息。Ceph中的MON角色其中有一个重要的工做就是监控Ceph中全部的OSD节点的工做状态,例如哪些OSD节点退出了Ceph环境,哪些新的OSD节点须要加入到Ceph环境。MON中的OSD Map就负责记录这些状态。至于“e11”中的“e”是epoch的简称,中文意思就是“时代”,MON中的OSD Map信息是要提供给Ceph中其它角色进行查询的(例如Client、各个OSD节点自己),而因为是分布式环境(存在节点间被割裂的状况),因此并不能保证这些角色在第一时间拿到最新版本的OSD Map信息,这时就要求MON Leader中记录目前最新版本的OSD Map的版本信息,以便Ceph中各个角色可以肯定本身当前记录的OSD Map是否是最新的,而每个新版本都会使OSD Map的epoch信息 + 1。关于最新版本的epoch信息在整个Ceph中是怎么进行传播的,后文还会进行描述。
执行完以上步骤后,Ceph节点的主要安装过程实际上就已经完成了,但这个时候Ceph FS子系统还没法正常工做/没法被Client正常链接(使用原生mount或者FUSE方式,都不会挂载成功)。若是使用如下命令查看,将会返回相似信息:
[root@vmnode1 ~]# sudo ceph mds stat
e1: 0/0/0 up
大意是Ceph系统中有0个MDS角色,0个节点处于工做状态。这一小节的重要工做就是为Ceph系统建立MDS角色。首先咱们经过ceph-deploy建立MDS节点:
[ceph@vmnode1 ~]$ ceph-deploy mds create vmnode1 vmnode2 vmnode3
注意MDS节点建立完成后不是说MDS角色就能够正常工做了,而只是说指定好了MDS角色将在哪些节点上进行工做。MDS角色的工做必须基于OSD Pool——MDS数据信息将在OSD节点上进行存储,因此咱们还须要经过如下命令建立至少两个OSD Pool数据池:
[root@vmnode1 ~]# sudo ceph osd pool create cephfs_data 10
[ceph@vmnode1 ~]$ sudo ceph osd pool create cephfs_metadata 10
// 命令格式:
osd pool create <poolname> <int[0-]>
{<int[0-]>} {replicated|erasure}
{<erasure_code_profile>} {<ruleset>}
{<int>}
以上命令中“cephfs_data”表示OSD Pool的名称,而指定的“10”表示这个Pool所使用的PG数量,关于PG的定义和工做方式咱们将在后续文章中进行介绍。那么咱们为何要建立名叫cephfs_data和cephfs_metadata的两个OSD Pool呢?这是由于其中一个OSD Pool要用来存储真实数据,另外一个OSD Pool要用来存储元(Metadata)数据,而这些元数据将被MDS角色使用。接下来基于已创建的OSD Pool建立Ceph文件系统:
[root@vmnode1 ~]# sudo ceph fs new cephfs cephfs_metadata cephfs_data
// new fs with metadata pool 2 and data pool 1
// 命令格式为:
fs new <fs_name> <metadata> <data>
其中cephfs表示新建立的Ceph文件系统的名称,cephfs_metadata表示存储文件系统元数据(Metadata)所使用的OSD Pool,cephfs_data表示存储文件真实数据所使用的OSD Pool。以上关于创建MDS元数据更详尽的信息,可参见Ceph官方文档http://docs.ceph.com/docs/master/cephfs/createfs/部分的介绍。完成文件系统建立后,再次使用命令查看MDS角色状态,就能够看到如下信息:
[ceph@vmnode1 ~]$ sudo ceph mds stat
e4: 1/1/1 up {0=vmnode3=up:creating}, 2 up:standby
注意,MDS角色的工做原理是主备模式。也就是说加入的新的MDS节点将做为备用节点。你也可使用以下命令,看到目前OSD Pool的使用状况:
[ceph@vmnode1 ~]$ sudo ceph df
GLOBAL:
SIZE AVAIL RAW USED %RAW USED
....M ....M ....M ....%
POOLS:
NAME ID USED %USED MAX AVAIL OBJECTS
rbd 0 0 0 0 0
cephfs_data 1 0 0 0 0
cephfs_metadata 2 0 0 0 0
这里要多说一句,请注意使用ceph df命令查看Ceph文件系统OSD Pool状态时,即便技术人员没有建立自定义的OSD Pool,您也能够发现有一个已经存在的名叫rbd的OSD Pool。这个OSD Pool是为上层RBD子系统准备了,用于存储模拟的块设备中的映射信息,反映到Ceph支持的块存储功能上就是所谓的image映射文件。完成以上步骤后,可使用如下命令,肯定整个Ceph系统是健康的:
[ceph@vmnode1 ~]$ sudo ceph -s
cluster 50c157eb-6d74-4d7d-b8e8-959a7b855b55
health HEALTH_OK
至此,整个Ceph分布式文件系统关于服务端各个角色的安装、配置工做才算真正完成(尚未对参数项进行优化)。接下来咱们就能够将一个或者多个Client链接到Ceph系统上进行使用了。
================ (接下文)