ELK概述
ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。
各工具合作流程图
- Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
- Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
Logstash工作流程
-
Kibana是一个开源的分析和可视化平台,设计用于和Elasticsearch一起工作。
可以用Kibana来搜索,查看,并和存储在Elasticsearch索引中的数据进行交互(增删改数据都可以)。
可以轻松地执行高级数据分析,并且以各种图标、表格和地图的形式可视化数据。
Kibana使得理解大量数据变得很容易。它简单的、基于浏览器的界面使你能够快速创建和共享动态仪表板,实时显示Elasticsearch查询的变化。 -
Filebeat隶属于Beats。目前Beats包含四种工具:
1.Packetbeat(搜集网络流量数据)
2.Metricbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
3.Filebeat(搜集文件数据)
4.Winlogbeat(搜集 Windows 事件日志数据)
Filebeat具体工作流程
ELK6.5 环境搭建
先在各服务器上安装JDK并配置
cd /usr/local/src
wget https://download.oracle.com/otn-pub/java/jdk/8u191-b12/2787e4a523244c269598db4e85c51e0c/jdk-8u191-linux-x64.tar.gz
tar xf jdk-8u191-linux-x64.tar.gz
mv jdk1.8.0_191/ /usr/local/java
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
安装ElasticSearch6.5.2
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.2.tar.gz
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.2.tar.gz.sha512
shasum -a 512 -c elasticsearch-6.5.2.tar.gz.sha512
tar -xzf elasticsearch-6.5.2.tar.gz
cd elasticsearch-6.5.2/
## 由于虚拟机只分配了1G内存,所以需要修改JVM的初始化内存,这里修改配置文件 jvm.options
cd /usr/local/src/elasticsearch-6.5.2/config
vim config/jvm.options
修改 jvm.options
# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space
-Xms384m
-Xmx384m
修改配置文件 config/elasticsearch.yml
cluster.name: myapplication
node.name: node-105
path.data: /usr/local/src/elasticsearch-6.5.2/data
path.logs: /usr/local/src/elasticsearch-6.5.2/logs
bootstrap.memory_lock: false
network.host: 192.168.56.105
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.56.105", "192.168.56.101", "192.168.56.103"]
discovery.zen.minimum_master_nodes: 2
gateway.recover_after_nodes: 3
注意:bootstrap.memory_lock:true 配置的意义:锁定物理内存地址,防止es内存被交换出去,也就是避免es使用swap交换分区,频繁的交换,会导致IOPS变高。
创建ElasticSearch进程用户 es
sudo groupadd es
sudo useradd es -g es
## 为es用户设置一个密码
sudo passwd es
修改 /etc/security/limits.conf 加入以下内容
es soft memlock unlimited
es hard memlock unlimited
es hard nofile 65536
es soft nofile 65536
es hard nproc 65536
es soft nproc 65536
注意:修改后必须退出重新登录才会生效
将ElasticSearch相关的目录的所有者改为es账户
sudo chown -R es:es /usr/local/src/jdk1.8.0_191
sudo chown -R es:es /usr/local/src/elasticsearch-6.5.2
启动ElasticSearch
cd /usr/local/src/elasticsearch-6.5.2
su es
./bin/elasticsearch
启动报错:
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
vim /etc/sysctl.conf
vm.max_map_count=262144
sudo sysctl -p
或
sysctl -w vm.max_map_count=262144
查看集群启动后能否正常工作
curl -X GET "192.168.56.105:9200/"
{
"name" : "node-105",
"cluster_name" : "myapplication",
"cluster_uuid" : "dBHz7YwUQLa3F943QhsW2g",
"version" : {
"number" : "6.5.2",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "9434bed",
"build_date" : "2018-11-29T23:58:20.891072Z",
"build_snapshot" : false,
"lucene_version" : "7.5.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
查看es集群节点状态
curl http://192.168.56.105:9200/_cluster/health?pretty
{
"cluster_name" : "myapplication",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 3,
"active_primary_shards" : 0,
"active_shards" : 0,
"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
}
Elasticsearch安装插件
./bin/elasticsearch-plugin install analysis-icu
./bin/elasticsearch-plugin install analysis-smartcn
查看已安装的elasticsearch插件
./bin/elasticsearch-plugin list
Elasticsearch内部原理
Elasticsearch 天生就是分布式的,并且在设计时屏蔽了分布式的复杂性.
Elasticsearch 尽可能地屏蔽了分布式系统的复杂性。这里列举了一些在后台自动执行的操作:
- 分配文档到不同的容器 或 分片 中,文档可以储存在一个或多个节点中
- 按集群节点来均衡分配这些分片,从而对索引和搜索过程进行负载均衡
- 复制每个分片以支持数据冗余,从而防止硬件故障导致的数据丢失 将集群中任一节点的请求路由到存有相关数据的节点
- 集群扩容时无缝整合新节点,重新分配分片以便从离群节点恢复
一个运行中的 Elasticsearch 实例称为一个 节点,而集群是由一个或者多个拥有相同 cluster.name 配置的节点组成, 它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。
当一个节点被选举成为 主 节点时, 它将负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等。 而主节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈。 任何节点都可以成为主节点。
作为用户,我们可以将请求发送到 集群中的任何节点 ,包括主节点。 每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。 无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将最终结果返回給客户端。 Elasticsearch 对这一切的管理都是透明的。
kibana 安装配置
cd /usr/local/src
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.5.2-linux-x86_64.tar.gz
tar -zxf kibana-6.5.2-linux-x86_64.tar.gz
cd kibana-6.5.2-linux-x86_64
##修改配置文件
vim config/kibana.yml
# 修改kibana外网地址的host
server.host: "192.168.56.102"
# 修改kibana要连接的ES服务器
elasticsearch.url: "http://192.168.56.105:9200"
./bin/kibana
验证是否成功 浏览器中输入 http://192.168.56.102:5601
Logstash 安装配置
cd /usr/local/src
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.5.2.tar.gz
tar -zxf logstash-6.5.2.tar.gz
cd logstash-6.5.2
## 新建配置文件 config/default.conf
# 监听5044端口作为输入
input {
beats {
port => "5044"
}
}
# 数据过滤
filter {
grok {
match => { "message" => "MAINNGINXLOG %{COMBINEDAPACHELOG} %{QS:x_forwarded_for}" }
}
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
target => ["datetime"]
}
geoip {
source => "clientip"
}
}
# 输出配置为ES服务器的9200端口
output {
elasticsearch {
hosts => ["192.168.56.105:9200"]
index => "access_log"
}
}
# 启动服务
./bin/logstash -f config/default.conf
Filebeat 安装配置
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.5.2-linux-x86_64.tar.gz
tar -zxf filebeat-6.5.2-linux-x86_64.tar.gz
cd filebeat-6.5.2-linux-x86_64
## 修改配置文件 filebeat.yml
# 修改数据来源,配置为nginx的日志目录,包括access.log及error.log
filebeat.inputs:
- type:log
enabled: true
paths:
- /var/log/nginx/*.log
# kibana相关设置,配置为kibana服务器地址
setup.kibana:
host: "192.168.56.102:5601"
# logstash的host地址及端口
output.logstash:
hosts: ["192.168.56.102:5044"]
## 运行filebeat -e 在终端显示一些处理过程信息
./filebeat -e -c filebeat.yml &