一个最小化的Ceph集群需要三个组件MON MGR OSD.上一章我们部署了MON,本章节我们完成剩下MGROSD 的部署。在文末我们将重点介绍下什么是FileStoreBlueStore,并详细分析其特点,来说明为什么Ceph社区放弃了FileStore,直接采用了BlueStore.

1、MGR 部署

  1. 创建mgr工作目录
sudo -u ceph mkdir /var/lib/ceph/mgr/ceph-mon01
  1. mgr 授权
#例子 ceph auth get-or-create mgr.$name mon \
# 'allow profile mgr' osd 'allow *' mds 'allow *'
# allow profile mgr 表示允许管理和配置mgr 的权限 ceph auth get-or-create mgr.mon01 mon \
'allow profile mgr' osd 'allow *' mds 'allow *' \
> /var/lib/ceph/mgr/ceph-mon01/keyring
  1. 修改目录的属主和属组为ceph用户,并启动ceph-mgr 进程
chown -R ceph:ceph /var/lib/ceph/mgr/
systemctl restart ceph-mgr@mon01
systemctl enable ceph-mgr@mon01

4、检查集群状态

[root@mon01 tmp]# ceph -s
cluster:
id: 51be96b7-fb6b-4d68-8798-665278119188
health: HEALTH_WARN
mon is allowing insecure global_id reclaim
1 monitors have not enabled msgr2 services:
mon: 1 daemons, quorum mon01 (age 44m)
mgr: mon01(active, since 1.5342s)
osd: 0 osds: 0 up, 0 in data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:

此时发现mgr: mon01 显示active 为活动状态表示部署成功。 但是Ceph 集群的状态还是显示为HEALTH_WARN。

  • 问题1 : 1 monitors have not enabled msgr2

    msgr2 协议 是Ceph中的新消息传递协议,它带来了一些性能和安全性方面的改进。在集群中,所有的监视器都应该启用msgr2以确保它们之间使用最新的消息传递协议。

总结:

  1. msgr是MON用来消息传递的协议,目前有两个版本V1 和V2 ,V1版本使用6789端口,

    V2版本使用3300端口。

  2. ceph mon enable-msgr2 开启V2版 消息传递协议。

【思考】:做过ceph运维的小伙伴肯定会遇见一种情况就是执行ceph -s 或其他ceph命令时命令一直卡住,很长时间都没有反应,第一次遇见此情况的小伙伴甚至怀疑集群宕机了。

【实验】 禁止本机3300端口

 #使用iptables 规制禁止了3300端口的访问
iptables -A INPUT -p tcp -m tcp --dport 3300 -j DROP



现在我们使用ceph -s 命令背后的逻辑

  • 先确定其进程编号
  • lsof 查看其命令访问的端口号



从上图中发现其确实访问的3300端口。因此我们得出结论,当执行ceph命令时,进程卡住了,先检查下3300 和6789 端口是否能正常访问。 iptables -F 清空filter 表后恢复正常

  • 问题2: mon is allowing insecure global_id reclaim
#关闭非安全的集群id 回收
ceph config set mon \
auth_allow_insecure_global_id_reclaim false

2、OSD 部署

OSD的安装可以分两步:初始化、激活,也可以一步到位。

#初始化
ceph-volume lvm prepare --data /dev/sdb
ceph-volume lvm list
#来获取osd.id 和 osd fsid

#激活
ceph-volume lvm activate 0 acdadb1a-ed18-4068-bbcb-432ba0cfcdb2

验证第一个osd



第二个osd 和第三三个osd 安装使用create 等于上面的两步

ceph-volume lvm create --data /dev/sdc
ceph-volume lvm create --data /dev/sdd

到此整个ceph 集群就部署完成了,一个MON ,一个MGR 和3个OSD 组成了一个最小化的Ceph集群。

不过上述的部署方式仅限于测试环境,生产环境切勿直接使用上述命令。为什么?

对ceph 有过生产经验的小伙伴都知道,Ceph是需要日志盘的。这里我们只使用了数据盘,那日志盘了?

