一、概念
1、集群和节点
节点(node)是你运行的Elasticsearch实例。一个集群(cluster)是一组具有相同cluster.name的节点集合,他们协同工作,共享数据并提供故障转移和扩展功能,当有新的节点加入或者删除节点,集群就会感知到并平衡数据。集群中一个节点会被选举为主节点(master),它用来管理集群中的一些变更,例如新建或删除索引、增加或移除节点等;当然一个节点也可以组成一个集群。
2、结点通信
我们能够与集群中的任何节点通信,包括主节点。任何一个节点互相知道文档存在于哪个节点上,它们可以转发请求到我们需要数据所在的节点上。我们通信的节点负责收集各节点返回的数据,最后一起返回给客户端。这一切都由Elasticsearch透明的管理。
3、索引分片
分片用于Elasticsearch在你的集群中分配数据。想象把分片当作数据的容器。文档存储在分片中,然后分片分配给你集群中的节点上。当你的集群扩容或缩小,Elasticsearch将会自动在你的节点间迁移分片,以使集群保持平衡。分片数量只能在索引创建前指定,并且索引创建后不能更改。
4、索引副本
提高系统的容错性,当某个结点的某个分片损坏时,可以从副本中恢复,所以副本分片和源分片不会放在同一节点上。
提高系统查询效率,Elasticsearch会自动对搜索请求进行负载均衡。
5、分片与副本交互
新建、索引和删除请求都是写(write)操作,它们必须在主分片上成功完成才能复制到相关的复制分片上,同步方式的一般步骤如下:
1)客户端给Node_1发送新建、索引或删除请求。
2)节点使用文档的_type和_id确定文档属于分片0。它转发请求到拥有分片0的节点Node_3上。
3)Node_3在主分片上执行请求,如果成功,它转发请求到相应的位于Node_1和Node_2的复制节点上。当所有的复制节点报告成功,Node_3报告成功到请求的节点,请求的节点再报告给客户端。
注意:副本的默认值是同步(sync),即允许Elasticsearch强制反馈传输,客户端接收到成功响应的时候,文档的修改已经被应用于主分片和所有的复制分片,你的修改生效了。而异步(async)复制依旧会转发请求给复制节点,但你将不知道复制节点成功与否,并且可能会因为在不等待其它分片就绪的情况下发送过多的请求而使Elasticsearch过载。
二、配置优化
1、routing优化
正常情况下,索引是根据type和id通过hash取模的方式来存储到不同的shard里面的,查询的时候则是在整个shard组里面做的,即每个shard都要参与查询,然后合并各个查询结果,这样会浪费很多查询;而routing就是可以按照一定的规则,建索引的时候,就可以指定数据存放在哪个shard里面,这样查询的时候,同理,通过routing规则就能够保证有的放矢,只在一个shard里面去进行查询,而不是到处撒网,这样不就快多了吗?当然用routing也有缺点,由于索引存放位置由我们自己控制,并且由于routing值不均匀,肯定会造成索引数据不均匀,即某几个shard里面什么数据也没有,某几个shard里面数据扎堆,数据扎堆的shard肯定对性能有影响。
http://localhost:9200/listing/listing/1?routing=1
2、分片优化
分片数过多会导致检索时打开比较多的文件别外也会导致多台服务器之间通讯。而分片数过少为导至单个分片索引过大,所以检索速度慢。单个分片内容最大为20G。
索引分片数 = 数据总量/单分片数(20G)
3、副本优化(副本越多越稳定,索引越慢)
默认同步方式为主分片完成增删改操作后,发送请求到所有副本,等待所有副本完成后,才返回客户端,所以副本越多索引越慢。建议在批量操作索引前,将副本数设置为0,操作完成后,执行Optimize优化操作,最后将副本数调整为合适的个数。
4、索引段优化(索引段越多检索越慢)
ES索引过程中会refresh和tranlog也就是说我们在索引过程中segments number不止一个,segments number越多检索越慢,而将segments numbers 有可能的情况下保证为1这将可以提到将近一半的检索速度。
curl -XPOST 'http://localhost:9200/listing/_optimize?&pretty&max_num_segments=1'
5、删除索引优化
清除删除文档(Lucene中删除文档会存放到.del文件中,所以要手动清除.del文件)
lucene在检索过程会判断是否删除了,如果删除了在过滤掉。这样也会降低检索效率。所以可以执行清除删除文档。
curl -XPOST 'http://localhost:9200/listing/_optimize?pretty&only_expunge_deletes=true'
三、API
elasticsearch支持多种语言的api:如python、ruby、js、java、http等,而我们开发和调试中最常用的api当然是java和http。
elasticsearch api支持的数据格式:json。
四、HTTP API
1、操作工具curl
1)我们可以借助linux下的工具curl来处理http请求,例如:
curl -XPUT 'http://localhost:9200/listing/_settings?pretty' -d '{"index":{"number_of_replicas":0}}'
curl -XPOST 'http://localhost:9200/listing?pretty' -d @listing.conf
curl -XPOST 'http://localhost:9200/listing/listing/_bulk?pretty' --data-binary @listing.
1、集群和节点
节点(node)是你运行的Elasticsearch实例。一个集群(cluster)是一组具有相同cluster.name的节点集合,他们协同工作,共享数据并提供故障转移和扩展功能,当有新的节点加入或者删除节点,集群就会感知到并平衡数据。集群中一个节点会被选举为主节点(master),它用来管理集群中的一些变更,例如新建或删除索引、增加或移除节点等;当然一个节点也可以组成一个集群。
2、结点通信
我们能够与集群中的任何节点通信,包括主节点。任何一个节点互相知道文档存在于哪个节点上,它们可以转发请求到我们需要数据所在的节点上。我们通信的节点负责收集各节点返回的数据,最后一起返回给客户端。这一切都由Elasticsearch透明的管理。
3、索引分片
分片用于Elasticsearch在你的集群中分配数据。想象把分片当作数据的容器。文档存储在分片中,然后分片分配给你集群中的节点上。当你的集群扩容或缩小,Elasticsearch将会自动在你的节点间迁移分片,以使集群保持平衡。分片数量只能在索引创建前指定,并且索引创建后不能更改。
4、索引副本
提高系统的容错性,当某个结点的某个分片损坏时,可以从副本中恢复,所以副本分片和源分片不会放在同一节点上。
提高系统查询效率,Elasticsearch会自动对搜索请求进行负载均衡。
5、分片与副本交互
新建、索引和删除请求都是写(write)操作,它们必须在主分片上成功完成才能复制到相关的复制分片上,同步方式的一般步骤如下:
1)客户端给Node_1发送新建、索引或删除请求。
2)节点使用文档的_type和_id确定文档属于分片0。它转发请求到拥有分片0的节点Node_3上。
3)Node_3在主分片上执行请求,如果成功,它转发请求到相应的位于Node_1和Node_2的复制节点上。当所有的复制节点报告成功,Node_3报告成功到请求的节点,请求的节点再报告给客户端。
注意:副本的默认值是同步(sync),即允许Elasticsearch强制反馈传输,客户端接收到成功响应的时候,文档的修改已经被应用于主分片和所有的复制分片,你的修改生效了。而异步(async)复制依旧会转发请求给复制节点,但你将不知道复制节点成功与否,并且可能会因为在不等待其它分片就绪的情况下发送过多的请求而使Elasticsearch过载。
二、配置优化
1、routing优化
正常情况下,索引是根据type和id通过hash取模的方式来存储到不同的shard里面的,查询的时候则是在整个shard组里面做的,即每个shard都要参与查询,然后合并各个查询结果,这样会浪费很多查询;而routing就是可以按照一定的规则,建索引的时候,就可以指定数据存放在哪个shard里面,这样查询的时候,同理,通过routing规则就能够保证有的放矢,只在一个shard里面去进行查询,而不是到处撒网,这样不就快多了吗?当然用routing也有缺点,由于索引存放位置由我们自己控制,并且由于routing值不均匀,肯定会造成索引数据不均匀,即某几个shard里面什么数据也没有,某几个shard里面数据扎堆,数据扎堆的shard肯定对性能有影响。
http://localhost:9200/listing/listing/1?routing=1
2、分片优化
分片数过多会导致检索时打开比较多的文件别外也会导致多台服务器之间通讯。而分片数过少为导至单个分片索引过大,所以检索速度慢。单个分片内容最大为20G。
索引分片数 = 数据总量/单分片数(20G)
3、副本优化(副本越多越稳定,索引越慢)
默认同步方式为主分片完成增删改操作后,发送请求到所有副本,等待所有副本完成后,才返回客户端,所以副本越多索引越慢。建议在批量操作索引前,将副本数设置为0,操作完成后,执行Optimize优化操作,最后将副本数调整为合适的个数。
4、索引段优化(索引段越多检索越慢)
ES索引过程中会refresh和tranlog也就是说我们在索引过程中segments number不止一个,segments number越多检索越慢,而将segments numbers 有可能的情况下保证为1这将可以提到将近一半的检索速度。
curl -XPOST 'http://localhost:9200/listing/_optimize?&pretty&max_num_segments=1'
5、删除索引优化
清除删除文档(Lucene中删除文档会存放到.del文件中,所以要手动清除.del文件)
lucene在检索过程会判断是否删除了,如果删除了在过滤掉。这样也会降低检索效率。所以可以执行清除删除文档。
curl -XPOST 'http://localhost:9200/listing/_optimize?pretty&only_expunge_deletes=true'
三、API
elasticsearch支持多种语言的api:如python、ruby、js、java、http等,而我们开发和调试中最常用的api当然是java和http。
elasticsearch api支持的数据格式:json。
四、HTTP API
1、操作工具curl
1)我们可以借助linux下的工具curl来处理http请求,例如:
curl -XPUT 'http://localhost:9200/listing/_settings?pretty' -d '{"index":{"number_of_replicas":0}}'
curl -XPOST 'http://localhost:9200/listing?pretty' -d @listing.conf
curl -XPOST 'http://localhost:9200/listing/listing/_bulk?pretty' --data-binary @listing.