wiki/运维/分布式存储/Ceph/分布式存储Ceph技术.md
2025-01-02 10:46:09 +08:00

1173 lines
46 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 分布式存储Ceph技术
#### 认识分布式存储
```shell
分布式存储系统,是通过网络将数据分散存储在多台独立的设备上。
```
#### 分布式存储系统的特性
```shell
可扩展
分布式存储系统可以扩展到几百台甚至几千台的集群规模,而且随着集群规模的增长,系统整体性能表现为线性增长。分布式存储的水平扩展有以下几个特性:
  1) 节点扩展后,旧数据会自动迁移到新节点,实现负载均衡,避免单点过热的情况出现;
  2) 水平扩展只需要将新节点和原有集群连接到同一网络,整个过程不会对业务造成影响;
  3) 当节点被添加到集群,集群系统的整体容量和性能也随之线性扩展,此后新节点的资源就会被管理平台接管,被用于分配或者回收。
低成本
分布式存储系统的自动容错、自动负载均衡机制使其可以构建在普通的PC机之上。另外线性扩展能力也使得增加、减少机器非常方便可以实现自动运维。
高性能
无论是针对整个集群还是单台服务器,都要求分布式存储系统具备高性能。
易用
分布式存储系统需要能够提供易用的对外接口,另外,也要求具备完善的监控、运维工具,并能够与其他系统集成。
易管理
可通过一个简单的WEB界面就可以对整个系统进行配置管理运维简便极低的管理成本。
分布式存储系统的挑战主要在于数据、状态信息的持久化,要求在自动迁移、自动容错、并发读写的过程中保证数据的一致性。分布式存储涉及的技术主要来自两个领域:分布式系统以及数据库。
```
###### 存储分类
```shell
本地存储本地的文件系统,不能在网络上用。
ext3 ext4 xfs ntfs
网络存储---网络文件系统,共享的都是文件系统。
nfs 网络文件系统
hdfs 分布式网络文件系统
glusterfs 分布式网络文件系统
共享的是裸设备
块存储 cinder ceph(块存储 对象存储 网络文件系统-分布式)
SAN(存储区域网)
分布式
集群
client
|
namenode 元数据服务器
|
------------------------------------
| | |
datanode datanode datanode
```
## 分布式存储分类介绍
#### Hadoop HDFS(大数据分布式文件系统)
```shell
HDFSHadoop Distributed File System是一个分布式文件系统,是hadoop生态系统的一个重要组成部分是hadoop中的的存储组件.HDFS是一个高度容错性的系统HDFS能提供高吞吐量的数据访问非常适合大规模数据集上的应用。
HDFS的优点
1. 高容错性
数据自动保存多个副本
副本丢失后,自动恢复
2. 良好的数据访问机制
一次写入、多次读取,保证数据一致性
3. 适合大数据文件的存储
TB、 甚至PB级数据
扩展能力很强
HDFS的缺点
1. 低延迟数据访问
难以应付毫秒级以下的应用
2. 海量小文件存取
占用NameNode大量内存
3. 一个文件只能有一个写入者
仅支持append(追加)
```
#### OpenStack的对象存储Swift
![image-20200426180726385](assets/image-20200426180726385.png)
```shell
OpenStack Object StorageSwift是OpenStack开源云计算项目的子项目之一。Swift的目的是使用普通硬件来构建冗余的、可扩展的分布式对象存储集群存储容量可达PB级。Swift的是用Python开发
其主要特点为:
1.各个存储的节点完全对等,是对称的系统架构。
2. 开发者通过一个RESTful HTTP API与对象存储系统相互作用。
3.无单点故障:Swift的元数据存储是完全均匀随机分布的并且与对象文件存储一样元数据也会存储多份。整个Swift集群中也没有一个角色是单点的。
4. 在不影响性能的情况下,集群通过增加外部节点进行扩展。
5.无限的可扩展性这里的扩展性分两方面一是数据存储容量无限可扩展二是Swift性能如QPS、吞吐量等可线性提升扩容只需简单地新增机器系统会自动完成数据迁移等工作使各存储节点重新达到平衡状态。
6.极高的数据持久性
Swift可以用以下用途
图片、文档存储
长期保存的日志文件
存储媒体库(照片、音乐、视频等)
视频监控文件的存档
总结Swift适合用来存储大量的、长期的、需要备份的对象。
```
#### 公有云对象存储
公有云大都只有对象存储。例如,谷歌云存储是一个快速,具有可扩展性和高可用性的对象存储。
```shell
Amazon类似产品就是S3 http://aws.amazon.com/s3;
微软类似产品Azure Bolbhttp://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-blobs/;
阿里类似的有OSShttps://www.aliyun.com/product/oss/;
阿里云对象存储OSS
阿里云对象存储服务Object Storage Service简称 OSS是阿里云提供的海量、安全、低成本、高可靠的云存储服务
存储类型Storage Class
OSS 提供标准、低频访问、归档三种存储类型,其中标准存储类型提供高可靠、高可用、高性能的对象存储服务,能够支持频繁的数据访问;低频访问存储类型适合长期保存不经常访问的数据(平均每月访问频率 12 次),存储单价低于标准类型;归档存储类型适合需要长期保存(建议半年以上)的归档数据,在三种存储类型中单价最低。
应用场景
1、图片和音视频等应用的海量存储
OSS可用于图片、音视频、日志等海量文件的存储。
2、云端数据处理
上传文件到OSS后可以配合媒体处理服务和图片处理服务进行云端的数据处理。
3、网页或者移动应用的静态和动态资源分离
利用海量互联网带宽OSS可以实现海量数据的互联网并发下载。
```
#### GlusterFS分布式文件系统
![image-20200427100435453](assets/image-20200427100435453.png)
```shell
GlusterFSGNU ClusterFile System是一种全对称的开源分布式文件系统所谓全对称是指GlusterFS采用弹性哈希算法没有中心节点所有节点全部平等。GlusterFS配置方便稳定性好可轻松达到PB级容量数千个节点2011年被红帽收购。
PB级容量 高可用性 基于文件系统级别共享 分布式 去中心化
glusgerfs存储卷的类型
基本类型:条带,复制,哈希。
复合卷
复合卷就是分布式复制,分布式条带,分布式条带复制卷,像分布式复制,分布式条带这两个是比较常用的,像分布式条带复制卷三种揉一块儿的用的都比较少,
各种卷的整理
分布卷存储数据时将文件随机存储到各台glusterfs机器上。
优点:存储数据时,读取速度快
缺点一个birck坏掉文件就会丢失
复制卷存储数据时所有文件分别存储到每台glusterfs机器上。
优点对文件进行的多次备份一个brick坏掉文件不会丢失其他机器的brick上面有备份
缺点:占用资源
条带卷存数据时一个文件分开存到每台glusterfs机器上
优点:对大文件,读写速度快
缺点一个brick坏掉文件就会坏掉
```
#### 最常见的GPFS和HDFS有什么区别
```shell
GPFS和Hadoop的HDFS系统对比它设计用于在商用硬件上存储类似或更大的数据
HDFS还将文件分割成块并将它们存储在不同的文件系统节点内。
HDFS对磁盘可靠性的依赖并不高它可以在不同的节点内存储块的副本。保存单一副本块的一个节点出现故障可以再复制该组其它有效块内的副本。相较而言虽然GPFS支持故障节点恢复但它是一个更严重的事件它可能包括数据(暂时性)丢失的高风险。
GPFS支持完整的Posix文件系统语义。 HDFS和GFS(谷歌文件系统)并不支持完整的Posix语义。
GPFS跨文件系统分布它的目录索引和其它元数据。相反 Hadoop将它们保留在主要和次要Namenode中大型服务器必须在RAM内存储所有的索引信息。
GPFS将文件分割成小块。Hadoop HDFS喜欢64MB甚至更多的块因为这降低了Namenode的存储需求。小块或很多小的文件会快速填充文件系统的索引因此限制了文件系统的大小。
```
# Ceph
##### Ceph简介
```shell
Ceph使用C++语言开发遵循LGPL协议开源。Sage Weil(Ceph论文发表者)于2011年创立了以Inktank公司主导Ceph的开发和社区维护。2014年Redhat收购inktank公司并发布Inktank Ceph企业版ICE软件业务场景聚焦云、备份和归档支持对象存储和块存储以及文件系统存储应用。出现Ceph开源社区版本和Redhat企业版。
Cphe主要设计的初衷是变成一个可避免单节点故障的分布式文件系统PB级别的扩展能力而且是一种开源自由软件许多超融合的分布式文件系统都是基于Ceph开发的。
Ceph是一个统一的分布式存储系统设计初衷是提供较好的性能、可靠性和可扩展性。
```
##### ceph的优势
```shell
高扩展性使用普通x86服务器支持10~1000台服务器支持TB到EB级的扩展。
高可靠性:没有单点故障,多数据副本,自动管理,自动修复。
高性能:数据分布均衡。
可用于对象存储,块设备存储和文件系统存储
```
### ceph架构
![image-20200427101925308](assets/image-20200427101925308.png)
```shell
基础存储系统
rados基础存储系统RADOSReliable, Autonomic, Distributed Object Store即可靠的、自动化的、分布式的对象存储。所有存储在Ceph系统中的用户数据事实上最终都是由这一层来存储的。Ceph的高可靠、高可扩展、高性能、高自动化等等特性本质上也是由这一层所提供的。
基础库librados:
librados这一层的功能是对RADOS进行抽象和封装并向上层提供API以便直接基于RADOS而不是整个Ceph进行应用开发。特别要注意的是RADOS是一个对象存储系统因此librados实现的API也只是针对对象存储功能的。
高层应用接口
radosgw对象网关接口(对象存储)
rbd:块存储
cephfs文件系统存储
其作用是在librados库的基础上提供抽象层次更高、更便于应用或客户端使用的上层接口。
```
#### Ceph的基本组件
![image-20200427150232465](assets/image-20200427150232465.png)
```shell
如上图所示Ceph主要有三个基本进程
Osd
用于集群中所有数据与对象的存储。处理集群数据的复制、恢复、回填、再均衡。并向其他osd守护进程发送心跳然后向Mon提供一些监控信息。
当Ceph存储集群设定数据有两个副本时一共存两份则至少需要两个OSD守护进程即两个OSD节点集群才能达到active+clean状态。
MDS(可选)
为Ceph文件系统提供元数据计算、缓存与同步也就是说Ceph 块设备和 Ceph 对象存储不使用MDS 。在ceph中元数据也是存储在osd节点中的mds类似于元数据的代理缓存服务器。MDS进程并不是必须的进程只有需要使用CEPHFS时才需要配置MDS节点。
Monitor
监控整个集群的状态维护集群的cluster MAP二进制表保证集群数据的一致性。ClusterMAP描述了对象块存储的物理位置以及一个将设备聚合到物理位置的桶列表。
Managerceph-mgr
用于收集ceph集群状态、运行指标比如存储利用率、当前性能指标和系统负载。对外提供 ceph dashboardceph ui和 resetful api。Manager组件开启高可用时至少2个
```
##### ceph 结构包含两个部分
```shell
ceph client访问 ceph 底层服务或组件,对外提供各种接口。比如:对象存储接口、块存储接口、文件级存储接口。
ceph nodeceph 底层服务提供端,也就是 ceph 存储集群。
```
#### Ceph存储种类及其应用场景
##### 块存储
![image-20200427144601636](assets/image-20200427144601636.png)
```shell
典型设备: 磁盘阵列,硬盘
主要是将裸磁盘空间映射给主机使用的。
优点:
通过Raid与LVM等手段对数据提供了保护。
多块廉价的硬盘组合起来,提高容量。
多块磁盘组合出来的逻辑盘,提升读写效率。
缺点:
采用SAN架构组网时光纤交换机造价成本高。
主机之间无法共享数据。
使用场景:
Docker容器、虚拟机磁盘存储分配。
日志存储。
文件存储。
```
##### 文件存储
![image-20200427144655626](assets/image-20200427144655626.png)
```shell
典型设备: FTP、NFS服务器
为了克服块存储文件无法共享的问题,所以有了文件存储。
在服务器上架设FTP与NFS服务就是文件存储。
优点:
造价低,随便一台机器就可以了。
方便文件共享。
缺点:
读写速率低。
传输速率慢。
使用场景:
日志存储。
有目录结构的文件存储。
```
##### 对象存储
```shell
为什么需要对象存储?
首先一个文件包含了属性术语叫metadata元数据例如该文件的大小、修改时间、存储路径等以及内容以下简称数据
例如FAT32这种文件系统存储过程是链表的形式。
而对象存储则将元数据独立了出来,控制节点叫元数据服务器(服务器+对象存储管理软件里面主要负责存储对象的属性主要是对象的数据被打散存放到了那几台分布式服务器中的信息而其他负责存储数据的分布式服务器叫做OSD主要负责存储文件的数据部分。当用户访问对象会先访问元数据服务器元数据服务器只负责反馈对象存储在哪些OSD假设反馈文件A存储在B、C、D三台OSD那么用户就会再次直接访问3台OSD服务器去读取数据。
这时候由于是3台OSD同时对外传输数据所以传输的速度就加快了。当OSD服务器数量越多这种读写速度的提升就越大通过此种方式实现了读写快的目的。
另一方面对象存储软件是有专门的文件系统的所以OSD对外又相当于文件服务器那么就不存在文件共享方面的困难了也解决了文件共享方面的问题。
所以对象存储的出现,很好地结合了块存储与文件存储的优点。
优点:
具备块存储的读写高速。
具备文件存储的共享等特性。
使用场景: (适合更新变动较少的数据)
图片存储。
视频存储。
```
**Ceph同时提供对象存储、块存储和文件系统存储三种功能满足不同应用需求。**
###### 扩展什么是OSD
```shell
对象存储Object-based Storage)是一种新的网络存储架构基于对象存储技术的设备就是对象存储设备Object-based Storage Device简称OSD。总体上来讲对象存储综合了NAS和SAN的优点同时具有SAN的高速直接访问和NAS的分布式数据共享等优势提供了具有高性能、高可靠性、跨平台以及安全的数据共享的存储体系结构。
```
## Ceph 工作原理
##### ceph数据的存储过程
![image-20200427144918893](assets/image-20200427144918893.png)
```shell
无论使用哪种存储方式对象、块、挂载存储的数据都会被切分成对象Objects。Objects size大小可以由管理员调整通常为2M或4M。每个对象都会有一个唯一的OID由ino与ono生成虽然这些名词看上去很复杂其实相当简单。ino即是文件的File ID用于在全局唯一标示每一个文件而ono则是分片的编号。比如一个文件FileID为A它被切成了两个对象一个对象编号0另一个编号1那么这两个文件的oid则为A0与A1。Oid的好处是可以唯一标示每个不同的对象并且存储了对象与文件的从属关系。由于ceph的所有数据都虚拟成了整齐划一的对象所以在读写时效率都会比较高。
  但是对象并不会直接存储进OSD中因为对象的size很小在一个大规模的集群中可能有几百到几千万个对象。这么多对象光是遍历寻址速度都是很缓慢的并且如果将对象直接通过某种固定映射的哈希算法映射到osd上当这个osd损坏时对象无法自动迁移至其他osd上面因为映射函数不允许。为了解决这些问题ceph引入了归置组的概念即PG。
  PG是一个逻辑概念我们linux系统中可以直接看到对象但是无法直接看到PG。它在数据寻址时类似于数据库中的索引每个对象都会固定映射进一个PG中所以当我们要寻找一个对象时只需要先找到对象所属的PG然后遍历这个PG就可以了无需遍历所有对象。而且在数据迁移时也是以PG作为基本单位进行迁移ceph不会直接操作对象。
  对象时如何映射进PG的还记得OID么首先使用静态hash函数对OID做hash取出特征码用特征码与PG的数量去模得到的序号则是PGID。由于这种设计方式PG的数量多寡直接决定了数据分布的均匀性所以合理设置的PG数量可以很好的提升CEPH集群的性能并使数据均匀分布。
  最后PG会根据管理员设置的副本数量进行复制然后通过crush算法存储到不同的OSD节点上其实是把PG中的所有对象存储到节点上第一个osd节点即为主节点其余均为从节点。
```
### Ceph名词介绍
```shell
Ceph核心组件及概念介绍
Monitor
监控整个集群的状态维护集群的cluster MAP二进制表保证集群数据的一致性
OSD --
OSD全称Object Storage Device也就是负责响应客户端请求返回具体数据的进程。一个Ceph集群一般都有很多个OSD。
MDS
MDS全称Ceph Metadata Server是CephFS服务依赖的元数据服务。
Object --
Ceph最底层的存储单元是Object对象每个Object包含元数据和原始数据。
PG --
PG全称Placement Grouops是一个逻辑的概念一个PG包含多个OSD。引入PG这一层其实是为了更好的分配数据和定位数据。
RADOS
RADOS全称Reliable Autonomic Distributed Object Store是Ceph集群的精华用户实现数据分配、Failover等集群操作。
Libradio
Librados是Rados提供库因为RADOS是协议很难直接访问因此上层的RBD、RGW和CephFS都是通过librados访问的目前提供PHP、Ruby、Java、Python、C和C++支持。
CRUSH --
CRUSH是Ceph使用的数据分布算法类似一致性哈希让数据分配到预期的地方。
RBD --
RBD全称RADOS block device是Ceph对外提供的块设备服务。
RGW
RGW全称RADOS gateway是Ceph对外提供的对象存储服务接口与S3和Swift兼容。
CephFS --
CephFS全称Ceph File System是Ceph对外提供的文件系统服务。
```
# ceph集群部署
## ceph的存储方式
###### radosgwCeph对象网关
```shell
Ceph对象网关是一个对象存储接口建立在该对象之上 librados为应用程序提供了通往Ceph存储集群的RESTful网关。Ceph对象存储支持两个接口
与S3兼容为对象存储功能提供与Amazon S3 RESTful API的大部分子集兼容的接口。
兼容Swift通过与OpenStack Swift API的大部分子集兼容的接口为对象存储功能提供支持。
```
Ceph对象存储使用Ceph对象网关守护进程`radosgw`它是用于与Ceph存储群集进行交互的HTTP服务器。由于它提供与OpenStack Swift和Amazon S3兼容的接口因此Ceph对象网关具有其自己的用户管理。Ceph对象网关可以将数据存储在用于存储来自Ceph文件系统客户端或Ceph块设备客户端的数据的同一Ceph存储群集中。S3和Swift API共享一个公共的名称空间因此您可以使用一个API编写数据而使用另一个API检索数据。
![image-20200430151905835](assets/image-20200430151905835.png)
###### Ceph 文件系统
Ceph 文件系统( Ceph FS )是个 POSIX 兼容的文件系统,它使用 Ceph 存储集群来存储数据。 Ceph 文件系统与 Ceph 块设备、同时提供 S3 和 Swift API 的 Ceph 对象存储、或者原生库( librados )一样,都使用着相同的 Ceph 存储集群系统。
###### CEPH 块存储
块是一个字节序列(例如,一个 512 字节的数据块)。基于块的存储接口是最常见的存储数据方法,它们基于旋转介质,像硬盘、 CD 、软盘。无处不在的块设备接口使虚拟块设备成为与 Ceph 这样的海量存储系统交互的理想之选。
Ceph 块设备是精简配置的、大小可调且将数据条带化存储到集群内的多个 OSD 。 Ceph 块设备利用 RADOS 的多种能力,如快照、复制和一致性。 Ceph 的 RADOS 块设备( RBD )使用内核模块或 librbd 库与 OSD 交互。
![image-20200430194407343](assets/image-20200430194407343.png)
## 安装ceph集群
```shell
注意版本更新非常快,有问题看官方文档
官方文档:
http://docs.ceph.com/docs/master
========================================
准备环境
系统版本centos7.4 x86_64 server
硬件配置5台vm1核1G内存每台node角色的机器至少挂载1块不低于5个G的空闲盘为osd存储
主机名 ip role
admin 192.168.153.130 admin--安装ceph-deploy
node1 192.168.153.131 mon / mgr / osd
node2 192.168.153.132 osd
node3 192.168.153.133 osd
ceph-client 192.168.153.134
1.给三台node节点添加一块大小5G以上的磁盘。
2.所有节点修改主机名并相互解析
3.关闭所有机器的防火墙和selinux
4.所有节点创建普通用户并设置密码--所有节点都操作
[root@admin ~]# useradd cephu
[root@admin ~]# passwd cephu
5.确保各 Ceph 节点上新创建的用户都有 sudo 权限--所有节点操作
[root@admin ~]# visudo ----在root ALL=(ALL) ALL下面添加
cephu ALL=(root) NOPASSWD:ALL
```
![image-20200427181932971](assets/image-20200427181932971.png)
```shell
6.实现ssh无密码登录admin节点操作
[root@admin ~]# su - cephu
[cephu@admin ~]$ ssh-keygen
7.将admin节点cephu用户生成的密钥拷贝到各Ceph节点
[cephu@admin ~]$ ssh-copy-id cephu@node1
[cephu@admin ~]$ ssh-copy-id cephu@node2
[cephu@admin ~]$ ssh-copy-id cephu@node3
[cephu@admin ~]$ ssh-copy-id cephu@ceph-client
8.在admin节点用root用户添加~/.ssh/config配置文件并进行如下设置这样 ceph-deploy 就能用你所建的用户名登录 Ceph 节点了
[root@admin ~]# mkdir ~/.ssh
[root@admin ~]# vim ~/.ssh/config
Host node1
Hostname node1
User cephu
Host node2
Hostname node2
User cephu
Host node3
Hostname node3
User cephu
```
```shell
9.添加下载源安装ceph-deployadmin节点root用户
[root@admin ~]# vim /etc/yum.repos.d/ceph.repo
[ceph-noarch]
name=Ceph noarch packages
baseurl=https://download.ceph.com/rpm-luminous/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
更新源安装ceph-deploy
[root@admin ~]# yum makecache
[root@admin ~]# yum update
开启yum缓存
[root@admin ~]# vim /etc/yum.conf
keepcache=1
安装
[root@admin ~]# yum install ceph-deploy -y
10.安装ntp所有节点
#注意选择任何一台机器当ntp时间服务器其他的节点当时间服务器的客户端跟服务器同步时间
我选择的是admin上:
[root@admin ~]# yum install -y ntp
[root@admin ~]# vim /etc/ntp.conf #有4行server的位置把那4行server行注释掉填写以下两行
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
```
![image-20200427184923746](assets/image-20200427184923746.png)
```shell
[root@admin ~]# systemctl start ntpd
[root@admin ~]# systemctl status ntpd
其他所有节点:
# yum install ntpdate -y
# ntpdate 时间服务器ip
```
===============================================================
```shell
部署ceph集群
#注意没有特别说明以下所有操作均是在admin节点cephu用户下执行
1.创建cephu操作的目录
[root@qfedu.com-admin ~]# su - cephu
[cephu@admin ~]$ mkdir my-cluster #之后所有ceph-deploy命令操作必须在该目录下执行
2.创建集群---这里报错查看后面的错误整理
首先在这里需要先下载一个包并安装否则会报错,然后在创建集群
[cephu@admin ~]$ wget https://files.pythonhosted.org/packages/5f/ad/1fde06877a8d7d5c9b60eff7de2d452f639916ae1d48f0b8f97bf97e570a/distribute-0.7.3.zip
[cephu@admin ~]$ unzip distribute-0.7.3.zip
[cephu@admin ~]$ cd distribute-0.7.3
[cephu@admin distribute-0.7.3]$ sudo python setup.py install
创建集群
[cephu@admin ~]$ cd my-cluster/
[cephu@admin my-cluster]$ ceph-deploy new node1
[cephu@qfedu.com-admin my-cluster]$ ls
ceph.conf ceph-deploy-ceph.log ceph.mon.keyring
创建成功会有三个文件ceph.conf, ceph.mon.keyring, and a log file
3.安装luminous-12.2.13在(脚本方式在admin节点)
目标在node1,node2,node3三个节点上安装ceph和ceph-radosgw主包
方法1利用官方脚本全自动安装
#脚本会帮助node1,node2,node3创建epel源和ceph源并且自动安装ceph和ceph-radosgw主包
[cephu@admin my-cluster]$ ceph-deploy install --release luminous node1 node2 node3
#这一步时间很长,容易超时,可以利用手动安装
如果ceph和ceph-radosgw安装不上则采用方法2
在千锋做实验要注意epel的源(切记)
测试是否安装完成分别在node1 node2 node3中确认安装版本为12.2.13
[cephu@node1 ~]$ ceph --version
ceph version 12.2.13 (584a20eb0237c657dc0567da126be145106aa47e) luminous (stable)
方法2手动部署安装三台机器分别创建三台node节点相同操作
1安装epel源
# yum install -y epel*
2创建Ceph源内容如下官方源
# vim /etc/yum.repos.d/ceph.repo
[Ceph]
name=Ceph packages for $basearch
baseurl=http://download.ceph.com/rpm-luminous/el7/$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1
[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://download.ceph.com/rpm-luminous/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1
[ceph-source]
name=Ceph source packages
baseurl=http://download.ceph.com/rpm-luminous/el7/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1
#下面的是阿里云的ceph源
# vim /etc/yum.repos.d/ceph.repo
[Ceph]
name=Ceph packages for $basearch
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/$basearch
enabled=1
gpgcheck=0
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
priority=1
[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/noarch
enabled=1
gpgcheck=0
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
priority=1
[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/SRPMS
enabled=1
gpgcheck=0
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
priority=1
3)分别在node1node2node3节点执行下面命令安装软件,可以完全手动安装但需要yum的ceph缓存目录结构
$sudo yum install ceph ceph-radosgw -y
如果因为速度慢导致安装失败可以按ctrl+c利用它创建的yum缓存目录手动把安装包下载下来保存到缓存目录/var/cache/yum/x86_64/Ceph/packages目录下
再次执行安装命令:
$sudo yum install ceph ceph-radosgw -y
测试是否安装完成分别在node1 node2 node3中确认安装版本为12.2.13
[cephu@node1 ~]$ ceph --version
ceph version 12.2.13 (584a20eb0237c657dc0567da126be145106aa47e) luminous (stable)
```
```shell
4.初始化monadmin节点--cephu用户执行
[cephu@admin my-cluster]$ ceph-deploy mon create-initial
5.赋予各个节点使用命令免用户名权限:
[cephu@admin my-cluster]$ ceph-deploy admin node1 node2 node3
6.安装ceph-mgr只有luminous才有为使用dashboard做准备
[cephu@admin my-cluster]$ ceph-deploy mgr create node1
7.添加osd
注意各个节点上提供存储空间的磁盘大小不能太小最好5G以上注意检查你的磁盘名字
[cephu@admin my-cluster]$ ceph-deploy osd create --data /dev/sdb node1
[cephu@admin my-cluster]$ ceph-deploy osd create --data /dev/sdb node2
[cephu@admin my-cluster]$ ceph-deploy osd create --data /dev/sdb node3
命令中/dev/sdb是在各个节点上为osd准备的空闲磁盘无需分区格式化如果有分区需要指定具体分区通过如下命令查看
[cephu@admin my-cluster]$ ssh node1 lsblk -f
最后通过如下命令查看集群状态:
[cephu@admin my-cluster]$ ssh node1 sudo ceph -s
如果显示health_ok3个osd up就成功了
```
![image-20200502210158493](assets/image-20200502210158493.png)
```shell
Dashboard的配置在node1上操作
把ceph-mgr和ceph-mon安装在同一个主机上最好只有一个ceph-mgr
[root@node1 ~]# su - cephu
1.创建管理域秘钥:
[cephu@node1 ~]$ sudo ceph auth get-or-create mgr.node1 mon 'allow profile mgr' osd 'allow *' mds 'allow *'
[mgr.node1]
key = AQAePadeYsvJLxAA9Pnmib3S+0Kj1jAeuSQcKw==
2.开启 ceph-mgr 管理域
[cephu@node1 ~]$ sudo ceph-mgr -i node1
3.查看ceph的状态确认mgr的状态为active
[cephu@node1 ~]$ sudo ceph status
cluster:
id: aec06bc6-428c-49ff-a2c1-2d84808bcb54
health: HEALTH_OK
services:
mon: 1 daemons, quorum node1
mgr: node1(active, starting)
osd: 3 osds: 3 up, 3 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0B
usage: 3.01GiB used, 12.0GiB / 15.0GiB avail
pgs:
4.打开dashboard模块
[cephu@node1 ~]$ sudo ceph mgr module enable dashboard
5.绑定开启dashboard模块的ceph-mgr节点的ip地址
[cephu@node1 ~]$ sudo ceph config-key set mgr/dashboard/node1/server_addr 192.168.153.136
set mgr/dashboard/node1/server_addr
# ip地址为mgr节点的ip地址,也就是node1的ip地址
5.web登录浏览器地址栏输入
mgr地址:7000
```
![image-20200427203351189](assets/image-20200427203351189.png)
到这里ceph分布式集群完成
```shell
配置客户端使用
配置客户端使用rbd
# 创建块设备之前需要创建存储池存储池相关命令需要在mon节点执行--也就是规划好的node1节点
1.创建存储池:
[cephu@node1 ~]$ sudo ceph osd pool create rbd 128 128
pool 'rbd' created
2.初始化存储池
[cephu@node1 ~]$ sudo rbd pool init rbd
3.准备客户端client客户端操作
#另备一台主机系统centos7用来作为client。主机名为clientip192.168.153.135。修改hosts文件实现和admin节点的主机名互通。
3.1.升级client内核到4.x,方法在子目录中
Centos7升级内核
更新前,内核版本为:
[root@ceph-client ~]# uname -r
3.10.0-693.el7.x86_64
升级方法:导入key:
[root@ceph-client ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
3.2.安装elrepo的yum源:
[root@ceph-client ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
查看可用的系统内核包
[root@ceph-client ~]# yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
3.3安装内核: 当前内核为最新5.6也可以安装4版本的内核
[root@ceph-client ~]# yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml -y
#当前为5.6.7版本
Dependencies Resolved
===============================================================================================================================
Package Arch Version Repository Size
===============================================================================================================================
Installing:
kernel-ml x86_64 5.6.7-1.el7.elrepo elrepo-kernel 49 M
kernel-ml-devel x86_64 5.6.7-1.el7.elrepo elrepo-kernel 13 M
Transaction Summary
===============================================================================================================================
Install 2 Packages
查看内核默认启动顺序
[root@ceph-client ~]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
CentOS Linux (5.6.7-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-8c5f0e6efaf047c5a0b72fdd72ee6575) 7 (Core)
默认启动的顺序是从0开始新内核是从头插入目前位置在0而5.6.7的是在1所以需要选择0。
[root@ceph-client ~]# grub2-set-default 0
然后reboot重启使用新的内核下面是重启后使用的内核版本:
[root@ceph-client ~]# reboot
[root@ceph-client ~]# uname -r
5.6.7-1.el7.elrepo.x86_64
4.删除旧的内核
[root@ceph-client ~]# yum remove kernel -y
5.为client安装ceph
[root@ceph-client ~]# yum -y install python-setuptools #还要做着一步 否则报错
5.1.参考部署ceph文档开头环境准备的2-5步
5.2.参考部署ceph集群中的第3步--安装安装luminous-12.2.13的第2中方式手动安装ceph
5.2.1.安装epel源
[root@ceph-client ~]# yum install -y epel*
5.2.2。创建ceph源
[root@ceph-client ~]# vim /etc/yum.repos.d/ceph.repo
[Ceph]
name=Ceph packages for $basearch
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/$basearch
enabled=1
gpgcheck=0
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
priority=1
[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/noarch
enabled=1
gpgcheck=0
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
priority=1
[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/SRPMS
enabled=1
gpgcheck=0
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
priority=1
[root@ceph-client ~]# vim /etc/yum.conf #开启yum缓存
keepcache=1
[root@ceph-client ~]# yum clean all
[root@ceph-client ~]# su - cephu
[cephu@ceph-client ~]$ sudo yum install ceph ceph-radosgw -y
[cephu@ceph-client ~]$ ceph --version
ceph version 12.2.13 (584a20eb0237c657dc0567da126be145106aa47e) luminous (stable)
6.在admin节点赋予client使用命令免用户名权限
[cephu@admin my-cluster]$ ceph-deploy admin ceph-client
7.修改client下该文件的读权限
[cephu@ceph-client ~]$ sudo chmod +r /etc/ceph/ceph.client.admin.keyring
8.修改client下的ceph配置文件这一步是为了解决映射镜像时出错问题
[cephu@ceph-client ~]$ sudo vi /etc/ceph/ceph.conf #在global section下添加
rbd_default_features = 1
9.client节点创建块设备镜像单位是M这里是4个G
[cephu@ceph-client ~]$ rbd create foo --size 4096
10.client节点映射镜像到主机
[cephu@ceph-client ~]$ sudo rbd map foo --name client.admin
/dev/rbd0
11.client节点格式化块设备
[cephu@ceph-client ~]$ sudo mkfs.ext4 -m 0 /dev/rbd/rbd/foo
12.client节点mount块设备
[cephu@ceph-client ~]$ sudo mkdir /mnt/ceph-block-device #创建挂载点
[cephu@ceph-client ~]$ sudo mount /dev/rbd/rbd/foo /mnt/ceph-block-device #挂载
[cephu@ceph-client ~]$ cd /mnt/ceph-block-device
[cephu@ceph-client ceph-block-device]$ sudo touch a.txt
客户端重起之后,设备需要重新作映射,不然可能会卡死
```
## 错误整理
```shell
[cephu@centos7u3_1 my-cluster]$ ceph-deploy new node1
Traceback (most recent call last):
File "/bin/ceph-deploy", line 18, in <module>
from ceph_deploy.cli import main
File "/usr/lib/python2.7/site-packages/ceph_deploy/cli.py", line 1, in <module>
import pkg_resources
ImportError: No module named pkg_resources
重新安装python的distribution
下载 distribution : https://pypi.python.org/pypi/distribute
cd distribution-0.7.3/
sudo python setup.py install
distribution下载地址
https://files.pythonhosted.org/packages/5f/ad/1fde06877a8d7d5c9b60eff7de2d452f639916ae1d48f0b8f97bf97e570a/distribute-0.7.3.zip
问题二
[ERROR ] admin_socket: exception getting command descriptions: [Errno 2] No such file or dir
cat /etc/ceph/ceph.conf
添加
public_network= 192.168.122.0/24
推送
ceph-deploy --overwrite-conf config push admin node1 node2 node3
https://www.cnblogs.com/aguncn/p/7352393.html
https://blog.csdn.net/zhydream77/article/details/81041767
问题三:
ceph-deploy mon create-initial 时候
```
[node1][INFO ] Running command: sudo ceph --cluster=ceph --admin-daemon /var/run/ceph/ceph-mon.node1.asok mon_status
[node1][ERROR ] no valid command found; 10 closest matches:
[node1][ERROR ] perf reset <var>
[node1][ERROR ] perf histogram schema
[node1][ERROR ] log reopen
[node1][ERROR ] log flush
[node1][ERROR ] perf histogram dump {<logger>} {<counter>}
[node1][ERROR ] perf dump {<logger>} {<counter>}
[node1][ERROR ] git_version
[node1][ERROR ] get_command_descriptions
[node1][ERROR ] log dump
[node1][ERROR ] help
[node1][ERROR ] admin_socket: invalid command
[node1][WARNIN] monitor: mon.node1, might not be running yet
[node1][INFO ] Running command: sudo ceph --cluster=ceph --admin-daemon /var/run/ceph/ceph-mon.node1.asok mon_status
[node1][ERROR ] no valid command found; 10 closest matches:
[node1][ERROR ] perf reset <var>
[node1][ERROR ] perf histogram schema
[node1][ERROR ] log reopen
[node1][ERROR ] log flush
[node1][ERROR ] perf histogram dump {<logger>} {<counter>}
[node1][ERROR ] perf dump {<logger>} {<counter>}
[node1][ERROR ] git_version
[node1][ERROR ] get_command_descriptions
[node1][ERROR ] log dump
[node1][ERROR ] help
[node1][ERROR ] admin_socket: invalid command
[node1][WARNIN] monitor node1 does not exist in monmap
```
原因: 第一次在做的时候没有修改主机名是就生成了公私钥,结果拷贝的公钥有问题,在问题二推送配置的时候,排查后发现主机名的问题。
之后初始化mon的时候出错排错两个小时差点怀疑人生的时候突然发现想起主机名的事情就检查了以下公私钥结果发现生成的公私钥是以原主机名生成的删除后生成新的公私钥传送公钥后还是失败。
但是感觉已经找到了问题所在继续排查到node1查看日志发现地址被占用平复以下自己激动的心然后冷静的杀掉进程重新初始化OK
问题四:
ceph-deploy osd create --data /dev/vdc node3
[node1][WARNIN] ceph-volume lvm create: error: GPT headers found, they must be removed on: /dev/vdb
[node1][ERROR ] RuntimeError: command returned non-zero exit status: 2
[ceph_deploy.osd][ERROR ] Failed to execute command: /usr/sbin/ceph-volume --cluster ceph lvm create --bluestore --data /dev/vdb
[ceph_deploy][ERROR ] GenericError: Failed to create 1 OSDs
千万不要分区,然后重新加磁盘,重新做
又文档说加上参数也可以但是
ceph-deploy osd create --data /dev/vdc --fs-type xfs node3 不行
[cephu@node1 ~]$ sudo ceph auth get-or-create mgr.node1 mon 'allow profile mgr' osd 'allow *' mds 'allow *'
[mgr.node1]
key = AQD8HPdcmntqJRAAlZ3Aeialqq0nVcdcg+axqQ==
-------------
问题:rdb map出错rbd sysfs write failed
创建了一个rbd镜像
$ rbd create --size 4096 docker_test
然后在Ceph client端将该rbd镜像映射为本地设备时出错。
$ rbd map docker_test --name client.admin
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable".
In some cases useful info is found in syslog - try "dmesg | tail" or so.
原因:
rbd镜像的一些特性OS kernel并不支持所以映射失败。我们查看下该镜像支持了哪些特性。
$ rbd info docker_test
rbd image 'docker_test':
size 4096 MB in 1024 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.43702ae8944a
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:
可以看到特性feature一栏由于我OS的kernel只支持layering其他都不支持所以需要把部分不支持的特性disable掉。
方法一: 直接diable这个rbd镜像的不支持的特性
$ rbd feature disable docker_test exclusive-lock object-map fast-diff deep-flatten
方法二: 创建rbd镜像时就指明需要的特性
$ rbd create --size 4096 docker_test --image-feature layering
方法三: 如果还想一劳永逸
那么就在执行创建rbd镜像命令的服务器中
修改Ceph配置文件/etc/ceph/ceph.conf
在global section下增加rbd_default_features = 1
再创建rdb镜像。
$ rbd create --size 4096 docker_test
通过上述三种方法后查看rbd镜像的信息。
$ rbd info docker_test
rbd image 'docker_test':
size 4096 MB in 1024 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.43a22ae8944a
format: 2
features: layering
flags:
再次尝试映射rdb镜像到本地块设备成功
$ rbd map docker_test --name client.admin
/dev/rbd0
======================================
问题:
[cephu@client ~]$ sudo rbd map docker_test --name client.admin
rbd: sysfs write failed
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (110) Connection timed out
解决方案:
[cephu@client ~]$ sudo ceph osd crush tunables hammer
adjusted tunables profile to hammer
然后重新
[cephu@client ~]$ sudo rbd map docker_test --name client.admin
/dev/rbd0
成功
参考链接: https://randomopenstackthoughts.wordpress.com/2018/08/16/ceph-block-device/
=====================================
问题1:
2.3步骤中,如果由于网速太慢,可以如下操作
由于网速慢的问题安装并不会成功。之所以仍进行这一步只因执行过了该命令就会自动创建相应文件夹。在进入各个节点手动安装的时候才能把下载的不成功的包放到正确的目录下这样手动安装使用yum命令才会成功。之后进入每个节点执行安装。
以node1为例
• 先从https://download.ceph.com/rpm-luminous/el7/x86_64/ 下载所有最有最新版本的rpm包到本地
• 之后使用secure shell client上传到node1的/var/cache/yum/x86_64/7/Ceph/packages/文件夹下
• 然后安装ceph
$ ssh node1
$ sudo yum install y epel-release ceph ceph-radosgw
虽然所有安装包都在相应的目录中了,但仍可能不成功,这个时候只需要再次重新把安装包放到对应目录后再执行该命令就成功了,原因不明。
======================================
问题2:
2.3步骤中如果开启防火墙需要做如下操作
设置防火墙由于node1既是mon节点又是osd节点所以要添加下面两个规则。其他节点只开启ceph服务即可
$ sudo firewall-cmd --zone=public --add-service=ceph-mon --permanent //该规则仅在mon节点执行如果不添加就不能在其他osd上进行一些查询操作
$ sudo firewall-cmd --zone=public --add-service=ceph --permanent
$ sudo firewall-cmd --reload
注意:该防火墙规则只能在安装成功ceph后才能添加否则就不识别添加失败。最后退出node1节点返回admin节点
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
问题3
激活 OSD 的时候需要先把OSD所在服务器的目录所有者和所属组手动改成ceph不然无法激活
[root@vm42 yum.repos.d]# chown ceph:ceph /var/local/osd2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
问题4
ceph:health_warn clock skew detected on mon的解决办法
造成集群状态health_warnclock skew detected on mon节点的原因有两个一个是mon节点上ntp服务器未启动另一个是ceph设置的mon的时间偏差阈值比较小。
排查时也应遵循先第一个原因,后第二个原因的方式。
第一步确认ntp服务是否正常工作
第二步修改ceph配置中的时间偏差阈值
1. 在admin部署节点修改配置参数
# vi ~/my-cluster/ceph.conf在global字段下添加
mon clock drift allowed = 2
mon clock drift warn backoff = 30
2. 向需要同步的mon节点推送配置文件
# ceph-deploy --overwrite-conf config push node{1..3}这里是向node1 node2 node3推送也可以后跟其它不联系节点
3. 重启mon服务centos7环境下
# systemctl restart ceph-mon.target4.验证:
# ceph -s显示health_ok说明问题解决
问题5
有些场景下对osd进行一些操作但是并不想要集群进行数据恢复此时可以通过设置noout标志来实现
[root@node3 ~]# ceph osd set noout
noout is set
[root@node3 ~]# ceph -s
cluster:
id: b8b4aa68-d825-43e9-a60a-781c92fec20e
health: HEALTH_WARN
noout flag(s) set
services:
mon: 1 daemons, quorum node1
mgr: node1(active)
osd: 6 osds: 6 up, 6 in
flags noout
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 bytes
usage: 6339 MB used, 55100 MB / 61440 MB avail
pgs: 去除noout标志命令
[root@node3 ~]# ceph osd unset noout
noout is unset
[root@node3 ~]# ceph -s
cluster:
id: b8b4aa68-d825-43e9-a60a-781c92fec20e
health: HEALTH_OK
services:
mon: 1 daemons, quorum node1
mgr: node1(active)
osd: 6 osds: 6 up, 6 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 bytes
usage: 6339 MB used, 55100 MB / 61440 MB avail
pgs:
==================================================
Error: Package: 2:librbd1-12.2.12-0.el7.x86_64 (Ceph)
Requires: liblttng-ust.so.0()(64bit
方法1
sudo yum install -y yum-utils && sudo yum-config-manager --add-repo https://dl.fedoraproject.org/pub/epel/7/x86_64/ &&sudo yum install --nogpgcheck -y epel-release &&sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 &&sudo rm -f /etc/yum.repos.d/dl.fedoraproject.org*
方法二:
yum install epel-release -y
wget https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-12.noarch.rpm
rpm -Uvh epel-release*rpm
yum install lttng-ust -y
```