关键词:
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.数... 查看详情