要解释清楚这个问题,我们先弄清楚FileStoreBlueStore

3、Filestore or Bluestore

在之前的章节中我们曾介绍说,一般数据可以简单分为两部分,数据和元数据,在Ceph集群中,数据在写入集群时,将被客户端分割成4MB为单位的对象。每个对象都会写入OSD来实现落盘。在FileStore中每一个对象都需要通过FileStore的功能来实现将对象写入磁盘。

Ceph采用的是全日志系统,也就是说将所有数据存放在日志中(数据和元数据都存放在日志中),这样做的好处是Ceph可以先把一些零散的、随机的I/O请求保存到缓存中并进行合并,然后再统一向内核发起I/O请求。这样做效率会比较高,其带来的问题就是一旦OSD崩溃,缓存中的数据就会丢失。因此Ceph的日志是事务日志。事务日志不是真正去修改数据,而是记录数据修改的操作,这样当数据崩溃后,只要基于当前时间节点回放事务日志就能还原数据。

写日志有两种模式:ParallelWriteahead

  • Parallel(并行写): 是日志和磁盘数据同时写;
  • Writeahead(预写日志): 是先写日志,只要日志写成功,就返回,后台每隔一段时间会同步日志中的写操作,实现落盘。这种方法带来的好处就是,可以把很多小I/O请求合并,形成顺序写盘,提高每秒读写次数。通常在生产环境中,我们使用SSD来单独存储日志文件,以提高Ceph读写性能。

Writeahead模式下,Ceph对象(数据和元数据)一旦写入日志盘之后,就返回给客户端写入完成,之后按照一定的同步周期来将数据同步到后端真正的数据盘中。也就是说,当用户写入了一个对象数据(Ceph 中一切皆对象)返回成功时,可能该数据仅仅只是写了日志盘,还没有真正落入后端的存储磁盘。这就引入了第一个问题,FileStore 的双写问题(数据先写了日志盘,之后按一定周期写入后端磁盘)。

其次是在ceph按一定周期将日志盘的信息写入后端数据盘时,其前端对日志的写操作是要暂停的。专门执行日志数据到文件系统的同步。日志系统空间大小代表能缓存的数据量,同步时间的设置也会影响Ceph的性能。

在从文件系统的角度来看,FileStore底层使用POSIX规范的文件系统接口,例如xfs、ext4、btrfs,无论是数据还是元数据,都需要先写入文件系统层(如图中的XFS文件系统),然后由XFS文件系统接口来实现数据的落盘操作。我们可以简单理解为其在文件系统层也有写放大的问题,增加了文件系统层IO操作。



前文中我们提过,数据的元数据的一些随机的小IO,在FileStore 中使用Leveldb键/值数据库来存放其元数据,而Leveldb 为了保证自身事务的一致性,也采用事务日志来记录其操作,而不是真正的元数据进行操作。这些只是记录操作本身,而不对真正数据操作的行为都可以称为WAL(Write Ahead Log预写日志),其优点是一方面提高了效率(将随机IO变成了顺序IO),另一方面也保证事务的唯一性要求。(其思想反复应用在各种数据库中).

下面我们总结下FileSore的特点:

  1. 无论是数据还是元数据都是先写日志盘,再由日志盘同步到数据盘。存在数据双写问题。
  2. 无论是数据还是元数据都是在文件系统层之上,存在文件系统层的写放大问题。
  3. 日志盘同步数据到数据盘时日志盘不能写入有性能问题。
  4. 为加速对元数据的访问,用键值数据库LevelDB来优化其访问,LevelDB为保证事务的持久化采用WAL。

