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和直接通过包管理器安装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。

Ceph编译安装教程的更多相关文章

  1. LNMP编译安装教程

    LNMP编译安装教程 此次安装在Centos上,我采用的CentOS的版本是:CentOS release 6.5 (Final) 可以通过以下命令查看:lsb_release -a 一.准备工作: ...

  2. Linux下nginx编译安装教程和编译参数详解

    这篇文章主要介绍了Linux下nginx编译安装教程和编译参数详解,需要的朋友可以参考下 一.必要软件准备1.安装pcre 为了支持rewrite功能,我们需要安装pcre 复制代码代码如下: # y ...

  3. 【转载】Ogre3d 2.1 源码编译安装教程

    原文:Ogre3d 2.1 源码编译安装教程 今年是3D手游年,今年也是游戏引擎战争进入白热的一年. 移动游戏的红海时代,让各大端游也忍不住纷纷伸出大白腿,Unreal.CryEngine纷纷宣布自己 ...

  4. Linux(centos)下mysql编译安装教程

    Linux下mysql编译安装教程 #查看linux发行版本 cat /etc/issue #查看linux内核版本号 uname -r 本文測试环境centOS6.6 一.Linux下编译安装MyS ...

  5. 转 Windows+VS2013爆详细Caffe编译安装教程

    1. 安装cuda Cuda是英伟达推出的GPU加速运算平台 我这里安装的是cuda7.5,已经安装过的忽略,还没有安装过的这里有安装教程.windows下面安装还是非常简单的. 点击打开链接    ...

  6. hadoop2.1.0编译安装教程

    由于现在hadoop2.0还处于beta版本,在apache官方网站上发布的beta版本中只有编译好的32bit可用,如果你直接下载安装在64bit的linux系统的机器上,运行会报一个INFO ut ...

  7. hadoop2.1.0和hadoop2.2.0编译安装教程

    由于现在hadoop2.0还处于beta版本,在apache官方网站上发布的beta版本中只有编译好的32bit可用,如果你直接下载安装在64bit的linux系统的机器上,运行会报一个INFO ut ...

  8. centos7下vim8.1的编译安装教程

    之前安装YouCompleteMe的时候遇到vim版本不兼容的问题,看网上说是需要将vim版本提升到8.0及以上,然后就开始安装最新版本的vim,安装过程中的遇到了不少问题主要集中在配置方面和缺少插件 ...

  9. 64位win10+cuda8.0+vs2013+cuDNN V5下Caffe的编译安装教程并配置matlab2014a 接口

    一.需要安装的软件 1)vs2013,我是在http://www.52pojie.cn/thread-492326-1-1.html这个网址安装的.我之前用的是vs2012,按照网上的配置教程会爆各种 ...

随机推荐

  1. [译]ASP.NET Core 2.0 中间件

    问题 如何创建一个最简单的ASP.NET Core中间件? 答案 使用VS创建一个ASP.NET Core 2.0的空项目,注意Startup.cs中的Configure()方法: public vo ...

  2. PyCharm 2017 免费 破解 注册 激活 教程(附 License Server 地址)(Python 编辑器 IDE 推荐)

    许多朋友都在问如何破解 PyCharm 2017 Professional 专业版,咪博士对此是坚决反对的! 不到万不得已,请不要这样做.破解之前,请拖到文章末尾,思考几个问题,想明白你确实需要这样做 ...

  3. LINUX 笔记-netstat命令

    netstat命令用于显示与IP.TCP.UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况.netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP ...

  4. Nginx配之负载均衡、缓存、黑名单和灰度发布

    一.Nginx安装(基于CentOS 6.5) 1.yum命令安装 yum install nginx –y(若不能安装,执行命令yum install epel-release) 2. 启动.停止和 ...

  5. 无需安装SqlServer打开并管理SqlServer数据库的方法

    本地安装的数据库是SqlServer2008R2的 在附加一个数据库文件时出现了以下错误 错误的原因就是附加的数据库版本太高,而本地数据库版本太低导致的 通过各种方式才查询到附加的数据库版本是SqlS ...

  6. 【JAVA零基础入门系列】Day11 Java中的类和对象

    今天要说的是Java中两个非常重要的概念--类和对象. 什么是类,什么又是对象呢?类是对特定集合的概括描述,比如,人,这个类,外观特征上,有名字,有年龄,能说话,能吃饭等等,这是我们作为人类的相同特征 ...

  7. 使用PHPExcel-1.8实现导入

    //使用PHPExcel-1.8实现导入(下载PHPExcel-1.8):导入excel 后缀名必须是.xls1.<form method="post" action=&qu ...

  8. EF6中使用事务的方法

    默认情况当你执行SaveChanges()的时候(insert update delete)来操作数据库时,Entity Framework会把这个操作包装在一个事务里,当操作结束后,事务也结束了. ...

  9. Ionic3 创建应用(Android)

    打开CMD 通过命令行进入项目目录 创建一个App项目 ionic start myApp blank 空白App ionic start myApp tabs 导航条 ionic start myA ...

  10. Good Luck in CET-4 Everybody!

    Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...