共计 6462 个字符,预计需要花费 17 分钟才能阅读完成。
Ceph 官方版本目前支持的纠删码很有限,实验室这块希望能够整合我们自主开发的纠删码 BRS(Binary Reed–Solomon encoding),所以需要编译 Ceph 环境。Ceph 官方目前推荐的安装方式都是通过 Ceph-deploy 的工具来安装配置,搭建起来十分简单。目前直接通过 Ceph 源码进行编译安装的中文教程有太多坑了。笔者亲身通过编译 Ceph 搭建环境之后,对这个流程进行了一个完整的小结,后续的童鞋可以做一个简单的参考。
1.Ceph 简介
Ceph 的初创来自 Sage Weil 博士的 PhD 论文,论文“Ceph: A Scalable, High-Performance Distributed File System”详细的阐述了 Ceph 的设计架构。
简而言之,Ceph 作为一个分布式存储系统设计的目标定位为:
- 可轻松扩展到数 PB 级别的容量(Ceph 目前的版本可以轻松支持 EB 级别的存储容量)
- 能够自动适应多种工作负载的高性能(每秒输入 / 输出操作 [IOPS] 和带宽)
- 高可靠性
- 提供了对象,块,文件系统一整套存储解决方案,大大降低运维的成本
笔者认为 Ceph 作为一个优秀的分布式存储系统,未来分布式存储系统提供了设计基础。自 Linux 内核 2.6.34 版开始,Ceph.ko 已经集成到 Linux 内核之中,作为分布式 文件系统 的备选项之一。同时 Ceph 也是 OpenStack 中优秀的开源存储解决方案,支持通过 Ceph 作为块存储或对象存储进行读写访问。
2. 编译 Ceph 的源码
Ceph 的源码可以去 Github 之上 clone 下来,或者去 Ceph 官网下载。这里重点提一下 Ceph 的版本问题,Ceph 在 Hammer 版本之后,采取了新的版本命名规则:
- x.0.z – 开发版
- x.1.z – 候选版
- x.2.z – 稳定、修正版
目前对 Ceph 进行二次开发的版本基本上是基于稳定 TLS 版本来做,实验室选取了两个版本进行了开发。10.2.6 版本与 12.2.1 版本,本文基于 10.2.6 的版本进行编写。(12.2.1 版本不在使用 autotools 作为编译工具,同时添加了 Mgr 等新的组件,配置文件的编写方式也略有不同。)
由于实验室拟态系统的要求与设定,这里笔者选择了混用 64 位的 Ubuntu 14.04 与 64 位的 CentOS 进行编译安装,二者流程大同小异,不同之处我会重点标记。通过 cd 进入 Ceph 的源码目录,依次执行如下命令
1. ./install-deps.sh // 安装对应的 Ceph 依赖包
2 ./autogen.sh // 调用 autotools 脚本,生成 configure 和 makefile 文件
3. ./configure // 这步是很麻烦的一步,由于第一步并不会完全安装好所有依赖,需要读者见招拆招,按照终端提示安装依赖。(注:Centos 系列不会存在类似问题,嫌麻烦的可以直接用 Centos 进行编译安装)4. make // 进入漫长的等待,多核可以添加 -j{cpu 核数} 如 make -j4
5. make install // 安装 Ceph
PS: 编译 Ceph 时需要超大的内存与硬盘空间,所以建议待安装节点的内存和硬盘空间要足够大,否则会出现:
virtual memory exhausted: Cannot allocate memory 或 full disk等问题。
3. 配置搭建 Ceph 的环境,启用 Mon 节点
编译成功后,也不要高兴得太早了,接下来我们按下面配置架构图来构建 Ceph 集群。
这部分应该是最让人头疼的部分了。编译安装 Ceph 和直接通过包管理器安装 Ceph 的可大有不同。如 /etc/ceph/ 的配置目录就自己新建,默认的 /var/log/ceph 路径也需要通过 mkdir 新建,否则 Ceph 会直接丢弃日志文件。
-
编辑 /etc/ceph/ceph.conf
-
(1) 为集群分配唯一的集群 id
uuidgen // 生成 uuid
-
-
(2) 编辑 fsid
fsid = {UUID} // 填写生成的 uuid
-
例如:
fsid = 236e7afe-7c61-41a0-b577-89df547fcef5
-
-
(3) 把初始监视器写入 Ceph 配置文件
mon initial members = {hostname}[,{hostname}]
-
例如:
mon initial members = slave1
-
-
(4) 把初始监视器的 IP 地址写入 Ceph 配置文件、并保存。
mon host = {ip-address}[,{ip-address}]
-
例如:
mon host = 192.168.1.4
-
-
(5) 为此集群创建密钥环、并生成监视器密钥。
ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
-
(6) 生成管理员密钥环,生成 client.admin 用户并加入密钥环。
ceph-authtool –create-keyring /etc/ceph/ceph.client.admin.keyring –gen-key -n client.admin –set-u
-
-
(7) 把 client.admin 密钥加入 ceph.mon.keyring。
ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
-
(8) 用规划好的主机名、对应 IP 地址、和 FSID 生成一个监视器图,并保存为 /tmp/monmap。
monmaptool --create --add {hostname} {ip-address} --fsid {uuid} /tmp/monmap
-
例如:
monmaptool –create –add slave1 192.168.1.4 –fsid 236e7afe-7c61-41a0-b577-89df547fcef5 /tmp/monmap
-
-
(9) 在监视器主机上分别创建数据目录。
sudo mkdir /var/lib/ceph/mon/{cluster-name}-{hostname}
-
例如:
sudo mkdir /var/lib/ceph/mon/ceph-slave1
-
-
(10) 用监视器图和密钥环组装守护进程所需的初始数据。
ceph-mon [--cluster {cluster-name}] --mkfs -i {hostname} --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
-
例如:
ceph-mon --mkfs -i slave1 --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
-
-
(11) 仔细斟酌 Ceph 配置文件,公共的全局配置包括这些:
[global] fsid = {cluster-id} mon initial members = {hostname}[, {hostname}] mon host = {ip-address}[, {ip-address}] auth cluster required = none // 这里为了方便搭建测试环境,关闭了 ceph 的安全认证,建议在实际运行环境之中开启。 auth service required = none auth client required = none
-
(12) 建一个空文件 done,表示监视器已创建、可以启动了:
sudo touch /var/lib/ceph/mon/ceph-slave1/done
-
启动监视器。
在 Ubuntu 上用 Upstart:
sudo start mon id=slave1 [cluster={cluster-name}]
要使此守护进程开机自启,需要创建两个空文件,像这样:
sudo touch /var/lib/ceph/mon/{cluster-name}-{hostname}/upstart
例如:
sudo touch /var/lib/ceph/mon/ceph-slave1/upstart
在 Debian/CentOS/RHEL 上用 sysvinit:
sudo /etc/init.d/ceph start mon.slave1
-
-
(13) 验证下 Ceph 已经创建了默认存储池。
ceph osd lspools
可以看到这样的输出:
1 rbd // Ceph 会默认搭建一个 rbd 的存储池
确认下集群在运行。
ceph -s
你应该从输出里看到刚刚启动的监视器在正常运行,并且应该会看到一个健康错误:它表明归置组卡在了 stuck inactive 状态。输出大致如此:
cluster a7f64266-0894-4f1e-a635-d0aeaca0e993 health HEALTH_ERR 64 pgs stuck inactive; 64 pgs stuck unclean; no osds monmap e1: 1 mons at {slave1=192.168.1.4:6789/0}, election epoch 1, quorum 0 slave1 osdmap e1: 0 osds: 0 up, 0 in pgmap v2: 64 pgs, 1 pools, 0 bytes data, 0 objects 0 kB used, 0 kB / 0 kB avail 64 creating
目前集群处于 ERR 状态,由于 osd 尚未启动,pgs 没有分配。接下来我们要开始启动 osd,将 pgs 分配到 osd 之上,可以让集群恢复健康。
4. 编辑 CrushMap,启用 osd 节点
你的初始监视器可以正常运行后就可以添加 osd 了。要想让集群达到 active + clean 状态,必须安装足够多的 osd 来处理 pgs,在完成 Mon 启动之后,集群就有了默认的 CrushMap,但现在此图还是 空的,里面没有任何 osd 映射到 Ceph 节点,所以我们要先启动 osd 节点,之后编辑 CrushMap,并将其导入 Mon 节点。
-
(1) 准备 OSD。
ssh {node-name}
sudo ceph-disk prepare –cluster {cluster-name} –cluster-uuid {uuid} –fs-type {ext4|xfs|btrfs} {data-path} [{journal-path}]-
例如:
ssh slave1
sudo ceph-disk prepare –cluster ceph –cluster-uuid 236e7afe-7c61-41a0-b577-89df547fcef5 –fs-type xfs /dev/sbb1
-
-
(2) 激活 osd,并启动 osd 设备:
sudo ceph-disk activate {data-path} [–activate-key {path}]
sudo start osd.{id} -
例如:
sudo ceph-disk activate /dev/sdb1 sudo start osd.0
接下来依次启动图中的 3 个 osd 节点,此次 osd 节点虽然启动了,但是并没有加入到 CrushMap 之中进行映射,接下来我们需要导出 Mon 上的 CrushMap,并进行编辑,之后导回到 Mon 中。
-
(3) 从 Mon 节点获取 CrushMap 的二进制文件:
ceph osd getcrushmap -o crushmapbinary
-
(4) 通过 CrushMap 的二进制文件反编译它,成为文本文件:
cephtool -d crushmapbinary -o crushmap.txt
-
(5) 接下来编辑 crushmap.txt,主要添加 osd device 与 osd 的权重进行配置:
在 CrushMap 里声明一个设备,在设备列表后面新建一行,输入 device、之后是唯一的数字 ID、之后是相应的 ceph-osd 守护进程例程名字。device {num} {osd.name}
-
例如:
添加好我们之前 activate 的 osd 设备device 0 osd.0
device 1 osd.1
device 2 osd.2
-
接下来我们要给这些 osd 设备分配权重
CrushMap 主要有 4 个主要类型。
设备 由任意对象存储设备组成,即对应一个 ceph-osd 进程的存储器。
桶类型 :定义了 CRUSH 分级结构里要用的桶类型(types),桶由逐级汇聚的存储位置(如行、机柜、机箱、主机等等)及其权重组成。
桶例程 :定义了桶类型后,还必须声明主机的桶类型、以及规划的其它故障域。
规则 :由选择桶的方法组成。
目前我们只要大概有个概念,接下来我们只需要简单的将我们的设备添加到 CrushMap 之中:
root default {id -1 # do not change unnecessarily
# weight 3.240
alg straw
hash 0 # rjenkins1
item slave1 weight 1.00
item slave2 weight 1.00
item slave3 weight 1.00
}
host slave1 {id -4
alg straw
hash 0
item osd.0 weight 1.00
}
host slave2 {id -2
alg straw
hash 0
item osd.1 weight 1.00
}
host slave3 {id -3
alg straw
hash 0
item osd.2 weight 1.00
}
-
(6) 重新编译这个新的 CRUSH map
crushtool -c crushmap.txt -o crushmap-compiled
-
(7) 将新的 CRUSH map 应用到 ceph 集群中
ceph osd setcrushmap -i crushmap-compiled
-
(8)再次确认 Ceph 集群的运行状态。
ceph -s cluster a7f64266-0894-4f1e-a635-d0aeaca0e993 health HEALTH_OK 64 pgs stuck active and clean; 3 osds monmap e1: 1 mons at {node1=192.168.0.1:6789/0}, election epoch 1, quorum 0 node1 osdmap e1: 3 osds: 3 up, 3 in pgmap v2: 64 pgs, 1 pools, 0 bytes data, 0 objects 3465 kB used, 923421 kB / 919956 kB avail 64 active and clean
我们可以确认,Ceph 集群已经恢复 健康,我们已经成功编译安装了 Ceph。
更多 Ceph 相关教程见以下内容:
在 CentOS 7.1 上安装分布式存储系统 Ceph http://www.linuxidc.com/Linux/2015-08/120990.htm
Ceph 环境配置文档 PDF http://www.linuxidc.com/Linux/2013-05/85212.htm
CentOS7 下部署 Ceph 集群(版本 10.2.2)http://www.linuxidc.com/Linux/2017-02/140728.htm
如何升级 Ceph 版本及注意事项 http://www.linuxidc.com/Linux/2017-02/140631.htm
HOWTO Install Ceph On FC12, FC 上安装 Ceph 分布式文件系统 http://www.linuxidc.com/Linux/2013-05/85209.htm
实验环境 Ceph 9.2.1 部署笔记 http://www.linuxidc.com/Linux/2016-11/137094.htm
Ubuntu 16.04 快速安装 Ceph 集群 http://www.linuxidc.com/Linux/2016-09/135261.htm
CentOS 7 下单台物理机搭建 Ceph 集群 http://www.linuxidc.com/Linux/2017-06/144636.htm
基于 CentOS 7.3 安装部署 jewel 版本 Ceph 集群实战演练 http://www.linuxidc.com/Linux/2017-09/146760.htm
Ceph 的详细介绍:请点这里
Ceph 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-12/149053.htm