今天配置ceph,参考了多方文档官方文档地址http://docs.ceph.com/docs/master/rados/configuration/ceph-conf/#the-configuration-file
其它大神的博客地址http://my.oschina.net/oscfox/blog/217798
http://www.kissthink.com/archive/c-e-p-h-2.html等等不一一例举了。
总体来说关于单节点配置没有遇到什么空难,但是多节点的配置总是提示我mon地址无法识别,我研究了整整一天多也没有头绪,尤其参考官方文档,没有发现什么问题,于是我又一次参考我的单节点配置文件,发现我在定义【mon.a】的时候有了空格(就是配置文件ceph.conf的每行都得顶头写,至少mon关键字下的每行得顶头写),才发现原来源码开发者在匹配配置文件的时候没有过滤这些无关紧要的字符,也不知道这算不算ceph开发的一个bug至少这不符合C语言的规范。
1 CEPH简介
1.1 CEPH定义
Ceph是一个 Linux PB 级分布式文件系统。
1.2 Ceph由来
其命名和UCSC(Ceph 的诞生地)的吉祥物有关,这个吉祥物是 “Sammy”,一个香蕉色的蛞蝓,就是头足类中无壳的软体动物。这些有多触角的头足类动物,是对一个分布式文件系统高度并行的形象比喻。
Ceph 最初是一项关于存储系统的 PhD 研究项目,由 Sage Weil 在 University of California, SantaCruz(UCSC)实施。
1.3 Ceph系统架构
Ceph 生态系统架构可以划分为四部分:
1. Clients:客户端(数据用户)
2. cmds:Metadata server cluster,元数据服务器(缓存和同步分布式元数据)
3. cosd:Object storage cluster,对象存储集群(将数据和元数据作为对象存储,执行其他关键职能)
4. cmon:Cluster monitors,集群监视器(执行监视功能)
图1 Ceph 生态系统的概念架构
图2 Ceph 生态系统简化后的分层视图
1.4 Ceph组件
了解了 Ceph 的概念架构之后,您可以挖掘到另一个层次,了解在 Ceph 中实现的主要组件。Ceph 和传统的文件系统之间的重要差异之一就是,它将智能都用在了生态环境而不是文件系统本身。
图 3 显示了一个简单的 Ceph 生态系统。Ceph Client 是 Ceph 文件系统的用户。Ceph Metadata Daemon 提供了元数据服务器,而 Ceph Object Storage Daemon 提供了实际存储(对数据和元数据两者)。最后,Ceph Monitor 提供了集群管理。要注意的是,Ceph 客户,对象存储端点,元数据服务器(根据文件系统的容量)可以有许多,而且至少有一对冗余的监视器。那么,这个文件系统是如何分布的呢?
图3 简单的 Ceph 生态系统
1.4.1 Ceph客户端
因为 Linux 显示文件系统的一个公共界面(通过虚拟文件系统交换机 [VFS]),Ceph 的用户透视图就是透明的。管理员的透视图肯定是不同的,考虑到很多服务器会包含存储系统这一潜在因素。从用户的角度看,他们访问大容量的存储系统,却不知道下面聚合成一个大容量的存储池的元数据服务器,监视器,还有独立的对象存储设备。用户只是简单地看到一个安装点,在这点上可以执行标准文件 I/O。
Ceph 文件系统 — 或者至少是客户端接口 — 在 Linux 内核中实现。值得注意的是,在大多数文件系统中,所有的控制和智能在内核的文件系统源本身中执行。但是,在 Ceph 中,文件系统的智能分布在节点上,这简化了客户端接口,并为 Ceph 提供了大规模(甚至动态)扩展能力。
Ceph 使用一个有趣的备选,而不是依赖分配列表(将磁盘上的块映射到指定文件的元数据)。Linux 透视图中的一个文件会分配到一个来自元数据服务器的 inodenumber(INO),对于文件这是一个唯一的标识符。然后文件被推入一些对象中(根据文件的大小)。使用 INO 和 object number(ONO),每个对象都分配到一个对象 ID(OID)。在 OID 上使用一个简单的哈希,每个对象都被分配到一个放置组。放置组(标识为 PGID)是一个对象的概念容器。最后,放置组到对象存储设备的映射是一个伪随机映射,使用一个叫做 Controlled Replication Under Scalable Hashing(CRUSH)的算法。这样一来,放置组(以及副本)到存储设备的映射就不用依赖任何元数据,而是依赖一个伪随机的映射函数。这种操作是理想的,因为它把存储的开销最小化,简化了分配和数据查询。
分配的最后组件是集群映射。集群映射 是设备的有效表示,显示了存储集群。有了 PGID 和集群映射,您就可以定位任何对象
1.4.2 Ceph元数据服务器
元数据服务器(cmds)的工作就是管理文件系统的名称空间。虽然元数据和数据两者都存储在对象存储集群,但两者分别管理,支持可扩展性。事实上,元数据在一个元数据服务器集群上被进一步拆分,元数据服务器能够自适应地复制和分配名称空间,避免出现热点。如图 4 所示,元数据服务器管理名称空间部分,可以(为冗余和性能)进行重叠。元数据服务器到名称空间的映射在 Ceph 中使用动态子树逻辑分区执行,它允许 Ceph 对变化的工作负载进行调整(在元数据服务器之间迁移名称空间)同时保留性能的位置。
图4 元数据服务器的 Ceph 名称空间的分区
但是因为每个元数据服务器只是简单地管理客户端人口的名称空间,它的主要应用就是一个智能元数据缓存(因为实际的元数据最终存储在对象存储集群中)。进行写操作的元数据被缓存在一个短期的日志中,它最终还是被推入物理存储器中。这个动作允许元数据服务器将最近的元数据回馈给客户(这在元数据操作中很常见)。这个日志对故障恢复也很有用:如果元数据服务器发生故障,它的日志就会被重放,保证元数据安全存储在磁盘上。
元数据服务器管理 inode 空间,将文件名转变为元数据。元数据服务器将文件名转变为索引节点,文件大小,和 Ceph 客户端用于文件 I/O 的分段数据(布局)。
1.4.3 Ceph监视器
Ceph 包含实施集群映射管理的监视器,但是故障管理的一些要素是在对象存储本身中执行的。当对象存储设备发生故障或者新设备添加时,监视器就检测和维护一个有效的集群映射。这个功能按一种分布的方式执行,这种方式中映射升级可以和当前的流量通信。Ceph 使用 Paxos,它是一系列分布式共识算法。
1.4.4 Ceph对象存储
和传统的对象存储类似,Ceph 存储节点不仅包括存储,还包括智能。传统的驱动是只响应来自启动者的命令的简单目标。但是对象存储设备是智能设备,它能作为目标和启动者,支持与其他对象存储设备的通信和合作。
从存储角度来看,Ceph 对象存储设备执行从对象到块的映射(在客户端的文件系统层中常常执行的任务)。这个动作允许本地实体以最佳方式决定怎样存储一个对象。Ceph 的早期版本在一个名为 EBOFS 的本地存储器上实现一个自定义低级文件系统。这个系统实现一个到底层存储的非标准接口,这个底层存储已针对对象语义和其他特性(例如对磁盘提交的异步通知)调优。今天,B-tree 文件系统(BTRFS)可以被用于存储节点,它已经实现了部分必要功能(例如嵌入式完整性)。
因为 Ceph 客户实现 CRUSH,而且对磁盘上的文件映射块一无所知,下面的存储设备就能安全地管理对象到块的映射。这允许存储节点复制数据(当发现一个设备出现故障时)。分配故障恢复也允许存储系统扩展,因为故障检测和恢复跨生态系统分配。Ceph 称其为 RADOS(见 图 3)。
2 Ceph安装
2.1 Ceph单节点安装
2.1.1 节点IP
192.168.14.100(hostname为ceph2,有两个分区/dev/xvdb1和/dev/xvdb2提供给osd,另外还安装了client/mon/mds)
2.1.2 安装Ceph库
# apt-get install ceph ceph-common ceph-mds
# ceph -v # 将显示ceph的版本和key信息
2.1.3 创建Ceph配置文件
#vim /etc/ceph/ceph.conf
[global]
max open files = 131072
#For version 0.55 and beyond, you mustexplicitly enable
#or disable authentication with"auth" entries in [global].
auth cluster required = none
auth service required = none
auth client required = none
[osd]
osd journal size = 1000
#The following assumes ext4 filesystem.
filestore xattruse omap = true
#For Bobtail (v 0.56) and subsequentversions, you may
#add settings for mkcephfs so that it willcreate and mount
#the file system on a particular OSD foryou. Remove the comment `#`
#character for the following settings andreplace the values
#in braces with appropriate values, orleave the following settings
#commented out to accept the defaultvalues. You must specify the
#--mkfs option with mkcephfs in order forthe deployment script to
#utilize the following settings, and youmust define the 'devs'
#option for each osd instance; see below.
osd mkfs type = xfs
osd mkfs options xfs = -f #default for xfsis "-f"
osd mount options xfs = rw,noatime # defaultmount option is"rw,noatime"
#For example, for ext4, the mount optionmight look like this:
#osd mkfs options ext4 =user_xattr,rw,noatime
#Execute $ hostname to retrieve the name ofyour host,
#and replace {hostname} with the name ofyour host.
#For the monitor, replace {ip-address} withthe IP
#address of your host.
[mon.a]
host = ceph2
mon addr = 192.168.14.100:6789
[osd.0]
host = ceph2
#For Bobtail (v 0.56) and subsequentversions, you may
#add settings for mkcephfs so that it willcreate and mount
#the file system on a particular OSD foryou. Remove the comment `#`
#character for the following setting foreach OSD and specify
#a path to the device if you use mkcephfswith the --mkfs option.
devs = /dev/xvdb1
[osd.1]
host= ceph2
devs= /dev/xvdb2
[mds.a]
host= ceph2
2.1.4 创建数据目录
#mkdir –p /var/lib/ceph/osd/ceph-0 #其中有个目录是current,就是相当于sheepdog的obj目录,上传的和创建的对象都存放于此目录,还包括元数据
#mkdir –p /var/lib/ceph/osd/ceph-1 #同上
#mkdir –p /var/lib/ceph/mon/ceph-a
#mkdir –p /var/lib/ceph/mds/ceph-a
2.1.5 为osd创建分区和挂载
对新分区进行xfs或者btrfs的格式化:
# mkfs.xfs -f /dev/xvdb1
# mkfs.xfs -f /dev/xvdb2
第一次必须先挂载分区写入初始化数据:
# mount /dev/ xvdb1 /var/lib/ceph/osd/ceph-0
# mount /dev/ xvdb2 /var/lib/ceph/osd/ceph-1
2.1.6 执行初始化
注意,每次执行初始化之前,都需要先停止Ceph服务,并清空原有数据目录:
# /etc/init.d/ceph stop
# rm -rf /var/lib/ceph/*/ceph-*/*
然后,就可以在mon所在的节点上执行初始化了:
# sudo mkcephfs -a -c /etc/ceph/ceph.conf-k /etc/ceph/ceph1.keyring
注意,一旦配置文件ceph.conf发生改变,初始化最好重新执行一遍。
2.1.7 启动Ceph服务
在mon所在的节点上执行:
# sudo service ceph -a start
注意,执行上面这步时,可能会遇到如下提示:
=== osd.0 ===
Mounting xfs onceph4:/var/lib/ceph/osd/ceph-0
Error ENOENT: osd.0 does not exist. create it before updating the crush map
执行如下命令后,再重复执行上面那条启动服务的命令,就可以解决:
# ceph osd create
2.1.8 执行健康检查
# sudo ceph health # 也可以使用ceph -s命令查看状态
如果返回的是HEALTH_OK,则代表成功!
注意,如果遇到如下提示:
HEALTH_WARN 576 pgs stuckinactive; 576 pgsstuck unclean; no osds
或者遇到如下提示:
HEALTH_WARN 178 pgs peering; 178pgs stuckinactive; 429 pgs stuck unclean; recovery 2/24 objects degraded(8.333%)
执行如下命令,就可以解决:
# ceph pg dump_stuck stale && cephpg dump_stuck inactive && ceph pg dump_stuck unclean
如果遇到如下提示:
HEALTH_WARN 384 pgs degraded; 384 pgs stuckunclean; recovery 21/42degraded (50.000%)
则说明osd数量不够,Ceph默认至少需要提供两个osd。
2.1.9 Ceph测试
客户端挂载mon所在的节点:
# sudo mkdir /mnt/mycephfs
# sudo mount -t ceph 192.168.73.129:6789://mnt/mycephfs
客户端验证:
# df -h #如果能查看到/mnt/mycephfs的使用情况,则说明Ceph安装成功。
2.1.10 Ceph使用
Ceph作为对象存储的使用就与sheepdog比较类似了,主要是命令的运用,尤其需要注意的是ceph中的pool就相当于sheepdog中的lu,PG相当于lun,我们所创建和上传的对象都存放在PG中,在之前介绍的current目录中都可以查看到。这里只介绍几个简单的命令:
#rados put/gettest.txt test.txt –pool=data 上传或者下载一个对象名字为test.txt的对象到池data中
#ceph osd map data test.txt 查看对象test.txt的属性,可以查看到其存放在PG的位置
#rados lspools/rados df 显示pool
#rados mkpool test 创建pool
#rados create test-object –p test 在池test中创建对象test-object
#rados –p test ls 像是pool test中的对象
#rados ls –p test |more 同上
1.1 Ceph多节点安装
对于多节点的情况,Ceph有如下要求:
修改各自的hostname,并能够通过hostname来互相访问。
各节点能够ssh互相访问而不输入密码(通过ssh-keygen命令)。
1.1.1 节点IP
192.168.14.96(hostname为ceph,有一个分区/dev/sdb1提供给osd,安装了client/mon/mds);
192.168.14.117(hostname为ceph1,有一个分区/dev/sdb1提供给osd);
192.168.14.120(hostname为ceph2,有一个分区/dev/sdb1提供给osd);
1.1.2 配置主机名
在每个节点上设置相应的主机名,例如:
# vim /etc/hostname
ceph1
修改/etc/hosts,增加如下几行:
192.168.14.96 ceph
192.168.73.117 ceph1
192.168.73.120 ceph2
之后分别在每个节点互相ping主机名能ping通,则达到效果。
1.1.3 配置免密码访问
在每个节点上创建RSA秘钥:
# ssh-keygen -t rsa # 一直按确定键即可
# touch /root/.ssh/authorized_keys
先配置ceph1,这样ceph1就可以无密码访问ceph和ceph2了:
ceph1# scp /root/.ssh/id_rsa.pub ceph:/root/.ssh/id_rsa.pub_ceph1
ceph1# scp /root/.ssh/id_rsa.pub ceph2:/root/.ssh/id_rsa.pub_ceph1
ceph1# ssh ceph "cat/root/.ssh/id_rsa.pub_ceph1>> /root/.ssh/authorized_keys"
ceph1# ssh ceph2 "cat /root/.ssh/id_rsa.pub_ceph1>> /root/.ssh/authorized_keys"
节点ceph和ceph2也需要参照上面的命令进行配置。
1.1.4 安装Ceph库
在每个节点上安装Ceph库:
# apt-get install ceph ceph-common ceph-mds
# ceph -v # 将显示ceph的版本和key信息
1.1.5 创建Ceph配置文件
# vim /etc/ceph/ceph.conf
[global]
max open files = 131072
auth cluster required = none
auth service required = none
auth client required = none
[osd]
osd journal size = 1000
filestore xattruse omap = true
osd mkfs type = xfs
osd mkfs options xfs = -f
osd mount options xfs = rw,noatime
[mon.a]
host = ceph
mon addr = 192.168.14.96:6789
[mon.b]
host = ceph1
mon addr = 192.168.14.117:6789
[mon.c]
host = ceph2
mon addr = 192.168.14.120:6789
[osd.0]
host = ceph
devs = /dev/xvdb1
[osd.1]
host = ceph1
devs= /dev/xvdb1
[osd.2]
host = ceph2
devs= /dev/xvdb1
[mds.a]
host = ceph
[mds.b]
host = ceph1
[mds.c]
host = ceph2
1.1.6 创建数据目录
在每个节点上创建数据目录:
# mkdir -p /var/lib/ceph/osd/ceph-0
# mkdir -p /var/lib/ceph/osd/ceph-1
# mkdir -p /var/lib/ceph/osd/ceph-2
# mkdir -p /var/lib/ceph/mon/ceph-a
# mkdir -p /var/lib/ceph/mon/ceph-b
# mkdir -p /var/lib/ceph/mon/ceph-c
# mkdir -p /var/lib/ceph/mds/ceph-a
# mkdir -p /var/lib/ceph/mds/ceph-b
# mkdir -p /var/lib/ceph/mds/ceph-c
1.1.7 为osd创建分区和挂载
Ceph:
#fdisk /dev/xvdb //创建xbdb1分区
#mkfs.xfs –f /dev/xvdb1
#mount /dev/xvdb1 /var/lib/ceph/osd/ceph-0
Ceph1:
#fdisk /dev/xvdb //创建xbdb1分区
#mkfs.xfs –f /dev/xvdb1
#mount /dev/xvdb1 /var/lib/ceph/osd/ceph-1
Ceph2:
#fdisk /dev/xvdb //创建xbdb1分区
#mkfs.xfs –f /dev/xvdb1
#mount /dev/xvdb1 /var/lib/ceph/osd/ceph-2
以下操作都在ceph上执行就可以:
1.1.8 执行初始化
注意,每次执行初始化之前,都需要在每个节点上先停止Ceph服务,并清空原有数据目录:
# /etc/init.d/ceph stop
# rm -rf /var/lib/ceph/*/ceph-*/*
然后,就可以在mon所在的节点ceph上执行初始化了:
# sudo mkcephfs -a -c /etc/ceph/ceph.conf-k /etc/ceph/ceph.keyring
注意,一旦配置文件ceph.conf发生改变,初始化最好重新执行一遍。
1.1.9 启动Ceph服务
在mon所在的节点ceph上执行:
# sudo service ceph -a start
注意,执行上面这步时,可能会遇到如下提示:
=== osd.0 ===
Mounting xfs onceph4:/var/lib/ceph/osd/ceph-0
Error ENOENT: osd.0 does not exist. create it before updating the crush map
执行如下命令后,再重复执行上面那条启动服务的命令,就可以解决:
# ceph osd create
1.1.10 执行健康检查
# sudo ceph health # 也可以使用ceph -s命令查看状态
如果返回的是HEALTH_OK,则代表成功!
注意,如果遇到如下提示:
HEALTH_WARN 576 pgs stuckinactive; 576 pgsstuck unclean; no osds
或者遇到如下提示:
HEALTH_WARN 178 pgs peering; 178pgs stuckinactive; 429 pgs stuck unclean; recovery 2/24 objects degraded(8.333%)
执行如下命令,就可以解决:
# ceph pg dump_stuck stale &&cephpg dump_stuck inactive && ceph pg dump_stuck unclean
如果遇到如下提示:
HEALTH_WARN 384 pgs degraded; 384 pgs stuckunclean; recovery 21/42degraded (50.000%)
则说明osd数量不够,Ceph默认至少需要提供两个osd。
1.1.11 Ceph测试
客户端(节点ceph)挂载mon所在的节点(节点ceph):
# sudo mkdir /mnt/mycephfs
# sudo mount -t ceph 192.168.73.131:6789://mnt/mycephfs
客户端验证:
# df -h #如果能查看到/mnt/mycephfs的使用情况,则说明Ceph安装成功。