<十六>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.mzph.cn/bicheng/58929.shtml

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

相关文章

NPOI 操作详解(操作Excel)

目录 1. 安装 NPOI 2. 使用 NPOI 创建新 Excel 文件 3. 设置列宽和行高 1. 设置列宽 2. 设置行高 3. 同时设置列宽和行高 4. 设置统一的行高 5. 设置统一的列宽 6. 应用统一的行高和列宽 4. 合并单元格 5. 设置单元格样式&#xff08;字体、边框、背景色等&#xf…

多处理机调度(李昂学长视频总结)25新增考点

多处理机定义&#xff1a;多处理机指的是某个计算机系统中有多个cpu&#xff0c;在多处理机调度中&#xff0c;多处理机一般指的是共享存储器处理机&#xff0c;其两个或更多的cpu全部共享一个公用的RAM。 根据系统中的处理机相同与否&#xff0c;可将多处理机系统分为如下两类…

少儿编程培训市场突破500亿元:教育新蓝海的崛起与未来展望

近年来&#xff0c;随着科技的迅速发展和家长对教育方式的重视&#xff0c;少儿编程市场成为一片新的蓝海。据最新市场调研报告显示&#xff0c;2024年中国少儿编程培训市场规模已突破500亿元&#xff0c;预计未来五年将持续增长。这一趋势反映了少儿编程教育的迅速崛起&#x…

【大数据学习 | kafka】producer的参数与结构

1. producer的结构 producer&#xff1a;生产者 它由三个部分组成 interceptor&#xff1a;拦截器&#xff0c;能拦截到数据&#xff0c;处理完毕以后发送给下游&#xff0c;它和过滤器不同并不是丢弃数据&#xff0c;而是将数据处理完毕再次发送出去&#xff0c;这个默认是不…

【论文速读】Optimization-based Prompt Injection Attack to LLM-as-a-Judge

基于优化的提示词注入攻击 摘要引言问题描述LLM-as-a-judge威胁模型攻击者知道什么 JUDGEDECEIVER 细节概述生成影子候选回复公式化为优化问题Target-aligned generation lossTarget-enhancement lossAdversarial perplexity loss优化问题 求解优化问题 摘要 LLM-as-a-Judge 利…

人工智能证书合集

本文将对目前市面上主流官方机构颁发的人工智能证书进行整理和介绍&#xff0c;由于整理的证书较多&#xff0c;本文共一万八千多字&#xff0c;请根据自己的考证需求阅读对应部分的内容&#xff0c;希望本文对人工智能行业的从业人员和计划从事人工智能相关岗位工作的人员有所…

Java入门8——二维数组

今天的内容算是数组的收尾~~ 从下次开始就要开始学习类和对象了&#xff0c;冲冲冲&#xff01; 首先二维数组&#xff0c;也很好理解&#xff0c;就是把几个一维数组拼在一起了&#xff0c;我们用代码来熟悉一下~ public class javaSchool {public static void main(String[…

自动售饮料机控制电路的设计

自动售饮料机控制电路的设计 1 设计目的 &#xff08;1&#xff09;熟悉数字电路的应用。 &#xff08;2&#xff09;掌握常常利用逻辑运算器及D触发器的逻辑功能及利用方式。 &#xff08;3&#xff09;熟悉电路仿真软件Multisim 利用。 &#xff08;4&#xff09;了解自动售饮…

高速高精运动控制解决方案亮相2024 NEPCON亚洲电子展!

■展会名称&#xff1a; NEPCON ASIA 2024 亚洲电子生产设备暨微电子工业展览会&#xff08;以下简称“亚洲电子展”&#xff09; ■展会日期 2024年11月6 -8日 ■展馆地点 中国深圳国际会展中心(宝安) ■展位号 11号馆-11A24 11月6日至8日&#xff0c;亚洲电子展将在中…

Flask轻松上手:从零开始搭建属于你的Web应用

目录 一、准备工作 二、安装Flask 三、创建你的第一个Flask应用 创建一个新的Python文件 编写Flask应用代码 运行Flask应用 四、创建一个简单的博客系统 定义路由和文章列表 创建模板文件 运行并测试博客系统 五、使用数据库存储用户信息 安装Flask-SQLAlchemy 修…

