ES优化总结

来源:互联网 发布:nginx rtmp win 下载 编辑:程序博客网 时间:2024/06/06 14:01

最近一直在研究ES集群,也看了很多篇前辈们总结的博客,同事借鉴了官方给出的一些建议,做了一下几点总结,希望对后来者有用:


1、内存交换。为了防止ES进程的内存被置换到磁盘上(会导致在检索的时候发生内存交换导致检索速度迟缓)引起性能急速下降。在启动ES的时

候可以把config/elasticsearch.yml中的bootstrap.mlockall设置为true就可以了。

 

2、节点的细分。在官方文档中,主要定义了master nodedata nodeclient nodetribe nodecoordinating node,他们之间的协调工作,才能使

集群节点更好的工作。(需要仔细研究,多搭建几个节点测试下)。

master node:配置 node.master : true     node.data : false

1)当master为false,而data为true时,会对该节点产生严重负荷;

2)当master为true,而data为false时,该节点作为一个协调者;

3)当master为false,data也为false时,该节点就变成了一个负载均衡器。

 

索引刷新。每次在进行一次document操作的时候,有两个可选项,在索引(动词,理解为插入一条document)之后刷新,在查询(同上)之前刷

新,在索引之后刷新,会牺牲索引的效率(每次插入document都额外的进行刷新),在查询之前刷新会牺牲查询的效率(查询之前会额外的进行刷新)。这两种方式虽然都可以让我们每次查到的数据都是实时性的,但是效率特别的低下,因此我们正常情况可以采用定时刷新的方式,即每次间隔一秒刷新一次(时间可以自己定)。在创建构建客户端的时候,设置index.refresh_interval为想要的数值即可。如:1s,也可以在elasticsearch中配置index.refresh_interval:1s

 

4 内存分配。es在内存分配上官方给的内存最大不超过32G(和os有关,超过32G,指针会变长,增加cpu压力),一般为机器内存的50%即可,剩下

的会交给lucene,Lucene的设计目的是把底层OS里的数据缓存到内存中。Lucene的段是分别存储到单个文件中的,这些文件都是不会变化的,所以很利于缓存,同时操作系统也会把这些段文件缓存起来,以便更快的访问。

 

分片数量。ES在创建索引的时候默认的分片大小是5。我们可以在创建索引的时候指定分片数量。注意:分片一旦确定,就没法更改。这是因为

Es在创建分片之后,每次索引(动词)都会使用一个算法

shard= hash(routing) % number_of_primary_shards

来确定存储在哪一个分片上,如果更改分片的数量,那么之前所有的document都将无效。没法被routing

官方给的建议:每个node上的分片数量不超过3个,因此我们如果想要更多的分片只能通过增加节点的方式。

分片不宜过大,也不宜过小。具体可以参考官网的文档和压力测试的结果来设定大小。

为了导入数据更快,可以在创建索引的时候把复制分片设置为0.导入数据结束之后再设置为想要的值。

 

routingElasticsearch的路由机制和它的分片机制有相似的地方,他们都是使用的hash算法。将具有相同hash值得文档放在一起。

情景分析:如果poi将全国所有的店面的信息放在es中,如果我们不指定路由,es会随机的将所有的文档存入分片中(数据很大,所以我们需要不止5个分片),现在我们想要查询上海地区所有的poi信息,es的做法是master收到请求,然后广播,每个节点查询数据,然后将数据交给通道节点合并,排序交给用户。这个会严重增加es的节点压力,网络负载。如果我们在查询的时候能明确的知道上海的poi数据在某一个节点上,我们只需要在查询的时候指定routinges就会在routing指定的节点上查询,就可以避免不必要的资源浪费。也可以提高查询的速度。

我们可以在添加数据的时候指定某一个相同值得字段放在一起,比如上海的cityid=1,我们可以使用以下命令

Curl -XPUT localhost:9200/store/poi?routing=cityId -d '{

"cityId":"1",

"cityName":"上海"

}'

PUT test/_settings
{
 "index.routing.allocation.include.size":"big,medium"
#这个是把test索引的数据全部分配到bigmedium节点
}

PUT test/_settings
{
 "index.routing.allocation.exclude.size": "small"
#与上面相反,把test索引的数据全部移除small节点
}

 

 

导入。在导入数据的时候建议先把副本设置为0.待导入完毕之后再设置为需要的数据。

curl -XPUT '192.168.5.112:9200/qinzi/_settings?pretty' -d '
{
    "index" : {
        "number_of_replicas" :
1
    }
}'

导入的时候先把刷新的时间设置为-1(这样在索引的时候,数据对搜索不可见,就是在索引的时候,数据是没法实时查询的),等到索引结束之后,在设置为想要的时间,这个值可以可以通过api设置

curl -XPUT localhost:9200/test/_settings-d '{
    "index" : {
        "refresh_interval" :"
-1"
    }
}'

记得在索引之后改回来,不然之前索引的数据都没法查询。

 

节点状态监控。

 

9   segments优化 ES是基于lucene的,

curl -XPOST192.168.5.112:9200/baidu/_forcemerge?max_num_segments=1(强制性的把segments变为1)在合并的时候需要预留足够的磁盘空间,因为segments合并时候是采用一定的策略,把segments合并,但是旧的还会暂时存在的。

curl -XPOST 192.168.5.112:9200/baidu/_optimize?max_num_segments=1

0 0
原创粉丝点击