记录一些elasticSearch使用过程中经常用到的一些运维工具和方法,主要是方便后续使用过程中能够快速查看
数据冷热分离
N 台机器做热数据的存储, 上面只放当天的数据。这 N 台热数据节点上面的 elasticsearc.yml 中配置 node.tag: hot,之前的数据放在另外的 M 台机器上。这 M 台冷数据节点中配置 node.tag: stale
模板中控制对新建索引添加 hot标签:1
2
3
4
5
6
7{
"order" : 0,
"template" : "*",
"settings" : {
"index.routing.allocation.require.tag" : "hot"
}
}
每天计划任务更新索引的配置, 将 tag 更改为 stale, 索引会自动迁移到 M 台冷数据节点1
2
3
4
5
6
7
8
9
10
11
12curl -XPUT http://127.0.0.1:9200/indexname/_settings -d'
{
"index": {
"routing": {
"allocation": {
"require": {
"tag": "stale"
}
}
}
}
}'
这样,写操作集中在 N 台热数据节点上,大范围的读操作集中在 M 台冷数据节点上。避免了堵塞影响。
日志数据设置
在日志refresh_interval 参数:1
curl -XPOST http://127.0.0.1:9200/logstash-2015.06.21/_settings -d'{ "refresh_interval": "10s" }'
如果是导入历史数据的场合,那甚至可以先完全关闭掉:1
2
3
4
5
6# curl -XPUT http://127.0.0.1:9200/logstash-2015.05.01 -d'
{
"settings" : {
"refresh_interval": "-1"
}
}'
在导入完成以后,修改回来或者手动调用一次即可:1
curl -XPOST http://127.0.0.1:9200/logstash-2015.05.01/_refresh
降低副本数
index.number_of_replicas => 0
减少副本数可以有效增加写入速度,在批量写入的时候可以暂时将副本数设置为 0.
对于不需要索引的字段关闭索引
不需要索引的意思是不需要查询的字段,并不是不存储,所有写入的字段信息都会完整的存储在 _source字段中,除非不存储原文字段,否则写入信息将是完整的。默认 true。
对于不需要评分的字段关闭
对于只需要匹配检索,而不需要评分的字段可以禁用 norms。默认 true。1
2
3
4
5
6
7
8
9PUT my_index/_mapping
{
"properties": {
"title": {
"type": "text",
"norms": false
}
}
}
对于不需要聚合和排序的字段关闭 doc_value
doc_value 是 lucene 的一种索引结构,主要用于聚合和排序的场景,对于像内容字段这类长文本一般不会有聚合和排序的情况,如果禁用 doc_value 会释放很多资源。默认是所有字段全部为 true。1
2
3
4
5
6
7
8
9
10
11
12
13
14PUT my_index
{
"mappings": {
"properties": {
"status_code": {
"type": "keyword"
},
"session_id": {
"type": "keyword",
"doc_values": false
}
}
}
}
Tribe node
结果震荡
搜索同一query, 结果ES返回的顺序却不尽相同, 这就是请求轮询到不同分片, 而未设置排序条件, 相同相关性评分情况下, 是按照所在segment中 lucene id来排序的, 相同数据的不同备份之间该id是不能保证一致的, 故造成结果震荡问题。
如设置该参数, 则有一下9种情况
_primary
: 发送到集群的相关操作请求只会在主分片上执行。_primary_first
: 指查询会先在主分片中查询, 如果主分片找不到( 挂了), 就会在副本中查询。_replica
: 发送到集群的相关操作请求只会在副本上执行。_replica_first
:指查询会先在副本中查询, 如果副本找不到( 挂了), 就会在主分片中查询。_local
: 指查询操作会优先在本地节点有的分片中查询, 没有的话再在其它节点查询。_prefer_nodes:abc,xyz
: 在提供的节点上优先执行( 在这种情况下为 ‘abc’或 ‘xyz’)_shards:2,3
:限制操作到指定的分片。(2
和“ 3”)。 这个偏好可以与其他偏好组合, 但必须首先出现:_shards:2,3 | _primary
_only_nodes:node1,node2
: 指在指定id的节点里面进行查询, 如果该节点只有要查询索引的部分分片, 就只在这部分分片中查找, 不同节点之间用“,” 分隔。- custom(自定义): 注意自定义的preference参数不能以下划线 “_”开头。当preference为自定义时, 即该参数不为空, 且开头不以“ 下划线” 开头时, 特别注意: 如果以用户query作为自定义preference时, 一定要处理以下划线开头的情况, 这种情况下如果不属于以上8种情况, 则会抛出异常。
延迟分配