这篇博客记录这一些运维ES的一些经验。

1、节点磁盘使用率过高,导致ES集群shard无法分配,丢失数据?

有两个配置,分配副本的时候

参数名称 默认值 含义
cluster.routing.allocation.disk.watermark.low 85% 当节点磁盘占用量高于85%时,就不会往该节点分配副本了
cluster.routing.allocation.disk.watermark.high 90% 当节点磁盘占用量高于90%时,尝试将该节点的副本重分配到其他节点

配置方式

  1. curl -XPUT 'localhost:9200/_cluster/settings' -d
  2. '{
  3. "transient": {
  4. "cluster.routing.allocation.disk.watermark.low": "90%"
  5. }
  6. }'

建议:密切关注ES集群节点的性能参数,对潜在风险有感知。

2、模板管理

template机制是比较有用的,特别是管理大量索引的时候。先给一个template的demo。

order:10  template的优先级,优先级高(order数字大的)会覆盖优先级低的template里的字段。

template:test*,这个template会命中test开头的索引。

index.number_of_shards:20 //index的一些配置

index.number_of_replicas::1

index.refresh_interval:5s

  1. {
  2. "aliases": {},
  3. "order": ,
  4. "template": "test*",
  5. "settings": {
  6. "index": {
  7. "priority": "",
  8. "merge": {
  9. "scheduler": {
  10. "max_thread_count": ""
  11. }
  12. },
  13. "search": {
  14. "slowlog": {
  15. "threshold": {
  16. "query": {
  17. "warn": "10s",
  18. "debug": "1s",
  19. "info": "5s",
  20. "trace": "500ms"
  21. },
  22. "fetch": {
  23. "warn": "1s",
  24. "debug": "500ms",
  25. "info": "800ms",
  26. "trace": "200ms"
  27. }
  28. }
  29. }
  30. },
  31. "unassigned": {
  32. "node_left": {
  33. "delayed_timeout": "5m"
  34. }
  35. },
  36. "max_result_window": "",
  37. "number_of_shards": "",
  38. "number_of_replicas": "",
  39. "translog": {
  40. "durability": "async"
  41. },
  42. "requests": {
  43. "cache": {
  44. "enable": "true"
  45. }
  46. },
  47. "mapping": {
  48. "ignore_malformed": "true"
  49. },
  50. "refresh_interval": "5s"
  51. }
  52. }
  53. }

配置方式

  1. curl -XPUT localhost:/_template/template_1 -d '
  2. {
  3. "template" : "test*",
  4. "order" : ,
  5. "settings" : {
  6. "number_of_shards" :
  7. },
  8. "mappings" : {
  9. "type1" : {
  10. "_source" : { "enabled" : false }
  11. }
  12. }
  13. }
  14. '

在配置了模板以后,如何建立索引

  1. # 索引创建
  2. curl -XPUT http://35.1.4.127:9200/index_name

3、mapping创建的一些注意事项

在创建索引type mapping的时候要妥善处理好_all和_source,不然会影响索引的性能。

_all,enable的话会把一个type中的所有字段合并成一个大字段,增加索引时间和大小。

_source,enable的话会请求会返回_source的结构体。

一般我们会禁用_all,打开_source。

另外,对时间的处理,可以如下这样,对于各种繁琐的时间格式都是支持的。

配置方式

  1. curl -PUT http://35.1.4.129:9200/index_name/RELATION/_mapping -d '{
  2. "RELATION": {
  3. "_all": {
  4. "enabled": "false"
  5. },
  6. "_source": {
  7. "enabled": "true"
  8. },
  9. "properties": {
  10. "FROM_SFZH": {
  11. "type": "keyword"
  12. },
  13. "TO_SFZH": {
  14. "type": "keyword"
  15. },
  16. "CREATE_TIME": {
  17. "type": "date",
  18. "format": "yyyy-MM-dd HH:mm:ss.SSS Z||yyyy-MM-dd HH:mm:ss.SSS||yyyy-MM-dd HH:mm:ss,SSS||yyyy/MM/dd HH:mm:ss||yyyy-MM-dd HH:mm:ss,SSS Z||yyyy/MM/dd HH:mm:ss,SSS Z||strict_date_optional_time||epoch_millis||yyyy-MM-dd HH:mm:ss"
  19. }
  20. }
  21. }
  22. }'

4、批量数据灌入ES时要禁用副本和刷新

大规模批量导入数据的时候,要禁用副本和刷新,ES在索引数据的时候,如果有副本的话,会同步副本,造成压力。

等到数据索引完成后,在恢复副本。

配置方法

  1. // 关闭
    curl -PUT http://35.1.4.129:9200/_settings -d '{
  2.   "index": {
  3.     "number_of_replicas" :
  4.     "refresh_interval" : -
  5.   }
  6. }'
  1. // 打开
  2. curl -PUT http://35.1.4.129:9200/_settings -d '{
  3.   "index": {
  4.     "number_of_replicas" :
  5.     "refresh_interval" : 5s
  6.   }
  7. }'

 5、jvm层面监控和优化

