ElasticSearch集群以及简单的JavaAPI操作
ES集群配置
ES集群的简介以及重要的配置项
一个集群由一个唯一的名字来标识,名字默认为elasticsearch,一个节点只能通过指定一个集群的名字来加入集群。
ES重要配置项的多种配置方式
默认情况下,ES集群中的每一个节点都有成为主节点的资格,也都存储数据,也提供
查询服务。主要由2个属性来控制
- node.master表示节点是否有成为主节点的资格
- node.data表示节点是否存储数据
- node.ingest 标识节点是否可以作为预处理节点
组合一:此节点既可以成为主节点,可以存储数据,可以作为预处理节点
ES的默认配置,在实际生产环境中肯定不能这样(因为一个节点如果这三个功能都有,压力会很大)
node.master: true
node.data: true
node.ingest: true
组合二:data节点
这个节点没有成为主节点的资格,也就不参与选举,只会存储数据。
node.master: false
node.data: true
node.ingest: false
组合三:master节点
不会存储数据,有成为主节点的资格,可以参与选举.
node.master: true
node.data: false
node.ingest: false
组合四:client节点
这个节点即不会成为主节点,也不会存储数据,主要用于负载均衡
node.master: false
node.data: false
node.ingest: true
组合五:只能查询的节点
node.master: false
node.data: false
node.ingest: false
ES集群(3台)简单配置
节点1:
#es会自动发现在同一网段下的es,所有节点都要填他
cluster.name: test
#节点名称,要唯一
node.name: test130
node.master: true
node.data: true
#节点的ip,填了这个也可以使用外网访问
network.host: 192.168.237.130
http.port: 9200
transport.tcp.port: 9300
#集群的ip+端口
discovery.zen.ping.unicast.hosts: ["192.168.237.130:9300","192.168.237.131:9300", "192.168.237.132:9300"]
discovery.zen.minimum_master_nodes: 2
节点2:
#es会自动发现在同一网段下的es,所有节点都要填他
cluster.name: test
#节点名称,要唯一
node.name: test131
node.master: true
node.data: true
#节点的ip,填了这个也可以使用外网访问
network.host: 192.168.237.131
http.port: 9200
transport.tcp.port: 9300
#集群的ip+端口
discovery.zen.ping.unicast.hosts: ["192.168.237.130:9300","192.168.237.131:9300", "192.168.237.132:9300"]
discovery.zen.minimum_master_nodes: 2
节点3:
#es会自动发现在同一网段下的es,所有节点都要填他
cluster.name: test
#节点名称,要唯一
node.name: test132
node.master: true
node.data: true
#节点的ip,填了这个也可以使用外网访问
network.host: 192.168.237.132
http.port: 9200
transport.tcp.port: 9300
#集群的ip+端口
discovery.zen.ping.unicast.hosts: ["192.168.237.130:9300","192.168.237.131:9300", "192.168.237.132:9300"]
discovery.zen.minimum_master_nodes: 2
说明:
为何集群的端口用的是9300而不是9200:
- 9200端口:ES节点与外部通信使用的端口,作为Http的Restful接口,用于CRUD操作
- 9300端口:ES节点之间使用的端口,是tcp通信端口,集群间的交流以及java客户端操作,都使用9300.
配置完后,依次开启3台机器的 ES服务即可。
集群状态查看:http://192.168.237.130:9200/_cat/health?v
端口9200确实开了的情况下,解决无法访问外网的问题。
这里在唠叨下,因为自己遇到这个坑(我配置ES的时候,虚机是刚下载的镜像,有很多坑)
如果说,ES服务确确实实打开了,9200,9300端口都开了(可以用命令netstat -nlp查看),但是外网就是访问不了ip+9200,可以排查以下原因:
- SELINUX是否设置为disabled
- 虚机的防火墙是否关闭
问题一的解决:
vim /etc/sysconfig/selinux
将SELINUX=enforcing 改为 SELINUX=disabled
问题二的解决:
- 查看防火墙service firewalld status
- 关闭防火墙service firewalld stop(暂时的)
- 开启防火墙service firewalld start
- 永久关闭防火墙service firewalld disable(用这种)
以上两种原因排查后,再看看外网能否访问成功。
ES简单的JavaAPI操作
注意,如果要用api操作ES,对应jar包的版本和ES版本要对应上,否则会报错,我用的ES版本是6.0.0.
链接: https://pan.baidu.com/s/1cZA3szFPXaIp5SOX_JrS9A
密码: gjp9
pom文件:
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.12.1</version>
</dependency>
插入数据:
@org.junit.Test
public void testInsert() throws Exception {
// ES的配置文件,这里配置集群名称即可
Settings settings = Settings.builder().put("cluster.name", "ljj").build();
// ES的客户端创建
TransportClient client = new PreBuiltTransportClient(settings)
.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.237.130"), 9300));
// ES的数据一般都通过XContentFactory.jsonBuilder()的方式区创建一个文档
// 文档的内容由startObject标识开始,endObject标识结束
XContentBuilder doc = XContentFactory.jsonBuilder()
.startObject()
.field("id", "2")
.field("name", "hello333")
.field("address", "hz")
.endObject();
IndexResponse response = client.prepareIndex("test", "test_type", "99")
.setSource(doc).get();
System.out.println(response.status());
client.close();
}
查询数据:
@org.junit.Test
public void testSelect() throws Exception {
//1.创建一个Setting对象,相当于是一个配置信息,主要是配置集群的名称
Settings settings = Settings.builder()
.put("cluster.name", "ljj")
.build();
//2.创建一个客户端Client对象
PreBuiltTransportClient client = new PreBuiltTransportClient(settings);
client.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.237.130"), 9300));
GetResponse response = client.prepareGet("test", "test_type", "99").get();
System.out.println(response.getSourceAsString());
//4.关闭client对象
client.close();
}
删除数据:
@org.junit.Test
public void testDelete() throws Exception {
//1.创建一个Setting对象,相当于是一个配置信息,主要是配置集群的名称
Settings settings = Settings.builder()
.put("cluster.name", "ljj")
.build();
//2.创建一个客户端Client对象
PreBuiltTransportClient client = new PreBuiltTransportClient(settings);
client.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.237.130"), 9300));
DeleteResponse response = client.prepareDelete("test", "test_type", "2").get();
System.out.println(response.status());
//4.关闭client对象
client.close();
}
修改数据:
@org.junit.Test
public void testUpdate() throws Exception {
Settings settings = Settings.builder().put("cluster.name", "ljj").build();
TransportClient client = new PreBuiltTransportClient(settings)
.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.237.130"), 9300));
UpdateRequest request = new UpdateRequest();
request.index("test")
.type("test_type")
.index("99")
.doc(
XContentFactory.jsonBuilder().startObject()
.field("address", "sh")
.endObject()
);
UpdateResponse response = client.update(request).get();
System.out.println(response.status());
client.close();
}