小周周i 2019-06-27
按照以下顺序安装 你要使用的Elastic Stack产品:
下图为X-Pack在Elasticsearch、Kibana、Logstash中所提供的功能。

注: X-Pack 将于 6.3 版本起开源。(官方说明)
1、下载所需的软件包:官方地址
# 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
2、服务器资源
Elastic Stack,同时也会有对集群模式的说明。3、创建普通用户
不要以root用户运行应用程序,这里我创建一个elastic普通用户。
# useradd elastic
4、创建目录结构
分别创建 程序目录、日志目录、数据目录,并对elastic普通用户授权目录权限。
# 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/elastic5、配置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)
6、补充说明
本文只根据官方资料,对nginx日志采集处理组织一个比较系统的简要介绍,没有针对单个产品的深入剖析。
全文中,代码字段说明:
##符号开头,注释行# 符号开头,以超级用户执行的命令$符号开头,以普通用户执行的命令
全文会围绕着此图进行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
至此,整个配置过程完毕。
参考资料