<十六>Ceph mon 运维

Ceph 集群有故障了,你执行的第一个运维命令是什么? 我猜测是ceph -s 。无论执行的第一个命令是什么,都肯定是先检查Mon。

在开始之前我们有必要介绍下Paxos协议,毕竟Mon就是靠它来实现数据唯一性。

一: Paxos 协议

1 Ceph 集群中的监视器(Monitors)是负责维护和分发集群状态的守护进程。多个Mon(通常是奇数个,如3个或5个)形成一个Mon集群,这些Mon通过 Paxos 协议来保持一致性。

Mon 一般都是2n+1 (n>=0) 因此Mon的个数一般是 1,3,5 。集群为了保证能正常选举,如果有 2n + 1 个监视器,那么集群可以容忍最多 n 个Mon的故障(Down)。

所以,对于一个由 2n + 1 个Mon组成的集群(例如 3 个监视器,n = 1),可以容忍 1 个Mon Down;对于 5 个Mon(n = 2),可以容忍 2 个Mon Down。以上规则适用于大多数的分布式集群。

Paxos节点与monitor节点绑定,每个mon启动一个Paxos,Paxos为Mon提供服务。其中一个Paxos节点作为leader其余的为peon角色。Lerder可以发起议案,peon根据自己的本地历史选择接受或拒绝议案,并回复leaderleder提交超过半数Paxos节点接收的议案,这些Paxos节点被称为quorum(法定人数)。quorum 这个词接下来会被多次提到,因为Mon只有在quorum中才能进行正常选举和投票信息。

二: 集群状态检查

我们先复习下ceph的组件和其作用。

监视器(Monitors)简称Mon:Ceph 监视器(ceph-mon)维护集群状态的映射信息,包括监视器映射(Monitor Map)、管理器映射(Manager Map)、OSD 映射(OSD Map)、MDS 映射(MDS Map)和 CRUSH 映射(CRUSH Map)。这些映射是 Ceph 守护进程之间协调操作所需的关键集群状态。监视器还负责管理守护进程和客户端之间的身份验证。

一句话总结:Mon 维护了集群5张地图(Mon Map ,Mgr Map, OSD Map MDS Map Crush Map )

所谓Map就是地图,以寻路为目标。而在Ceph中MAP 也是如此,通过Mon Map 知道集群中有哪些Mon,

管理器(Managers)简称Mgr:Ceph 管理器守护进程(ceph-mgr)负责跟踪 Ceph 集群的运行时指标和当前状态,包括存储使用情况、当前性能指标和系统负载。Ceph 管理器守护进程还托管基于 Python 的模块,用于管理和公开 Ceph 集群信息,包括基于 Web 的 Ceph Dashboard 和 REST API。通常,至少需要两个管理器以实现高可用性。

一句话总结:Mgr 复杂集群指标监控数据。

Ceph OSDs:对象存储守护进程(Ceph OSD,ceph-osd)存储数据(简称OSD),负责数据复制、恢复、重新平衡,并通过检查其他 Ceph OSD 守护进程的心跳来向 Ceph Mon和Mgr提供一些监控信息。通常,至少需要三个 Ceph OSD 以实现冗余和高可用性。

一句话总结: OSD 是真正存储数据的磁盘,可以是一个分区,也可以是磁盘。

元数据服务器(MDSs):Ceph 元数据服务器(MDS,ceph-mds)存储 Ceph 文件系统的元数据。(简称MDS)Ceph 元数据服务器允许 CephFS 用户运行基本命令(如 lsfind 等),而不会给 Ceph 存储集群带来负担。

一句话总结:MDS 是维护文件存储中的元数据信息的(如果集群没有文件存储,则不需要MDS服务)。

每个服务都有其对应的守护进程:

mon :其结构为 ceph-mon@<mon name>  例子: ceph-mon@mon01.service  
mgr:         ceph-mgr@<mon name>   例子: ceph-mgr@mon01.service
osd:         ceph-osd@<osd 编号>    例子: ceph-osd@0.service 

