ElasticSearch 问题分析:No data nodes with HTTP-enabled available

摘要:
node.isData()){9it.remove();10}11}12返回节点;13} 1415//获取http node_ Nodes/http16publicList<NodeInfo>getHttpNodes{17//使用es接口“_Nodes/http”获取节点18Map<String,Map<String、Object>>nodesData=Get;19List<NodeInfo˃Nodes=newArrayList<NodeInfo>();2021用于{22NodeInfonode=newNodeInfo;23//如果您不在查找客户端节点,则只要该节点正在运行网络访问,就可以添加;如果您在查找客户端,则必须通过isClient身份验证才能添加24if(node.hasHttp()&&(!clientNodeOnly | | node.isClient())){25node.add;26}27}28个returnnodes;29}ViewCode最后,让我们看看node的方法1privatefinalStringid。hasHttp()、isClient()和isData();2privatefinalStringname;3privatefinalStringhost;4个私有字符串;5私有最终字符串发布地址;6个私人财务公司;Http;7私人金融机构客户;8私人财务报表数据;9私生子Ingest;1011PublicNodeInfo{12this.id=id;13EsMajorVersion=EsMajorVersion.parse;14this.name=map.get;15this.host=map.gget;16this.ip=map.got;17//5.0下的分支18如果{19Map<String,Object>attributes=map.gt;20if{21this.isClient=false;22this.isData=true;23}其他{24Stringdata=attributes.get;25this.isClient=data=null?

环境:ES-5.4.0版本,部署方式:3master node+2client node+3data node

说明:data node和client node都配置了http.enabled: false,程序在写数据时报错:No data nodes with HTTP-enabled available

源码分析:

 1 public static void filterNonDataNodesIfNeeded(Settings settings, Log log) {
 2     if (!settings.getNodesDataOnly()) {
 3         return;
 4     }
 5 
 6     RestClient bootstrap = new RestClient(settings);
 7     try  {
 8         String message = "No data nodes with HTTP-enabled available";
 9         List<NodeInfo> dataNodes = bootstrap.getHttpDataNodes();
10     // 找不到dataNodes就会报错
11         if (dataNodes.isEmpty()) {
12             throw new EsHadoopIllegalArgumentException(message);
13         }
14         ...
15     } finally {
16         bootstrap.close();
17     }
18 }

接下来看看RestClient.getHttpDataNodes()方法的取值逻辑

ElasticSearch 问题分析:No data nodes with HTTP-enabled available第1张ElasticSearch 问题分析:No data nodes with HTTP-enabled available第2张
 1 public List<NodeInfo> getHttpDataNodes() {
 2     List<NodeInfo> nodes = getHttpNodes(false);
 3   // 遍历上面获取到的节点
 4     Iterator<NodeInfo> it = nodes.iterator();
 5     while (it.hasNext()) {
 6         NodeInfo node = it.next();
 7     // 如果不是数据节点,则移除
 8         if (!node.isData()) {
 9             it.remove();
10         }
11     }
12     return nodes;
13 }
14 
15 // 获取http节点_nodes/http
16 public List<NodeInfo> getHttpNodes(boolean clientNodeOnly) {
17   // 通过es接口“_nodes/http”来获取nodes的信息
18     Map<String, Map<String, Object>> nodesData = get("_nodes/http", "nodes");
19     List<NodeInfo> nodes = new ArrayList<NodeInfo>();
20 
21     for (Entry<String, Map<String, Object>> entry : nodesData.entrySet()) {
22         NodeInfo node = new NodeInfo(entry.getKey(), entry.getValue());
23     // 如果不是查找client节点,则只要节点运行网络访问就可以add了;如果查找client节点,则还要通过isClient验证才能add
24         if (node.hasHttp() && (!clientNodeOnly || node.isClient())) {
25             nodes.add(node);
26         }
27     }
28     return nodes;
29 }
View Code

 最后再来看看node.hasHttp(),isClient(),isData()的方法