BlueStore的诞生是为了解决FileStore同时维护一套日志系统和基于文件系统写放大的问题,实现FileStore本身没有的对SSD的最优支持

  1. BlueStore 数据是直接写入裸盘的,不存在双写问题
  2. BlueStore 数据写入的裸盘中是没有文件系统层的。
  3. 实现在用户态下使用linux aio直接对裸设备进行I/O操作,去除了本地文件系统的消耗,减少系统复杂度,更有利于Flash介质盘发挥性能优势
  4. 采用RockDB来存储对象的元数据和DB WALRocksDB是一种嵌入式高性能键/值存储。在闪存存储方面表现出色,RocksDB无法直接写入原始磁盘设备,需要底层文件系统来存储其持久化数据,因此设计了BlueFS
  5. BlueFS:简化的文件系统,解决元数据、文件及磁盘的空间分配和管理问题

无论是FileStore 还是BlueStore中为加速元数据的访问都使用键值存储数据库,键值存储数据是依赖文件系统的。FileStore 采用了LevelDB ,BlueStore采用了BlueFS .为了持久化存储事务日志都采用了预写日志的方式(DB WAL)。

因此在生产中FileStore一般是用SSD磁盘作为为日志盘来使用,而数据盘一般是HDD磁盘。 而在BlueStore环境中 一般是采用两块SSD磁盘 ,一块用作RockDB ,一块用作DB WAL。体现在命令上如下

FileStore 环境
#--data 指定数据盘 --journal 指定日志盘,一般为分区。
ceph-volume --cluster ceph lvm create --osd-id 0 /
--filestore --data /dev/sdb--journal /dev/sda1
#--data 指定数据盘 --block.db 指定RocksDB --block.wal 指定WAL
ceph-volume lvm create --bluestore \
--data /dev/{data_device} \
--block.db /dev/{db_device} \
--block.wal /dev/{wal_device}

问题:如何判断一个Ceph集群使用的是FileStore还是BlueStore ?

通过磁盘的type来判断是比较通用的方式

[root@mon01 ~]# cat /var/lib/ceph/osd/ceph-0/type
bluestore

写在最后

生产中存储系统的IO上限就决定了整个系统的磁盘IO的上限。因此为了追求极致的IO,仅仅对元数据的加速访问使用SSD或NVME磁盘是远远不够的。因此下一章节我们将介绍存储的缓存技术。聊下目前比较流行的两种存储的缓存技术。



每天5分钟复习OpenStack(十二)Ceph FileStore 和 BlueSotre的更多相关文章

  1. 《用chsh选择shell》-linux命令五分钟系列之十二

    chsh命令用于修改你的登录shell. 1 我想知道我机器安装了哪些shell? 两种方法可以查看: 第一种: [rocrocket@wupengchong ~]$ chsh -l /bin/sh ...

  2. Git复习(十二)之命令专场

    命令 git init -> 初始化一个git仓库 git clone -> 克隆一个本地库 git pull -> 拉取服务器最新代码 git fetch –p -> 强行拉 ...

  3. OpenStack 图形化服务 Horizon介绍和部署(十二)

    Horizon介绍 Horizon是一个web接口,使得云平台管理员以及用户可以管理不同的OpenStack资源以及服务. 提供一个Web界面操作OpenStack系统 使用Django框架基于Ope ...

  4. HAOI(十二省联考)2019 qwq记

    \(\large{Day\ -1}:\) 放假了,白天大概是抱着最后一次在机房的心态复习着板子过去的.看着机房里的各位神仙丝毫不慌的颓倒是有点慌了,敲了一下多项式的板子感觉写的相当自闭,感觉AFO应该 ...

  5. 第十二周作业_PSP总结报告

    回顾1 (1)回想一下你曾经对计算机专业的畅想 当初你是如何做出选择计算机专业的决定的?经过一个学期,你的看法改变了么,为什么? 你认为过去接触到的课程是否符合你对计算机专业的期待,为什么?经过一个学 ...

  6. 软工 · 第十二次作业 - Beta答辩总结

    福大软工 · 第十二次作业 - Beta答辩总结 写第十二次的时候操作失误直接在Beta版本的博客里改了...第七次冲刺的作业链接补在这里 Beta(7/7) 组长本次博客作业链接 项目宣传视频链接 ...

  7. @游记@ CQOI2019(十二省联考)

    目录 @day - 0@ @day - 1@ @day - 2@ @后记@ 我只是来打酱油哒-- 顶多能进个 E 类继续打酱油. 原本还在互奶 A 队,结果现在--铁定进不了队啦. 对初中生的歧视啊 ...

  8. Senparc.Weixin.MP SDK 微信公众平台开发教程(十二):OAuth2.0说明

    紧接上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明>,这里专讲OAuth2.0. 理解OAuth2.0 首先我们通过一张图片来了解一下OAu ...

  9. 第十二篇 SQL Server代理多服务器管理

    本篇文章是SQL Server代理系列的第十二篇,详细内容请参考原文 在这一系列的上一篇,我们查看了维护计划,一个维护计划可能会创建多个作业,多个计划.你还简单地看了SSIS子系统,并查看了维护计划作 ...

  10. linux设备驱动归纳总结(十二):简单的数码相框【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-116926.html linux设备驱动归纳总结(十二):简单的数码相框 xxxxxxxxxxxxxx ...

