ceph编译_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 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-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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA进阶教学之(Object类中的equals方法)

public boolean equals(Object obj){return (this obj); } 原始equals方法是判断两个对象的内存地址是否相等的(内存地址相等,保存的值也相等) 比较是判断两个对象的值是否相等(保存的值相等) 在Object类中的equal…

hashmap扩容机制_图文并茂:HashMap经典详解!

点击上方 Java后端,选择 设为星标优质文章,及时送达代码中的注解多看几遍,其中HashMap的扩容机制是要必懂知识!结合图片一起理解!什么是 HashMap?HashMap 是基于哈希表的 Map 接口的非同步实现。此实现提供所有可选的…

python使用高阶函数实现_18.python高阶函数

什么是高阶函数:一个函数可以作为参数传给另外一个函数(一个函数可以用来接收另一个函数作为参数),或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),满足其一则为高阶函数。函数的形参位置必须接受一个函数对…

JAVA进阶教学之(Object类中的hashCode方法)

import java.util.Objects;/* hashCode方法 在Object中的hashCode方法是怎样的? public native int hashCode(); 这个方法不是抽象方法,带有native关键字,底层调用的是c程序hashCode() 方法返回的是int类型的哈希码 实际上就是一个java对象的…

nfc加密卡pm3和pm5区别_小米手环4/5 NFC添加加密门禁

什么是 NFC近场通信技术(Near-field communication,NFC)由非接触式射频识别(RFID)演变而来,由飞利浦半导体(现恩智浦半导体)、诺基亚和索尼共同于2004年研制开发,其基础是RFID及互连技术。近场通信是一种短距高频的无线电技术,在1…

JAVA进阶开发之(内部类概述)

匿名内部类(相当于此类没有名字): 1.什么是内部类:在类的内部又定义了一个新的类 2.内部类的分类: 静态内部类:类似静态变量 实例内部类:类似实例变量 局部内部类:类似局部变量…

python图书管理系统增删改查_固定资产管理系统,高效管理企业资产

固定资产管理系统是面向资产密集型单位信息化解决方案的总称,是一款通用性极强的管理软件,能够对单位所有的固定资产进行全方位掌控,并规范其管理流程,适用于企业、机关、学校、医院等单位。系统围绕固定资产的“进、出、用”各个…

JAVA进阶教学之(一维数组)

1、java语言中的数组是一种引用数据类型。不属于基本数据类型 数组的父类是object 2、数组实际上是一个容器,可以同时容纳多个元素(数组是一个数据的集合) 3、字面意思:数组意味着一组数据 4、数组当中可以存储“基本数据类型”的…

python画五角星填充不同颜色_不同颜色牡丹怎么画?3种牡丹图解教你画,适合0基础学习,收藏...

不同颜色的牡丹画法【黄牡丹】1 选取小号羊毫笔,笔肚先蘸取白粉,再在笔尖蘸藤黄稍加调和,运用斡水法,瓣片环花心而发,第一层花瓣要成弧形排列。2 再在笔尖上蘸藤黄,待蘸饱后,笔尖向内&#xff0…

stm32程序怎么设置apb2总线时钟_stm32学习笔记

整理了一些STM32相关知识点,平时有空可以看看,如果是面试STM32相关工作的也可以看看。相信对你一定会有所帮助的。1、AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2>1,意思是AP…

JAVA进阶开发之(二维数组)

1、二维数组其实是一个特殊的一维数组,特殊在这个二维数组中每一个元素是一个一维数组 2、就是一维数组里面都是一样的元素,二维数组就是把元素换成了一维数组 3、实际开发中,使用最多的就是一维数组,二维数组很少使用&#xff0c…

java steam 去重_Java中对List去重, Stream去重

问题当下互联网技术成熟,越来越多的趋向去中心化、分布式、流计算,使得很多以前在数据库侧做的事情放到了Java端。今天有人问道,如果数据库字段没有索引,那么应该如何根据该字段去重?大家都一致认为用Java来做&#xf…

python语言中包含的标准数据类型_Python对象——标准类型的分类

如果让我们最啰嗦的描述标准类型,我们也许会称它们是Python 的“基本内建数据对象原始类型”。 z “基本”,是指这些类型都是Python 提供的标准或核心类型。 z “内建”,是由于这些类型是Python 默认就提供的 z “数据”,因为他们…

JAVA进阶级开发之(Array工具类)

目录 常见的算法: 1、排序算法: 2、查找算法: 3、算法: 4、冒泡排序算法(理论) 4、选择排序算法(理论) 5、数组的元素查找: 6、介绍一下java.util.Arrays工具类 …

css怎么使元素绝对定位有过度效果_CSS定位属性Position实例分析

CSS所提供的Position定位属性在进行网页页面布局过程中非常重要,通过使用Position定位属性可以实现对页面元素进行精确定位,最终达到较好的设计及页面展示效果。本文主要针对Position属性设计教学案例,实现教学。CSS学习教程Position定位属性…

JAVA进阶开发之(String字符串的存储原理)

我们现在开始学习的就是一些工具类 这些工具类只需要我们学会查阅帮助文档进行开发就可以实现很多功能 例如:我们查看工具类String 关于java JDK中内置的一个类:java.lang.String 1、String表示字符串类型,属于引用数据类型,不属…

sqlmap使用_sqlmap于sql labs下使用

本文主要是写sqlmap在sql labs下的使用学习记录,目的在于模拟黑盒测试,不太在意原理。(当然,原理还是要学习好才这么干的。)不得不说收获还是蛮大的。首先推荐下sqlmap使用的学习视频。1-9:python sqlmap.p…

cad解除块的快捷命令_47个快捷键50个CAD技巧,快收藏起来

终于知道为什么别人用CAD总比我快了,原来他们早就掌握了这些实用的CAD技巧,还没看完我就默默地转了,总有用得到的时候。0147个快捷键1. 创建直线的快捷方式是L空格2. 创建圆的快捷方式是C空格3. 创建圆弧的快捷方式是A空格4. 创建矩形的快捷方…

JAVA进阶教学之(String类的构造方法)

试题: 问:以下程序一共创建了几个对象 public class StringTest03 {public static void main(String[] args) {String s1new String("aaa");String s2new String("aaa");} }答:一共创建了3个对象 1个对象是"aaa&…

python 栈实现_Python实现栈

class Node(object): def __init__(self, valueNone, prevNone, nextNone): self.value, self.prev, self.next value, prev, next class CirculaDoubleLinkedList(object): def __init__(self, msxsizeNone): # msxsizeNone代表无限大 self.maxsize msxsize node Node() no…