因为可以使用systemd 命令来对对应服务进程重启和启动

systemctl restart ceph-mon@mon0
systemctl restart ceph-mgr@mon0
systemctl restart ceph-osd@0
systemctl restart ceph-osd@1
systemctl restart ceph-osd@2

集群维护:

如果 ceph -s 命令没有返回,或一直在运行中没有结束也没有返回怎么办 ?

接下来几步将会帮你解决生产过程中90% Mon 问题。

1. 检查所有的节点服务,确保服务是正常running 状态
systemctl -t service |grep ceph 
# -t 指定类型 service 搜索ceph 服务
2. 检查集群网络:
   #1 检查ceph的配置文件路径找到对应的默认为/etc/ceph/ceph.conf  public_network=xxx.xxx  #对应ceph的外部网络  cluster_network=xxx.xxx #对应ceph的内部网络 #2 检查所有mon 节点的外部网络和内部网络的 3300和6789端口是否正常可达nc 192.168.1.100 3300nc 192.168.1.100 6789#3 检查集群网络是否有丢包 延迟过高问题ping 192.168.1.2  -i 0.01 -s 2000 -c 1000  参数说明-i 指定了ping的间隔 默认为1s一次,此时指定了间隔为0.01 秒-s 指定了包的大小2000 #默认不指定为1500,在实际环境中经常发现小包不丢包,大包丢包的现象,因此建议ping 大于1500的包。 -c 指定了ping包的个数
3. 检查集群状态 :

请在确保上面两步检查已经完成的情况下进行第三步,以上两步看上去很简单,但是却能解决生产环境大部分问题。

#1 ceph status  命令简称 ceph -s 
#当ceph -s 命令能正常返回结果时,则表示集群正在运行。
只有在形成法定数量(quorum)的情况下,监视器才会响应状态请求,也就是说如果是3个mon节点情况
#至少2个mon 节点是正常才能返回结果。

如果ceph -s 没有返回结果,此时在确保前面简称服务正常和集群网络正常的情况下可以使用 -m 来指定mon 来查看集群状态。

正常如果不指定-m参数,客户端的请求是随机选择mon进行发送请求的。

ceph -s -m mon01

以上都是ceph -s 能返回正常状态,若是mon 没有形成quorum 则不会返回输出,此时我们就需要使用 ceph tell mon.ID mon_status

ceph tell mon.0 mon_status -f json-pretty 
参数说明:
-f 指定json格式来输出
注意此时mon.0 此时0 是mon等级, 
ceph tell mon.0 mon_status 
ceph tell mon.1 mon_status 
ceph tell mon.2 mon_status 
ceph tell mon.c mon_status #{ "name": "c","rank": 2,"state": "peon","election_epoch": 38,"quorum": [1,2],"outside_quorum": [],"extra_probe_peers": [],"sync_provider": [],"monmap": { "epoch": 3,"fsid": "5c4e9d53-e2e1-478a-8061-f543f8be4cf8","modified": "2013-10-30 04:12:01.945629","created": "2013-10-29 14:14:41.914786","mons": [{ "rank": 0,"name": "a","addr": "127.0.0.1:6789\/0"},{ "rank": 1,"name": "b","addr": "127.0.0.1:6790\/0"},{ "rank": 2,"name": "c","addr": "127.0.0.1:6795\/0"}]}}

从上面信息可以知道 其结果是mon.c 返回的结果,其name 是 c ,quorum列表中只有【1,2】缺少等级为0 的mon ,而在 monmap 中 mons 为一个列表其中 等级为0 的name 是 a 。

因此我们可以知道mon.a 节点 mon 有问题。 由上面信息我们可以了解如下信息

  • monmap 是mon 的集群状态视图,存储是所有mon集合 。

  • quorum 是当前形成选举的mon 的节点的集合

问题1 mon 等级 编号 0,1,2 是如何确定的?

