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。
Ceph编译安装教程的更多相关文章
- LNMP编译安装教程
LNMP编译安装教程 此次安装在Centos上,我采用的CentOS的版本是:CentOS release 6.5 (Final) 可以通过以下命令查看:lsb_release -a 一.准备工作: ...
- Linux下nginx编译安装教程和编译参数详解
这篇文章主要介绍了Linux下nginx编译安装教程和编译参数详解,需要的朋友可以参考下 一.必要软件准备1.安装pcre 为了支持rewrite功能,我们需要安装pcre 复制代码代码如下: # y ...
- 【转载】Ogre3d 2.1 源码编译安装教程
原文:Ogre3d 2.1 源码编译安装教程 今年是3D手游年,今年也是游戏引擎战争进入白热的一年. 移动游戏的红海时代,让各大端游也忍不住纷纷伸出大白腿,Unreal.CryEngine纷纷宣布自己 ...
- Linux(centos)下mysql编译安装教程
Linux下mysql编译安装教程 #查看linux发行版本 cat /etc/issue #查看linux内核版本号 uname -r 本文測试环境centOS6.6 一.Linux下编译安装MyS ...
- 转 Windows+VS2013爆详细Caffe编译安装教程
1. 安装cuda Cuda是英伟达推出的GPU加速运算平台 我这里安装的是cuda7.5,已经安装过的忽略,还没有安装过的这里有安装教程.windows下面安装还是非常简单的. 点击打开链接 ...
- hadoop2.1.0编译安装教程
由于现在hadoop2.0还处于beta版本,在apache官方网站上发布的beta版本中只有编译好的32bit可用,如果你直接下载安装在64bit的linux系统的机器上,运行会报一个INFO ut ...
- hadoop2.1.0和hadoop2.2.0编译安装教程
由于现在hadoop2.0还处于beta版本,在apache官方网站上发布的beta版本中只有编译好的32bit可用,如果你直接下载安装在64bit的linux系统的机器上,运行会报一个INFO ut ...
- centos7下vim8.1的编译安装教程
之前安装YouCompleteMe的时候遇到vim版本不兼容的问题,看网上说是需要将vim版本提升到8.0及以上,然后就开始安装最新版本的vim,安装过程中的遇到了不少问题主要集中在配置方面和缺少插件 ...
- 64位win10+cuda8.0+vs2013+cuDNN V5下Caffe的编译安装教程并配置matlab2014a 接口
一.需要安装的软件 1)vs2013,我是在http://www.52pojie.cn/thread-492326-1-1.html这个网址安装的.我之前用的是vs2012,按照网上的配置教程会爆各种 ...
随机推荐
- Python学习笔记(八)
Python学习笔记(八): 复习回顾 递归函数 内置函数 1. 复习回顾 1. 深浅拷贝 2. 集合 应用: 去重 关系操作:交集,并集,差集,对称差集 操作: 定义 s1 = set('alvin ...
- JAVA编程入门
java最早是由Sun公司基于C++开发而成的新一代编程语言也是现行下的主流行编程语言,其原始的主要用于嵌入式开发.java的第一个版本为JDK1.0,到2017年已经升级到JAK1.9版本.java ...
- Python 第十三节 文件操作
A 1.首先文件读写操作有以下几种模式: a\a+ w\w+ r\r+ a模式:追加_写入模式,写入指针默认在开头,如果文件存在将在开头追加写入,如果文件不存在将创建文件再写入. a+模式: ...
- 为Android设备添加A2SD支持
相信很多用Android设备的用户都有这个问题,内部存储太小导致应用只能装那么几个,虽然rom也有提供移动到sd卡的选项,但是仅仅是移动程序文件到sd卡,并不能解决多少问题,多装几个还是会 ...
- Spark 基本概念
Application:用户编写的 Spark 应用程序,包含驱动程序(Driver),和分布在集群中多个节点上运行的 Executor 代码,在执行过程中由一个或多个作业组成 Driver(驱动程序 ...
- PHP的取整函数
PHP的取整函数有四个,分别是ceil.floor.round和intval,下面对它们进行一一介绍: 1. ceil(x):向上舍入为最接近的整数. 返回不小于 x 的下一个整数,x 如果有小数部分 ...
- ASP.NET中登录时记住用户名和密码(附源码下载)--ASP.NET
必需了解的:实例需要做的是Cookie对象的创建和对Cookie对象数据的读取,通过Response对象的Cookies属性创建Cookie,通过Request对象的Cookies可以读取Cookie ...
- 剑指offer--面试题3
一 题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.完成一个函数,输入这样的数组和一整数,判断这个数组是否包含这个整数. 二 分析 如果这个二维数组是 ...
- Android 开发笔记___复选框__checkbox
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout ...
- android视频播放器系列(一)——系统播放器
使用系统播放器(intent隐士调用)可以播放本地视频和网络视频,但是使用方式上稍微有点差别: 一.播放本地视频 Uri uri = Uri.parse("本地视频地址");Int ...