Elasticsearch是java开发的组件,当然可以压测看一下jvm的表现,例如通过jconsole远程连接。

config/jvm.options里面有各种jvm的配置,可以根据硬件资源合理配置一下。jvm调优就不说了。

  1. -Djava.rmi.server.hostname=192.168.1.152
  2. -Dcom.sun.management.jmxremote
  3. -Dcom.sun.management.jmxremote.port=
  4. -Dcom.sun.management.jmxremote.ssl=false
  5. -Dcom.sun.management.jmxremote.authenticate=false

6、高并发查询时,优化ES线程池

当你查询并发上来了,有时候你会发现下面这个异常

  1. EsRejectedExcutionException[rejected execution(queue capacity ) on.......]

这个原因是在新版本的elasticsearch中线程池已经是fixed类型了,即固定大小的线程池,默认是5*core数,当所有线程忙碌,且队列满的情况下,es会拒绝请求。

多种请求类型对应多种线程池

  1. index:此线程池用于索引和删除操作。它的类型默认为fixedsize默认为可用处理器的数量,队列的size默认为200
  2. search:此线程池用于搜索和计数请求。它的类型默认为fixedsize默认为(可用处理器的数量* ) / ) + ,队列的size默认为1000
  3. suggest:此线程池用于建议器请求。它的类型默认为fixedsize默认为可用处理器的数量,队列的size默认为1000
  4. get:此线程池用于实时的GET请求。它的类型默认为fixedsize默认为可用处理器的数量,队列的size默认为1000
  5. bulk:此线程池用于批量操作。它的类型默认为fixedsize默认为可用处理器的数量,队列的size默认为50
  6. percolate:此线程池用于预匹配器操作。它的类型默认为fixedsize默认为可用处理器的数量,队列的size默认为1000

这里以index为例,可以在elasticsearch.yml中修改线程池配置

  1. threadpool.index.type: fixed
  2. threadpool.index.size:
  3. threadpool.index.queue_size:

通过api控制

  1. curl -XPUT 'localhost:9200/_cluster/settings' -d '{
  2. "transient": {
  3. "threadpool.index.type": "fixed",
  4. "threadpool.index.size": ,
  5. "threadpool.index.queue_size":
  6. }
  7. }'

7、 若干副本shard分配不成功,集群状态yellow

7.1 先看看集群状态

  1. curl -XGET http://10.96.78.164:9200/_cluster/health?pretty

结果如下,如果有未分配的分片,unassigned_shards应该不为0,status=yellow。

  1. {
  2. "cluster_name": "elasticsearch",
  3. "status": "green",
  4. "timed_out": false,
  5. "number_of_nodes": ,
  6. "number_of_data_nodes": ,
  7. "active_primary_shards": ,
  8. "active_shards": ,
  9. "relocating_shards": ,
  10. "initializing_shards": ,
  11. "unassigned_shards": ,
  12. "delayed_unassigned_shards": ,
  13. "number_of_pending_tasks": ,
  14. "number_of_in_flight_fetch": ,
  15. "task_max_waiting_in_queue_millis": ,
  16. "active_shards_percent_as_number":
  17. }

7.2 查看未分配的shard属于哪个index,以及allocate的目标机器是哪个。

  1. curl -XGET http://localhost:9200/_cat/shards | grep UNASSIGNED

结果

  1. xiankan_xk_qdhj r UNASSIGNED 261b 10.96.78.164 yfbf9D3
  2. xiankan_xk_qdhj r UNASSIGNED 261b 10.96.78.164 yfbf9D3
  3. xiankan_xk_qdhj r UNASSIGNED 261b 10.96.78.164 yfbf9D3
  4. xiankan_xk_qdhj r UNASSIGNED 261b 10.96.78.164 yfbf9D3

r-表示副本分片,p是主分片,ip是分配目标机器

7.3 尝试1:索引级别的副本重新分配

有问题的索引,先关闭其副本,然后打开重新分配副本。

关闭

  1. curl -PUT http://35.1.4.129:9200/xiankan_xk_zjhj/_settings -d '{
  2.   "index": {
  3.     "number_of_replicas" :
  4.   }
  5. }'

打开

  1. http://10.96.78.164:9200/xiankan_xk_zjhj/_settings -d '{
  2. "index": {
  3. "number_of_replicas": 1
  4. }
  5. }'

7.4 尝试2:node级别的副本重新分配

重启shard分配不成功的node,如果shard分布在为数不多的几个node上,可以根据ip重启node上的es实例

杀死es

  1. ps -ef | grep elasticsearch | grep -v grep | awk '{print $2}' | xargs kill -

启动es

  1. ./bin/elasticsearch -d

7.5 尝试3:逐个索引shard的reroute

  1. curl -XPOST 'localhost:9200/_cluster/reroute' -d '{
  2. "commands" : [ {
  3. "allocate" : {
  4. "index" : "xiankan_xk_zjhj",
  5. "shard" : ,
  6. "node" : "yfbf9D3",
  7. "allow_primary" : true
  8. }
  9. }
  10. ] }'

