zoukankan      html  css  js  c++  java
  • Elasticsearch 监控和部署

    Elasticsearch:

    ! [ https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/_cluster_health.html ]

    【监控】
    server command:
    1.集群健康 :
    a.health check --- command:GET _cluster/health
    example:
    {
    "cluster_name": "elasticsearch_zach",
    "status": "green",
    "timed_out": false,
    "number_of_nodes": 1,
    "number_of_data_nodes": 1,
    "active_primary_shards": 10,
    "active_shards": 10,
    "relocating_shards": 0,
    "initializing_shards": 0,
    "unassigned_shards": 0
    }
    b.issue example:
    command:GET _cluster/health?level=indices
    {
    "cluster_name": "elasticsearch_zach",
    "status": "red",
    "timed_out": false,
    "number_of_nodes": 8,
    "number_of_data_nodes": 8,
    "active_primary_shards": 90,
    "active_shards": 180,
    "relocating_shards": 0,
    "initializing_shards": 0,
    "unassigned_shards": 20
    "indices": {
    "v1": {
    "status": "green",
    "number_of_shards": 10,
    "number_of_replicas": 1,
    "active_primary_shards": 10,
    "active_shards": 20,
    "relocating_shards": 0,
    "initializing_shards": 0,
    "unassigned_shards": 0
    },
    "v2": {
    "status": "red", -----------issue
    "number_of_shards": 10,
    "number_of_replicas": 1,
    "active_primary_shards": 0,
    "active_shards": 0,
    "relocating_shards": 0,
    "initializing_shards": 0,
    "unassigned_shards": 20 ----------issue
    },
    "v3": {
    "status": "green",
    "number_of_shards": 10,
    "number_of_replicas": 1,
    "active_primary_shards": 10,
    "active_shards": 20,
    "relocating_shards": 0,
    "initializing_shards": 0,
    "unassigned_shards": 0
    },
    ....
    }
    }
    c.当构建单元和集成测试时,或者实现和 Elasticsearch 相关的自动化脚本时,
    cluster-health API 还有另一个小技巧非常有用。你可以指定一个 wait_for_status 参数,
    它只有在状态达标之后才会返回。比如:
    command:GET _cluster/health?wait_for_status=green


    2.单个节点统计:
    a.GET _nodes/stats
    在输出内容的开头,我们可以看到集群名称和我们的第一个节点:

    {
    "cluster_name": "elasticsearch_zach",
    "nodes": {
    "UNr6ZMf5Qk-YCPA_L18BOQ": {
    "timestamp": 1408474151742,
    "name": "Zach",
    "transport_address": "inet[zacharys-air/192.168.1.131:9300]",
    "host": "zacharys-air",
    "ip": [
    "inet[zacharys-air/192.168.1.131:9300]",
    "NONE"
    ],

    b.索引
    c.操作系统和进程部分
    CPU/负载/内存使用率/Swap 使用率/打开的文件描述符
    d.线程池
    e.文件系统和网络部分
    f.断路器

    3.集群统计
    GET _cluster/stats

    4.索引统计:
    GET my_index/_stats
    GET my_index,another_index/_stats
    GET _all/_stats
    统计 my_index 索引。
    使用逗号分隔索引名可以请求多个索引统计值。
    使用特定的 _all 可以请求全部索引的统计值

    5.等待中任务:
    GET _cluster/pending_tasks

    6.cat API
    a.GET /_cat

    eg:GET /_cat

    =^.^=
    /_cat/allocation
    /_cat/shards
    /_cat/shards/{index}
    /_cat/master
    /_cat/nodes
    /_cat/indices
    /_cat/indices/{index}
    /_cat/segments
    /_cat/segments/{index}
    /_cat/count
    /_cat/count/{index}
    /_cat/recovery
    /_cat/recovery/{index}
    /_cat/health
    /_cat/pending_tasks
    /_cat/aliases
    /_cat/aliases/{alias}
    /_cat/thread_pool
    /_cat/plugins
    /_cat/fielddata
    /_cat/fielddata/{fields}

    b.要启用表头,添加 ?v 参数即可:

    GET /_cat/health?v

    epoch time cluster status node.total node.data shards pri relo init
    1408[..] 12[..] el[..] 1 1 114 114 0 0 114
    unassign

    【部署】
    1.硬件/内存/CPU/硬盘/网络
    2.Java虚拟机
    3.Transport Client (传输客户端) 与 Node Client (节点客户端)
    4.配置管理

    elasticsearch.yml:
    a.集群/节点
    cluster.name: elasticsearch_production
    node.name: elasticsearch_005_data

    b.插件、日志以及你最重要的数据路径:
    path.data: /path/to/data1,/path/to/data2
    # Path to log files:
    path.logs: /path/to/logs
    # Path to where plugins are installed:
    path.plugins: /path/to/plugins

    c.最小主节点数:
    minimum_master_nodes
    eg:discovery.zen.minimum_master_nodes: 2

    d.集群恢复方面设置:
    keywords example:
    gateway.recover_after_nodes: 8
    gateway.expected_nodes: 10
    gateway.recover_after_time: 5m
    eg:
    这意味着 Elasticsearch 会采取如下操作:
    等待集群至少存在 8 个节点
    等待 5 分钟,或者10 个节点上线后,才进行数据恢复,这取决于哪个条件先达到。

    e.单播代替组播:
    #discovery.zen.ping.multicast.enabled: false
    discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]

    5.[red]不要触碰的配置:
    a.垃圾回收器
    b.线程池

    6.堆内存:大小(小于32GB)和交换
    a.设置:
    (1)指定 ES_HEAP_SIZE 环境变量或者用下面的命令设置它:export ES_HEAP_SIZE=10g
    (2)此外,你也可以通过命令行参数的形式,在程序启动的时候把内存大小传递给它,
    如果你觉得这样更简单的话:./bin/elasticsearch -Xmx10g -Xms10g
    确保堆内存最小值( Xms )与最大值( Xmx )的大小是相同的,
    防止程序在运行时改变堆内存大小, 这是一个很耗系统资源的过程。

    b.内存的(少于)一半给 Lucene
    Lucene 被设计为可以利用操作系统底层机制来缓存内存数据结构。
    标准的建议是把 50% 的可用内存作为 Elasticsearch 的堆内存.

    c.性能优化:
    禁用swapping:
    1.临时:sudo swapoff -a
    2.需要永久禁用,你可能需要修改 /etc/fstab 文件,这要参考你的操作系统相关文档。
    3.降低 swappiness 的值:
    对于大部分Linux操作系统,可以在 sysctl 中这样配置:
    vm.swappiness = 1
    4.需要打开配置文件中的 mlockall 开关。 它的作用就是允许 JVM 锁住内存,
    禁止操作系统交换出去。在你的 elasticsearch.yml 文件中,设置如下:
    bootstrap.mlockall: true

    7.文件描述符和 MMap
    a.GET /_nodes/process

    {
    "cluster_name": "elasticsearch__zach",
    "nodes": {
    "TGn9iO2_QQKb0kavcLbnDw": {
    "name": "Zach",
    "transport_address": "inet[/192.168.1.131:9300]",
    "host": "zacharys-air",
    "ip": "192.168.1.131",
    "version": "2.0.0-SNAPSHOT",
    "build": "612f461",
    "http_address": "inet[/192.168.1.131:9200]",
    "process": {
    "refresh_interval_in_millis": 1000,
    "id": 19808,
    "max_file_descriptors": 64000, --------【显示 Elasticsearch 进程可以访问的可用文件描述符数量】
    "mlockall": true
    }
    }
    }
    }
    b.Elasticsearch 对各种文件混合使用了 NioFs( 注:非阻塞文件系统)和
    MMapFs ( 注:内存映射文件系统)。请确保你配置的最大映射数量,
    以便有足够的虚拟内存可用于 mmapped 文件。这可以暂时设置:
    sysctl -w vm.max_map_count=262144
    或者你可以在 /etc/sysctl.conf 通过修改 vm.max_map_count 永久设置它。


    【部署后】
    1.动态变更设置
    eg:
    PUT /_cluster/settings
    {
    "persistent" : {
    "discovery.zen.minimum_master_nodes" : --这个永久设置会在全集群重启时存活下来
    },
    "transient" : {
    "indices.store.throttle.max_bytes_per_sec" : "50mb" --这个临时设置会在第一次全集群重启后被移除。
    }
    }

    2.日志记录:
    a.Elasticsearch 会输出很多日志,都放在 ES_HOME/logs 目录下
    b.我们调高节点发现的日志记录级别:
    PUT /_cluster/settings
    {
    "transient" : {
    "logger.discovery" : "DEBUG"
    }
    }
    c.慢日志:
    PUT /my_index/_settings
    {
    "index.search.slowlog.threshold.query.warn" : "10s", 查询慢于 10 秒输出一个 WARN 日志。
    "index.search.slowlog.threshold.fetch.debug": "500ms", 获取慢于 500 毫秒输出一个 DEBUG 日志
    "index.indexing.slowlog.threshold.index.info": "5s" 索引慢于 5 秒输出一个 INFO 日志。
    }
    PUT /_cluster/settings
    {
    "transient" : {
    "logger.index.search.slowlog" : "DEBUG", 设置搜索慢日志为 DEBUG 级别。
    "logger.index.indexing.slowlog" : "WARN" 设置索引慢日志为 WARN 级别。
    }
    }
    d.索引性能技巧:
    (1)科学的测试性能
    (2)使用批量请求并调整其大小
    (3)存储
    (4)段和合并
    PUT /_cluster/settings
    {
    "persistent" : {
    "indices.store.throttle.max_bytes_per_sec" : "100mb"
    }
    }
    PUT /_cluster/settings
    {
    "transient" : {
    "indices.store.throttle.type" : "none" 设置限流类型为 none 彻底关闭合并限流。等你完成了导入,记得改回 merge 重新打开限流。
    }
    }
    如果你使用的是机械磁盘而非 SSD,你需要添加下面这个配置到你的 elasticsearch.yml 里:

    index.merge.scheduler.max_thread_count: 1
    (5)
    其他
    最后,还有一些其他值得考虑的东西需要记住:

    如果你的搜索结果不需要近实时的准确度,考虑把每个索引的 index.refresh_interval 改到 30s 。如果你是在做大批量导入,导入期间你可以通过设置这个值为 -1 关掉刷新。别忘记在完工的时候重新开启它。
    如果你在做大批量导入,考虑通过设置 index.number_of_replicas: 0关闭副本。文档在复制的时候,整个文档内容都被发往副本节点,然后逐字的把索引过程重复一遍。这意味着每个副本也会执行分析、索引以及可能的合并过程。

    相反,如果你的索引是零副本,然后在写入完成后再开启副本,恢复过程本质上只是一个字节到字节的网络传输。相比重复索引过程,这个算是相当高效的了。

    如果你没有给每个文档自带 ID,使用 Elasticsearch 的自动 ID 功能。 这个为避免版本查找做了优化,因为自动生成的 ID 是唯一的。
    如果你在使用自己的 ID,尝试使用一种 Lucene 友好的 ID。包括零填充序列 ID、UUID-1 和纳秒;这些 ID 都是有一致的,压缩良好的序列模式。相反的,像 UUID-4 这样的 ID,本质上是随机的,压缩比很低,会明显拖慢 Lucene。

    f.推迟分片分配
    修改参数 delayed_timeout ,默认等待时间可以全局设置也可以在索引级别进行修改:

    eg:PUT /_all/_settings 通过使用 _all 索引名,我们可以为集群里面的所有的索引使用这个参数
    {
    "settings": {
    "index.unassigned.node_left.delayed_timeout": "5m" 默认时间被修改成了 5 分钟
    }
    }

    g.滚动重启
    可能的话,停止索引新的数据。虽然不是每次都能真的做到,但是这一步可以帮助提高恢复速度。
    禁止分片分配。这一步阻止 Elasticsearch 再平衡缺失的分片,直到你告诉它可以进行了。如果你知道维护窗口会很短,这个主意棒极了。你可以像下面这样禁止分配:

    PUT /_cluster/settings
    {
    "transient" : {
    "cluster.routing.allocation.enable" : "none"
    }
    }
    关闭单个节点。
    执行维护/升级。
    重启节点,然后确认它加入到集群了。
    用如下命令重启分片分配:
    PUT /_cluster/settings
    {
    "transient" : {
    "cluster.routing.allocation.enable" : "all"
    }
    }
    分片再平衡会花一些时间。一直等到集群变成 绿色 状态后再继续。 to status green before continuing.
    重复第 2 到 6 步操作剩余节点。
    到这步你可以安全的恢复索引了(如果你之前停止了的话),不过等待集群完全均衡后再恢复索引,也会有助于提高处理速度。

    h.备份集群: (https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/backing-up-your-cluster.html)
    使用 snapshot API
    创建仓库:
    PUT _snapshot/my_backup 给我们的仓库取一个名字,在本例它叫 my_backup 。
    {
    "type": "fs", 我们指定仓库的类型应该是一个共享文件系统。
    "settings": {
    "location": "/mount/backups/my_backup" 最后,我们提供一个已挂载的设备作为目的地址。
    }
    }
    快照所有打开的索引
    快照指定索引
    列出快照相关的信息
    删除快照
    监控快照进度
    取消一个快照

    i.从快照恢复 (https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/_restoring_from_a_snapshot.html#_restoring_from_a_snapshot)

  • 相关阅读:
    NOIP前的一些计划
    回文自动机[学习笔记]
    Luogu-3705 [SDOI2017]新生舞会
    01分数规划[学习笔记]
    jvm参数总结
    读懂jstack
    PRODUCER配置加载
    为什么WAIT必须在同步块中
    NIO学习笔记
    dp求最长递增子序列并输出
  • 原文地址:https://www.cnblogs.com/shide/p/6911867.html
Copyright © 2011-2022 走看看