ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Ceph MON命令详解:从quorum机制到故障排查实战

Ceph MON命令详解:从quorum机制到故障排查实战 1. 先从“MON是什么”说起理解命令背后的机制做Ceph运维的人早晚都要面对一个现实不是每个集群都有专门的图形化监控界面很多情况下你手里只有一台跳板机、几个终端窗口以及堆积如山的ceph命令。而在所有这些命令里MON相关的命令又是最容易被忽略的——因为多数人平时只盯着ceph -s看状态真正能把MON命令用得得心应手的人其实不多。我个人的体会是MON命令之所以值得单独写一篇来详解是因为MON本身就是整个Ceph集群的“神经中枢”。你可以把Ceph的MON节点想象成一家公司的管理层所有成员OSD、MGR、MDS、Client都要定期向管理层汇报自己的状态管理层则统一维护一份“公司账本”——也就是cluster map包括monmap、osdmap、pgmap、crushmap、mdsmap等。一旦管理层本身出问题比如某个MON节点宕了、网络分区了、甚至只是时间不同步了整个集群都会跟着遭殃。所以熟练掌握MON命令本质上是在掌握一套“与集群管理层对话”的接口。需要先说明一个概念Ceph的MON节点之间通过选举机制维持一个“法定人数”quorum。这个法定人数决定了集群能不能对外提供元数据服务。常规Ceph集群要求至少1个mon能存活单mon集群生产环境通常部署3个或5个mon节点允许挂掉不超过(n-1)/2个节点。为什么是3个而不是2个因为2个节点会出现“脑裂”问题——两个mon各执一词谁也说服不了谁。而3个节点中挂掉1个剩下2个仍然能构成多数派继续正常工作。这个背景听起来像是理论但它直接决定了你后续运维护命令的行为逻辑比如为什么ceph mon remove要谨慎、为什么mon节点必须奇数个、为什么我们做maintenance时要确保同时下线的mon不超过一半。这篇文章专为需要上手Ceph运维的工程师准备内容会覆盖MON命令的常规巡检、成员管理、状态检查以及集群出现异常时的实战排查思路。要注意的是文中提到的命令主要以Octopus、Pacific和Reef版本为基准这三个大版本的命令语法和执行逻辑基本一致只有极少数细节差异我会在对应地方单独标注。2. 最常用的MON命令建议直接背下来2.1 日常巡检三件套ceph -s / ceph health detail / ceph mon stat先放一段我自己日常巡检的“肌肉记忆”ceph -s ceph health detail ceph mon stat这三条命令分别回答三个问题集群现在整体怎么样如果有异常具体是哪里的问题MON节点的状态明细如何ceph -s是最常见的状态命令它的输出里包含了cluster的id、health状态、monmap版本、osdmap版本、pg分布情况、服务状态等。对于巡检来说最关键的是health字段。正常情况下你会看到HEALTH_OK如果出现HEALTH_WARN甚至HEALTH_ERR就需要进一步用ceph health detail去看详细信息。举个实际案例有一次我接到一个集群告警显示HEALTH_WARN但从ceph -s输出看PG状态全部activeclean。当时就有一种“明明没问题却报异常”的疑惑。后来执行ceph health detail才发现告警原因是某个mon节点的时钟偏移超过了阈值clock skew detected on mon.2。这类信息在ceph -s里只会概括显示一个HEALTH_WARN但具体原因就藏在detail输出里。所以我的建议是巡检的第一条命令可以先用ceph -s扫一眼全局但只要状态不是OK必须立刻补上ceph health detail。再说ceph mon stat。这个命令在很多人日常操作里用得不多但它输出的是monmap的当前状态摘要比如e1: 1 mons at {a192.168.1.10:6789/0}, election epoch 2, leader 0 a, quorum 0 a这里最核心的信息是election epoch和leader以及quorum成员。如果你有多个mon节点输出里会列出所有mon的地址、端口以及当前选举情况。注意ceph mon stat和ceph mon dump的区别在于前者更偏向“当前运行状态”后者更偏向“map的持久化定义”。两者后续我都会讲到但在巡检场景下ceph mon stat是快速判断mon当前是否存活、是否有leader、quorum是否有缺失的第一个抓手。2.2 mon成员管理ceph mon add / remove / dump当集群规模扩大、需要增加新的mon节点或者某个mon节点硬件报废需要缩容时就会用到ceph mon add和ceph mon remove。新增MON节点的完整操作路径是这样的# 1. 在新节点上安装ceph-mon相关包并确认network链路互通 # 2. 生成并分发mon keyring通常由cephadm或手动方式处理 # 3. 将新mon加入集群 ceph mon add 新mon名字 ip地址:6789 # 4. 启动新节点上的mon服务并确认加入quorum ceph mon stat注意ceph mon add本质上是在monmap里注册新节点的位置。但注册完成后新节点上的mon服务进程还需要手动启动或由编排工具拉起。Cephadm方式下ceph orch apply mon --placement新节点名就完成了整个过程手工部署方式则要自己处理keyring和monmap的同步。移除MON节点同样要谨慎ceph mon remove mon名字这个命令没有--yes-i-really-mean-it之类的二次确认参数执行后就直接从monmap里删除了。我自己见过有人误把三个mon中的一个名字拼错结果移除了一个还在正常服务的节点导致quorum状态直接异常。所以执行前务必用ceph mon dump核对节点名称。ceph mon dump输出的是完整的monmap包括每个mon的id、地址、端口、公网/内部网络配置以及crush_location等扩展字段。举个例子输出是这样epoch 3 fsid: 6b6d2f7e-6d4a-4e3a-9e6a-1a2b3c4d5e6f last_changed: 2024-01-15T10:23:45.1234560800 created: 2024-01-10T08:00:00.0000000800 min_mon_rank: 0 0: [v2:192.168.1.10:3300/0,v1:192.168.1.10:6789/0] mon.a 1: [v2:192.168.1.11:3300/0,v1:192.168.1.11:6789/0] mon.b 2: [v2:192.168.1.12:3300/0,v1:192.168.1.12:6789/0] mon.c这里有一个非常关键的信息每个mon都同时绑定了v2端口默认3300和v1端口默认6789。这是从Nautilus版本开始引入的msgr2协议同时兼容旧版客户端。如果你在维护老集群时看到某些mon只有v1:192.168.x.x:6789/0而没有v2那说明该节点还没启用msgr2可以用ceph mon enable-msgr2命令完成协议启用。2.3 quorum相关操作ceph quorum_status / ceph mon rankceph quorum_status是我在日常排查中觉得信息量很大的一条命令。它会输出当前quorum的构成包括成员列表、monmap的epoch、选举epoch、quorum的rank信息等。生产环境中这条命令最有价值的场景是确认当前哪些mon参与了法定人数哪些掉队了。来看一个实际输出片段{ election_epoch: 24, quorum: [ 0, 1 ], quorum_names: [ mon.a, mon.b ], quorum_leader_name: mon.a, monmap: { epoch: 3, mons: [ { rank: 0, name: mon.a, addr: 192.168.1.10:6789/0 }, { rank: 1, name: mon.b, addr: 192.168.1.11:6789/0 }, { rank: 2, name: mon.c, addr: 192.168.1.12:6789/0 } ] } }quorum里只有mon.a和mon.b且leader是mon.a说明mon.c当前掉队了。这时你还要结合ceph mon stat确认是进程挂了、网络不通还是时钟偏移等配置问题。rank的概念则对应monmap中每个mon的排序序号rank最小值min_mon_rank通常表示集群选主时的优先级。在部署新集群或者做mon替换时rank的分配逻辑也值得注意新增的mon默认分配当前最大的rank但如果旧的mon被删除rank会被重新排布。这个机制本身不需要我们手动干预但理解它之后你就能明白为什么有些教程里会说“尽量保持mon数量稳定不要频繁增删否则会引发不必要的选举”。3. rook-ceph mon down从一次真实故障复盘看MON命令怎么用3.1 故障表现与快速定位“rook-ceph mon down”是近期搜索热度很高的话题说明使用Rook在Kubernetes中部署Ceph的用户群体很大而且MON节点异常是他们遇到的最常见问题之一。典型的故障表现是某个mon Pod处于CrashLoopBackOff状态或者mon服务启动失败Ceph Dashboard上告警不断。处理这类问题我建议按以下顺序排查第一步确认是K8s层面问题还是Ceph层面问题。kubectl -n rook-ceph get pod -l approok-ceph-mon kubectl -n rook-ceph logs -f mon-pod-name第二步如果日志中能看到Ceph自身的报错就进入Ceph层面排查。但一个常见的坑是mon Pod都起不来时ceph -s是没法正常执行的因为它需要mon的quorum才能输出状态。这时可以尝试用Rook的toolbox或者在幸存的mon Pod里执行ceph命令同时结合monmap、日志来做判断。第三步检查磁盘空间和网络。mon节点虽然不像OSD那样占大量存储但mon存在一个单独的数据库目录默认/var/lib/ceph/mon/ceph-hostname如果该目录所在磁盘写满mon进程会直接拒绝启动或运行时报错。3.2 日志分析awk、screen、vmstat、top、history这些技能在这里能派上用场有朋友问过我排查mon down时除了ceph命令本身还需要哪些Linux常规命令配合这里正好说说热词里提到的那几个。awk是我在分析Ceph日志时用得最频繁的文本处理工具。比如我想提取mon日志中所有和election相关的行并统计每个mon被选举为leader的次数awk /election/ {print $0} /var/log/ceph/ceph-mon.ceph-a.log | less还可以用awk按时间窗口过滤awk /2024-06-01T10:/ /slow/ {count} END {print slow requests count:, count} /var/log/ceph/ceph-mon.ceph-a.logtop和vmstat用于判断mon所在节点的资源是否吃紧。MON看起来是个很轻量级的进程但实际上如果集群规模大、OSD数量多mon的CPU和内存占用会明显上升。每次选举、每次OSDMap更新都要在mon内存中做合并和生成操作。我用top观察mon进程的CPU占用时发现正常情况mon的CPU使用率应该比较平稳如果出现持续高CPU通常意味着mon在做大量日志写入或者频繁处理map更新。vmstat则能快速查看系统整体的CPU、内存、IO和上下文切换情况尤其是cscontext switch列如果数值异常偏高说明系统调度压力很大会影响mon的响应时间。screen这个工具主要用于远程操作时保持会话不断开。这里说个真实场景有一次我要在mon节点上执行一个需要手动确认的恢复流程整个过程大概要持续几十分钟如果直接用SSH连着跑中途网络抖动一次就前功尽弃。用screen开一个会话在会话内执行命令即使SSH断开命令也不会中断重新连接后还能看到执行过程。这个习惯在很多Ceph调优和维护场景里非常重要。history则是个容易被忽视但很有用的命令。排查事故时我会先看操作历史搞清楚这个集群在故障发生前执行过哪些命令。比如history | grep ceph mon一行命令就能看出是不是有人误删了mon、执行了错误的配置变更。在多人协作的集群环境里history可以帮助快速定位人为操作导致的问题线索。我自己遇到过一例某个mon节点突然与集群失联排查了大半天没找到原因最后看history发现有人在该节点上手动改过NTP配置时钟跳变触发了mon down。3.3 典型处理流程恢复mon节点假设确认mon进程本身没有问题只是被K8s调度或网络原因暂时拉起了异常可以按下面步骤恢复。在Rook环境下最直接的方法是强制重启mon Podkubectl -n rook-ceph delete pod rook-ceph-mon-a-xxxxxK8s会根据StatefulSet的配置自动重建Pod。但如果mon.b、mon.c也同时有问题就需要小心了因为同时重启多个mon可能导致quorum退化到0。推荐的恢复顺序是先保证至少一个mon能启动并重建quorum再逐个拉起其他mon。如果mon进程起不来且日志里有类似failed to open mon store或Cant read post-election state这样的报错说明mon的本地存储数据可能损坏。这时可以从其他健康mon的monmap导出再在故障节点上重新部署mon通过ceph mon add加入集群。操作路径大致是# 从健康节点导出monmap ceph mon getmap -o /tmp/monmap.bin # 在新节点上创建mon数据目录并写入monmap monmaptool --print /tmp/monmap.bin # 将新节点加入集群 ceph mon add 新名字 ip:6789但注意这种方式会触发新mon全量同步monstore数据同步期间可能对集群有一定压力。我的建议是优先尝试恢复原有节点只有在原节点数据无法恢复时才走新节点替换路线。4. 排查MON问题时真正值钱的几个命令细节4.1 动态调整MON日志级别Ceph的MON日志级别调优是很多人忽略但关键时刻很有用的功能。默认情况下mon日志级别是--log_level1或者更低这对于日常运行足够但在排查问题时就显得信息不够用了。你可以通过teller机制在不重启mon进程的情况下临时调整日志级别ceph tell mon.a injectargs --debug_mon 10 --debug_paxos 10执行后mon.a的日志会瞬间变得冗长包括很多paxos协议交互细节、选举细节。这里要注意三点第一debug_mon和debug_paxos只是临时注入重启mon后就会恢复默认配置。如果你想持久化需要修改ceph.conf中的[mon]段。第二正常排查问题建议从5级开始不要一步拉满到20否则会产生海量日志反而把关键信息淹没。我踩过这个坑有一次直接调到20结果几分钟就写满了几个G的日志还得花时间清理。第三ceph tell mon.* injectargs可以同时给所有mon注入参数但生产环境我建议先只对一个mon做避免同时增加所有mon的日志压力。排查结束后恢复正常级别ceph tell mon.a injectargs --debug_mon 1 --debug_paxos 14.2 日志关键词清单MON相关日志默认路径在/var/log/ceph/ceph-mon.hostname.log。排查问题时我总结了以下高频关键词及其含义日志关键词含义处理方向election选举相关事件观察是否有频繁选举正常情况选举epoch应该稳定clock skew时钟偏移检查NTP/chrony确保mon之间时间差在阈值内slow request请求处理超时可能mon高负载或网络问题配合top/vmstat排查paxos分布式共识协议活动大量paxos日志可能表明monmap/OSDMap频繁更新failed to store本地存储写入失败检查磁盘空间、目录权限、文件系统状态quorum法定人数变化关注成员变动确认是否有mon掉线或加入monmap集群mon配置变更配合ceph mon dump查看map版本与内容举个例子当你看到日志里反复出现clock skew就算ceph health detail还没报错也要提前处理否则某次跳变超过阈值后mon会主动退出quorum。处理方法是同步各节点时间推荐使用chrony或NTP并将mon节点的时间源指向统一的上游或主时钟节点。我见过不少因为时间不同步导致mon反复down的环境最后都是靠修时间同步解决的而不是Ceph本身的问题。4.3 从monmap看网络与安全配置ceph mon dump不只是看成员和地址它还能反映出mon的公网网络和集群内部网络配置。这里的公网网络public network是客户端和mon通信所使用的网段集群内部网络cluster network通常是OSD之间数据复制使用的专用网段mon本身不直接使用cluster network做数据复制但它的状态信息会影响monmap中地址的发布。实际排查中如果客户端报connection refused或timed out但osdmap看起来正常就要重点检查monmap里的地址是否可达。比如mon迁移到新IP之后如果没更新monmap旧的地址信息会导致客户端无法连接。这时需要# 修改mon的地址谨慎操作 ceph mon set-addrs mon.a [v2:192.168.1.20:3300/0,v1:192.168.1.20:6789/0]这个命令是运行时修改mon地址的。修改后要确保mon进程实际监听了新地址并确认防火墙放行对应端口。这里特别提醒ceph mon set-addrs不会自动修改配置文件重启mon后可能会回退所以还需要同步更新ceph.conf中的mon host或mon addr配置。安全配置方面MON相关的认证配置通常在ceph.conf中[mon] mon_host 192.168.1.10,192.168.1.11,192.168.1.12 mon_initial_members mon.a, mon.b, mon.c keyring /etc/ceph/ceph.client.admin.keyring若出现认证失败问题可以临时用ceph auth ls查看当前用户的权限ceph auth ls在客户端上常见的认证报错是file not found或permission denied这时检查/etc/ceph/ceph.client.admin.keyring是否存在且权限正确即可。4.4 MON节点磁盘空间与数据库维护MON虽然不存业务数据但它在本地有一个leveldb或rocksdb存储取决于Ceph版本用于持久化monmap、osdmap等map信息以及部分日志。这个存储目录出现异常时表现和OSD故障类似mon进程可能无法启动或运行缓慢。这里给两条实用建议第一mon存储目录所在的磁盘不要和OSD日志盘共用一块盘否则OSD高IO会拖垮mon的存储性能。第二定期关注磁盘使用率df -h /var/lib/ceph/mon/ du -sh /var/lib/ceph/mon/ceph-*正常情况下monstore的容量增长非常缓慢如果发现它在短时间内暴涨多半是有大量的OSDMap变更记录被持久化这时要回到集群层面检查而不是单纯清理mon数据目录。monstore如果出现明显膨胀可以参考Ceph官方文档执行ceph mon compact来压缩存储。这个命令的原理是触发一次monstore的compact操作相当于对底层KV数据库做rewrite能够清理掉一些历史垃圾数据。执行要放在业务低峰期尤其注意不要在选举发生时执行否则可能导致mon状态异常。5. 避坑总结我踩过的mon命令相关的坑5.1 不要随便执行ceph mon remove前文提到了误删mon的真实案例这里再展开说几句。ceph mon remove执行后被删除的mon节点会从quorum中剥离但该节点上的mon进程如果还在运行它会尝试重新加入集群。有意思的是由于monmap已更新旧节点会发现自己的rank不再匹配通常会自己退出。那问题在于如果你的删除操作是误执行再想把它加回来就面临一个麻烦需要重新ceph mon add并且该节点要重新同步monstore数据。如果你有这个风险意识我建议在操作之前执行ceph mon dump并保存到文件必要时可以从文件中恢复ceph mon dump /tmp/monmap_before_remove.txt万一需要恢复可以利用monmaptool重建。但整体来说任何对mon成员的增删操作都建议放在变更窗口内且操作前一定备份monmap。5.2 命令超时不等于mon挂掉这是一个非常容易误判的情况。执行ceph -s或者其他mon相关命令时如果等待很久才返回甚至直接报Error: Operation timed out很多人的第一反应是mon节点挂了。但真实情况往往是mon的leader健康但由于某种原因比如大量PG状态变更触发osdmap持续更新mon在短时间内忙于处理map间的同步和存储写入导致对客户端请求的响应变慢。我见过有个集群在故障恢复阶段OSD全部重启后mon瞬间要处理大批量PG上报此时ceph -s的响应时间达到几十秒。关键排查思路是用ceph tell mon.* version或者ceph quorum_status尝试连接只要能执行成功说明mon进程是活的。真正需要紧张的是命令完全无法执行且日志里有大量异常报错的情况。5.3 不要忘了配置认证密钥手工方式部署Ceph时mon之间、client与mon之间的通信依赖于keyring。很多人一开始图方便把auth_cluster_required或者auth_service_required设成none短期看操作顺畅但集群规模一大、参与节点变多之后认证缺失会导致各种安全问题而且部分高级特性如lazy mode、scrub等会受限制。正确的做法是把认证打开并在mon数据目录中存放对应的keyring文件ls -la /var/lib/ceph/mon/ceph-hostname/如果出发时出现权限错误先确认keyring路径和mon配置中的引用是否一致。多数我见到的启动失败场景都源于ceph.conf中keyring目录配置不匹配。5.4 mon数据库损坏不要轻易删库重建当monstore损坏时比如日志出现error (2) No such file or directory或者无法正常进入peering状态最好的手段是优先从其他健康mon恢复。直接删除故障节点的monstore目录让它重新从零同步是一项风险很高的操作如果恰好其他mon同时出现问题集群会彻底失去元数据服务恢复成本呈指数级上升。正确的降风险操作是先把故障节点上的monstore目录完整备份cp -a /var/lib/ceph/mon/ceph-hostname /var/lib/ceph/mon/ceph-hostname.bak.$(date %F)然后再尝试修复或重建。如果确实需要重建确保至少有一个健康mon在提供服务并且有足够的时间和空间让新mon完成全量同步。同步期间不要并发执行OSDMap变更类操作比如增加OSD、调整pg_num避免给mon增加额外压力。6. 结合Rook环境mon相关命令在Kubernetes中的常见使用思路虽然题为“Ceph MON命令详解”但结合热词“rook-ceph mon down”的出现频率我觉得值得单独补充一章Rook环境下的MON排查思路。Rook的本质是把Ceph包装成云原生应用MON的管理被抽象成了CRD和Pod但底层使用的仍然是我们前面提到的这些Ceph命令。只是入口变成了kubectl和一众Rook工具。在Rook环境中进入mon Pod执行命令通常需要toolboxkubectl -n rook-ceph get pod -l approok-ceph-tools kubectl -n rook-ceph exec -it toolbox-pod -- bash进入后可以直接执行ceph -s、ceph mon dump这些命令。需要你记住的是即使在Rook集群ceph mon status、ceph mon add等命令的行为和手工集群是完全一样的。Rook环境下有个独特问题就是mon的地址发布机制。Rook会在每个mon Pod创建后自动向monmap注册Pod IP。如果你手动去设置fixed IP或手动add mon反而容易和Rook的operator逻辑打架。我的经验是在Rook里尽量让operator自动管理mon成员不要手动去执行ceph mon add/remove。如果遇到mon down优先通过Pod重启、节点漂移等方式处理除非你清楚知道自己在做什么否则别在底层手动操作monmap。排查Rook mon down时的另一个高频命令是查看Rook operator日志kubectl -n rook-ceph logs -f deploy/rook-ceph-operatoroperator日志里会明确记录它尝试管理mon的过程包括某个mon Pod启动失败的具体原因。这往往比直接看Ceph日志更快捷因为operator已经帮我们做了一部分原因聚合。7. 从热词看MON运维的高频场景top、vmstat、awk之外的命令联动热度词里反复出现了top命令详解、vmstat命令详解、awk命令详解、screen命令详解这些确实是Ceph日常运维中会用到的经典Linux命令。但大家要理解一点单独背它们的参数列表意义不大真正有价值的是知道在什么场景下调用它们并如何与Ceph命令的输出相互印证。举个例子假设执行ceph -s后看到HEALTH_WARN提示部分PG处于degraded状态。你可能会立刻去看OSD但很多时候问题源头在mon的选举或map分发上。此时用以下命令组合可以快速定位# 看mon节点整体负载 top -u ceph # 看上下文切换和IO等待 vmstat 2 20 # 确认mon进程的线程状态 ps -eLf | grep ceph-mon | wc -l如果vmstat中waIO wait列很高说明mon所在磁盘的IO正在成为瓶颈。如果si/so频繁变动说明内存压力较大。结合top里mon进程的CPU占比你就能在“mon慢查询”和“OSD磁盘满了”之间做出判断。awk在日志排查里的价值前面其实已经体现。我再说一个具体用法在多个mon日志之间对比选举时间线判断谁先发起选举、谁主导了epoch递增。比如awk /election/ {print strftime(%Y-%m-%d %H:%M:%S, systime()), $0} /var/log/ceph/ceph-mon.*.log这种分析在“mon互相不投票导致选不出leader”的场景里非常高效。screen和history则更偏向操作规范。Ceph运维中确实有很多操作耗时较长比如ceph osd reweight大批量执行、ceph pg repair扫描甚至ceph-mon恢复流程中的monstore rebuild。如果不用screen或tmux一个断网就会中断操作更麻烦的是中断后不知道命令执行到了哪一步得重新排查一遍浪费时间不说还可能因为重复执行引发状态异常。所以我的习惯是凡是涉及集群变更的操作一律先在screen会话里跑执行前用history确认计划执行中每隔一段时间用history记录关键节点确保任何中断都有迹可循。8. 关于MON命令的深入学习路径与操作建议聊到这里MON命令的主干已经讲得差不多了。最后说一点我在学习Ceph MON命令过程中的体会不要死记命令参数而是先理解“Paxos协议在MON中的作用”和“quorum的数学原理”然后所有命令的输出和参数自然就串联起来了。比如ceph mon stat里的election epoch本质上就是Paxos协议中每一轮选举的编号。ceph mon dump里的fsid则是集群的唯一标识。理解了这些概念后你在排查问题时看到任何一个输出都不会觉得是无意义的数字。给还没接触过MON命令的新手一个学习路径参考先把ceph -s、ceph mon stat、ceph mon dump、ceph quorum_status这四条命令的输出全部看懂能解释每一行代表什么然后到测试环境练习ceph mon add和ceph mon remove观察quorum的变化过程再进阶到用ceph tell mon.* injectargs动态调日志用awk分析日志细节。这样由浅入深两周左右就能基本掌握MON命令的日常使用。补充一句多版本命令兼容性问题。在Ceph的较老Luminous或Nautilus版本中部分命令参数和输出格式与Octopus以后版本不同。如果你维护的是老版本集群建议以集群实际版本为准不要盲目照搬网上教程。比如老版本ceph mon stat的输出字段在格式上会和新版有差异ceph mon enable-msgr2这个命令也是从Nautilus才引入的。最后再分享一个我多年养成的习惯每次对MON执行重要变更之前我会先把这个节点上的monstore目录做一个快照同时在另一个终端打开mon日志文件动态跟踪tail -f /var/log/ceph/ceph-mon.hostname.log这样一旦出现异常我能立刻在日志里看到操作触发的事件快速判断回滚还是继续。MON作为集群的大脑对它做的每一次操作都不该是盲目的冒险而应该是可观测、可回退、有明确预期的工程实践。所有输出中出现的参考配置和建议都建议先在测试集群验证后再用于生产环境尤其是涉及mon成员结构的变更一定要慎之又慎。
返回列表