Elasticsearch一些使用笔记(持续更新)的更多相关文章

  1. BLE资料应用笔记 -- 持续更新

    BLE资料应用笔记 -- 持续更新 BLE 应用笔记 小书匠 简而言之,蓝牙无处不在,易于使用,低耗能和低使用成本.'让我们'更深入地探索这些方面吧. 蓝牙无处不在-,您可以在几乎每一台电话.笔记本电 ...

  2. [读书]10g/11g编程艺术深入体现结构学习笔记(持续更新...)

    持续更新...) 第8章 1.在过程性循环中提交更新容易产生ora-01555:snapshot too old错误.P257 (这种情况我觉得应该是在高并发的情况下才会产生) 假设的一个场景是系统一 ...

  3. react-native-storage 使用笔记 持续更新

    React-native-storage是在AsyncStorage之上封装的一个缓存操作插件库,刚开始接触这个也遇到了一些问题,在这里简单记录总结一下,碰到了就记下来,持续更新吧 1.安卓下stor ...

  4. 数据分析之Pandas和Numpy学习笔记(持续更新)<1>

    pandas and numpy notebook        最近工作交接,整理电脑资料时看到了之前的基于Jupyter学习数据分析相关模块学习笔记.想着拿出来分享一下,可是Jupyter导出来h ...

  5. BLE资料应用笔记 -- 持续更新(转载)

    简而言之,蓝牙无处不在,易于使用,低耗能和低使用成本.’让我们’更深入地探索这些方面吧. 蓝牙无处不在—,您可以在几乎每一台电话.笔记本电脑 .台式电脑和平板电脑中找到蓝牙.因此,您可以便利地连接键盘 ...

  6. Semantic ui 学习笔记 持续更新

    这个semantic 更新版本好快~ 首先是代码的标识<code></code> 具体样式就是红框这样的 圈起来代码感觉不错 不过要在semantic.css里在加上如下样式~ ...

  7. Git学习笔记(持续更新)

    1.强制同步为远程的代码 远程仓库回退了commit的情况下(第2条描述之情况),强制同步远程的代码到本地 #更新远程最新的所有代码,但是不merge或者rebase git fetch --all ...

  8. web前端开发随手笔记 - 持续更新

    本文仅为个人常用代码整理,供自己日常查阅 html 浏览器内核 <!--[if IE]><![endif]--> <!--[if IE 6]><![endif ...

  9. Codeforces/TopCoder/ProjectEuler/CodeChef 散题笔记 (持续更新)

    最近做到了一些有趣的散题,于是开个Blog记录一下吧… (如果有人想做这些题的话还是不要看题解吧…) 2017-03-16 PE 202 Laserbeam 题意:有一个正三角形的镜子屋,光线从$C$ ...

随机推荐

  1. C#技巧记录——持续更新

    作为一名非主修C#的程序员,在此记录下学习与工作中C#的有用内容,持续更新 对类型进行约束,class指定了类型必须是引用类型,new()指定了类型必须具有一个无参的构造函数 where T : cl ...

  2. JavaScript加载次序问题

    3个文件,一个index.html如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8&quo ...

  3. Linux(Ubuntu)使用日记------Mongodb的安装与使用

    1.安装 Linux下安装mongodb还是比较容易的 直接使用apt-get安装即可,命令如下: sudo apt-get install mongodb 安装完成之后进行检验, “mongo sh ...

  4. 利用bootstrap-select.min.js实现bootstrap下拉列表的单选和多选

    参考文章:https://blog.csdn.net/qq_37677519/article/details/78143522

  5. 使用react全家桶制作博客后台管理系统

    前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基于react全家桶(React.React-r ...

  6. [洛谷P1392] 取数

    无法用复杂状态进行转移时改变计算方式:巧妙的整体考虑:压缩空间优化时间 传送门:$>here<$ 题意 给出一个n*m矩阵,从每一行选一个数加起来,可以得到一个和.易知总共会有$n^n$个 ...

  7. abp添加动态菜单

    abp中MenuDefinition封装了导航栏上的主菜单的属性,MenuItemDefinition则封装了子菜单的属性,子菜单可以引用其他子菜单构成一个菜单树. MenuDefinitio成员如下 ...

  8. CF235B Let's Play Osu! 期望DP

    貌似是一道很裸的期望\(DP\).直接说思路: 设\(f[i]\)表示到\(i\)位置时的期望分数,但是只有\(f[i]\)的话我们发现是无法转移的,我们还需要知道到\(i\)位置时的期望连续长度,于 ...

  9. Redisson分布式锁实现

    转: Redisson分布式锁实现 2018年09月07日 15:30:32 校长我错了 阅读数:3303   转:分布式锁和Redisson实现 概述 分布式系统有一个著名的理论CAP,指在一个分布 ...

  10. (五) vivi代码分析

    目录 vivi代码分析 初始化注册 使用open/read/ioctl 系统调用分析 ioctl流程一览 总结 title: vivi代码分析 date: 2019/4/23 19:30:00 toc ...