STM32开发 —— 新工程创建思路终于清晰了

目 录 工程创建三步法一、工程文件夹创建二、管理工程项三、配置工程参数 工程创建三步法 从ST官网下载好stm32标准库或HAL库&#xff0c;HAL库目录如下。 在Keil开发环境中创建STM32工程&#xff0c;分三大步即可完成工程的创建&#xff1a; 一步&#xff1a;在本地磁盘创建…

Java SpringBoot调用大模型AI构建AI应用

本文是一个用springboot 结合spring mvc 和spring ai alibaba 调用国产大模型通义千问的具体例子&#xff0c;按照这个做能够快速的搞定Java应用的调用。 然后就可以把这类应用泛化到所有的涉及到非结构化数据结构化的场景中。 Spring AI&#xff1a;简化Java中大模型调用的框…

【办公类-04-04】华为助手导出照片视频分类(根据图片、视频的文件名日期导入“年-月-日”文件夹中,并转移到“年-月”文件中整理、转移到“年”文件夹中整理)

背景需求 最近带班&#xff0c;没有时间整理照片&#xff0c;偶尔导一次&#xff0c;几个月的照片。发现用电脑版“华为手机助手“中的WLAN连接”与华为手机的“华为手机助手”连接&#xff0c;速度更快、更稳定&#xff0c;不会出现数据线连接时碰碰就断网的问题 1、先打开电…

电脑没有下载声卡驱动怎么办?电脑声卡驱动安装方法

在日常使用电脑的过程中&#xff0c;我们可能会遇到电脑没有声音的问题&#xff0c;这往往与声卡驱动缺失或损坏有关。声卡驱动是连接电脑硬件&#xff08;声卡&#xff09;与操作系统之间的桥梁&#xff0c;确保音频信号能够正常输入输出。那么&#xff0c;当电脑没有声卡驱动…

MYSQL死锁真实案例

​最近例行巡检时候发现一个死锁,阿里云RDS FOR MYSQL 8.0.X! 虽然阿里云的死锁页面看起来比较友好,不过跟社区版一样只是显示事务最后一条死锁SQL和相关的信息.一不小心对初级MYSQL DBA来说,深深地误导,浪费大量时间研究这两个SQL怎么发生了死锁! 阿里云RDS默认情况下审计没有…

【Spring】Spring Boot 日志(8)

本系列共涉及4个框架&#xff1a;Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点&#xff0c;根据序号学习即可。 目录 本系列共涉及4个框架&#xff1a;Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点&#xff0c;根据序号学习即可。 …

饿了么数据库表设计

有商家表、商品表、商品规格表、购物车表&#xff0c;不难分析出表是不够全面的。 (1)首先分析需要补充的表 1.对于购物车而言肯定有对应的用户&#xff0c;因此要添加一个用户表。 2.商品规格是冷&#xff0c;热&#xff0c;半分糖、全糖&#xff0c;对于冷热和半分糖是可以分…

C++模拟实现list

C教学总目录 C模拟实现list 1、成员变量2、迭代器3、insert函数4、erase函数5、pop_back、push_front、pop_front函数6、size和clear函数7、析构函数8、拷贝构造函数9、赋值运算符重载完整代码&#xff08;包含测试代码&#xff09; 1、成员变量 先来看看SGI版本STL中list的实…

【STM32】SD卡

(一)常用卡的认识 在学习这个内容之前&#xff0c;作为生活小白的我对于SD卡、TF卡、SIM卡毫无了解&#xff0c;晕头转向。 SD卡&#xff1a;Secure Digital Card的英文缩写&#xff0c;直译就是“安全数字卡”。一般用于大一些的电子设备比如&#xff1a;电脑、数码相机、AV…

品牌怎么找到用户发的优质内容,进行加热、复制?

在&#xff0c;相对传统媒体来说&#xff0c;社交媒体营销具有更高的成本效益。品牌可以通过相对较低的成本达到大量潜在客户&#xff0c;尤其是通过口碑营销和内容分享&#xff0c;可以实现倍增的传播效果。在社媒营销的过程中&#xff0c;去找到与品牌有关的优质、正向内容&a…