elasticsearch源码之元数据culsterstate(代码片段)

darcy_yuan darcy_yuan     2023-02-09     505

关键词:

1.概述

前面几篇讲述了es的许多重要的逻辑,这些逻辑都涉及到一个非常核心的类ClusterState,本文来看下ClusterState包括什么信息。

2.ClusterState

从注解中我们看到,CusterState表示整个集群的状态,其中的数据都是不可变的(除了RoutingTable),并且只能由master节点来更新。

CusterState 支持diff接口,用来生成增量信息。

主要字段如下:

// CulsterState

    private final long version; // 版本号

    private final String stateUUID; // 状态uuid

    private final RoutingTable routingTable; // 路由表

    private final DiscoveryNodes nodes; // 所有的发现节点

    private final MetaData metaData; // 元数据

    private final ClusterBlocks blocks; // 一些限制,用来阻止非法操作

    private final ImmutableOpenMap<String, Custom> customs; // 自定义

    private final ClusterName clusterName; // 集群名称

    private final boolean wasReadFromDiff;

    private final int minimumMasterNodesOnPublishingMaster;

    // built on demand
    private volatile RoutingNodes routingNodes;  // 路由信息的copy

RoutingTable 即全局的路由表,是索引路由表IndexRoutingTable的迭代器

public class RoutingTable implements Iterable<IndexRoutingTable>, Diffable<RoutingTable> 

    public static final RoutingTable EMPTY_ROUTING_TABLE = builder().build();

    private final long version;

    // index to IndexRoutingTable map
    private final ImmutableOpenMap<String, IndexRoutingTable> indicesRouting;

索引路由表 IndexRoutingTable 是分片路由表 IndexShardRoutingTable的迭代器

public class IndexRoutingTable extends AbstractDiffable<IndexRoutingTable> implements Iterable<IndexShardRoutingTable> 

    private final Index index; // 索引
    private final ShardShuffler shuffler; // 洗牌器

    // note, we assume that when the index routing is created, ShardRoutings are created for all possible number of
    // shards with state set to UNASSIGNED
    private final ImmutableOpenIntMap<IndexShardRoutingTable> shards; // 分片路由信息

    private final List<ShardRouting> allActiveShards; // 所有活跃分片的路由信息

IndexShardRoutingTable 包含了主分片和复制分片的信息

public class IndexShardRoutingTable implements Iterable<ShardRouting> 

    final ShardShuffler shuffler; // 洗牌器
    final ShardId shardId; // shard id is a int

    final ShardRouting primary; // 主分片
    final List<ShardRouting> primaryAsList;
    final List<ShardRouting> replicas; // 复制分片
    final List<ShardRouting> shards; // 分片
    final List<ShardRouting> activeShards; // 活跃分片
    final List<ShardRouting> assignedShards; // 已分配的分片
    final Set<String> allAllocationIds;
    final boolean allShardsStarted;

DiscoveryNodes 表示所有发现节点

public class DiscoveryNodes extends AbstractDiffable<DiscoveryNodes> implements Iterable<DiscoveryNode> 

    public static final DiscoveryNodes EMPTY_NODES = builder().build();

    private final ImmutableOpenMap<String, DiscoveryNode> nodes; // 节点
    private final ImmutableOpenMap<String, DiscoveryNode> dataNodes; // 数据节点
    private final ImmutableOpenMap<String, DiscoveryNode> masterNodes; // master节点
    private final ImmutableOpenMap<String, DiscoveryNode> ingestNodes;

    private final String masterNodeId; // master节点id
    private final String localNodeId; // 本地节点id
    private final Version minNonClientNodeVersion;
    private final Version maxNonClientNodeVersion;
    private final Version maxNodeVersion;
    private final Version minNodeVersion;
public class DiscoveryNode implements Writeable, ToXContentFragment 
    ...
    private final String nodeName; // 节点名称
    private final String nodeId; // 节点id
    private final String ephemeralId; // 临时id
    private final String hostName; // 主机信息
    private final String hostAddress;
    private final TransportAddress address; // transport 地址
    private final Map<String, String> attributes;
    private final Version version;
    private final Set<DiscoveryNodeRole> roles;

MetaData代表元数据,包括一些配置,index mapping

public class MetaData implements Iterable<IndexMetaData>, Diffable<MetaData>, ToXContentFragment 
    ...
    private final String clusterUUID; // cluster uuid
    private final boolean clusterUUIDCommitted;
    private final long version; // 版本号

    private final CoordinationMetaData coordinationMetaData; // 节点发现元数据

    private final Settings transientSettings; // 各类设置
    private final Settings persistentSettings;
    private final Settings settings;
    private final DiffableStringMap hashesOfConsistentSettings;
    private final ImmutableOpenMap<String, IndexMetaData> indices; // 索引元数据map
    private final ImmutableOpenMap<String, IndexTemplateMetaData> templates; // 索引模版map
    private final ImmutableOpenMap<String, Custom> customs; // 自定义map

    private final transient int totalNumberOfShards; // Transient ? not serializable anyway? // 分片总数
    private final int totalOpenIndexShards; // open的分片总数

    private final String[] allIndices; // 所有的索引
    private final String[] allOpenIndices; // 所有打开的索引
    private final String[] allClosedIndices; // 所有关闭的索引

    private final SortedMap<String, AliasOrIndex> aliasAndIndexLookup; // name -> alias/index map

