首页 > 其他 > 详细

elasticsearch 心得

时间:2019-11-15 01:15:20      阅读:118      评论:0      收藏:0      [点我收藏+]

1.es 一台机器一般为一个节点。一台机器不设置的情况下是无法创建副本集的,副本集和主本必须不在一个节点下,方便故障转移等

2.es7.x后一个索引后只能创建一个类型,可以通过修改更改

出现这个的原因是,elasticsearch7默认不在支持指定索引类型,默认索引类型是_doc,如果想改变,则配置include_type_name: true 即可(这个没有测试,官方文档说的,无论是否可行,建议不要这么做,因为elasticsearch8后就不在提供该字段)。官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html

3.创建索引定义数据类型  相当于sqlserver中的创建表

postman工具来进行请求发送

{
    "settings": {
        "number_of_shards": 3,
        "number_of_replicas": 0
    },
    "mappings": {
        "properties": {
            "wordid": {
                "type": "integer"
            },
            "word": {
                "type": "text"
            },
            "wordsign": {
                "type": "long"
            },
            "wordhint": {
                "type": "integer"
            },
            "searchcount": {
                "type": "integer"
            },
            "createtime": {
                "type": "date",
                "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
            },
            "appstoreids": {
                "type": "nested",
                "properties": {
                    "appstoreid": {
                        "type": "long"
                    },
                    "rank": {
                        "type": "integer"
                    },
                    "apptype": {
                        "type": "integer"
                    },
                    "change":{
                        "type":"integer"
                    },
                    "isnew":{
                        "type":"integer"
                    }
                }
            }
        }
    }
}

4.es的数据类型

核心类型 字符串类型 string,text,keyword 
整数类型 integer,long,short,byte 
浮点类型 double,float,half_float,scaled_float 
逻辑类型 boolean 
日期类型 date 
范围类型 range 
二进制类型 binary 
复合类型 数组类型 array 
对象类型 object 
嵌套类型 nested 
地理类型 地理坐标类型 geo_point 
地理地图 geo_shape 
特殊类型 IP类型 ip 
范围类型 completion 
令牌计数类型 token_count 
附件类型 attachment 
抽取类型 percolator 
 
5.由于es的内存使用的是java的jvm,所以设置占用的内存最好小于32g
6.关于es的优化

//修改默认查询条数 不过不起作用好像
alarm/_settings
{
"max_result_window" : 200000000
}
2. 开启最佳压缩
对于打开了上述_source字段的index,可以通过下面的命令来把lucene适用的压缩算法替换成 DEFLATE,提高数据压缩率。
http://127.0.0.1:9200/searchresult/_settings
{
"index.codec": "best_compression"
}
3. bulk批量写入
写入数据时尽量使用下面的bulk接口批量写入,提高写入效率。每个bulk请求的doc数量设定区间推荐为1k~1w,具体可根据业务场景选取一个适当的数量。
4. 调整translog同步策略
默认情况下,translog的持久化策略是,对于每个写入请求都做一次flush,刷新translog数据到磁盘上。这种频繁的磁盘IO操作是严重影响写入性能的,如果可以接受一定概率的数据丢失(这种硬件故障的概率很小),可以通过下面的命令调整 translog 持久化策略为异步周期性执行,并适当调整translog的刷盘周期。
http://127.0.0.1:9200/searchresult/_settings
{
"index": {
"translog": {
"sync_interval": "5s",
"durability": "async"
}
}
}

5. 调整refresh_interval
写入Lucene的数据,并不是实时可搜索的,ES必须通过refresh的过程把内存中的数据转换成Lucene的完整segment后,才可以被搜索。默认情况下,ES每一秒会refresh一次,产生一个新的segment,这样会导致产生的segment较多,从而segment merge较为频繁,系统开销较大。如果对数据的实时可见性要求较低,可以通过下面的命令提高refresh的时间间隔,降低系统开销。
http://127.0.0.1:9200/searchresult/_settings
{
"index": {
"refresh_interval": "30s"
}
}
6. merge并发控制
ES的一个index由多个shard组成,而一个shard其实就是一个Lucene的index,它又由多个segment组成,且Lucene会不断地把一些小的segment合并成一个大的segment,这个过程被称为merge。默认值是Math.max(1, Math.min(4, Runtime.getRuntime().availableProcessors() / 2)),当节点配置的cpu核数较高时,merge占用的资源可能会偏高,影响集群的性能,可以通过下面的命令调整某个index的merge过程的并发度:

PUT /my_index/_settings
{
"index.merge.scheduler.max_thread_count": 2
}
7. 写入数据不指定_id,让ES自动产生
当用户显示指定_id写入数据时,ES会先发起查询来确定index中是否已经有相同_id的doc存在,若有则先删除原有doc再写入新doc。这样每次写入时,ES都会耗费一定的资源做查询。如果用户写入数据时不指定doc,ES则通过内部算法产生一个随机的_id,并且保证_id的唯一性,这样就可以跳过前面查询_id的步骤,提高写入效率。

所以,在不需要通过_id字段去重、update的使用场景中,写入不指定_id可以提升写入速率。腾讯云CES技术团队的测试结果显示,无_id的数据写入性能可能比有_id的高出近一倍,实际损耗和具体测试场景相关。

3. 禁止swap,一旦允许内存与磁盘的交换,会引起致命的性能问题。 通过: 在elasticsearch.yml 中 bootstrap.memory_lock: true, 以保持JVM锁定内存,保证ES的性能。

对于数据量较小(100GB以下)的index,往往写入压力查询压力相对较低,一般设置3~5个shard,number_of_replicas设置为1即可(也就是一主一从,共两副本) 。
对于数据量较大(100GB以上)的index:
一般把单个shard的数据量控制在(20GB~50GB)
让index压力分摊至多个节点:可通过index.routing.allocation.total_shards_per_node参数,强制限定一个节点上该index的shard数量,让shard尽量分配到不同节点上
综合考虑整个index的shard数量,如果shard数量(不包括副本)超过50个,就很可能引发拒绝率上升的问题,此时可考虑把该index拆分为多个独立的index,分摊数据量,同时配合routing使用,降低每个查询需要访问的shard数量。

//复制索引和数据
http://127.0.0.1:9200/_reindex
{
"source": {
"index": "searchresult"
},
"dest": {
"index": "searchresult2"
}
}

 

elasticsearch 心得

原文:https://www.cnblogs.com/elsons/p/11863601.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!