当加入或删除 monitor 时,会(重新)计算等级。计算时遵循一个简单的规则: IP:PORT 的组合值越, 等级越(等级越低,编号越大)。因此在上例中, 127.0.0.1:6789 比其他 IP:PORT 的组合值都小,

所以 mon.a 的等级是 0 。 (也许上面这句不好理解,因为上述都是来自官方文档解释) 用中国人思维方式就可以理解为 IP+端口的组合最小的是编号0,次小的为编号1 ,依次类推,编号越小等级越高。

例子 : 
mon.a  10.101.24.11:6789
mon.b  10.101.24.13:6789 
mon.c  10.101.24.13:6789
IP地址最后1位进行比较得知  mon.a 数字最小,编号是0 ,mon.b 次之,编号是1  mon.c 编号为2 

在没有形成quorum 时,除了指定mon 使用 ceph tell mon.x mon_status 方式外 还可以使用管理套接字的方式。

管理套接字:

  1. 查看管理套接字路径

    1.1 使用ceph-conf 工具

    ceph-conf --name mon.0 --show-config-value admin_socket
    /var/run/ceph/ceph-mon.0.asok
    

    1.2 查看/etc/ceph/ceph.conf 的配置文件

    1.3 默认路径 /var/run/ceph/ceph-mon.mon01.asok

  2. 使用管理套接字查询

# 1 查看mon 状态
ceph --admin-daemon /var/run/ceph/ceph-mon.mon01.asok  mon_status#2 查看quorum 
ceph --admin-daemon /var/run/ceph/ceph-mon.mon01.asok quorum_status

问题2: Mon有quorum返回,但是至少有一个Mon Down ?

ceph health detail 是ceph 运维过程中最常用的命令,可以快速定位ceph的WarningError 错误原因

ceph health detail
[snip]
mon.a (rank 0) addr 127.0.0.1:6789/0 is down (out of quorum)

二: MON 5种状态

正常状态leader peon

其他状态probing electing synchronizing 也称为中间状态;

如果mon 处于quorum 列表中,那mon 状态一定是 lead peon , 如果处于其他状态 则不会认为自身处于quorum中。

ceph tell mon.0 mon_status -f json-pretty  |grep state

生产环境截图如下

从图片中可以看到一个三节点Mon集群,一个节点状态为leader 两个节点状态 peon

[ probing状态 ]:

如果 ceph health detail 显示某个监视器的状态是 probing,那么该Mon仍在寻找其他Mon。每个Mon启动时都会在这个状态停留一段时间。
当一个Mon连接到 monmap 中指定的其他Mon后,它就会退出 probing 状态。Mon处于 probing 状态的时间长短取决于其所属集群的参数。

例如,当一个Mon属于单Mon集群时(生产环境中绝对不要这样做),它几乎会瞬间通过 probing 状态。在多Mon集群中,Mon会一直处于 probing 状态,直到找到足够的Mon形成法定数量(quorum)。

这意味着如果集群中的三个Mon有两个宕机,那么剩下的一个Mon将无限期地停留在 probing 状态,直到您启动另一个Mon为止。
如果已经建立了法定数量(quorum),那么Mon守护进程应该能够快速找到其他Mon,只要它们可以被访问。如果一个Mon卡在 probing 状态,并且已经按照上面描述的步骤排查了Mon之间的通信问题,那么可能是问题MonIP 地址或端口错误。
mon_status 会输出该监视器已知的 monmap:确定 monmap 中指定的其他MonIP是否正确。如果IP地址正确,请检查时间偏差

一句话总结: probing状态是中间状态,Mon启动后会通过monmap 寻找其他Mon来形成quorum ,如果无法达到quorum则会卡在 probing 状态。

问题2: 怎么判断monmap IP 地址是否正确,如何查看呢?

 #假如 mon卡在probing 状态,则通过 mon_status 可以查看到monmap 对应的mon IP地址信息,确保该IP地址是正确epoch 3
fsid 5c4e9d53-e2e1-478a-8061-f543f8be4cf8
last_changed 2013-10-30 04:12:01.945629
created 2013-10-29 14:14:41.914786
0: 127.0.0.1:6789/0 mon.a
1: 127.0.0.1:6790/0 mon.b
2: 127.0.0.1:6795/0 mon.c

