Elasticsearch脑裂紧急处理与预防

在 Elasticsearch 中出现 网络分区(Network Partition)脑裂(Split-Brain) 导致两个子集群各自选出 Master 的情况,是非常严重的问题。比如这个场景(20个节点分裂成两个10节点的子集群,各自选出 Master)正是典型的脑裂场景。如果不立即处理,会导致数据不一致、写入冲突甚至数据丢失。

以下是详细的解决方案和预防措施:


一、紧急处理步骤(恢复集群一致性)

  1. 立即隔离并评估状态

    • 通过 REST API 检查两个子集群的状态:
      curl -XGET 'http://子集群A的节点IP:9200/_cluster/state?pretty'
      curl -XGET 'http://子集群B的节点IP:9200/_cluster/state?pretty'
      
    • 对比两个集群的元数据(cluster_uuidmetadata版本号、索引分片分配状态)。保留元数据更新更活跃(版本号更大)的子集群作为有效集群。
  2. 人工强制选择有效集群

    • 停止无效子集群的所有节点(假设你决定保留子集群A):
      # 在子集群B的所有节点上执行
      sudo systemctl stop elasticsearch.service
      
    • 重启有效子集群(子集群A)以清除异常状态
      # 在子集群A的所有节点上执行
      sudo systemctl restart elasticsearch.service
      
  3. 恢复被隔离节点

    • 清理被停止节点(原子集群B)的数据目录(避免旧元数据冲突):
      # 谨慎操作!备份后删除节点数据目录
      rm -rf /path/to/elasticsearch/data/nodes
      
    • 重新启动这些节点,让它们以全新节点身份加入有效集群(子集群A)。

二、根本原因分析

  1. 配置错误
    Elasticsearch 7.x 及之后版本必须显式配置集群法定节点数(quorum)

    # elasticsearch.yml
    discovery.zen.minimum_master_nodes: 11  # 公式 = (总Master候选节点数 / 2) + 1
    
    • 在你的场景中设为 11,可阻止任一10节点子集群形成有效Master(10 < 11)。
  2. 网络分区或防火墙问题
    节点间通信中断导致集群分裂,需检查:

    • 网络设备(交换机、路由器)
    • 防火墙规则(确保端口 9300 互通)
    • 云平台的VPC/安全组配置
  3. 资源瓶颈导致节点失联

    • CPU/内存过载导致节点停止响应
    • 垃圾回收(GC)卡顿超时

三、关键预防措施

  1. 正确设置法定人数(Quorum)
    Elasticsearch 7.0+ 引入了 cluster.initial_master_nodes,但仍需显式配置

    # 在初始集群启动时指定Master候选节点
    cluster.initial_master_nodes: - node-1- node-2- ... - node-20   # 明确列出所有Master候选节点名
    
  2. 专用Master节点(推荐)

    # 3-5个专用Master节点(不存储数据)
    node.roles: [ master ]   # 专用Master节点
    node.roles: [ data, ingest ]  # 数据节点(不参与选举)
    
    • 此时 discovery.zen.minimum_master_nodes 设置为 (专用Master节点数/2) + 1(例如3节点集群设为 2)。
  3. 启用生产级发现机制
    避免使用默认的 zen 发现,改用:

    # 使用云服务商发现插件 或 安全协议
    discovery.seed_providers: file
    discovery.seed_hosts:- 192.168.1.10:9300- 192.168.1.11:9300- ... 
    
  4. 监控与告警

    • 监控API:GET /_cluster/health
    • 设置告警规则:
      • statusgreen 变为 yellow/red
      • number_of_nodes 异常减少
      • active_primary_shards 突然下降

四、Elasticsearch 8.x+ 的改进

  • 自动引导安全配置(Bootstrapping):首次启动自动生成安全配置和密钥。
  • 更严格的节点准入控制:新节点需验证证书和凭证才能加入。
  • 优化选举算法:基于 Raft 协议的改进实现,减少脑裂概率。

总结处理流程

保留子集群A
保留子集群B
发生脑裂
隔离并评估两个子集群
选择有效集群
停止子集群B的节点
停止子集群A的节点
清理被停止节点的数据
重启有效集群
重新加入被隔离节点
验证集群状态
修复配置与网络

