为什么80%的码农都做不了架构师?>>>
要连接到集群,首先要告诉集群:你是谁,你有什么特征。在 ES 中体现为实例化节点。
ES 通过 org.elasticsearch.node.NodeBuilder 的 build() 或者 node() 方法实例化节点,build() 创建节点而不启动,而 node() 方法等价于 build().start() ,即 创建并启动。
首先实例化 NodeBuilder ,有两种方式,第一种是 new, 如下:
NodeBuilder nodeBuilder = new NodeBuilder();
第二种使用 NodeBuilder 的工厂方法,NodeBuilder 中有以下方法
public static NodeBuilder nodeBuilder(){return new NodeBuilder();
}
所以可以直接通过以下代码实例化 NodeBuilder:
NodeBuilder nodeBuilder = NodeBuilder.nodeBuilder();
实例化后便可设置该 node 的特性,NodeBuilder 本身自带了一些方法:
1、loadConfigSettings ,是否家在配置文件。
你可以在 classpathx 下 创建一个 elasticsearch.yml 文件,然后再其中设置一些属性(参见分布式搜索Elasticsearch——配置) ,再把 loadConfigSettings 的值设置为 true 即可,代码如下
NodeBuilder nodeBuilder = NodeBuilder.nodeBuilder().loadConfigSettings(true);
loadConfigSettings 默认为 true.
2、是否只作为客户端,即不存储索引数据,默认值为false 代码如下所示:
NodeBuilder nodeBuilder = NodeBuilder.nodeBuilder().client(true);
3、是否持有索引数据,默认值为 true,代码如下所示:
NodeBuilder nodeBuilder = NodeBuilder.nodeBuilder().data(true);
client(boolean) 和 data(boolean) 是有一定关联的,
当 client 为 true 时候, data 默认值为 false,且不能改为 true,否则会报错。
当 client 为 false 时候,data 默认值为 true,而且改为 false 也不起作用,也就是下面代码等价:
NodeBuilder nodeBuilder = NodeBuilder.nodeBuilder().data(true).client(false);
NodeBuilder nodeBuilder = NodeBuilder.nodeBuilder().data(false).client(false);
4、是否为 本地节点,本地节点是指在 JVM 级别中的统计,当多个节点使用同一个 JVM 时,这些节点可以组合成一个集群,而非同一个 JVM 下的节点则不处于集群中,默认值为 false:
NodeBuilder nodeBuilder = NodeBuilder.nodeBuilder().local(true);
5、设置集群名,即该节点位于哪个集群下,默认值elasticsearch:
NodeBuilder nodeBuilder = NodeBuilder.nodeBuilder().clusterName(your name");
若多个节点设置了同一个 clusterName,则说明这几个节点位于同一个集群下。
6、以 Map 的方式设置属性,NodeBuilder 中有以下两个方法:
/*** Explicit node settings to set*/
public NodeBuilder settings(Settings.Builder settings){return settings(settings.build());
}/*** Explicit node settings set*/
public NodeBuilder settings(Settings settings){this.settings.put(settings);return this;
}
这两个方法允许通过 Map 的方法设置属性,如下代码所示:
Map<String,String> settingsMap = new HashMap<String,String>();
settingsMap.put("node.client","false");
settingsMap.put("node.data","true");
settingsMap.put("node.local","true");
settingsMap.put("cluster.name","clusterName");
settingsMap.put("node.name","geloin");Settings settings = ImmutableSettings.settingsBuilder().put(settingsMap).build();
Node node = NodeBuilder.nodeBuilder().settings(settings).node();
org.elasticsearch.common.settings.Settings 是一个接口,
org.elasticsearch.common.settings.ImmutableSettings 才是它的实现类。
上一篇文章 分布式搜索 Elasticsearch —— 配置 说了一些 ES 的配置,可以在上述的代码中的 map 中设置。
综上所述,我们对设置 Node 的属性有以下结论:
1、使用配置文件,即在 classpath 下建立 elasticsearch.yml 文件,然后把 分布式搜索 Elasticsearch —— 配置 李曼提到的配置加入到此文件中,再保持 loadConfigSettings为 true 即可;
2、使用 Map 方式,然后用 NodeBuilder.nodeBuilder().settings(settings);
3、使用 NodeBuilder 自带了 client 、data、local、clusterName 方法,不过 NodeBuilder 自带方法有限,所以可能还需要配合以上提到的两种方式才能达到要求。