最近一直在研究ES集群,也看了很多篇前辈们总结的博客,同事借鉴了官方给出的一些建议,做了一下几点总结,希望对后来者有用:
1、内存交换。为了防止ES进程的内存被置换到磁盘上(会导致在检索的时候发生内存交换导致检索速度迟缓)引起性能急速下降。在启动ES的时
候可以把config/elasticsearch.yml中的bootstrap.mlockall设置为true就可以了。
2、节点的细分。在官方文档中,主要定义了master node 、data node 、client node 、tribe node、coordinating node,他们之间的协调工作,才能使
集群节点更好的工作。(需要仔细研究,多搭建几个节点测试下)。
master node:配置 node.master : true node.data : false
1)当master为false,而data为true时,会对该节点产生严重负荷;
2)当master为true,而data为false时,该节点作为一个协调者;
3)当master为false,data也为false时,该节点就变成了一个负载均衡器。
3 索引刷新。每次在进行一次document操作的时候,有两个可选项,在索引(动词,理解为插入一条document)之后刷新,在查询(同上)之前刷
新,在索引之后刷新,会牺牲索引的效率(每次插入document都额外的进行刷新),在查询之前刷新会牺牲查询的效率(查询之前会额外的进行刷新)。这两种方式虽然都可以让我们每次查到的数据都是实时性的,但是效率特别的低下,因此我们正常情况可以采用定时刷新的方式,即每次间隔一秒刷新一次(时间可以自己定)。在创建构建客户端的时候,设置index.refresh_interval为想要的数值即可。如:1s,也可以在elasticsearch中配置index.refresh_interval:1s
4 内存分配。es在内存分配上官方给的内存最大不超过32G(和os有关,超过32G,指针会变长,增加cpu压力),一般为机器内存的50%即可,剩下
的会交给lucene,Lucene的设计目的是把底层OS里的数据缓存到内存中。Lucene的段是分别存储到单个文件中的,这些文件都是不会变化的,所以很利于缓存,同时操作系统也会把这些段文件缓存起来,以便更快的访问。
5 分片数量。ES在创建索引的时候默认的分片大小是5。我们可以在创建索引的时候指定分片数量。注意:分片一旦确定,就没法更改。这是因为
Es在创建分片之后,每次索引(动词)都会使用一个算法
shard= hash(routing) % number_of_primary_shards
来确定存储在哪一个分片上,如果更改分片的数量,那么之前所有的document都将无效。没法被routing。
官方给的建议:每个node上的分片数量不超过3个,因此我们如果想要更多的分片只能通过增加节点的方式。
分片不宜过大,也不宜过小。具体可以参考官网的文档和压力测试的结果来设定大小。
为了导入数据更快,可以在创建索引的时候把复制分片设置为0.导入数据结束之后再设置为想要的值。
6 routing。Elasticsearch的路由机制和它的分片机制有相似的地方,他们都是使用的hash算法。将具有相同hash值得文档放在一起。
情景分析:如果poi将全国所有的店面的信息放在es中,如果我们不指定路由,es会随机的将所有的文档存入分片中(数据很大,所以我们需要不止5个分片),现在我们想要查询上海地区所有的poi信息,es的做法是master收到请求,然后广播,每个节点查询数据,然后将数据交给通道节点合并,排序交给用户。这个会严重增加es的节点压力,网络负载。如果我们在查询的时候能明确的知道上海的poi数据在某一个节点上,我们只需要在查询的时候指定routing,es就会在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索引的数据全部分配到big和medium节点
}
PUT test/_settings
{
"index.routing.allocation.exclude.size": "small" #与上面相反,把test索引的数据全部移除small节点
}
7 导入。在导入数据的时候建议先把副本设置为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"
}
}'
记得在索引之后改回来,不然之前索引的数据都没法查询。
8 节点状态监控。
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 人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