关键原则:脑裂后必然存在数据冲突,恢复时需以数据完整性为优先人工裁定有效数据分区。定期测试集群恢复流程,并确保配置符合 Elasticsearch 官方推荐。

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

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

相关文章

华为网路设备学习-29(BGP协议 四)路由策略-实验

示例 延伸-具体实验1.代码部分&#xff1a;基础配置R1 [Huawei]int GigabitEthernet 0/0/0 [Huawei-GigabitEthernet0/0/0]ip address 10.1.13.1 24[Huawei]int LoopBack 1 [Huawei-LoopBack1]ip address 172.16.1.1 24 [Huawei-LoopBack1]q [Huawei]int LoopBack 2 [Huawei-Lo…

500系列状态码与可能的场景

501 Not Implemented&#xff08;未实现&#xff09;HTTP 方法不支持客户端发送了 PUT、DELETE、PATCH 请求但服务器只实现了 GET 和 POST协议功能不支持客户端使用了 HTTP/2 的某些高级特性服务器只支持 HTTP/1.1&#xff0c;无法处理&#xff0c;返回 501API 接口未完成开发中…

大数据、hadoop、爬虫、spark项目开发设计之基于数据挖掘的交通流量分析研究

大数据、hadoop、爬虫、spark项目开发设计之基于数据挖掘的交通流量分析研究

Pytest项目_day20(log日志)

Log日志优点&#xff1a;记录程序运行信息&#xff0c;方便定位问题python日志模块logging&#xff0c;日志等级如下&#xff1a; DEBUGINFO&#xff08;正常&#xff09;WARNINGERROR&#xff08;报错&#xff09;示例代码如下&#xff1a;import logging import os.path impo…

elasticsearch中的分词器配置及使用

一、什么是分词器&#xff1f; 在 Elasticsearch&#xff08;ES&#xff09;中&#xff0c;分词器&#xff08;Analyzer&#xff09; 是处理文本的核心组件&#xff0c;负责将原始文本转换为可搜索的索引词&#xff08;Term&#xff09;。它是文本分析过程的核心&#xff0c;直…

《Linux 网络编程二:UDP 与 TCP 的差异、应用及问题应对》

一、UDP 与 TCP 对比表对比项UDPTCP连接方式无需建立连接有连接&#xff08;三次握手建立&#xff0c;四次挥手断开&#xff09;传输可靠性尽最大努力交付&#xff0c;可能丢包安全可靠的数据传输机制面向对象面向数据包面向数据流传输模式一对一、一对多传输本质一对一&#x…

uniapp 页面跳转及字符串转义

1. uniapp 页面跳转及字符串转义 1.1. uniapp页面跳转方法 在uniapp中,页面跳转可以通过多种方式进行,包括但不限于路由跳转和页面间事件通信。   一. 路由跳转   在uniapp中,路由跳转是指通过改变页面url的方式来跳转到不同的页面。uni-app提供了一套路由跳转的API,包…

Vue中 this.$emit() 方法详解, 帮助子组件向父组件传递事件

this.$emit()是 Vue.js 中一个很有用的方法,可以帮助子组件向父组件传递事件1、原理说明&#xff1a;在Vue中&#xff0c;this.$emit()方法用于触发自定义事件。它是Vue实例的一个方法&#xff0c;可以在组件内部使用。使用 this.$emit() 方法&#xff0c;可以向父组件发送自定…

BUCK电路的环路补偿

芯片的COMP脚是用来设计环路补偿用的&#xff0c;它给芯片内部的误差放大器的输出和PWM控制器输入做补偿&#xff0c;如果环路补偿设计得不好&#xff0c;会更容易引起环路的不稳定或振荡&#xff0c;也可能导致输出电压异常。环路补偿涉及三个指标&#xff1a;剪切频率&#x…

Hyperledger Fabric官方中文教程-改进笔记(十六)-策略(policy)

本Fabric中文文档专栏的阅读前言&#xff1a;前言 文章目录什么是策略为什么需要策略策略如何实现访问控制列表 (ACLs)智能合约背书政策修改策略如何在 Fabric 中编写策略Signature policiesImplicitMeta policies例子: 通道配置策略Organizations 部分Application部分Fabric 链…

