elasticsearch源码分析-02选举主节点

在Elasticsearch中,数据的写入和查询是在主节点上进行的,主节点的选举是集群健康运行的关键。在Elasticsearch中,主节点被称为master节点。主节点的选举是通过一个叫做Zen Discovery的模块来完成的,它负责集群中节点的发现以及主节点的选举。

以下是主节点选举的核心代码:




// 在Elasticsearch的ZenDiscovery模块中,有一个MasterFinder类负责发现和选举主节点
class MasterFinder {
    // 选举主节点
    public void findMaster(ClusterState state, DiscoveryNode localNode) {
        // 获取所有可能的主节点
        List<DiscoveryNode> possibleNodes = state.getNodes().getMasterNodes().values().stream()
            .filter(node -> node.isMasterEligible())
            .collect(Collectors.toList());
 
        // 如果本地节点有权限成为主节点,并且没有其他节点比本地节点更合适
        if (localNode.isMasterEligible() && possibleNodes.isEmpty()) {
            becomeMaster.run();
        } else {
            // 如果有合适的节点,则选举该节点为主节点
            DiscoveryNode masterNode = possibleNodes.stream()
                .filter(node -> node.getId().equals(state.nodes().getMasterNodeId()))
                .findFirst()
                .orElse(null);
 
            if (masterNode != null) {
                // 如果本地节点不是主节点,但是已经有一个主节点了,则本地节点成为它的follower
                if (localNode.equals(masterNode) == false) {
                    followerNode.run();
                }
            } else {
                // 如果没有主节点,并且本地节点没有权限成为主节点,则重新选举
                becomeMaster.run();
            }
        }
    }
}

在这段代码中,ClusterState 对象包含了集群状态的所有信息,包括所有节点的信息和当前的主节点。DiscoveryNode 是一个代表节点的类,包含了节点的所有信息,包括节点是否有资格成为主节点以及节点的ID等。

在选举主节点时,首先会筛选出所有有资格成为主节点的节点,然后判断是否需要进行主节点的选举。如果本地节点是唯一有资格的节点,且之前没有主节点,则本地节点会成为主节点。如果有其他节点有资格,则会根据集群状态中记录的主节点ID来决定是否需要重新选举。

这个过程是Elasticsearch保证集群健康运行和数据一致性的重要步骤。

评论已关闭

推荐阅读

Vue中使用mind-map实现在线思维导图
2024年08月04日
VUE
Web前端最全Vue实现免密登录跳转的方式_vue怎么样不登录返回首页,最强技术实现
2024年08月04日
VUE
vue3 项目搭建教程(基于create-vue,vite,Vite + Vue)
2024年08月04日
VUE
Vue-颜色选择器实现方案——>Vue-Color( 实战*1+ Demo*7)
2024年08月04日
VUE
Vue项目卡顿慢加载?这些优化技巧告诉你!_vue数据多渲染卡顿
2024年08月04日
VUE
vue中的keep-alive详解与应用场景
2024年08月04日
VUE
Vue、React实现excel导出功能(三种实现方式保姆级讲解)
2024年08月04日
vue-office/docx插件实现docx文件预览
2024年08月04日
VUE
java调用js文件的两种方法(支持V8引擎)
2024年08月04日
JavaScript:解决计算精度问题/mathjs/bignumber.js/big.js/decimal.js
2024年08月04日
两周从爬虫小白变大神 _yjs_js_security_passport
2024年08月04日
JS笔记(对象、函数、数组)
2024年08月04日
Markdown.js:强大的纯JavaScript Markdown解析器
2024年08月04日
Vue项目:js模拟点击a标签下载文件并重命名,URL文件地址下载方法、请求接口下载文件方法总结。
2024年08月04日
vue 父组件怎么获取子组件里面的data数据
2024年08月04日
VUE
个人开发实现AI套壳网站快速搭建(Vue+elementUI+SpringBoot)
2024年08月04日
el-table 表格封装并改造实现单元格可编辑
2024年08月04日
none
nodejs环境下创建vue项目、SSH密钥登陆!!!
2024年08月04日
vue+quill+element-ui实现视频、图片上传及缩放保姆级教程,轻松使用富文本
2024年08月04日
【three.js】22. Imported Models导入模型
2024年08月04日