Ceph编译安装教程

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 memoryfull disk等问题。

3.配置搭建Ceph的环境,启用Mon节点

编译成功后,也不要高兴得太早了,接下来我们按下面配置架构图来构建Ceph集群。

ceph集群图.png

这部分应该是最让人头疼的部分了。编译安装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-uid=0 --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow'
    • (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 ceph-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

接下来依次启动图中的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。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据架构师专家

新的技术资料来了

我分享资料有一个特点,从来不要求大家转发,大家按需下载学习,如果资源有失效的,请第一时间告知

2834
来自专栏小文博客

小文’s blog – 论坛搭建教程-附源码-直播搭建

4443
来自专栏blackpiglet

Ceph RGW bucket 自动分片介绍和存在的问题

工作中存储集群使用了 Ceph 技术,所用的是版本是 Luminous 12.2.4,因为刚刚上手 Ceph,不少概念和问题也都是头一次听说,比如这次的自动分片...

2554
来自专栏磨磨谈

查询OSD运行在哪些cpu上

在看CPU相关的文章的时候,想起来之前有文章讨论是否要做CPU绑定,这个有说绑定的也有说不绑定的,然后就想到一个问题,有去观测这些OSD到底运行在哪些CPU上面...

1331
来自专栏安恒信息

[紧急]Discuz!X 安全漏洞预警

1DISCUZ漏洞 2017年9月29日,Comsenz向Discuz!X官方Git提交了加强安全性的代码更新,代码更改记录: https://gitee.co...

43012
来自专栏腾讯云TStack专栏

RBD至FileStore之所见(原理篇)

前言 我们知道,FileStore是目前Ceph版本的默认存储方式(后续社区准备采用BlueStore)。 RDB是我们虚拟机使用Ceph的常用方式,Ceph...

5024
来自专栏黑泽君的专栏

Win10没有以太网图标如何找回?以太网适配器不见了怎么恢复?

Win10以太网适配器不见了怎么恢复?以太网其实就是Win7系统中常说的“本地连接”假若用户发现网络适配器中的以太网适配器图标不见了,可以在设备管理器中添加一些...

801
来自专栏白驹过隙

ACE - Ubuntu下环境搭建

2889
来自专栏ChaMd5安全团队

内网工具学习之Empire后渗透

Empire一款基于PowerShell的后渗透测试工具。感谢某葵和某Egg的推荐和指点。感谢某骗子给我解惑DNS的一些东西。

1141
来自专栏黑泽君的专栏

win10 64位JLink v8固件丢失修复总结

大早晨的调着调着程序,视线没离开一会,就发现jlink自动断开连接了,然后重新拔插jlink、重启都不行,才发现小灯已经不亮了,原来是固件损坏了,果断想办法修复...

1631

扫码关注云+社区

领取腾讯云代金券