Flutter性能优化完全指南:构建流畅应用的实用策略

Flutter性能优化完全指南&#xff1a;构建流畅应用的实用策略 探索从UI构建到内存管理的全方位优化技巧&#xff0c;打造如丝般顺滑的Flutter体验 引言 在跨平台开发领域&#xff0c;Flutter以其出色的性能表现脱颖而出。然而&#xff0c;正如任何强大的框架一样&#xff0c;不…

jvm对象内存占用

欢迎访问我的主页: https://heeheeaii.github.io/ 在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;一个对象在内存中的存储布局可以分为三个部分&#xff1a;对象头&#xff08;Object Header&#xff09;、实例数据&#xff08;Instance Data&#xff09;和对齐填充…

嵌入式系统中mcu寄存器分类划分

目录一、 按行为特性分类二、 按功能角色分类&#xff08;更宏观的角度&#xff09;总结与注意事项在32位单片机&#xff08;尤其是基于ARM Cortex-M系列内核的&#xff09;中&#xff0c;寄存器的种类可以按照其“行为模式”和“功能”来进行分类。以下是32位单片机&#xff0…

Redis如何高效安全的遍历所有key?

大家好&#xff0c;我是锋哥。今天分享关于【Redis如何高效安全的遍历所有key?】面试题。希望对大家有帮助&#xff1b; Redis如何高效安全的遍历所有key? 超硬核AI学习资料&#xff0c;现在永久免费了&#xff01; 在 Redis 中&#xff0c;遍历所有的 key 是一个相对昂贵的…

网易云音乐歌曲导出缓存为原始音乐文件。低调,低调。。。

最近买了个榭兰图耳机头&#xff0c;拿到手第一件事当然是煲机了。弄个旧手机做24小时煲机但是不想再装多一个网易云音乐&#xff0c;省得一号多登录会问题。对于软工男最先想到的肯定是在本地直接播放音乐了&#xff0c;正好自己 有淘宝88VIP联合会员&#xff0c;于是琢磨着怎…

从Android到鸿蒙:一场本应无缝的转型-优雅草卓伊凡

从Android到鸿蒙&#xff1a;一场本应无缝的转型-优雅草卓伊凡看到Android开发者询问如何转向鸿蒙&#xff0c;卓伊凡不禁摇头&#xff1a;真正的Android工程师根本不需要“学习”鸿蒙&#xff0c;只需要简单查阅文档即可。近年来&#xff0c;随着鸿蒙系统的不断发展&#xff0…

HTML————更实用于后端宝宝们学习的前端

博主主攻后端&#xff0c;但是毕竟要做网站&#xff0c;我们来学习一点前端的知识&#xff0c;一共有三节&#xff0c;学完就能做一点小小的页面啦&#xff1b;1.1 HTML基础什么是HTML呢&#xff0c;他是超文本标记语言&#xff0c;还记得HTTP是啥不&#xff0c;HTTP是超文本传…

Vue.js 核心机制深度学习笔记

Vue核心机制深度学习笔记 概述 本文档整理自一次深入的 Vue.js 技术讨论&#xff0c;涵盖了响应式系统原理、虚拟 DOM 工作机制、更新策略等核心概念。通过问答形式&#xff0c;旨在帮助开发者彻底理解 Vue.js 的内部运行机制。 目录 SPA 应用与虚拟 DOM虚拟 DOM 生成与 Di…

通义千问VL-Plus:当AI“看懂”屏幕,软件测试的OCR时代正式终结!

—— 一位测试老兵的实战手记&#xff1a;如何用多模态大模型让Bug无处遁形 深夜11点&#xff0c;某电商App紧急上线前 测试工程师小王盯着第37次失败的自动化脚本崩溃截图&#xff1a; “Network Error: Conn3ct1on t1m30ut” 传统OCR把“timeout”识别成“t1m30ut”&#xff…

Notepad++换行符替换

使用 Postman 测试接口时&#xff0c;有时候会遇到需要发送一篇文章&#xff0c;但是我们需要收到将文章的换行符换成 \n&#xff0c;我们可以通过 Notepad 实现快速替换。 首先&#xff0c;将文章粘贴到 Notepad 中&#xff0c;使用 Ctrl H 快捷键打开替换窗口。 查找目标&a…