ClusterBlock表示在特定状态下对集群的一些禁止操作,比如在集群恢复阶段不可读写

public class ClusterBlocks extends AbstractDiffable<ClusterBlocks> 
    public static final ClusterBlocks EMPTY_CLUSTER_BLOCK = new ClusterBlocks(emptySet(), ImmutableOpenMap.of());

    private final Set<ClusterBlock> global; // 全局的block

    private final ImmutableOpenMap<String, Set<ClusterBlock>> indicesBlocks; // 索引级别的block

    private final EnumMap<ClusterBlockLevel, ImmutableLevelHolder> levelHolders; // 根据level对上面的block进行分类

3.builder模式

ClusterState使用了builder模式,builder模式对于修改复杂的数据对象非常方便。先定义一个内部类,属性和数据对象相同

// ClusterState

public static class Builder 

        private final ClusterName clusterName;
        private long version = 0;
        private String uuid = UNKNOWN_UUID;
        private MetaData metaData = MetaData.EMPTY_META_DATA;
        private RoutingTable routingTable = RoutingTable.EMPTY_ROUTING_TABLE;
        private DiscoveryNodes nodes = DiscoveryNodes.EMPTY_NODES;
        private ClusterBlocks blocks = ClusterBlocks.EMPTY_CLUSTER_BLOCK;
        private final ImmutableOpenMap.Builder<String, Custom> customs;
        private boolean fromDiff;
        private int minimumMasterNodesOnPublishingMaster = -1;

        public Builder(ClusterState state) 
            this.clusterName = state.clusterName;
            this.version = state.version();
            this.uuid = state.stateUUID();
            this.nodes = state.nodes();
            this.routingTable = state.routingTable();
            this.metaData = state.metaData();
            this.blocks = state.blocks();
            this.customs = ImmutableOpenMap.builder(state.customs());
            this.minimumMasterNodesOnPublishingMaster = state.minimumMasterNodesOnPublishingMaster;
            this.fromDiff = false;
        
    
        ...
        public Builder metaData(MetaData metaData) 
            this.metaData = metaData;
            return this; // 返回当前builder对象
        
        ...
        public ClusterState build() 
            if (UNKNOWN_UUID.equals(uuid)) 
                uuid = UUIDs.randomBase64UUID();
            
            return new ClusterState(clusterName, version, uuid, metaData, routingTable, nodes, blocks, customs.build(),
                minimumMasterNodesOnPublishingMaster, fromDiff); // 返回主类对象
        

初始化和修改对象时进行链式修改,然后build,避免了传统的new, set, set...的写法

ClusterState initialClusterState = ClusterState.builder(ClusterName.CLUSTER_NAME_SETTING.getDefault(Settings.EMPTY))
            .metaData(metaData).routingTable(routingTable).nodes
                (nb).build(); // 链式写法

 4.总结

本文简单描述了ClusterState的数据结果,展示了builder模式的运用。

day014python数据类型之元组

参考技术A今儿我们再续前缘,接着List开始说。元组和List特别像,区别是元组中的数据不可以修改。为表区别,元组的标识符用的是小括号(),而List是用的中括号[]举个栗子tup2=(1,2,3,4,5)不可修改属性,这也是和List最大区别元组... 查看详情

1-2:数据类型之元组列表类型

一.元组的概念:前面我们学过数字类型,字符串类型,它们都代表一个元素!1.元组是包含多个元素的类型,元素之间用逗号分隔。t1=123,456,"hello"2.元组可以使空的,t2=()3.元组包含一个元素:t3=123,4.元组外层可以使用括号,也可... 查看详情

elasticsearch源码概述

从功能上说,可以分为两部分,分布式功能和数据功能。分布式功能主要是节点集群及集群附属功能如restful借口、集群性能检测功能等,数据功能主要是索引和搜索。代码上这些功能并不是完全独立,而是由相互交叉部分。当然... 查看详情

mysql死锁过程及案例详解之元数据锁metadatalock(代码片段)

Mysql数据锁MetaDataLock元数据锁MetaDataLock元数据锁MetaDataLocks的主要作用是在执行查询或者发起事务时元数据结构受到保护,即不被修改。MetaDataLock是表级锁。MetaDataLock是排他锁,当该锁存在时不能有其它的连接对表的模式... 查看详情

第6天数据类型之元组,字典,集合(代码片段)

