环境准备
虽然官网说ES 7.12 支持JDK8,但是实际测试发现,ES 7.12 开始至少需要JDK11 以上版本。
- 因此我们的服务器最好使用JDK11长期支持版本。
Future versions of Elasticsearch will require Java 11; your Java version from [/usr/local/java/jdk/jdk1.8.0_161/jre] does not meet this requirement. Consider switching to a distribution of Elasticsearch with a bundled JDK. If you are already using a distribution with a bundled JDK, ensure the JAVA_HOME environment variable is not set.
ELK 是Elasticsearch ,Logstash, Kibana 的简称缩写,主要专注于可视化日志分析和查询
Elastic Stack 主要包括三大部分:
- 海量数据存储和检索----- Elasticsearch 分布式存储和查询
- 可视化界面和图表生成----Kibana 可提供可视化界面和各种图表的生成。
- 数据采集-----可以用Logstash采集日志也可以使用FileBeat 采集日志。
ELK 不过是Elastic Stack 用法中日志分析栈的一部分
说明:
- 不知道你们有没有注意到,官网似乎已经有意在使用FileBeat 替换Logstash 采集日志了。
- Logstash 是由 Elastic 公司推出的一款开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送指定的存储库中。Logstash 官方介绍。
- Filebeat 是 Elastic 公司为解决 Logstash “太重” 的问题推出的一款轻量级日志采集器,在处理数量众多的服务器、虚拟机和容器生成的日志时可使用 Logstash + Filebeat 的日志采集方式。Filebeat 官方介绍。
安装ELK/EFK
服务器IP | 主机名 | 软件列表 |
---|---|---|
10.0.0.11 | node-1 | Elasticsearch、Kibana、Logstash、FileBeat |
10.0.0.12 | node-2 | Elasticsearch、Logstash、FileBeat |
10.0.0.13 | node-3 | Elasticsearch、Logstash、FileBeat |
安装Elasticsearch
- Elasticsearch,江湖人称ES,它是一个实时的分布式存储,搜索和分析引擎。
下载和解压
- ES 的官方下载地址: https://www.elastic.co/cn/dow...
- 下载方式二: 使用命令行下载
yum install curl;
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.12.0-linux-x86_64.tar.gz;
#如果操作系统不支持curl命令也可以使用wget命令下载
yum install wget
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.12.0-linux-x86_64.tar.gz;
这里使用的版本 |
---|
elasticsearch-7.16.1-linux-x86_64.tar.gz |
filebeat-7.16.1-linux-x86_64.tar.gz |
logstash-7.16.2-linux-x86_64.tar.gz |
kafka-3.0.0-src.tgz |
kibana-7.16.1-linux-x86_64.tar.gz |
jdk使用ELK自带的 |
网盘链接:https://pan.baidu.com/s/1JL_l... |
---|
提取码:7777 |
虚拟机给三台服务器的配置都是
三台修改操作系统限制
在Centos7 Linux 操作系统中,默认单个进程可以打开的最多文件数是1024
但是ES 对操作系统有些特殊要求
- 要求操作系统单个进程可以打开的最大文件数最少要达到65535.
- 而且ES 将会使用很多线程,也需要修改下操作系统限制。
如果不配置就会报错如下所示:
bootstrap checks failed. You must address the points described in the following [3] lines before starting Elasticsearch.
bootstrap check failure [1] of [3]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
bootstrap check failure [2] of [3]: max number of threads [3687] for user [elasticsearch] is too low, increase to at least [4096]
bootstrap check failure [3] of [3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
检查当前操作系统支持单个进程可以打开的最多文件数,返回值如果没修改会显示1024
ulimit -n
要修复bootstrap check failure [1] of [3] 和bootstrap check failure [2] of [3]错误
三台修改配置文件
vi /etc/security/limits.conf
在最后面加入
* soft nofile 65535
* hard nofile 65535
* hard nproc 4096
* soft nproc 4096
- 设置限制数量,第一列表示用户,* 表示所有用户
- soft nproc :单个用户可用的最大进程数量(超过会警告);
- hard nproc:单个用户可用的最大进程数量(超过会报错);
- soft nofile :可打开的文件描述符的最大数(超过会警告);
- hard nofile :可打开的文件描述符的最大数(超过会报错);
原文链接:https://blog.csdn.net/zxljsbk... - 断开session 链接,重新登陆生效
要修复bootstrap check failure [3] of [3] 错误,需要修改/etc/sysctl.conf
vi /etc/sysctl.conf
#添加内容
vm.max_map_count=262144
- vm.max_map_count 配置确保操作系统拥有足够多的虚拟内存
- 如果使用的是包管理器方式安装,那么不需要这个操作,默认会进行配置。
#刷新配置立即生效,重启一下
sysctl -p
reboot
三台都需要操作
#创建es用户
useradd es_user
#修改es用户密码
passwd es_user
#创建es目录
mkdir -p /elk
cd /elk
#上传安装包到elk目录,这里就统一上传了,具体用到那个软件看上面说明
#进入elk目录解压文件
cd /elk;
tar -zxvf elasticsearch-7.16.1-linux-x86_64.tar.gz;
tar -zxvf filebeat-7.16.1-linux-x86_64.tar.gz;
tar -zxvf logstash-7.16.2-linux-x86_64.tar.gz;
tar -zxvf kafka-3.0.0-src.tgz;
tar -zxvf kibana-7.16.1-linux-x86_64.tar.gz;
配置JDK
#进入目录
cd /elk/elasticsearch-7.16.1/bin
#编辑配置文件
vim elasticsearch
#添加环境变量
#配置为elasticsearch自带jdk
export JAVA_HOME=/elk/elasticsearch-7.16.1/jdk
export PATH=$JAVA_HOME/bin:$PATH
#添加jdk判断
if [ -x "$JAVA_HOME/bin/java" ]; then
JAVA="/elk/elasticsearch-7.16.1/jdk/bin/java"
else
JAVA=`which java`
fi
安装elasticsearch
#每个节点创建对应日志数据目录
#node-1
mkdir -p /var/data/es/es-node-1/
mkdir -p /var/log/es/es-node-1/
#node-2
mkdir -p /var/data/es/es-node-2/
mkdir -p /var/log/es/es-node-2/
#node-3
mkdir -p /var/data/es/es-node-3/
mkdir -p /var/log/es/es-node-3/
#进入elasticsearch的config配置目录
cd /elk/elasticsearch-7.16.1/config/;
#修改配置文件
vim elasticsearch.yml;
#node-1配置文件
# 集群名称
cluster.name: my-application
# 集群节点名称
node.name: node-1
# ES默认 只允许本地 127.0.0.1 和[::1] 访问
# 也可以设置成0.0.0.0 允许所有IP主机访问
# 如果不配置就默认认为是开发者模式,如果配置不正确会写入警告但是能正确运行
# 如果配置了就会认为进入了生产环境, 如果配置不正确就会升级为异常,ES无法正确启动。
network.host: 0.0.0.0
# 默认ES节点端口9200,如果是伪集群(在一台服务器上搭建集群),需要修改。
http.port: 9200
# 设置数据存放路径,建议修改这个路径到ES的安装文件夹外面,避免ES升级误删掉这个文件夹
path.data: /var/data/es/es-node-1/
# 设置日志存放路径,建议修改这个路径到ES的安装文件夹外面,避免ES升级误删掉这个文件夹
path.logs: /var/log/es/es-node-1/
# 发现其他节点主机配置 这里配置的是ES所在服务器的公网IP地址
discovery.seed_hosts: ["10.0.0.11:9300","10.0.0.12:9300","10.0.0.13:9300"]
# 哪些节点可以被选举为主节点配置
cluster.initial_master_nodes: ["node-1", "node-2","node-3"]
#node-2配置文件
# 集群名称
cluster.name: my-application
# 集群节点名称
node.name: node-2
# ES默认 只允许本地 127.0.0.1 和[::1] 访问
# 也可以设置成0.0.0.0 允许所有IP主机访问
# 如果不配置就默认认为是开发者模式,如果配置不正确会写入警告但是能正确运行
# 如果配置了就会认为进入了生产环境, 如果配置不正确就会升级为异常,ES无法正确启动>。
network.host: 0.0.0.0
# 默认ES节点端口9200,如果是伪集群(在一台服务器上搭建集群),需要修改。
http.port: 9200
# 设置数据存放路径,建议修改这个路径到ES的安装文件夹外面,避免ES升级误删掉这个文件夹
path.data: /var/data/es/es-node-2/
# 设置日志存放路径,建议修改这个路径到ES的安装文件夹外面,避免ES升级误删掉这个文件夹
path.logs: /var/log/es/es-node-2/
# 发现其他节点主机配置 这里配置的是ES所在服务器的公网IP地址
discovery.seed_hosts: ["10.0.0.11:9300","10.0.0.12:9300","10.0.0.13:9300"]
# 哪些节点可以被选举为主节点配置
cluster.initial_master_nodes: ["node-1", "node-2","node-3"]
#node-3配置文件
# 集群名称
cluster.name: my-application
# 集群节点名称
node.name: node-3
# ES默认 只允许本地 127.0.0.1 和[::1] 访问
# 也可以设置成0.0.0.0 允许所有IP主机访问
# 如果不配置就默认认为是开发者模式,如果配置不正确会写入警告但是能正确运行
# 如果配置了就会认为进入了生产环境, 如果配置不正确就会升级为异常,ES无法正确启动。
network.host: 0.0.0.0
# 默认ES节点端口9200,如果是伪集群(在一台服务器上搭建集群),需要修改。
http.port: 9200
# 设置数据存放路径,建议修改这个路径到ES的安装文件夹外面,避免ES升级误删掉这个文件夹
path.data: /var/data/es/es-node-3/
# 设置日志存放路径,建议修改这个路径到ES的安装文件夹外面,避免ES升级误删掉这个文件夹
path.logs: /var/log/es/es-node-3/
# 发现其他节点主机配置 这里配置的是ES所在服务器的公网IP地址
discovery.seed_hosts: ["10.0.0.11:9300","10.0.0.12:9300","10.0.0.13:9300"]
# 哪些节点可以被选举为主节点配置
cluster.initial_master_nodes: ["node-1", "node-2","node-3"]
三台配置文件
- 如果需要设置远程访问密码,那么需要添加配置如下
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
例如
分别创建目录并给es_user赋予权限
# 分配权限给10.0.0.11
# 授予执行权限
chmod u+x /elk/elasticsearch-7.16.1/bin
# ES 文件夹权限授权给es_user 用户
mkdir -p /usr/local/es/
chown -R es_user /usr/local/es/
# 创建数据文件夹
mkdir -p /var/data/es/es-node-1/
# 将ES数据存储文件夹权限授权给es_user用户
chown -R es_user /var/data/es/es-node-1/
# 创建日志文件夹
mkdir -p /var/log/es/es-node-1
# 将ES 日志存储文件夹权限授权给es_user用户
chown -R es_user /var/log/es/es-node-1/
# 分配权限给10.0.0.12
# 授予执行权限
chmod u+x /elk/elasticsearch-7.16.1/bin
# ES 文件夹权限授权给es_user 用户
mkdir -p /usr/local/es/
chown -R es_user /usr/local/es/
# 创建数据文件夹
mkdir -p /var/data/es/es-node-2/
# 将ES数据存储文件夹权限授权给es_user用户
chown -R es_user /var/data/es/es-node-2/
# 创建日志文件夹
mkdir -p /var/log/es/es-node-2
# 将ES 日志存储文件夹权限授权给es_user用户
chown -R es_user /var/log/es/es-node-2/
# 分配权限给10.0.0.13
# 授予执行权限
chmod u+x /elk/elasticsearch-7.16.1/bin
# ES 文件夹权限授权给es_user 用户
mkdir -p /usr/local/es/
chown -R es_user /usr/local/es/
# 创建数据文件夹
mkdir -p /var/data/es/es-node-3/
# 将ES数据存储文件夹权限授权给es_user用户
chown -R es_user /var/data/es/es-node-3/
# 创建日志文件夹
mkdir -p /var/log/es/es-node-3
# 将ES 日志存储文件夹权限授权给es_user用户
chown -R es_user /var/log/es/es-node-3/
启动Elasticsearch
开发9200,9300端口
firewall-cmd --zone=public --add-port=9200/tcp --permanent;
firewall-cmd --zone=public --add-port=9300/tcp --permanent;
firewall-cmd --reload;
firewall-cmd --list-all;
CA
cd /elk/elasticsearch-7.16.1
bin/elasticsearch-certutil ca
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
cd /elk/elasticsearch-7.16.1/config
mkdir certs
cp /elk/elasticsearch-7.16.1/elastic-certificates.p12 /elk/elasticsearch-7.16.1/config/certs
chown -R es_user:es_user /elk/*
切换用户登陆
# 切换用户
cd /elk/elasticsearch-7.16.1/
chown -R es_user:es_user /elk/*
su es_user
# 启动ES
./bin/elasticsearch
- 第一次启动建议前台启动,观测没有错误后再使用后台守护线程启动
- 前台启动后,如果想退出,可以按键盘Ctrl+C 进行退出
- 如果需要后台运行的话,那么增加下启动参数即可:./bin/elasticsearch -d -p pid
注意: - 其中-d 表示后台守护进程启动, -p 表示将生成的进程Id存储到文件中。
- ES 默认启动会加载 $ES_HOME/config/ 文件夹下elasticsearch.yml 中的配置
如本地部署可跳过
Elasticsearch 安装访问密码(如需远程访问)
刚才我们的健康检查和对ES的一些接口访问时公开的,这样是不安全的,对于生产环境我们一般需要为ES设置密码。
由于ES 和其他组件进行交互,因此我们需要依次设置密码。
值得注意的是,
ES 必须先启动,然后才能使用elasticsearch-setup-passwords 为ES相关的组件所使用的各个用户安装密码。
因为不同的用户有不同的权限
接下来我们开始设置密码:
./bin/elasticsearch-setup-passwords interactive
ES 的安装文件夹下的bin 目录下,可以找到一个叫做elasticsearch-setup-passwords的可执行文件.
命令执行后就会显示如下内容提示:
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y
Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana_system]:
Reenter password for [kibana_system]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
Enter password for [beats_system]:
Reenter password for [beats_system]:
Enter password for [remote_monitoring_user]:
Reenter password for [remote_monitoring_user]:
Changed password for user [apm_system]
Changed password for user [kibana_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]
我们依次要为elastic,apm_system,kibana_system,logstash_system,beats_system,remote_monitoring_user 用户设置远程访问密码。
然后当我们再次访问es.xxx.com 就会发现需要提示输入密码
这里输入 账号 和 刚才设置的密码就可以登陆了。
- 默认账号是: elastic
- 密码:刚才设置的密码
安装Kibana(仅node-1)
Kibana 是一个免费且开放的用户界面,能够让您对 Elasticsearch 数据进行可视化,并让我们在 Elastic Stack中进行导航。我们可以进行各种操作,从跟踪查询负载,到理解请求如何流经您的整个应用,都能轻松完成。
#进入安装目录
cd /elk/kibana-7.16.1-linux-x86_64;
#进入配置目录
cd config;
#编辑配置文件
vim kibana.yml;
# Kibana 默认监听端口5601,如果需要改变就修改这个配置
server.port: 5601
# Kibana 部署服务器IP,如果是单网卡配置0.0.0.0即可,如果是多网卡需要配置IP
server.host: 10.0.0.11
# 配置服务器的名称
server.name: my-kibana
# 配置ES的集群节点地址
elasticsearch.hosts: ["http://10.0.0.11:9200","http://10.0.0.12:9200","http://10.0.0.13:9200"]
# 创建一个kibana索引
kibana.index: ".kibana"
#启动Kibana
cd /elk/kibana-7.16.1-linux-x86_64/
./bin/kibana
#如果用root 用户执行,那么需要带上参数:
./bin/kibana --allow-root
#如果想后台运行kibana 那么需要带上参数:
nohup ./bin/kibana --alow-root > /dev/null 2> /dev/null &
#非root就授权给es_user
chown -R es_user:es_user /elk/*
cd /elk/kibana-7.16.1-linux-x86_64/
su es_user;
./bin/kibana
#挂后台启动
nohup ./bin/kibana &
#开启端口
firewall-cmd --zone=public --add-port=5601/tcp --permanent;
firewall-cmd --reload;
firewall-cmd --list-all;
安装Logstash 采集日志
#进入logstash安装目录
cd /elk/logstash-7.16.2/
#新建一个配置文件 logstash-simple.conf
vim logstash-simple.conf
input {
beats {
port => 5044
}
file {
path => "/usr/local/nginx/logs/access.log"
start_position => "beginning"
}
}
filter {
if [path] =~ "access" {
mutate { replace => { "type" => "apache_access" } }
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
elasticsearch {
hosts => ["10.0.0.11:9200","10.0.0.12:9200","10.0.0.13:9200"]
}
stdout { codec => rubydebug }
}
以上配置收集 /usr/local/nginx/logs/access.log下的日志
Logstash 默认监听5044端口
#启动Logstash
cd /elk/logstash-7.16.2/config
su es_user
./elk/logstash-7.16.2/bin/logstash -f ./elk/logstash-7.16.2/config/logstash-simple.conf
- 通过-f 参数可以指定加载哪个配置文件
- 如果想后台启动则执行如下命令即可:
nohup ./bin/logstash -f ./config/logstash-simple.conf > /dev/null 2> /dev/null &
安装FileBeat 采集日志
Filebeat 是 Elastic 公司为解决 Logstash “太重” 的问题推出的一款轻量级日志采集器.
FileBeat 可以监视指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或 Logstash进行索引。
FileBeat 的工作方式:
接下来我们将分享如何使用FileBeat 监控并采集日志。
大致分为如下步骤:
- 在要监视的每个系统上安装Filebeat
- 指定日志文件的位置
- 将日志数据解析为字段并将其发送到Elasticsearch
- 可视化Kibana中的日志数据
cd /elk/filebeat-7.16.1-linux-x86_64/
vim filebeat.yml
#配置文件
###################### Filebeat Configuration Example #########################
# ============================== Filebeat inputs ===============================
filebeat.inputs:
# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.
- type: log
# Change to true to enable this input configuration.
enabled: false
# Paths that should be crawled and fetched. Glob based paths.
paths:
- /var/log/*.log
- /usr/local/nginx/logs/*.log
#- c:\programdata\elasticsearch\logs\*
# filestream is an experimental input. It is going to replace log input in the future.
- type: filestream
# Change to true to enable this input configuration.
enabled: false
# Paths that should be crawled and fetched. Glob based paths.
paths:
- /var/log/*.log
#- c:\programdata\elasticsearch\logs\*
# ============================== Filebeat modules ==============================
filebeat.config.modules:
# Glob pattern for configuration loading
path: ${path.config}/modules.d/*.yml
# 配置文件自动加载
# Set to true to enable config reloading
reload.enabled: true
# 每10秒检查一次
# Period on which files under path should be checked for changes
# reload.period: 10s
reload.period: 10s
# ======================= Elasticsearch template setting =======================
setup.template.settings:
index.number_of_shards: 1
#index.codec: best_compression
#_source.enabled: false
# =================================== Kibana ===================================
# Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API.
# This requires a Kibana endpoint configuration.
setup.kibana:
# Kibana Host
# Scheme and port can be left out and will be set to the default (http and 5601)
# In case you specify and additional path, the scheme is required: http://localhost:5601/path
# IPv6 addresses should always be defined as: https://[2001:db8::1]:5601
#host: "localhost:5601"
host: "192.168.159.11:5601"
# Kibana Space ID
# ID of the Kibana Space into which the dashboards should be loaded. By default,
# the Default Space will be used.
#space.id:
# ================================== Outputs ===================================
# Configure what output to use when sending the data collected by the beat.
# ---------------------------- Elasticsearch Output ----------------------------
output.elasticsearch:
# Array of hosts to connect to.
#hosts: ["localhost:9200"]
hosts: ["192.168.159.11:9200","192.168.159.12:9200","192.168.159.13:9200"]
# Protocol - either `http` (default) or `https`.
#protocol: "https"
protocol: "http"
# Authentication credentials - either API key or username/password.
#api_key: "id:api_key"
#username: "elastic"
#password: "changeme"
# ------------------------------ Logstash Output -------------------------------
#output.logstash:
# The Logstash hosts
#hosts: ["192.168.159.11:5044"]
#hosts: ["192.168.159.11:5044"]
# Optional SSL. By default is off.
# List of root certificates for HTTPS server verifications
#ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]
# Certificate for SSL client authentication
#ssl.certificate: "/etc/pki/client/cert.pem"
# Client Certificate Key
#ssl.key: "/etc/pki/client/cert.key"
# ================================= Processors =================================
processors:
- add_host_metadata:
when.not.contains.tags: forwarded
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~
配置Filebeat日志收集实现方式
- 方式一:通过启用模块,修改模块中的配置文件方式实现
比如想监控nginx模块,开启nginx模块,然后在模块的模板配置nginx.yml 文件中配置日志路径就行了 - 方式二: 通过自定义监控文件路径事项
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。