ElasticSearch 问题分析:No data nodes with HTTP-enabled available第3张ElasticSearch 问题分析:No data nodes with HTTP-enabled available第4张
 1     private final String id;
 2     private final String name;
 3     private final String host;
 4     private final String ip;
 5     private final String publishAddress;
 6     private final boolean hasHttp;
 7     private final boolean isClient;
 8     private final boolean isData;
 9     private final boolean isIngest;
10 
11     public NodeInfo(String id, Map<String, Object> map) {
12         this.id = id;
13         EsMajorVersion version = EsMajorVersion.parse((String) map.get("version"));
14         this.name = (String) map.get("name");
15         this.host = (String) map.get("host");
16         this.ip = (String) map.get("ip");
17     // 5.0以下版本的分支
18         if (version.before(EsMajorVersion.V_5_X)) {
19             Map<String, Object> attributes = (Map<String, Object>) map.get("attributes");
20             if (attributes == null) {
21                 this.isClient = false;
22                 this.isData = true;
23             } else {
24                 String data = (String) attributes.get("data");
25                 this.isClient = data == null ? true : !Boolean.parseBoolean(data);
26                 this.isData = data == null ? true : Boolean.parseBoolean(data);
27             }
28             this.isIngest = false;
29     // 5.0版本以上的分支
30         } else {
31             List<String> roles = (List<String>) map.get("roles");
32       // 如果roles列表中不包含"data",则此节点是client
33             this.isClient = roles.contains("data") == false;
34       // 如果roles列表中包含"data",则此节点是data
35             this.isData = roles.contains("data");
36       // 如果roles列表中包含"ingest",则此节点是ingest
37             this.isIngest = roles.contains("ingest");
38         }
39         Map<String, Object> httpMap = (Map<String, Object>) map.get("http");
40     // 如果节点数据中包含key:http
41         if (httpMap != null) {
42             String addr = (String) httpMap.get("publish_address");
43       // 如果http数据中包含key:publish_address
44             if (addr != null) {
45                 StringUtils.IpAndPort ipAndPort = StringUtils.parseIpAddress(addr);
46                 this.publishAddress = ipAndPort.ip + ":" + ipAndPort.port;
47         // 则此节点可以提供http服务,即:http.enabled: true
48                 this.hasHttp = true;
49             } else {
50                 this.publishAddress = null;
51                 this.hasHttp = false;
52             }
53         } else {
54             this.publishAddress = null;
55             this.hasHttp = false;
56         }
57     }
View Code

 从上面的源码分析可以得出:如果一个data节点不配置http.enabled:true,则此节点不会被getHttpDataNodes()方法搜索到,那么就会直接抛出异常:No data nodes with HTTP-enabled available

解决的方法无非两种:

第一:数据节点配置 http.enabled:true

第二:绕过filterNonDataNodesIfNeeded()校验,需要settings.getNodesDataOnly()返回false;看下面源码可知,默认es.nodes.data.only是true,在客户端中将其设置为false即可。

ElasticSearch 问题分析:No data nodes with HTTP-enabled available第5张ElasticSearch 问题分析:No data nodes with HTTP-enabled available第6张
 1 /** Clients only */
 2 String ES_NODES_CLIENT_ONLY = "es.nodes.client.only";
 3 String ES_NODES_CLIENT_ONLY_DEFAULT = "false";
 4 
 5 /** Data only */
 6 String ES_NODES_DATA_ONLY = "es.nodes.data.only";
 7 String ES_NODES_DATA_ONLY_DEFAULT = "true";
 8 
 9 /** Ingest only */