如果一个Mon Down机时间过长,集群Mon发生了变化,导致Down机节点monmap 无法使用;此时可以选择一个集群节点monmap 来注入损坏的节点。

1 如果集群有法定的quorum 则可以选择在quorum节点的monmap #1 导出monmap 
ceph mon getmap -o /tmp/monmap #2 查看monmap 
monmaptool --print /tmp/monmap 
monmaptool: monmap file /tmp/monmap
epoch 2
fsid 0bc5409d-5019-482c-a853-537d27c2114d
last_changed 2024-07-24 07:24:53.707979
created 2024-07-24 07:16:00.549039
min_mon_release 14 (nautilus)
0: [v2:192.168.1.100:3300/0,v1:192.168.1.100:6789/0] mon.mon01 #3 停止损坏节点的mon 
systemctl stop ceph-mon@xxxx.service   #xxxx 代表mon名字 #4 注入monmap
ceph-mon -i ID --inject-monmap /tmp/monmap没有形成法定人数?直接从其他 monitor 节点上抓取 monmap 
(这里假定你抓取 monmap 的 monitor 的 id 是 ID-FOO 并且守护进程已经停止运行):
ceph-mon -i ID-FOO --extract-monmap /tmp/monmap 
将上述命令替换#1 的命令既可以,其他步骤都都一样。
[ electing 状态 ]

如果 ceph health detail 显示MoN的状态是 electing,这表示Mon正在进行选举。选举通常会很快完成,但有时监视器可能会陷入所谓的“选举风暴”。此时通常是时间偏差造成的,请检查时间偏差。

问题3:时间偏差怎么确定 ?

  • 查看ceph日志一般会出现如下消息
mon.a (rank 0) addr 127.0.0.1:6789/0 is down (out of quorum)
mon.a addr 127.0.0.1:6789/0 clock skew 0.08235s > max 0.05s (latency 0.0045s)
2015-06-04 07:28:32.035795 7f806062e700 0 log [WRN] : mon.a 127.0.0.1:6789/0 clock skew 0.14s > max 0.05s
2015-06-04 04:31:25.773235 7f4997663700 0 log [WRN] : message from mon.1 was stamped 0.186257s in the future, clocks not synchronized
[ synchronizing 状态 ]

这意味着该 monitor 正在和集群中的其他 monitor 进行同步以便加入法定人数。Monitor 的数据库越小,同步过程的耗时就越短。然而,如果你注意到 monitor 的状态从 synchronizing 变为 electing 后又变回 synchronizing ,那么就有问题了:集群的状态更新的太快(即产生新的 maps ),同步过程已经无法追赶上了。这种情况说明你的Ceph Mon版本太旧了,可能需要更新新的版本来解决。

最后我们总结下Mon 的常用操作命令

#1 查看mon 状态
ceph mon stat
#使用管理套接字来查看 
ceph --admin-daemon /var/run/ceph/ceph-mon.mon01.asok  mon_status
ceph tell mon.0 mon_status -f json-pretty  |grep state
#2 查看mon 选举状态
ceph quorum_status
#3 查看mon 映射信息 ceph mon dump
#4 查看集群状态
ceph -s  
ceph health detail 
ceph -s -m mon01
#5 获取monmap 
ceph mon getmap -o  /tmp/monmap
#6 查看monmap 
monmaptool --print /tmp/monmap

:(以上所有的维护操作指导都来源官方文档加上个人注释,学习任何技术,官方文档永远是最权威的指导手册。)

写在最后:

谈到分布式存储,ceph是很多互联网公司第一选择,因此我们在接下来多个章节将一一介绍ceph的各个组件运维技巧与心得。欢迎大家与我一起学习一起成长。

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

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

相关文章

计算机网络-MSTP的基础概念

