按照如下顺序安装 你要使用的Elastic Stack
产品:html
下图为X-Pack
在Elasticsearch
、Kibana
、Logstash
中所提供的功能。java
注: X-Pack 将于 6.3 版本起开源。( 官方说明)
一、下载所需的软件包:官方地址node
# mkdir /opt/download/elastic # cd /opt/download/elastic # wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.tar.gz # wget https://artifacts.elastic.co/downloads/kibana/kibana-6.2.4-linux-x86_64.tar.gz # wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4-linux-x86_64.tar.gz # wget https://artifacts.elastic.co/downloads/logstash/logstash-6.2.4.tar.gz # wget https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-6.2.4.zip
二、服务器资源linux
Elastic Stack
,同时也会有对集群模式的说明。三、建立普通用户
不要以root
用户运行应用程序,这里我建立一个elastic
普通用户。nginx
# useradd elastic
四、建立目录结构
分别建立 程序目录、日志目录、数据目录,并对elastic
普通用户受权目录权限。web
# mkdir -p /opt/soft/elastic # mkdir -p /opt/log/elastic/{elasticsearch,logstash,kibana} # mkdir -p /opt/data/elastic/{elasticsearch,logstash,kibana} # chwon -R elastic:elastic /opt/soft/elastic # chwon -R elastic:elastic /opt/log/elastic # chwon -R elastic:elastic /opt/data/elastic
五、配置java
环境
访问Oracle官网 下载JAVA
这里我下载的版本是jdk-8u171-linux-x64.tar.gz
缓存
## 解压安装 # tar xzf jdk-8u171-linux-x64.tar.gz -C /opt/soft/ ## 配置JAVA的全局环境变量 # tail -1 /etc/profile export PATH=/opt/soft/jdk1.8.0_171/bin:$PATH ## 从新登陆当前终端或重载环境,可直接执行java命令为完成配置。 # . /etc/profile # java -version java version "1.8.0_171" Java(TM) SE Runtime Environment (build 1.8.0_171-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
六、补充说明
本文只根据官方资料,对nginx日志采集处理组织一个比较系统的简要介绍,没有针对单个产品的深刻剖析。bash
全文中,代码字段说明:
##
符号开头,注释行#
符号开头,以超级用户执行的命令$
符号开头,以普通用户执行的命令全文会围绕着此图进行Elastic Stack
介绍。服务器
Beats
服务部署在应用服务器(或称之边缘服务器)进行数据采集。Logstash
服务接收数据进行解析,处理数据结构后写入ES。ElasticSearch
服务搜索、分析和存储数据。在规模较大时,ES集群须要进行角色拆分。Kibana
操做 Elastic Stack 可视化 Elasticsearch 中的数据。说明:在生产环境中每层都建议是独立的主机,避免额外的干扰,提升每层的数据处理能力。另外,在一些网上的资料中,有的会在采集层和解析层中间加一层队列层
(队列服务 - REDIS/MQ/Kafka),用来提升突发尖峰等异常状况的容错能力。实际上是非必要的,下面会在介绍Logstash时对此说明。数据结构
## 配置用户的文件打开数及线程数 # grep "elastic" /etc/security/limits.conf elastic - nofile 65536 elastic - nproc 4096 ## 配置虚拟内存 # grep "max_map_count" /etc/sysctl.conf vm.max_map_count = 262144 # sysctl -p ## 解压即安装 # su - elastic $ tar xzf /opt/download/elastic/elasticsearch-6.2.4.tar.gz -C /opt/soft/elastic/ ## 配置文件 $ cd /opt/soft/elastic/elasticsearch-6.2.4 $ cat config/elasticsearch.yml cluster.name: elasticsearch node.name: ${HOSTNAME} network.host: 0.0.0.0 path.data: /opt/data/elastic/elasticsearch path.logs: /opt/log/elastic/elasticsearch ## 安装 X-pack 插件 $ bin/elasticsearch-plugin install file:///opt/download/elastic/x-pack-6.2.4.zip ## 启动服务 $ bin/elasticsearch -p elasticsearch.pid -d ## 生成 elastic、kibana、logstash_system 用户密码 $ bin/x-pack/setup-passwords auto
能够直接以${...}
的方式,调用系统中的环境变量。
来源参见: 官方说明
cluster.name
相同的节点能够组建成一个集群,默认的名称是elasticsearch
,可是你应该将它更改成一个适当的名称,它描述了集群的目的。 确保不会在不一样的环境中重用相同的集群名称,不然可能会遇到链接错误集群的节点。elasticsearch
将使用随机生成的UUID的前七个字符做为节点id。注意,节点id是持久化的,也就是说当节点从新启动时不会改变,因此配置一个可读性更高的节点名是有意义的,这里我习惯以主机名命名。elasticsearch
只绑定本地回环地址127.0.0.1
,这适合在单台服务器上部署单个开发节点。生产环境根据状况配置为你要监听的实际地址,以实现集群个节点间的通讯。 elasticsearch
进程也能实现集群功能,但仅适用于测试。Discovery settings elasticsearch
使用Zen Discovery
自定义发现实现节点与节点的集群创建和主选举。在生产环境中应该配置两个重要的发现设置。
Heap size
默认状况下,Elasticsearch
告诉JVM使用最小和最大的Heap size
为1GB。生产环境中,配置Heap size
是很重要的,以确保ES有足够的堆可用。配置法则是:
/var/lib/elasticsearch
,若是此路径不适合存储堆转储,可修改-XX:HeapDumpPath=/var/lib/elasticsearch
自定义路径。 若是指定了文件名而不是目录,则JVM将重复使用相同的文件; 这是一种防止堆转储在堆转储路径中积累的机制。或者,你能够经过配置计划任务,按期删除比配置的时间早的堆转储。 这里不作过多的赘述,细节详情参见:官方说明
Tribe node
经过 tribe.* 配置部落节点。是一种特殊的协调节点,它能够链接到多个集群,并在全部链接的集群中执行搜索和其余操做。
注意:Tribe node 从5.4.0版本起已被弃用。被 Cross Cluster Search 功能所取代,并将于 Elasticsearch 7.0 时移除。
Coordinating node
若是 node 禁用了node.master、node.data、node.ingest 能力,那么就剩下了一个协调节点,该节点只能路由请求、处理搜索减小阶段,以及分发批量索引。从本质上说,只协调节点就像智能负载平衡器同样。这样的节点须要有足够的内存和CPU来处理收集阶段。
注意:将太多的协调节点添加到集群中会增长整个集群的负担,由于所选的主节点必须等待来自每一个节点的集群状态更新的确认!只协调节点的好处不该该被夸大 —— 数据节点能够很好地服务于相同的目的。
更多细节详情参见:官方说明
配置为单机部署的最简配置。配置完启动后可经过:http://your_server_ip:5601 访问kibana的web服务。不要带端口访问的话,建议结合nginx来实现。
## 解压即安装 $ tar xzf /opt/download/elastic/kibana-6.2.4-linux-x86_64.tar.gz -C /opt/soft/elastic $ cd /opt/soft/elastic/kibana-6.2.4-linux-x86_64 ## 安装 X-pack 插件 $ bin/kibana-plugin install file:///opt/download/elastic/x-pack-6.2.4.zip ## 配置文件 $ grep -Ev '^#|^$' config/kibana.yml server.host: "0.0.0.0" elasticsearch.username: "kibana" elasticsearch.password: "Your****Pass****For****Kibana" pid.file: /opt/log/elastic/kibana/kibana.pid ## 启动服务 $ nohup bin/kibana &> /dev/null &
## 解压即安装 $ tar xzf /opt/download/elastic/logstash-6.2.4.tar.gz -C /opt/soft/elastic/ $ cd /opt/soft/elastic/logstash-6.2.4/ ## 安装 X-pack 插件 $ bin/logstash-plugin install file:///opt/download/elastic/x-pack-6.2.4.zip ## 主配置文件 $ grep -Ev "^#|^$" config/logstash.yml node.name: ${HOSTNAME} path.data: /opt/data/elastic/logstash config.reload.automatic: true path.logs: /opt/log/elastic/logstash xpack.monitoring.elasticsearch.url: ["http://your_es_ip:9200"] xpack.monitoring.elasticsearch.username: "logstash_system" xpack.monitoring.elasticsearch.password: "your***logstash***pass"
接下来配置work文件,用于解析处理数据。
$ mkdir workconfig $ cat workconfig/test-nginx.conf input { beats { port => 5044 host => "0.0.0.0" } } filter { if [fileset][module] == "nginx" { if [fileset][name] == "access" { grok { match => { "message" => ["%{IPORHOST:[nginx][access][remote_ip]} - %{DATA:[nginx][access][user_name]} \[%{HTTPDATE:[nginx][access][time]}\] \"%{WORD:[nginx][access][method]} %{DATA:[nginx][access][url]} HTTP/%{NUMBER:[nginx][access][http_version]}\" %{NUMBER:[nginx][access][response_code]} %{NUMBER:[nginx][access][body_sent][bytes]} \"%{DATA:[nginx][access][referrer]}\" \"%{DATA:[nginx][access][agent]}\""] } remove_field => "message" } mutate { add_field => { "read_timestamp" => "%{@timestamp}" } } date { match => [ "[nginx][access][time]", "dd/MM/YYYY:H:m:s Z" ] remove_field => "[nginx][access][time]" } useragent { source => "[nginx][access][agent]" target => "[nginx][access][user_agent]" remove_field => "[nginx][access][agent]" } geoip { source => "[nginx][access][remote_ip]" target => "[nginx][access][geoip]" } } else if [fileset][name] == "error" { grok { match => { "message" => ["%{DATA:[nginx][error][time]} \[%{DATA:[nginx][error][level]}\] %{NUMBER:[nginx][error][pid]}#%{NUMBER:[nginx][error][tid]}: (\*%{NUMBER:[nginx][error][connection_id]} )?%{GREEDYDATA:[nginx][error][message]}"] } remove_field => "message" } mutate { rename => { "@timestamp" => "read_timestamp" } } date { match => [ "[nginx][error][time]", "YYYY/MM/dd H:m:s" ] remove_field => "[nginx][error][time]" } } } } output { elasticsearch { hosts => your_es_ip manage_template => false index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" } }
指定work配置文件,启动服务。
$ bin/logstash -f workconfig/test-nginx.conf
Logstash
工做有三个阶段:inputs → filters → outputs
。
上面示例中的work配置,用于接收beats发来的nginx日志事件,而后进行字段处理实现关键字匹配,最后输出到ES并创建事件索引。每个Logstash
插件都足够的强大,更多细节性的插件说明请参阅官网:Input Plugins , Filter Plugins , Output Plugins , Codec Plugins.
前面我有提到说Beats
数据采集层与Logstash
解析层之间不须要额外的增长队列层(缓冲层),缘由是由于:
假如 Logstash 节点发生故障,Logstash 会经过持久化队列来保证运行中的事件至少一次被送达(at-least-once delivery)。那些未被正常处理的消息会被送往死信队列(dead letter queue)以便作进一步处理。因为具有了这种吸取吞吐量的能力,因此如今无需采用额外的队列层,Logstash 就能平稳度太高峰期。
## 解压即安装 $ tar xzf /opt/download/elastic/filebeat-6.2.4-linux-x86_64.tar.gz -C /opt/soft/elastic/ $ cd /opt/soft/elastic/filebeat-6.2.4-linux-x86_64/ ## 配置文件 $ grep -Pv "^[ ]*#|^$" filebeat.yml filebeat.prospectors: - type: log enabled: false paths: - /var/log/*.log filebeat.config.modules: path: ${path.config}/modules.d/*.yml reload.enabled: true setup.template.settings: index.number_of_shards: 3 output.logstash: hosts: ["your_logstash_ip:5044"]
使用filebeats
模块功能
## 启用nginx模块 ./filebeat modules enable nginx ## 模块配置 $ grep -Pv "^[ ]*#|^$" modules.d/nginx.yml - module: nginx access: enabled: true var.paths: - /path/to/log/nginx/access.log* error: enabled: true var.paths: - /path/to/log/nginx/error.log*
启动服务
$ filebeat
至此,整个配置过程完毕。
参考资料