10 String ES_NODES_INGEST_ONLY = "es.nodes.ingest.only";
11 String ES_NODES_INGEST_ONLY_DEFAULT = "false";
12 
13 /** WAN only */
14 String ES_NODES_WAN_ONLY = "es.nodes.wan.only";
15 String ES_NODES_WAN_ONLY_DEFAULT = "false";
16 
17 ...
18 
19 public boolean getNodesDataOnly() {
20     // by default, if not set, return a value compatible with the other settings
21   // 默认es.nodes.data.only是true,在客户端中将其设置为false即可
22     return Booleans.parseBoolean(getProperty(ES_NODES_DATA_ONLY), !getNodesWANOnly() && !getNodesClientOnly() && !getNodesIngestOnly());
23 }
24 
25 public boolean getNodesIngestOnly() {
26     return Booleans.parseBoolean(getProperty(ES_NODES_INGEST_ONLY, ES_NODES_INGEST_ONLY_DEFAULT));
27 }
28 
29 public boolean getNodesClientOnly() {
30     return Booleans.parseBoolean(getProperty(ES_NODES_CLIENT_ONLY, ES_NODES_CLIENT_ONLY_DEFAULT));
31 }
32 
33 public boolean getNodesWANOnly() {
34     return Booleans.parseBoolean(getProperty(ES_NODES_WAN_ONLY, ES_NODES_WAN_ONLY_DEFAULT));
35 }
View Code

 最后附上一段"_nodes/http"接口的返回值:

ElasticSearch 问题分析:No data nodes with HTTP-enabled available第7张ElasticSearch 问题分析:No data nodes with HTTP-enabled available第8张
"nodes": {
    "YgwRm4j1RwiK3jjDHY8Hzw": {
      "name": "node-02",
      "transport_address": "192.168.100.10:9300",
      "host": "192.168.100.10",
      "ip": "192.168.100.10",
      "version": "5.4.0",
      "build_hash": "780f8c4",
      "roles": [
        "master",
        "ingest"
      ],
      "attributes": {
        "ml.enabled": "true"
      },
      "http": {
        "bound_address": [
          "192.168.100.10:9200"
        ],
        "publish_address": "192.168.100.10:9200",
        "max_content_length_in_bytes": 104857600
      }
    }
    ...
}
View Code

免责声明:文章转载自《ElasticSearch 问题分析:No data nodes with HTTP-enabled available》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇elasticsearch 高级搜索示例 es7.0.net表达式计算器(中缀表达式转后缀表达式,支持20多个数学函数,支持函数嵌套)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

块状链表[ext/rope]

2008年OI集训论文上有介绍<对块状链表的一点研究>,其主要是结合了链表和数组各自的优点,链表中的节点指向每个数据块,即数组,并且记录数据的个数,然后分块查找和差入。在g++头文件中,<ext/rope>中有成型的块状链表,在using namespace __gnu_cxx;空间中,其操作十分方便。 基本操作: rope lis...

鸢尾花种类预测--数据集

1 案例:鸢尾花种类预测 Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。关于数据集的具体介绍: 2 scikit-learn中数据集介绍 2.1 scikit-learn数据集API介绍 sklearn.datasets 加载获取流行数据集 datasets.load_...

asp.net分割字符串的几种方法

在编写程序中,经常要用到分割的方法来处理一些字符串。这里总结了几种常用的分割方法: 1、最简单最常用的方法,以一个指定的字符进行的分割 string s="abcdeabcdeabcde";string[] sArray=s.Split('c');foreach(string i in sArray)Console.WriteLine(i.ToString...

WebSocket实时消息推送

最近在项目中,使用到了WebSocket来实时推送服务器的数据到客户端,今天来记录总结一下。 想要使用WebSocket来实时推送数据,首先需要服务器与客户端直接建立连接,也就是握手(HTTP协议) 每5秒钟发生一个心跳@Scheduled(cron = "0/5 * * * * ? ") public void sendHeart() {...

FastAPI 学习之路(四十九)WebSockets(五)修复接口测试中的问题

其实代码没有问题,但是我们忽略了一点,就是我们在正常的开发中,肯定是遇到这样的情况,我们频繁的有客户端链接,断开链接,我们需要统一的管理起来,那么我们应该如何去管理呢,其实这个时候,我们要去声明一个类去管理我们的这些链接。我们应该如何优化呢。 定义一个链接管理类,处理我们所有的链接。 classConnectionManager: def __in...

c#根据标题判断进程是否存在,是否已退出

 int handle = FindWindow(null, "XXX");  if (handle == 0)//0说明不存在 [DllImport("User32.dll", EntryPoint = "FindWindow")] private static extern int FindWindow(string lpClassName, stri...