环境: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()方法的取值逻辑
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 }