ELK由浅入深
1. ELK stack
Lucene:
文档:Document
包含一个或多个域的容器
filed:value
域:
有很多选项
索引选项,存储选项,项向量使用选项
索引选项用于通过倒排索引来控制文本是否被搜索
存储选项:是否需要存储域的真实值
文档和域的加权操作
默认都没有加权
加权计算标准:
搜索:
查询Lucene索引时,它返回的是一个有序的scoreDOC对象:查询时,Lucene会为每个文档计算出其score。
2. ElasticSearch
ES是一个基于Lucene实现的开源,分布式,Restful的全文搜索引擎;此外,它还是一个分布式实现文档存储,其中每个文档的每个filed均可以被索引的数据,且可被搜索;也是一个带实时分析功能的分布式搜索引擎,能够扩展至数以百计的节点实时处理PB级的数据。
基本组件:
索引:文档容器,类似于表,索引名必须使用小写字母
类型:类型是索引内部的逻辑分区,其意义完全取决于用户需求
文档:文档是Lucene索引和搜索的原子单位,它包含了一个或多个域,是域的容器;基于JSON格式表示。拥有多个值的域,叫做多值域。
映射:原始内容存储为文档之前需要进行分析,例如切词,过滤掉某些词等;映射用于定义此分析机制该如何实现。
ES的集群组件:
cluster:ES的集群标识为集群名称,默认为"elasticsearch",节点就是靠此名字来决定加入到哪个集群,一个节点只能属于一个集群。
node:运行了单个ES实例的主机即为节点,用于存储数据,参与集群索引及搜索操作,节点的标识靠节点名。
shard:将索引切割成为的物理存储组件,但每一个shard都是独立且完整的索引:创建索引时,ES默认将其分割为5个shard,用户也可以按需自定义。(一旦确定,不可修改)
shard有两种类型:primary shard和replica,replica用于数据冗余及查询时的负载均衡。默认每个索引有5个primary shard,每个primary shard的副本数量可自定义,且可动态修改。默认为1.
ES cluster工作过程:
启动时,通过多播或单播方式在9300/tcp查找同一集群中的其它节点,并与之通信。
集群中的所有节点会选举出一个主节点负责管理整个集群状态,以及在集群范围内决定各shard的分布方式.站在用户角度,每个节点均可接收并响应用户的各类请求。
当集群中的某个节点宕机了,集群状态会进入修复状态也就是yellow,主节点会检查所有可用shard的主shard是否够用,如果主shard不够,那么对应的副本shard会提升为主shard(这个时候shard是没有冗余和负载均衡的,所以集群的性能会下降很多),这样副本shard数量就不够用了,那么主节点会复制一份作为副本shard。这个时候会进入重新均衡状态。ES会自动rebalance。
如果有多个副本,那么当主shard不可用,副本之间会进行一个选举,选举出一个副本升级为主shard。
当集群中的主节点宕机时,slave节点会重新选举出一个新的master节点。
集群状态:green,red,yellow
官方站点: https://www.elastic.co/downloads/elasticsearch
3. 安装jdk(至少1.8以上版本)
yum list all | grep jdk
yum install java-1.8.0-openjdk.x86_64
yum install java-1.8.0-openjdk-devel.x86_64
yum install java-1.8.0-openjdk-headless.x86_64
其它准备工作:
官方提供了生产环境下 Elasticsearch 所在操作系统的相关建议,详见 这里
虚拟内存设置,编辑 /etc/sysctl.conf,追加:
vm.max_map_count=262144
修改文件句柄限制,编辑 /etc/security/limits.conf,追加:
* soft nofile 65536
* hard nofile 65536
4. 安装Elasticsearch
1. 导入PGP Key
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
2. 配置一下 elasticsearch的yum源
在/etc/yum.repos.d/目录下,创建一个名为elasticsearch.repo的文件,内容如下:
[elasticsearch-5.x] name=Elasticsearch repository for 5.x packages baseurl=https://artifacts.elastic.co/packages/5.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md
3. 安装elasticsearch
yum install elasticsearch -y
chkconfig -add elasticsearch
4. 启动elasticsearch
/etc/init.d/elasticsearch start
5. 检查启动是否正常
curl -XGET 'http://127.0.0.1:9200/'
6. 配置elasticsearch
默认的配置文件:/etc/elasticsearch/elasticsearch.yml
系统配置文件: /etc/sysconfig/elasticsearch
参数内容:
ES_USER The user to run as, defaults to elasticsearch. ES_GROUP The group to run as, defaults to elasticsearch. JAVA_HOME Set a custom Java path to be used. MAX_OPEN_FILES Maximum number of open files, defaults to 65536. MAX_LOCKED_MEMORY Maximum locked memory size. Set to unlimited if you use the bootstrap.memory_lock option in elasticsearch.yml. MAX_MAP_COUNT Maximum number of memory map areas a process may have. If you use mmapfs as index store type, make sure this is set to a high value. For more information, check the linux kernel documentation about max_map_count. This is set via sysctl before starting elasticsearch. Defaults to 262144. LOG_DIR Log directory, defaults to /var/log/elasticsearch. DATA_DIR Data directory, defaults to /var/lib/elasticsearch. CONF_DIR Configuration file directory (which needs to include elasticsearch.yml and log4j2.properties files), defaults to /etc/elasticsearch. ES_JAVA_OPTS Any additional JVM system properties you may want to apply. RESTART_ON_UPGRADE Configure restart on package upgrade, defaults to false. This means you will have to restart your elasticsearch instance after installing a package manually. The reason for this is to ensure, that upgrades in a cluster do not result in a continuous shard reallocation resulting in high network traffic and reducing the response times of your cluster.
7. 目录结构
home Elasticsearch home directory or $ES_HOME /usr/share/elasticsearch bin Binary scripts including elasticsearch to start a node and elasticsearch-plugin to install plugins /usr/share/elasticsearch/bin conf Configuration files including elasticsearch.yml /etc/elasticsearch path.conf conf Environment variables including heap size, file descriptors. /etc/sysconfig/elasticsearch data The location of the data files of each index / shard allocated on the node. Can hold multiple locations. /var/lib/elasticsearch path.data logs Log files location. /var/log/elasticsearch path.logs plugins Plugin files location. Each plugin will be contained in a subdirectory. /usr/share/elasticsearch/plugins repo Shared file system repository locations. Can hold multiple locations. A file system repository can be placed in to any subdirectory of any directory specified here. Not configured path.repo script Location of script files. /etc/elasticsearch/scripts path.scripts
修改clustername
修改nodename
5. 监控方案
1. 集群健康状态
curl -X GET 'http://127.0.0.1:9200/_cluster/health?pretty' 查看群集的健康状态
[root@localhost elk_data]# curl -X GET 'http://192.168.1.100:9200/_cluster/health?pretty'
{
"cluster_name" : "zhenpin-elk", 集群名称
"status" : "yellow", 集群状态,重要
"timed_out" : false,
"number_of_nodes" : 3, 集群内节点总数
"number_of_data_nodes" : 3, 集群内的总数据节点数
"active_primary_shards" : 6466, 集群内所有索引的主分片总数
"active_shards" : 7737, 集群内所有索引的分片总数
"relocating_shards" : 0, 正在迁移的分片数
"initializing_shards" : 2, 正在初始化的分片数
"unassigned_shards" : 5193, 未分配到具体节点上的分片数
"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" : 59.82833281781627 活动分片的百分比
}
正常情况下:
relocating_shards
initializing_shards
unassigned_shards
delayed_unassigned_shards
这四项的值都应该为0
2. level请求参数
curl -X GET 'http://192.168.1.100:9200/_cluster/health?level=indices'
查看索引级别的分片状态
3. 使用bigdesk工具
4. 查看节点状态
curl -X GET http://192.168.1.100:9200/_cat/nodes?v
curl -XGET 'http://192.168.10.213:9200/_cluster/state/nodes?pretty'
5. 安装head插件
官网地址:https://github.com/mobz/elasticsearch-head
-
-
git clone git://github.com/mobz/elasticsearch-head.gitcd elasticsearch-headnpm installnpm run start- open http://ip:9100
- 连接9100发现很慢,需要修改主节点的配置文件/etc/elasticsearch/elasticsearch.yml
- 添加两行内容 :
http.cors.enabled: truehttp.cors.allow-origin: "*"- 重启elasticsearch服务。
-
6. 查看分片状态
curl -XGET 'http://192.168.x.xx:9200/_cat/shards' |grep UNASSIGNED
7. 查看节点上的分片信息
四类API:
1. 检查集群,节点,索引等健康与否,以及获取其相应状态
curl -X GET 'http://127.0.0.1:9200/?pretty' 查看当前节点的版本信息
curl -X GET 'http://127.0.0.1:9200/_cat/nodes?v' 查看当前所有节点的负载信息
curl -X GET 'http://127.0.0.1:9200/_cat/master?v' 查看当前主节点的信息
curl -X GET 'http://127.0.0.1:9200/_cat/shards/?help' 查看帮助信息
curl -X GET 'http://127.0.0.1:9200/_cat/indices' 查看所有索引信息
curl -X GET 'http://127.0.0.1:9200/_cluster/health?pretty' 查看群集的健康状态
curl -X GET 'http://127.0.0.1:9200/_cluster/health/common-error-*?pretty' 查看某个索引的健康状态
curl -X GET 'http://127.0.0.1:9200/_cluster/state/master_node'
2. 管理集群,节点,索引及元数据
curl -X GET 'http://127.0.0.1:9200/_cluster/state/master_node'
3. 执行CRUD操作
创建文档
curl -XPUT '127.0.0.1:9200/students/class/1?pretty' -d ''
获取文档
curl -XGET '127.0.0.1:9200/students/class/1?pretty'
更新文档
PUT覆盖原来的文档
只更新部分文档内容,得使用_update API
curl -XPOST '127.0.0.1:9200/students/class/1/_update?pretty' -d '
{
"doc": {"age": 22 }
}'
删除文档
curl -XDELETE 'localhost:9200/students/class/2'
删除索引
curl -XDELETE 'localhost:9200/students'
4. 查询数据
query API
Query DSL: 用于实现诸多类型查询操作
查看某个索引下的所有文档
curl -XGET 'localhost:9200/students/_search?pretty'
查看所有索引下的所有文档
curl -XGET 'localhost:9200/_search?pretty'
4. 执行高级操作,例如:paging,filtering等
ES访问接口: 9200/tcp
curl -X <VERB> '<PROTOCOL>://HOST:PORT/<PATH>?<QUERY_STRING>' -d '<BODY>'
VERB: GET,PUT,DELETE
PROTOCOL: http, https
QUERY_STRING: 查询参数,例如?pretty表示用易读的JSON格式输出
BODY: 请求的主体
Cluster APIs:
health:
curl -X GET 'http://127.0.0.1:9200/_cluster/health?pretty' 查看群集的健康状态
curl -X GET 'http://127.0.0.1:9200/_cluster/health/common-error-*?pretty' 查看某个索引的健康状态
state:
curl -X GET 'http://127.0.0.1:9200/_cluster/state/master_node'
stats:
curl -X GET 'http://127.0.0.1:9200/_cluster/stats?pretty'
6. ES的plugins插件
1. 插件扩展ES的功能
添加自定义的映射类型,自定义分析器,本地脚本,自定义发现方式
2. 安装
直接将插件放到plugins目录中,/usr/share/elasticsearch/plugins
使用plugin脚本管理/usr/share/elasticsearch/bin/plugin
/usr/share/elasticsearch/bin/plugin -h 帮助
/usr/share/elasticsearch/bin/plugin -i 安装插件
/usr/share/elasticsearch/bin/plugin -r 卸载插件
/usr/share/elasticsearch/bin/elasticsearch-plugin install 插件url路径
/usr/share/elasticsearch/bin/elasticsearch-plugin remove 插件名称
/usr/share/elasticsearch/bin/elasticsearch-plugin list 列出所有插件
插件:marvel插件
3. 站点插件
http://127.0.0.1:9200/_plugin/plugins_name
7. ES stack之logstash
1. logstash日志收集工具
支持多数据获取机制,通过TCP/UDP协议,文件,syslog,windows,eventlogs及STDIN等。
它支持对数据执行过滤,修改等操作。
agent/server
2. logstash插件
1. input plugin
file:从指定的文件中读取事件流,类似于tail -f
udp
redis:从redis读取数据,支持redis channel和lists两种方式
2. codec plugin
3. filter plugin
用于在于将event通过output发出之前对其实现某些处理功能。grok
grok:用于分析并结构化文本数据,目前是logstash中将非结构化日志数据转化为结构化的可查询数据的不二之选。
模式定义位置:/usr/share/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.1.2/patterns/grok-patterns
1.1.1.1 GET /index.html 30 0.23
%{IP:clientip} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:decrion}
例子:
input {
beats {
port => 5044
}
}
filter {
if [fields][tag] == "common-all"{
grok {
match =>{
"message" => "\ - %{TIMESTAMP_ISO8601:datetime} \[// - - \] %{LOGLEVEL:loglevel} %{NOTSPACE:other} - %{ALL:info}"
}
}
}
if [fields][tag] == "common-error"{
grok {
match =>{
"message" => "%{TIMESTAMP_ISO8601:datetime} \[// - - \] %{LOGLEVEL:loglevel} %{NOTSPACE:other} - %{ALL:info}"
}
}
}
}
output {
if [fields][tag] == "common-all"{
elasticsearch {
hosts => "127.0.0.1:9200"
index => "common-all-%{+YYYY.mm.dd}"
#document_type => "%{[@metadata][type]}"
}
}
if [fields][tag] == "common-error"{
elasticsearch {
hosts => "127.0.0.1:9200"
index => "common-error-%{+YYYY.mm.dd}"
#document_type => "%{[@metadata][type]}"
}
}
}
匹配apache logs
grok {
match =>{
"message" => "%{COMBINEDAPACHELOG}"
}
}
匹配nginx logs
1. 自定义好正则
NGUSERNAME [a-zA-Z\.\@\-\+_%]+
HOSTPORT1 (%{IPV4}:%{POSINT}[, ]{0,2})+
NGUSER %{NGUSERNAME}
NGINXACCESSTRUE %{IPORHOST:http_host} (?:%{IPORHOST:clientip}|-) (?:%{HOSTPORT1:upstream_addr}|-) \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} (?:%{NUMBER:upstream_time:float}|-) (?:%{NUMBER:request_time:float})
NGINXACCESSERROR %{IPORHOST:http_host} (?:%{IPORHOST:clientip}|-) (?:%{HOSTPORT1:upstream_addr}|-) \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent}
NGINXACCESSLOG %{NGINXACCESSTRUE}|%{NGINXACCESSERROR}
NGINXACCESS %{NGINXACCESSLOG}
grok {
patterns_dir => "/usr/share/logstash/patterns"
match =>{
"message" => "%{NGINXACCESS}"
}
}
4. output plugin
1. stdout标准输出
2. elasticsearch
3. redis
3. 安装logstash
yum install logstash -y
4. 配置logstash
5. 检查配置文件语法
logstash -f /etc/logstash/conf.d/sample.conf -t
6. 数据类型
1. Array: [item1,item2,....]
2. Boolean: true
3. Bytes
4. Codec:编码器
5. Hash: key => value
6. Number
7. string
8. elasticsearch集群
1. 故障:
max file descriptors [64000] for elasticsearch process is too low, increase to at least [65536]
解决方法:
2. 报错:
[2019-03-07T15:44:56,109][INFO ][logstash.outputs.elasticsearch] retrying failed action with response code: 429 ({"type"=>"es_rejected_execution_exception", "reason"=>"rejected execution of org.elasticsearch.transport.TransportService$7@3211f4ed on EsThreadPoolExecutor[bulk, queue capacity = 200, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@229b9da8[Running, pool size = 2, active threads = 2, queued tasks = 200, completed tasks = 2554]]"})
解决方法:
3. 报错:
[2019-03-15T14:38:54,986][WARN ][r.suppressed ] path: /_bulk, params: {}
org.elasticsearch.cluster.block.ClusterBlockException: blocked by: [SERVICE_UNAVAILABLE/2/no master];
at org.elasticsearch.cluster.block.ClusterBlocks.globalBlockedException(ClusterBlocks.java:165) ~[elasticsearch-5.6.15.jar:5.6.15]
at org.elasticsearch.action.bulk.TransportBulkAction$BulkOperation.handleBlockExceptions(TransportBulkAction.java:396) [elasticsearch-5.6.15.jar:5.6.15]
at org.elasticsearch.action.bulk.TransportBulkAction$BulkOperation.doRun(TransportBulkAction.java:280) [elasticsearch-5.6.15.jar:5.6.15]
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) [elasticsearch-5.6.15.jar:5.6.15]
at org.elasticsearch.action.bulk.TransportBulkAction$BulkOperation$2.onTimeout(TransportBulkAction.java:433) [elasticsearch-5.6.15.jar:5.6.15]
at org.elasticsearch.cluster.ClusterStateObserver$ContextPreservingListener.onTimeout(ClusterStateObserver.java:311) [elasticsearch-5.6.15.jar:5.6.15]
at org.elasticsearch.cluster.ClusterStateObserver$ObserverClusterStateListener.onTimeout(ClusterStateObserver.java:238) [elasticsearch-5.6.15.jar:5.6.15]
at org.elasticsearch.cluster.service.ClusterService$NotifyTimeout.run(ClusterService.java:1056) [elasticsearch-5.6.15.jar:5.6.15]
at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:576) [elasticsearch-5.6.15.jar:5.6.15]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_201]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_201]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_201]、
4. 报错:
[2019-03-15T17:07:05,572][WARN ][o.e.t.n.Netty4Transport ] [node-3] write and flush on the network layer failed (channel: [id: 0x26f5f798, L:0.0.0.0/0.0.0.0:9300 ! R:/192.168.1.100:57523])
java.nio.channels.ClosedChannelException: null
at io.netty.channel.AbstractChannel$AbstractUnsafe.write(...)(Unknown Source) ~[?:?]
5. 发现elasticsearch的日志,报错:
[2019-03-28T14:44:21,949][DEBUG][o.e.a.b.TransportShardBulkAction] [node-1] [mly-tomcatfilebeat-2019.03.28][4] failed to execute bulk item (index) BulkShardRequest [[mly-tomcatfilebeat-2019.03.28][4]] containing [index {[mly-tomcatfilebeat-2019.03.28][log][AWnDCtk9gquPiFasuuLO], source[{"date":"<com.netflix.discovery.shared.resolver.aws.ConfigClusterResolver>","classfile":"eureka","other":"endpoints","offset":24933,"level":"Resolving","input_type":"log","source":"/usr/local/javalogs/wms/common-all.log","message":"<com.netflix.discovery.shared.resolver.aws.ConfigClusterResolver> - Resolving eureka endpoints via configuration","type":"log","tags":["tomcat_base_wms_service_21","beats_input_codec_plain_applied","multiline"],"@timestamp":"2019-03-28T06:44:08.623Z","@version":"1","beat":{"name":"tomcat-base-wms-21","hostname":"tomcat-base-wms-21","version":"5.6.11"},"host":"tomcat-base-wms-21","time":"-","info":"via"}]}]
org.elasticsearch.index.mapper.MapperParsingException: failed to parse [date]
at org.elasticsearch.index.mapper.FieldMapper.parse(FieldMapper.java:298) ~[elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.index.mapper.DocumentParser.parseObjectOrField(DocumentParser.java:468) ~[elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.index.mapper.DocumentParser.parseValue(DocumentParser.java:591) ~[elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.index.mapper.DocumentParser.innerParseObject(DocumentParser.java:396) ~[elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.index.mapper.DocumentParser.parseObjectOrNested(DocumentParser.java:373) ~[elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.index.mapper.DocumentParser.internalParseDocument(DocumentParser.java:93) ~[elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.index.mapper.DocumentParser.parseDocument(DocumentParser.java:66) ~[elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:277) ~[elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.index.shard.IndexShard.prepareIndex(IndexShard.java:530) ~[elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.index.shard.IndexShard.prepareIndexOnPrimary(IndexShard.java:507) ~[elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.action.bulk.TransportShardBulkAction.prepareIndexOperationOnPrimary(TransportShardBulkAction.java:458) ~[elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.action.bulk.TransportShardBulkAction.executeIndexRequestOnPrimary(TransportShardBulkAction.java:466) ~[elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.action.bulk.TransportShardBulkAction.executeBulkItemRequest(TransportShardBulkAction.java:146) [elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.action.bulk.TransportShardBulkAction.shardOperationOnPrimary(TransportShardBulkAction.java:115) [elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.action.bulk.TransportShardBulkAction.shardOperationOnPrimary(TransportShardBulkAction.java:70) [elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryShardReference.perform(TransportReplicationAction.java:975) [elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryShardReference.perform(TransportReplicationAction.java:944) [elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.action.support.replication.ReplicationOperation.execute(ReplicationOperation.java:113) [elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.action.support.replication.TransportReplicationAction$AsyncPrimaryAction.onResponse(TransportReplicationAction.java:345) [elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.action.support.replication.TransportReplicationAction$AsyncPrimaryAction.onResponse(TransportReplicationAction.java:270) [elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.action.support.replication.TransportReplicationAction$1.onResponse(TransportReplicationAction.java:924) [elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.action.support.replication.TransportReplicationAction$1.onResponse(TransportReplicationAction.java:921) [elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.index.shard.IndexShardOperationsLock.acquire(IndexShardOperationsLock.java:151) [elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.index.shard.IndexShard.acquirePrimaryOperationLock(IndexShard.java:1659) [elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.action.support.replication.TransportReplicationAction.acquirePrimaryShardReference(TransportReplicationAction.java:933) [elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.action.support.replication.TransportReplicationAction.access$500(TransportReplicationAction.java:92) [elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.action.support.replication.TransportReplicationAction$AsyncPrimaryAction.doRun(TransportReplicationAction.java:291) [elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) [elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:266) [elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:248) [elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:69) [elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.transport.TransportService$7.doRun(TransportService.java:644) [elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:638) [elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) [elasticsearch-5.6.0.jar:5.6.0]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_141]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_141]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_141]
Caused by: java.lang.IllegalArgumentException: Invalid format: "<com.netflix.discovery.shared.re..."
at org.joda.time.format.DateTimeParserBucket.doParseMillis(DateTimeParserBucket.java:187) ~[joda-time-2.9.5.jar:2.9.5]
at org.joda.time.format.DateTimeFormatter.parseMillis(DateTimeFormatter.java:826) ~[joda-time-2.9.5.jar:2.9.5]
at org.elasticsearch.index.mapper.DateFieldMapper$DateFieldType.parse(DateFieldMapper.java:240) ~[elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.index.mapper.DateFieldMapper.parseCreateField(DateFieldMapper.java:465) ~[elasticsearch-5.6.0.jar:5.6.0]
at org.elasticsearch.index.mapper.FieldMapper.parse(FieldMapper.java:287) ~[elasticsearch-5.6.0.jar:5.6.0]
... 36 more
解决方法:
根据错误显示,认为是date字段解析有问题。怀疑是grok那里写的不对,然后修改了一下grok,发现问题依然存在。
把所有的客户端的filebeat都停止,然后一台一台开启filebeat,发现当有一台filebeat的时候,问题还是存在。
怀疑是logstash的multiline不对,然后修改multiline,问题还是存在,把multiline屏蔽,问题不存在。然后把logstatsh的multiline,都放到每个客户端的filebeat中。
6. ELK集群中的一个节点报错:
[2019-04-22T16:30:15,468][ERROR][o.e.b.Bootstrap ] Exception
java.lang.IllegalStateException: Failed to create node environment
at org.elasticsearch.node.Node.<init>(Node.java:268) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.node.Node.<init>(Node.java:245) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:233) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:233) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:342) [elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:132) [elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:123) [elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:70) [elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:134) [elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.cli.Command.main(Command.java:90) [elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:91) [elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:84) [elasticsearch-5.6.16.jar:5.6.16]
Caused by: java.io.IOException: failed to test writes in data directory [/var/lib/elasticsearch/nodes/0/indices/1a2hC1WUTX-jvawR3tWBzw/3/_state] write permission is required
at org.elasticsearch.env.NodeEnvironment.tryWriteTempFile(NodeEnvironment.java:1111) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.env.NodeEnvironment.assertCanWrite(NodeEnvironment.java:1090) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:282) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.node.Node.<init>(Node.java:265) ~[elasticsearch-5.6.16.jar:5.6.16]
... 11 more
Caused by: java.nio.file.FileSystemException: /var/lib/elasticsearch/nodes/0/indices/1a2hC1WUTX-jvawR3tWBzw/3/_state/.es_temp_file: Not a directory
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91) ~[?:?]
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) ~[?:?]
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) ~[?:?]
at sun.nio.fs.UnixFileSystemProvider.implDelete(UnixFileSystemProvider.java:244) ~[?:?]
at sun.nio.fs.AbstractFileSystemProvider.deleteIfExists(AbstractFileSystemProvider.java:108) ~[?:?]
at java.nio.file.Files.deleteIfExists(Files.java:1165) ~[?:1.8.0_201]
at org.elasticsearch.env.NodeEnvironment.tryWriteTempFile(NodeEnvironment.java:1107) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.env.NodeEnvironment.assertCanWrite(NodeEnvironment.java:1090) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:282) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.node.Node.<init>(Node.java:265) ~[elasticsearch-5.6.16.jar:5.6.16]
... 11 more
[2019-04-22T16:30:15,487][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [node-3] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: Failed to create node environment
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:136) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:123) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:70) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:134) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:91) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:84) ~[elasticsearch-5.6.16.jar:5.6.16]
Caused by: java.lang.IllegalStateException: Failed to create node environment
at org.elasticsearch.node.Node.<init>(Node.java:268) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.node.Node.<init>(Node.java:245) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:233) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:233) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:342) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:132) ~[elasticsearch-5.6.16.jar:5.6.16]
... 6 more
Caused by: java.io.IOException: failed to test writes in data directory [/var/lib/elasticsearch/nodes/0/indices/1a2hC1WUTX-jvawR3tWBzw/3/_state] write permission is required
at org.elasticsearch.env.NodeEnvironment.tryWriteTempFile(NodeEnvironment.java:1111) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.env.NodeEnvironment.assertCanWrite(NodeEnvironment.java:1090) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:282) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.node.Node.<init>(Node.java:265) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.node.Node.<init>(Node.java:245) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:233) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:233) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:342) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:132) ~[elasticsearch-5.6.16.jar:5.6.16]
... 6 more
Caused by: java.nio.file.FileSystemException: /var/lib/elasticsearch/nodes/0/indices/1a2hC1WUTX-jvawR3tWBzw/3/_state/.es_temp_file: Not a directory
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91) ~[?:?]
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) ~[?:?]
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) ~[?:?]
at sun.nio.fs.UnixFileSystemProvider.implDelete(UnixFileSystemProvider.java:244) ~[?:?]
at sun.nio.fs.AbstractFileSystemProvider.deleteIfExists(AbstractFileSystemProvider.java:108) ~[?:?]
at java.nio.file.Files.deleteIfExists(Files.java:1165) ~[?:1.8.0_201]
at org.elasticsearch.env.NodeEnvironment.tryWriteTempFile(NodeEnvironment.java:1107) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.env.NodeEnvironment.assertCanWrite(NodeEnvironment.java:1090) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:282) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.node.Node.<init>(Node.java:265) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.node.Node.<init>(Node.java:245) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:233) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:233) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:342) ~[elasticsearch-5.6.16.jar:5.6.16]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:132) ~[elasticsearch-5.6.16.jar:5.6.16]
... 6 more
7. 记录一次elk集群中的一个节点突然与主节点,然后一直尝试连接的问题。
报错内容如下:
[2019-04-25T15:34:45,682][INFO ][o.e.c.s.ClusterService ] [node-2] detected_master {node-1}{iFpkp4QeQEyfsULp5jXzjw}{4RLhFTzbQoiTaK3mpquN-A}{192.168.1.100}{192.168.1.100:9300}, reason: zen-disco-receive(from master [master {node-1}{iFpkp4QeQEyfsULp5jXzjw}{4RLhFTzbQoiTaK3mpquN-A}{192.168.1.100}{192.168.1.100:9300} committed version [43070]])
[2019-04-25T15:34:46,983][INFO ][o.e.d.z.ZenDiscovery ] [node-2] master_left [{node-1}{iFpkp4QeQEyfsULp5jXzjw}{4RLhFTzbQoiTaK3mpquN-A}{192.168.1.100}{192.168.1.100:9300}], reason [failed to ping, tried [3] times, each with maximum [30s] timeout]
[2019-04-25T15:34:46,984][WARN ][o.e.d.z.ZenDiscovery ] [node-2] master left (reason = failed to ping, tried [3] times, each with maximum [30s] timeout), current nodes: nodes:
{node-2}{Rt0Bx2ZrTn6yLnQoduU3xQ}{OAds0hDJTZuqj6AnnhnV_g}{192.168.1.39}{192.168.1.39:9300}, local
{node-1}{iFpkp4QeQEyfsULp5jXzjw}{4RLhFTzbQoiTaK3mpquN-A}{192.168.1.100}{192.168.1.100:9300}, master
反反复复出现这个报错。
解决方法:
查看系统时间,发现两台服务器的时间不同,导致这个问题出现。
8. 新增elasticsearch节点,启动报错
max number of threads [1024] for user [elasticsearch] is too low, increase to at least [2048]
解决方法:
修改/etc/security/limits.d/90-nproc.conf
* soft nproc 2048
9. 关于elastisearch的索引名称问题
在logstash的配置文件中,设置时间为
output {
if [fields][tag] == "common-all"{
elasticsearch {
hosts => "192.168.1.100:9200"
#hosts => "127.0.0.1:9200"
index => "common-all-%{+YYYY.MM.dd}"
#document_type => "%{[@metadata][type]}"
}
}
if [fields][tag] == "common-error"{
elasticsearch {
hosts => "192.168.1.100:9200"
#hosts => "127.0.0.1:9200"
index => "common-error-%{+YYYY.MM.dd}" 这里要写对了
#document_type => "%{[@metadata][type]}"
}
}
10. kibana配置与管理
1. 安装
yum install kibana
2. 安装目录
/usr/share/kibana
3. 配置文件
/etc/kibana/kibana.yml
[root@localhost kibana]# grep -Ev "^$|^#" /etc/kibana/kibana.yml server.port: 5601 server.host: "0.0.0.0" elasticsearch.url: "http://192.168.1.100:9200" elasticsearch.pingTimeout: 3000 elasticsearch.requestTimeout: 300000
4. 管理kibana服务
/etc/init.d/kibana start status stop restart
5. 查看kibana版本
/usr/share/kibana/bin/kibana --version
6. .kibana索引结构
index pattern
11. logstash占用CPU过高
logstash 是通过rpm方式安装的,版本是6.2.2
解决方案 :
rpm 安装的logstash有 initctl 的守护进程
使用initctl stop logstash来关闭 logstash
#initctl stop logstash logstash stop/waiting
12. kibana使用的lucene查询语法
1. 全文搜索
在搜索栏中输入要搜索的关键字,例如:login,会返回所有字段值中包含login的文档
2. 使用双引号包起来作为一个短语搜索
3. 按照某个字段搜索
filed: value
filed: "value"
4. 通配符
?匹配单个字符
*匹配0到多个字符
?和*不能用作第一个字符
5. 模糊搜索
在一个单词后面加上~
6. 范围搜索
数值/时间/IP/字符串 类型的字段可以对某一范围进行查询length:[100 TO 200]sip:["172.24.20.110" TO "172.24.20.140"]date:{"now-6h" TO "now"}tag:{b TO e} 搜索b到e中间的字符count:[10 TO *] * 表示一端不限制范围count:[1 TO 5} [ ] 表示端点数值包含在范围内,{ } 表示端点数值不包含在范围内,可以混合使用,此语句为1到5,包括1,不包括5
可以简化成以下写法:age:>10age:<=10age:(>=10 AND <20)
7. 逻辑操作
ANDOR
+:搜索结果中必须包含此项-:不能含有此项+apache -jakarta test aaa bbb:结果中必须存在apache,不能有jakarta,剩余部分尽量都匹配到
8. 转义特殊字符
+ - = && || > < ! ( ) { } [ ] ^ " ~ * ? : \ /
以上字符当作值搜索的时候需要用\转义\(1\+1\)\=2用来查询(1+1)=2
9. 正则表达式
匹配zhen.com的所有二级域名
/.*zhen\.com/
13. elasticsearch集群增加节点
1. 安装配置好elasticsearch
2. 修改配置文件/etc/elasticsearch/elasticsearch.yml
cluster.name: test node.name: node-4 node.master: false path.data: /elk_data/data bootstrap.memory_lock: false bootstrap.system_call_filter: false network.host: 192.168.1.101 http.port: 9200 discovery.zen.ping.unicast.hosts: ["192.168.1.100:9300","192.168.1.39:9300","192.168.1.52:9300","192.168.1.101:9300"] http.cors.enabled: true http.cors.allow-origin: "*"
3. 修改/etc/security/limits.d/90-nproc.conf
* soft nproc 2048
4. 启动elasticsearch服务
/etc/init.d/elasticsearch start
5. elasticsearch集群会把部分分片分配到新的服务器上
查看一下elk集群的状态
curl -X GET 'http://192.168.1.101:9200/_cluster/health?pretty'
{
"cluster_name" : "zhenpin-elk",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 3,
"active_primary_shards" : 1261,
"active_shards" : 2522,
"relocating_shards" : 0, 这个显示为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
}
14. elasticsearch集群删除节点
1. 将自动分配分片,排除192.168.1.39
curl -XPUT "http://192.168.1.100:9200/_cluster/settings" -d '{"transient": {"cluster.routing.allocation.exclude._ip" : "192.168.1.39"}}'
2. 等待所有的分片都分配完成。
curl -X GET 'http://192.168.1.101:9200/_cluster/health?pretty'
结果中relocating_shards这个值为0
3. 关闭要删除的节点
/etc/init.d/elasticsearch stop
4. 其它一下其他节点的/etc/elasticsearch/elasticsearch.yml的配置文件
discovery.zen.ping.unicast.hosts: ["192.168.1.100:9300","192.168.1.101:9300","192.168.1.52:9300"]
5. 所有节点的elasticsearch服务都需要重启一下。
16. elasticsearch集群节点重启
1. 关闭自动分配分片
curl -XPUT "http://192.168.1.100:9200/_cluster/settings" -d '{"transient": {"cluster.routing.allocation.enable" : "none"}}'
2. 重启elastisearch节点
/etc/init.d/elasticsearch restart
3. 恢复自动分配分片
curl -XPUT "http://192.168.1.100:9200/_cluster/settings" -d '{"transient": {"cluster.routing.allocation.enable" : "all"}}'
17. 定时清理elasticsearch集群索引
#!/bin/bash
shijian=`date +%Y.%m.%d -d "60 days ago"`
/usr/bin/curl -XDELETE "http://192.168.1.100:9200/common-error-${shijian}" && /usr/bin/curl -XDELETE "http://192.168.1.100:9200/common-all-${shijian}"

浙公网安备 33010602011771号