ES学习笔记之health api的实现
发表于:2024-11-18 作者:千家信息网编辑
千家信息网最后更新 2024年11月18日,使用health api可以查看es集群的健康度。 health api的用法如下:curl 'http://localhost:9200/_cluster/health' health api的返回
千家信息网最后更新 2024年11月18日ES学习笔记之health api的实现
使用health api可以查看es集群的健康度。 health api的用法如下:
curl 'http://localhost:9200/_cluster/health'
health api的返回值中有一个核心的字段status
, status
有3种取值: green, yellow, red。分别代表集群的3种状态: 主分片和副本都已经分配,主分片已经分配副本分片没有,主分片和副本都都没有分配。
也就是说, health api关注的核心在于数据的高可用。
看health api的实现:
请求会路由到master节点,然后读取clusterState中的routing_table
.
基于routing_table
, 判断索引的各个分片状态
public ClusterShardHealth(int shardId, final IndexShardRoutingTable shardRoutingTable) { this.shardId = shardId; for (ShardRouting shardRouting : shardRoutingTable) { if (shardRouting.active()) { activeShards++; if (shardRouting.relocating()) { // the shard is relocating, the one it is relocating to will be in initializing state, so we don't count it relocatingShards++; } if (shardRouting.primary()) { primaryActive = true; } } else if (shardRouting.initializing()) { initializingShards++; } else if (shardRouting.unassigned()) { unassignedShards++; } } if (primaryActive) { if (activeShards == shardRoutingTable.size()) { status = ClusterHealthStatus.GREEN; } else { status = ClusterHealthStatus.YELLOW; } } else { status = ClusterHealthStatus.RED; } }
基于分片,决定索引的状态
public ClusterIndexHealth(IndexMetaData indexMetaData, IndexRoutingTable indexRoutingTable) { this.index = indexMetaData.getIndex(); this.numberOfShards = indexMetaData.getNumberOfShards(); this.numberOfReplicas = indexMetaData.getNumberOfReplicas(); this.validationFailures = indexRoutingTable.validate(indexMetaData); for (IndexShardRoutingTable shardRoutingTable : indexRoutingTable) { int shardId = shardRoutingTable.shardId().id(); shards.put(shardId, new ClusterShardHealth(shardId, shardRoutingTable)); } // update the index status status = ClusterHealthStatus.GREEN; for (ClusterShardHealth shardHealth : shards.values()) { if (shardHealth.isPrimaryActive()) { activePrimaryShards++; } activeShards += shardHealth.getActiveShards(); relocatingShards += shardHealth.getRelocatingShards(); initializingShards += shardHealth.getInitializingShards(); unassignedShards += shardHealth.getUnassignedShards(); if (shardHealth.getStatus() == ClusterHealthStatus.RED) { status = ClusterHealthStatus.RED; } else if (shardHealth.getStatus() == ClusterHealthStatus.YELLOW && status != ClusterHealthStatus.RED) { // do not override an existing red status = ClusterHealthStatus.YELLOW; } } if (!validationFailures.isEmpty()) { status = ClusterHealthStatus.RED; } else if (shards.isEmpty()) { // might be since none has been created yet (two phase index creation) status = ClusterHealthStatus.RED; } }
基于索引,决定集群的状态。
public ClusterStateHealth(ClusterState clusterState, String[] concreteIndices) { RoutingTableValidation validation = clusterState.routingTable().validate(clusterState.metaData()); validationFailures = validation.failures(); numberOfNodes = clusterState.nodes().size(); numberOfDataNodes = clusterState.nodes().dataNodes().size(); for (String index : concreteIndices) { IndexRoutingTable indexRoutingTable = clusterState.routingTable().index(index); IndexMetaData indexMetaData = clusterState.metaData().index(index); if (indexRoutingTable == null) { continue; } ClusterIndexHealth indexHealth = new ClusterIndexHealth(indexMetaData, indexRoutingTable); indices.put(indexHealth.getIndex(), indexHealth); } status = ClusterHealthStatus.GREEN; for (ClusterIndexHealth indexHealth : indices.values()) { activePrimaryShards += indexHealth.getActivePrimaryShards(); activeShards += indexHealth.getActiveShards(); relocatingShards += indexHealth.getRelocatingShards(); initializingShards += indexHealth.getInitializingShards(); unassignedShards += indexHealth.getUnassignedShards(); if (indexHealth.getStatus() == ClusterHealthStatus.RED) { status = ClusterHealthStatus.RED; } else if (indexHealth.getStatus() == ClusterHealthStatus.YELLOW && status != ClusterHealthStatus.RED) { status = ClusterHealthStatus.YELLOW; } } if (!validationFailures.isEmpty()) { status = ClusterHealthStatus.RED; } else if (clusterState.blocks().hasGlobalBlock(RestStatus.SERVICE_UNAVAILABLE)) { status = ClusterHealthStatus.RED; } // shortcut on green if (status.equals(ClusterHealthStatus.GREEN)) { this.activeShardsPercent = 100; } else { List shardRoutings = clusterState.getRoutingTable().allShards(); int activeShardCount = 0; int totalShardCount = 0; for (ShardRouting shardRouting : shardRoutings) { if (shardRouting.active()) activeShardCount++; totalShardCount++; } this.activeShardsPercent = (((double) activeShardCount) / totalShardCount) * 100; } }
理解health api, 需要理解clusterState。 好在这些都是只读的信息,不难理解。
状态
副本
索引
集群
分配
核心
健康
也就是
也就是说
代表
信息
字段
数据
节点
路由
都都
笔记
学习
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
impdp导入数据库
软件开发人天评估
互联网科技壁纸高清
数据库系统的教学目标
sel数据库批量操作
数据库的并发能力分析
苹果新手机发生服务器连接问题
服务器就是消息队列
海康存储服务器密码
开源代理服务器 windows
数字星空网络技术有限公司
网络安全主管工作权限
gis地图数据库
网络安全核心技术关键领域
手机开发人员数据库
微博开发数据库分析
视频服务器ir指示灯什么意思
浦东新区管理软件开发销售电话
移动光纤没有服务器
中美网络技术对比
数据库查询记录筛选日期
数据库系统降低了部分数据冗余
工业控制网络安全重大事故
网络安全工程师证认证
数据库表建外建优缺点
软件开发哪个外包比较大
医院信息网络安全情况汇报
哈尔滨软件开发中专
不属于网络安全服务的
能率的服务器