8.4 监控与日志 (Monitoring & Logging) 8.4 Elasticsearch 监控与日志 (Monitoring & Logging) 8.4.1 监控 Elasticsearch 提供了多种监控手段,包括: 集群健康 API: 用于快速检查集群的整体健康状况。 节点统计 API: 提供节点级别的详细统计信息。 索引统计 API: 提供索引级别的统计信息。 Cat API: 提供简洁的命令行接口,用于查看集群状态。 Elasticsearch Monitoring: Elastic Stack 提供的官方监控解决方案。 第三方监控工具: 例如 Prometheus, Grafana 等。 8.4.1.
Elasticsearch 提供了多种监控手段,包括:
集群健康 API: 用于快速检查集群的整体健康状况。
节点统计 API: 提供节点级别的详细统计信息。
索引统计 API: 提供索引级别的统计信息。
Cat API: 提供简洁的命令行接口,用于查看集群状态。
Elasticsearch Monitoring: Elastic Stack 提供的官方监控解决方案。
第三方监控工具: 例如 Prometheus, Grafana 等。
集群健康 API 是一个快速了解集群状态的入口。它返回集群的整体健康状态、节点数量、分片数量等信息。
请求:
GET /_cluster/health
响应示例:
{ "cluster_name": "my-application", "status": "green", "timed_out": false, "number_of_nodes": 3, "number_of_data_nodes": 3, "active_primary_shards": 5, "active_shards": 10, "relocating_shards": 0, "initializing_shards": 0, "unassigned_shards": 0, "delayed_unassigned_shards": 0, "number_of_pending_tasks": 0, "number_of_in_flight_fetch": 0, "task_max_waiting_in_queue_millis": 0, "active_shards_percent_as_number": 100.0 }
状态说明:
green: 集群健康,所有主分片和副本分片都可用。
yellow: 集群功能正常,但至少有一个副本分片不可用。
red: 集群部分功能受损,至少有一个主分片不可用。
节点统计 API 提供了节点级别的详细统计信息,包括 CPU 使用率、内存使用率、磁盘空间使用率、网络流量等。
请求:
GET /_nodes/stats
可以指定节点 ID 或节点属性来获取特定节点的统计信息。
GET /_nodes/node1,node2/stats GET /_nodes/_local/stats
响应示例:
响应内容非常丰富,这里只展示一部分:
{ "_nodes": { "total": 3, "successful": 3, "failed": 0 }, "cluster_name": "my-application", "nodes": { "node1": { "name": "node1", "transport_address": "192.168.1.10:9300", "host": "192.168.1.10", "ip": "192.168.1.10", "roles": [ "master", "data", "ingest" ], "attributes": { "ml.machine_memory": "16777216", "xpack.installed": "true", "transform.node": "true" }, "os": { "timestamp": 1678886400000, "cpu": { "percent": 5 }, "mem": { "total_in_bytes": 16777216, "free_in_bytes": 8388608, "used_in_bytes": 8388608, "free_percent": 50, "used_percent": 50 }, "swap": { "total_in_bytes": 0, "free_in_bytes": 0, "used_in_bytes": 0 } }, "process": { "timestamp": 1678886400000, "open_file_descriptors": 300, "max_file_descriptors": 65535, "cpu": { "percent": 2 }, "mem": { "resident_in_bytes": 209715200, "virtual_in_bytes": 2147483648 } }, "jvm": { "timestamp": 1678886400000, "uptime_in_millis": 3600000, "mem": { "heap_used_in_bytes": 536870912, "heap_max_in_bytes": 1073741824 }, "threads": { "count": 100 } }, "fs": { "timestamp": 1678886400000, "total_in_bytes": 107374182400, "free_in_bytes": 53687091200, "available_in_bytes": 53687091200, "data": [ { "path": "/path/to/data", "mount": "/path/to/data", "type": "ext4", "total_in_bytes": 107374182400, "free_in_bytes": 53687091200, "available_in_bytes": 53687091200 } ] }, "indices": { "docs": { "count": 10000, "deleted": 100 }, "store": { "size_in_bytes": 10485760 }, "indexing": { "index_total": 10000, "index_time_in_millis": 1000, "index_failed": 0, "delete_total": 100, "delete_time_in_millis": 100, "delete_failed": 0, "is_throttled": false, "throttle_time_in_millis": 0 }, "get": { "total": 10000, "time_in_millis": 1000, "exists_total": 9000, "exists_time_in_millis": 900, "missing_total": 1000, "missing_time_in_millis": 100 }, "search": { "total": 10000, "time_in_millis": 1000, "query_total": 10000, "query_time_in_millis": 1000, "fetch_total": 10000, "fetch_time_in_millis": 1000 }, "merges": { "current": 0, "current_docs": 0, "current_size_in_bytes": 0, "total": 100, "total_time_in_millis": 1000, "total_docs": 1000, "total_size_in_bytes": 1048576 }, "refresh": { "total": 100, "total_time_in_millis": 1000 }, "flush": { "total": 100, "total_time_in_millis": 1000 }, "warmer": { "total": 100, "total_time_in_millis": 1000 }, "fielddata": { "memory_size_in_bytes": 0, "evictions": 0 }, "query_cache": { "memory_size_in_bytes": 0, "evictions": 0, "hit_count": 0, "miss_count": 0 }, "segments": { "count": 10, "memory_in_bytes": 1048576, "terms_memory_in_bytes": 1048576, "stored_fields_memory_in_bytes": 1048576, "term_vectors_memory_in_bytes": 0, "norms_memory_in_bytes": 0, "points_memory_in_bytes": 0, "doc_values_memory_in_bytes": 0, "index_writer_memory_in_bytes": 0, "version_map_memory_in_bytes": 0, "fixed_bit_set_memory_in_bytes": 0, "max_unsafe_auto_id_timestamp": 0, "file_sizes": {} }, "translog": { "operations": 100, "size_in_bytes": 1048576 }, "request_cache": { "memory_size_in_bytes": 0, "evictions": 0, "hit_count": 0, "miss_count": 0 }, "recovery": { "current_as_source": 0, "current_as_target": 0, "stage": "DONE", "start": { "time_in_millis": 0, "total_time_in_millis": 0 } } }, "thread_pool": { "bulk": { "threads": 10, "queue_size": 100, "active": 5, "rejected": 0, "completed": 1000 }, "index": { "threads": 10, "queue_size": 100, "active": 5, "rejected": 0, "completed": 1000 }, "search": { "threads": 10, "queue_size": 100, "active": 5, "rejected": 0, "completed": 1000 }, "get": { "threads": 10, "queue_size": 100, "active": 5, "rejected": 0, "completed": 1000 }, "write": { "threads": 10, "queue_size": 100, "active": 5, "rejected": 0, "completed": 1000 }, "generic": { "threads": 10, "queue_size": 100, "active": 5, "rejected": 0, "completed": 1000 }, "refresh": { "threads": 10, "queue_size": 100, "active": 5, "rejected": 0, "completed": 1000 } }, "script": { "compilations": 0, "cache_evictions": 0 }, "ingest": { "total": { "operations": 0, "time_in_millis": 0, "current": 0, "failed": 0 }, "processors": {} }, "breakers": { "fielddata": { "limit_size_in_bytes": 0, "limit": "0b", "estimated_size_in_bytes": 0, "estimated": "0b", "overhead": 1.03, "tripped": 0 }, "request": { "limit_size_in_bytes": 0, "limit": "0b", "estimated_size_in_bytes": 0, "estimated": "0b", "overhead": 1.0, "tripped": 0 }, "circuit_breaker_parent": { "limit_size_in_bytes": 0, "limit": "0b", "estimated_size_in_bytes": 0, "estimated": "0b", "overhead": 1.0, "tripped": 0 } }, "adaptive_selection": { "incoming_selections": 0, "outgoing_selections": 0, "rejections": 0, "usages": {} } } } }
索引统计 API 提供了索引级别的统计信息,包括文档数量、存储大小、索引速度、搜索速度等。
请求:
GET /my-index/_stats GET /_all/_stats
响应示例:
响应内容与节点统计 API 类似,但范围限定在索引级别。
Cat API 提供了一系列简洁的命令行接口,用于查看集群状态。例如:
GET /_cat/health: 查看集群健康状况。
GET /_cat/nodes: 查看节点信息。
GET /_cat/indices: 查看索引信息。
GET /_cat/shards: 查看分片信息。
Cat API 的输出格式可读性强,适合快速查看集群状态。
示例:
GET /_cat/nodes?v
输出:
node.role master data ingest transform ml remote_cluster client ip heap.percent ram.percent cpu load_1m load_5m load_15m node.name * data,ingest,ml,transform 192.168.1.10 23 70 2 0.10 0.20 0.30 node1 data,ingest,ml,transform 192.168.1.11 25 72 3 0.15 0.25 0.35 node2 data,ingest,ml,transform 192.168.1.12 27 74 4 0.20 0.30 0.40 node3
Elasticsearch Monitoring 是 Elastic Stack 提供的官方监控解决方案。它通过收集 Elasticsearch 集群的指标数据,并将其存储在专门的监控索引中,然后使用 Kibana 进行可视化展示。
配置步骤:
启用 Monitoring: 在 elasticsearch.yml 配置文件中启用监控:
xpack.monitoring.enabled: true
配置 Kibana: 在 Kibana 中配置 Elasticsearch 连接,并安装 Monitoring 插件。
查看监控仪表盘: 在 Kibana 中打开 Monitoring 仪表盘,查看集群的各种指标。
除了 Elastic Stack 提供的监控解决方案外,还可以使用第三方监控工具,例如 Prometheus 和 Grafana。
Prometheus: 用于收集 Elasticsearch 指标数据。可以使用 elasticsearch_exporter 将 Elasticsearch 指标暴露给 Prometheus。
Grafana: 用于可视化 Prometheus 收集的指标数据。可以创建自定义仪表盘,展示 Elasticsearch 集群的各种指标。
Elasticsearch 提供了详细的日志记录功能,可以帮助我们了解集群的运行状态和排查问题。
Elasticsearch 主要有以下几种类型的日志:
GC 日志: 记录 Java 垃圾回收事件。
Deprecation 日志: 记录已弃用的功能的使用情况。
Audit 日志: 记录安全相关的事件,例如身份验证和授权。
Slow Log: 记录执行时间超过阈值的查询和索引操作。
Elasticsearch 日志: 记录 Elasticsearch 的常规运行信息,包括启动、关闭、错误和警告等。
Elasticsearch 的日志配置位于 log4j2.properties 文件中。可以配置日志级别、日志格式、日志输出位置等。
示例:
status = warn appender.console.type = Console appender.console.name = console appender.console.layout.type = PatternLayout appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%m%n appender.rolling.type = RollingFile appender.rolling.name = file appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}.log appender.rolling.layout.type = PatternLayout appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%.-1m%n appender.rolling.policies.type = Policies appender.rolling.policies.time.type = TimeBasedTriggeringPolicy appender.rolling.policies.time.interval = 1 appender.rolling.policies.time.modulate = true appender.rolling.strategy.type = DefaultRolloverStrategy appender.rolling.strategy.fileIndex = nomax appender.rolling.strategy.delete.type = Delete appender.rolling.strategy.delete.basepath = ${sys:es.logs.base_path} appender.rolling.strategy.delete.maxDepth = 2 appender.rolling.strategy.delete.ifLastModified.type = IfLastModified appender.rolling.strategy.delete.ifLastModified.age = 7d root.type = Root root.level = info root.appenderRef.console.ref = console root.appenderRef.rolling.ref = file logger.deprecation.name = org.elasticsearch.deprecation logger.deprecation.level = warn logger.deprecation.appenderRef.rolling.ref = file_deprecation logger.deprecation.additivity = false appender.file_deprecation.type = RollingFile appender.file_deprecation.name = file_deprecation appender.file_deprecation.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_deprecation.log appender.file_deprecation.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_deprecation-%d{yyyy-MM-dd}.log appender.file_deprecation.layout.type = PatternLayout appender.file_deprecation.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%.-1m%n appender.file_deprecation.policies.type = Policies appender.file_deprecation.policies.time.type = TimeBasedTriggeringPolicy appender.file_deprecation.policies.time.interval = 1 appender.file_deprecation.policies.time.modulate = true appender.file_deprecation.strategy.type = DefaultRolloverStrategy appender.file_deprecation.strategy.fileIndex = nomax appender.file_deprecation.strategy.delete.type = Delete appender.file_deprecation.strategy.delete.basepath = ${sys:es.logs.base_path} appender.file_deprecation.strategy.delete.maxDepth = 2 appender.file_deprecation.strategy.delete.ifLastModified.type = IfLastModified appender.file_deprecation.strategy.delete.ifLastModified.age = 7d logger.audit.name = org.elasticsearch.xpack.security.audit.logfile.LoggingAuditTrail logger.audit.level = info logger.audit.appenderRef.rolling.ref = file_audit logger.audit.additivity = false appender.file_audit.type = RollingFile appender.file_audit.name = file_audit appender.file_audit.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_audit.log appender.file_audit.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_audit-%d{yyyy-MM-dd}.log appender.file_audit.layout.type = PatternLayout appender.file_audit.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%.-1m%n appender.file_audit.policies.type = Policies appender.file_audit.policies.time.type = TimeBasedTriggeringPolicy appender.file_audit.policies.time.interval = 1 appender.file_audit.policies.time.modulate = true appender.file_audit.strategy.type = DefaultRolloverStrategy appender.file_audit.strategy.fileIndex = nomax appender.file_audit.strategy.delete.type = Delete appender.file_audit.strategy.delete.basepath = ${sys:es.logs.base_path} appender.file_audit.strategy.delete.maxDepth = 2 appender.file_audit.strategy.delete.ifLastModified.type = IfLastModified appender.file_audit.strategy.delete.ifLastModified.age = 7d
Slow Log 用于记录执行时间超过阈值的查询和索引操作。可以配置 index.indexing.slowlog.threshold.index.warn 和 index.search.slowlog.threshold.query.warn 等参数来设置阈值。
示例:
PUT /my-index/_settings { "index.indexing.slowlog.threshold.index.warn": "5s", "index.search.slowlog.threshold.query.warn": "5s", "index.search.slowlog.threshold.fetch.warn": "5s" }
可以使用 Elastic Stack 提供的 Logstash 和 Kibana 对 Elasticsearch 日志进行分析和可视化。
Logstash: 用于收集、解析和转换 Elasticsearch 日志。
Kibana: 用于可视化 Logstash 处理后的日志数据。
可以创建自定义仪表盘,展示 Elasticsearch 集群的各种日志信息,例如错误数量、警告数量、慢查询数量等。
定期检查集群健康状况: 使用集群健康 API 或 Cat API 定期检查集群健康状况,及时发现潜在问题。
监控关键指标: 监控 CPU 使用率、内存使用率、磁盘空间使用率、索引速度、搜索速度等关键指标,及时发现性能瓶颈。
配置 Slow Log: 配置 Slow Log,记录执行时间超过阈值的查询和索引操作,用于性能优化。
集中管理日志: 使用 Logstash 和 Elasticsearch 集中管理 Elasticsearch 日志,便于分析和排查问题。
设置告警: 根据监控指标和日志信息设置告警,及时通知运维人员处理问题。