前面我们大致了解了MSTP的由来&#xff0c;是为了解决STP/RSTP只有一根生成树导致的VLAN流量负载分担与次优路径问题&#xff0c;了解MSTP采用实例映射VLAN的方式实现多实例生成树&#xff0c;MSTP有很多的理论概念需要知道&#xff0c;其实与其它的知识一样理论复杂配置还好的…

电源完整性

电源分配系统 电源分配系统:Power Distribution Network(简称 PDN) 真正用电节点在 Die&#xff0c;所以PDN系统包含 PCB 和 Package上的部分 PCB 上:VRM、大电容、小电容、电源平面、地平面 Package内:电容、电源平面、地平面 电源噪声的产生 稳压电源芯片本身的输出不恒定&a…

基于SpringBoot云养鸡互动平台的设计与实现

前言 对于当今社会的人们来说&#xff0c;互联网技术是必不可少的&#xff0c;随着经济和技术的不断发展&#xff0c;计算机已经深入到各个领域。云养鸡互动平台将人们的时间需求与计算机技术结合起来&#xff0c;架起一座桥梁&#xff0c;使云养鸡互动更加方便快捷。云养鸡互…

枫清科技仲光庆:AI+行业新范式,双轮驱动助力数智化升级

10月23日&#xff0c;由财视传媒主办&#xff0c;未来图灵、尚品新消费、未来企业家俱乐部、传播达人汇联合主办的“赢在大模型时代”2024未来发布论坛暨“向上拾年”财视十周年盛典在北京举行。枫清科技联合创始人兼 CPO 仲光庆应邀出席并分享了“AI行业落地新范式”&#xff…

谷歌云GCP基础概念讲解

概览 云的基础是虚拟化&#xff1a;服务器&#xff0c;存储&#xff0c;网络。服务器是远程计算机的逻辑分区。存储是物理硬盘的逻辑划分。网络则是虚拟私有云。 谷歌是唯一一个拥有全球私有基础设施的公司&#xff1b;他们的谷歌云基础设施没有任何一部分通过公共互联网。换句…

【ACM出版,EI稳定检索,九大高校联合举办, IEEE Fellow支持】2024年计算机视觉与艺术研讨会(CVA 2024)

在线投稿&#xff1a;学术会议-学术交流征稿-学术会议在线-艾思科蓝 2024年计算机视觉与艺术国际学术会议&#xff08;CVA 2024&#xff09;作为2024年人工智能、数字媒体技术与交互设计国际学术会议&#xff08;ICADI 2024)的分会。此次大会旨在汇聚全球在计算机视觉与艺术…

Java知识巩固(十二)

I/O JavaIO流了解吗&#xff1f; IO 即 Input/Output&#xff0c;输入和输出。数据输入到计算机内存的过程即输入&#xff0c;反之输出到外部存储&#xff08;比如数据库&#xff0c;文件&#xff0c;远程主机&#xff09;的过程即输出。数据传输过程类似于水流&#xff0c;因…

