Elasticsearch问题以及调优
Elasticsearch脑裂问题分析
- 脑裂问题的图解
- [外链图片转存失败(img-09EzQT3W-1566829347750)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1566822492817.png)]
- 脑裂问题就是在集群环境之中,由于节点之间的通信问题导致节点对集群的状态理解不同,导致es有些查询非常缓慢甚至查询失败
- 最好的解决办法就是重启集群,详细的问题分析可以查看我的博客《Elasticsearch脑裂问题详细分析及解决方案》
Elasticsearch索引模板以及索引名
索引模板index template
-
在我们的工作中,针对一个大批量的数据存储时需要使用多个索引库,如果我们手工去为每个索引库配置信息就很麻烦,所以就有了索引模板,创建一个模板,制定好配置信息,如果我们闯进的索引库匹配到了模板就会使用模板中的配置信息
-
创建模板
-
curl -H "Content-Type: application/json" -XPUT localhost:9200/_template/template_1 -d ' { "template" : "*", "order" : 0, "settings" : { "number_of_shards" : 1 }, "mappings" : { "type1" : { "_source" : { "enabled" : false } } } } 其中的order值是用来进行模板之间的优先级排序的,如果一个索引匹配到多个模板则比较模板的order值,选取最大order值的模板进行配置信息匹配
-
-
查看模板信息 curl -XGET localhost:9200/_template/temp*?pretty
-
删除模板 curl -XDELETE localhost:9200/_template/temp_1
索引别名index alias
-
索引别名就是为索引起一个或者多个别名方便引用
-
公司使用es收集应用的日志,每个星期创建一个索引库,这样时间长了就会创建很多个索引库,操作和管理非常不方便
-
由于新增的索引只会操作最新的这一周的索引库,所以我们就可以创建两个别名
-
curr_week :此别名执行这个星期的索引库,新增的数据操作这个索引库
-
last_3_month:这个别名指向的是近三个月的索引库,因为我们需要查询近三个月的数据
-
后期只需要修改两个别名与索引库的指向关系即可,应用层的代码不许要更新、
-
还需要将三个月之前的索引库close掉,将一年前的索引库删除
-
es默认对查询分片的数量是有限制的,默认是1000个,使用通配符查询多个索引库的时候会出问题,正好可以使用别名解决
-
增加索引别名 可同时增减多个
-
curl -H "Content-Type: application/json" -XPOST 'http://localhost:9200/_aliases' -d ' { "actions" : [ { "add" : { "index" : "test1", "alias" : "alias1" } }, { "add" : { "index" : "test2", "alias" : "alias1" } } ] }'
-
-
删除索引别名
-
curl -H "Content-Type: application/json" -XPOST 'http://localhost:9200/_aliases' -d ' { "actions" : [ { "remove" : { "index" : "test1", "alias" : "alias1" } } ] }'
-
Elasticsearch参数调优
-
解决es启动警告信息
-
vi /etc/security/limits.conf 增加以下内容 * soft nofile 65536 * hard nofile 131072 * soft nproc 2048 * hard nproc 4096 vi /etc/security/limits.d/90-nproc.conf 把1024修改为4096 * soft nproc 4096
-
-
修改配置文件调整es的jvm内存大小
- 修改bin/elasticsearch.in.sh中ES_MIN_MEM和ES_MAX_MEM的大小,建议设置一样大,避免频繁的分配内存,根据服务器内存大小,一般分配60%左右(默认256M)
- 注意内存最大不要超过32G 一旦你越过这个神奇的32GB边界,指针会切换回普通对象指针.。每个指针的大小增加,使用更多的CPU内存带宽。事实上,你使用40~50G的内存和使用32G的内存效果是一样的。
-
设置memory_lock来锁定进程的物理内存地址
-
避免交换(swapped)来提高性能
修改文件conf/elasticsearch.yml
bootstrap.memory_lock: true
需要根据es启动日志修改/etc/security/limits.conf文件(重启系统)
-
-
改变分片的数量
- 分片多的话,可以提升建立索引的能力,5-20个比较合适。
- 如果分片的数量过多或者过少都会导致检索比较慢
- 分片过多会导致查询的额时候打开较多的文件,而分片数过少会导至单个分片索引过大,所以检索速度也会慢。
- 建议单个分片存储20G左右的索引数据【最高也不要超过50G,否则性能会很差】,所以,分片数量=数据总量/20G
- 副本多的话,可以提升搜索的能力,但是如果设置很多副本的话也会对服务器造成额外的压力,因为主分片需要给所有副本同步数据。所以建议最多设置1-2个即可。
-
针对不使用的index,建议close,减少内存占用。因为只要索引处于open状态,索引库中的segement就会占用内存,close之后就只会占用磁盘空间了。
- curl -XPOST ‘localhost:9200/test/_close’
-
要定时对索引进行合并优化,不然segment越多,占用的segment memory越多,查询的性能也越差
-
索引量不是很大的话可以将segment设为1
-
在es2.1.0以前调用_optimize接口,后期改为_forcemerge接口
-
curl -XPOST 'http://localhost:9200/test/_forcemerge?max_num_segments=1' client.admin().indices().prepareForceMerge("test").setMaxNumSegments(1).get(); 注意:索引合并是针对分片的。segment设置为1,则每个分片都有一个索引片段。
-
-
-
删除文档:在es中删除文档,数据不会马上在硬盘上除去,而是在es索引中产生一个.del的文件,而在检索过程中这部分数据也会参与检索,es在检索过程会判断是否删除了,如果删除了在过滤掉。这样也会降低检索效率。所以可以执行清除删除文档
-
shell: curl -XPOST 'http://localhost:9200/test/_forcemerge?only_expunge_deletes=true' java: client.admin().indices().prepareForceMerge("test").setOnlyExpungeDeletes(true).get();
-
-
如果在项目开始的时候需要批量入库大量数据的话,建议将副本数设置为0
- 因为es在索引数据的时候,如果有副本存在,数据也会马上同步到副本中,这样会对es增加压力。可以等索引完成后将副本按需要改回来。这样可以提高索引效率
-
Elasticsearch在建立索引时,根据id或(id,类型)进行hash,得到hash值之后再与该索引的分片数量取模,取模的值即为存入的分片编号
-
可以指定把数据存储到某一个分片中,通过routing参数 可以显著提高性能
-
curl -XPOST 'localhost:9200/yehua/emp?routing=rout_param' -d '{"name":"zs","age":20}' routing(路由参数)
-
-