元组(不可变,有序,多个值)元组类型就是一个不可变的列表,为什么会有元组呢?因为在我们写程序的过程中可能会出现这样的一个情况,也就是为了防止一些不必要的bug,一些重要的数据别人是可以读取的,但是不能够进... 查看详情

springboot整合elasticsearch和mysql附案例源码

导读  前二天,写了一篇ElasticSearch7.8.1从入门到精通的(点我直达),但是还没有整合到SpringBoot中,下面演示将ElasticSearch和mysql整合到SpringBoot中,附演示源码。项目介绍模仿NBA网站网址地址:点我直达 接口开发将数据库... 查看详情

《elasticsearch源码解析与优化实战》样章-第6章数据模型

1.概述转载:https://www.easyice.cn/archives/300这里面有一些是我以前不知道的,先记录一下,以后看的时候加深理解。 查看详情

《elasticsearch源码解析与优化实战》第6章:数据模型(代码片段)

文章目录关注我的公众号【宝哥大数据】,更多干货一、简介1.1、查询类型二、PacificA算法2.1、数据副本策略2.2、配置管理2.3、错误检测三、数据副本模型3.1、基本写入模型3.2、写故障处理3.3、基本读取模型3.3.1、检索数据过... 查看详情

python中的基本数据类型之元组类型

参考技术A元组数据类型也是序列类型,和列表类型十分的相似,同样可以根据索引来获取元素,并且一样可以使用切片操作,和列表的不同之处在于,元组是不可变类型,一旦创建是无法修改里面的值的。元组是用小括号表示... 查看详情

python从入门到精通,100天就够了!——常用数据结构之元组(代码片段)

文章目录一、元组的定义和使用1.元组的定义2.元组的创建方法3.元组的运算符4.元组的遍历二、元组的应用场景1.打包和解包操作。2.交换两个变量的值三、元组与列表相互转换上一篇文章为大家讲解了Python中的列表,它是一... 查看详情

小菜鸡进阶之路_secondweek之元组列表集合字典对比.

 这一周主要学习数据类型,要记的东西特别多,特别是元组、列表、集合、字典这一部分有很多地方相似而不相同,特别容易混淆.所以我做了一个简单的汇总,希望大家批评指正.  查看详情

数据结构之元组(代码片段)

#为何要有元组,存放多个值,元组不可变,更多的是用来做查询t=(1,[1,3],‘sss‘,(1,2))#t=tuple((1,[1,3],‘sss‘,(1,2)))#print(type(t))##元组可以作为字典的key#d=(1,2,3):‘egon‘#print(d,type(d),d[(1,2,3)])#    切片#goods=(‘iphone‘,‘lenovo‘,‘s... 查看详情

《elasticsearch源码解析与优化实战》第11章:gateway模块分析(代码片段)

文章目录一、gateway模块分析1.1、简介1.2、元数据1.3、元数据的持久化1.4、元数据的恢复1.5、元数据恢复流程分析1.5.1、选举集群级和索引级别的元数据1.6、触发allocation1.7、思考关注我的公众号【宝哥大数据】,更多干货一、... 查看详情

《elasticsearch源码解析与优化实战》第11章:gateway模块分析(代码片段)

文章目录一、gateway模块分析1.1、简介1.2、元数据1.3、元数据的持久化1.4、元数据的恢复1.5、元数据恢复流程分析1.5.1、选举集群级和索引级别的元数据1.6、触发allocation1.7、思考关注我的公众号【宝哥大数据】,更多干货一、... 查看详情

数据类型之元组介绍(代码片段)

元组就是"一个不可变的列表"1、作用:按照索引/位置存放多个值,只用于读不用于改2、定义:()内用逗号分隔开多个任意类型的元素 t=(1,1.3,‘aa‘)#相当于t=tuple((1,1.3,‘aa‘))print(t,type(t))#(1,1.3,‘aa‘)<class‘tuple‘>?x=(10)... 查看详情

数据治理之元数据管理atlas(代码片段)

数据治理之元数据管理的利器——Atlas一、数据治理与元数据管理1.1背景为什么要做数据治理?业务繁多,数据繁多,业务数据不断迭代。人员流动,文档不全,逻辑不清楚,对于数据很难直观理解,... 查看详情

《elasticsearch源码解析与优化实战》第1章走进elasticsearch(代码片段)

文章目录一、第1章走进Elasticsearch1.1、基本概念和原理1.1.1、索引结构1.1.2、分片(shard)1.1.3、动态更新索引1.1.4、近实时搜索1.1.5、段合并1.2、集群内部原理1.2.1、集群节点角色1.主节点(Masternode)2.数... 查看详情

《elasticsearch源码解析与优化实战》第1章走进elasticsearch(代码片段)

文章目录一、第1章走进Elasticsearch1.1、基本概念和原理1.1.1、索引结构1.1.2、分片(shard)1.1.3、动态更新索引1.1.4、近实时搜索1.1.5、段合并1.2、集群内部原理1.2.1、集群节点角色1.主节点(Masternode)2.数... 查看详情