基于SSM+小程序的智慧旅游平台登录管理系统(旅游2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 旅游平台开发微信小程序功能有管理员和用户。 1、管理员功能有个人中心&#xff0c;用户管理&#xff0c;景点分类管理&#xff0c;旅游景点管理&#xff0c;景点购票管理&#xff0c;景…

我谈Canny算子

在Canny算子的论文中&#xff0c;提出了好的边缘检测算子应满足三点&#xff1a;①检测错误率低——尽可能多地查找出图像中的实际边缘&#xff0c;边缘的误检率&#xff08;将边缘识别为非边缘&#xff09;低&#xff0c;且避免噪声产生虚假边缘&#xff08;将非边缘识别为边缘…

量子容错计算

基本思想 容错量子计算的基本想法是&#xff0c;在合理编码后的量子态上直接量子计算&#xff0c;以至于不完全需要解码操作。假设有一个简单的量子电路&#xff0c;但不幸的是噪声影响着这个电路的每一个元件&#xff0c;包括量子态的制备、量子逻辑门、对输出的测量&#x…

代码随想录算法训练营第十一天(补) 栈与队列| 后序表达式、滑动窗口、高频元素、链表总结

目录 一、150. 逆波兰表达式求值 二、239. 滑动窗口最大值 三、347.前 K 个高频元素 四、总结 一、150. 逆波兰表达式求值 力扣题目链接(opens new window) 根据 逆波兰表示法&#xff0c;求表达式的值。 有效的运算符包括 , - , * , / 。每个运算对象可以是整数&#x…

【论文阅读】SRGAN

学习资料 论文题目&#xff1a;基于生成对抗网络的照片级单幅图像超分辨率&#xff08;Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network&#xff09;论文地址&#xff1a;https://arxiv.org/abs/1609.04802 代码&#xff1a;GitHub - x…

芯片上音频相关的验证

通常芯片设计公司&#xff08;比如QUALCOMM&#xff09;把芯片设计好后交由芯片制造商&#xff08;比如台积电&#xff09;去生产&#xff0c;俗称流片。芯片设计公司由ASIC部门负责设计芯片。ASIC设计的芯片只有经过充分的验证&#xff08;这里说的验证是FPGA&#xff08;现场…

SpringMVC实战:构建高效表述层框架

文章目录 1. SpringMVC简介和体验1.1 介绍1.2 主要作用1.3 核心组件和调用流程1.4 快速体验 2. SpringMVC接收数据2.1 访问路径设置2.2 接收参数2.2.1 param和json参数比较2.2.2 param参数接收2.2.3 路径参数接收2.2.4 json参数接收 2.3 接收cookie数据2.4 接收请求头数据2.5 原…

python爬虫实战案例——抓取B站视频,不同清晰度抓取,实现音视频合并,超详细!(内含完整代码)

文章目录 1、任务目标2、网页分析3、代码编写 1、任务目标 目标网站&#xff1a;B站视频&#xff08;https://www.bilibili.com/video/BV1se41117WP/?vd_sourcee8e376ccbc5aa4cfd88e6a7917adfd1a&#xff09;&#xff0c;用于本文测验 要求&#xff1a;抓取该网址下的视频&…

华为ICT题库-云服务部分

1651、关于创建数据盘镜像的约束条件&#xff0c;以下说法错误的是&#xff1f;&#xff08;云服务考点&#xff09; (A)使用云服务器的数据盘创建数据盘镜像时&#xff0c;要确保该云服务器必须有系统盘 (B)通过外部文件创建数据盘镜像必须明确指定操作系统类型 (C)使用云服务…

Docker快速上手教程:MacOS系统【安装/配置/使用/原理】全链路速通

背景 最近换了个 Macbook Air M3, 写个人项目需要用到 Docker,配置过程有一点点坎坷,还是得记录下避免重蹈覆辙。 什么。为什么是买 Air 而不是 Pro Max? 因为码农的钱也是钱啊。 这里我不会先讲原理,我认为工程的事情都是先看到现象,有了概念的轮廓,才应该去研究原理,…

Python基础学习(六)数据容器

代码获取&#xff1a;https://github.com/qingxuly/hsp_python_course 完结版&#xff1a;Python基础学习完结版 数据容器 基本介绍 数据容器是一种数据类型&#xff0c;有些地方也简称容器/collections。数据容器可以存放多个数据&#xff0c;每一个数据也被称为一个元素。存…

计算机网络IP地址分类,子网掩码,子网划分复习资料

IP 地址的概念 IP 地址是独立于硬件地址的逻辑地址&#xff0c;它是由软件提供的地址。 IP 地址是网络层地址。 IP 编址方案和分类 IP 地址由 32 位二进制数构成&#xff0c;分为前缀(网络地址)和后缀(主机地址) 同一网段中每台计算机的 IP 地址是唯一的网络地址的分配全球…

力扣21 : 合并两个有序链表

链表style 描述&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a; 节点大小相同时&#xff0c;l1的节点在前 何解&#xff1f; 1&#xff0c;遍历两个链表&#xff0c;挨个比较节点大小 同时遍…