随机推荐

  1. 3.0 Python 迭代器与生成器

    当我们需要处理一个大量的数据集合时,一次性将其全部读入内存并处理可能会导致内存溢出.此时,我们可以采用迭代器Iterator和生成器Generator的方法,逐个地处理数据,从而避免内存溢出的问题. ...

  2. ignite

    目录 简介 运行 制作vm文件系统 制作vm基础文件系统文件 创建contianerdClient 创建cniInstance 拉取基础镜像 创建基础文件系统文件 制作vm内核文件 Create vm ...

  3. Visual Studio Code(vscode)下载慢 插件安装失败解决方案

    目录 一.系统环境 二.前言 三.Visual Studio Code(vscode)简介 四.解决Visual Studio Code(vscode)下载慢的问题 4.1 问题描述 4.2 解决方案 ...

  4. 为不断增长的Go生态系统扩展gopls

    原文在这里. 由 Robert Findley and Alan Donovan 发布于 2023年9月8日 今年夏天初,Go团队发布了gopls的v0.12版本,这是Go语言的语言服务器,它进行了核 ...

  5. Ds100p -「数据结构百题」21~30

    21.P4172 [WC2006]水管局长 SC 省 MY 市有着庞大的地下水管网络,嘟嘟是 MY 市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从 \(x ...

  6. Flask框架——详解URL、HTTP请求、视图函数和视图类

    文章目录 1 什么是url? 2 为什么要有url? 3 如何应用url? 3.1 url和路由的区别. 3.2 url传参的两种 3.2.1动态路由传参 3.2.1.1 动态路由的过滤 3.2.2 ...

  7. python第一章 学习笔记 计算机基础知识 Sublime Text 3

    ## 计算机是什么 在现实生活中,越来越无法离开计算机了 电脑.笔记本.手机.游戏机.汽车导航.智能电视 ... 计算机就是一个用来计算的机器! 目前来讲,计算机只能根据人类的指令来完成各种操作,人让 ...

  8. 栈和堆的区别、FreeRTOS 中的任务栈

    栈和堆的区别.FreeRTOS 中的任务栈 01 堆和栈的概念 堆 功能 堆是一块用于动态分配内存的区域,用于存储程序运行时动态创建的对象.堆的大小可以在程序运行时动态调整. 特点 堆的分配和释放是由 ...

  9. Java21上手体验-分代ZGC和虚拟线程

    一.导语 几天前Oracle刚刚发布了Java21, 由于这是最新的LTS版本,引起了大家的关注. 我也第一时间在个人项目中进行了升级体验. 一探究竟,和大家分享. 二.Java21更新内容介绍 官方 ...

  10. 04-华为HyperReplication中的多时间片技术

    简介 多时间片技术,是应用于HyperReplication的异步远程复制:提高效率, 在同步远程复制中,没有这个概念: 时间片:在Cache中管理一段时间内写入数据的逻辑空间(数据大小没有限定): ...