ELK搭建实战
- 准备工作
- 下载并安装公共签名密钥
- 设置repo内容
- 在repo中添加如下内容
- Java环境安装
- 安装java 环境`yum install java -y`版本低直接安装9.0
- 去镜像网站下载jdk
- 配置JAVA_HOME
- 验证是否安装好
- Elasticsearch 安装和配置
- 核心参数
- 命令介绍
- 验证
- 修改elasticsearch占用内存
- Logstash 安装
- 安装
- 自启动
- 启动完之后内存占用达到 200%--300% 解决:
- Kibana 安装和配置
- 安装
- 设置自动启
- 安装redis
- FileBeat 安装和配置
- 建议rpm安装 这样后台运行方便
- wget安装
- 设置后台运行
- Logstash 配置
准备工作
下载并安装公共签名密钥
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
设置repo内容
vim /etc/yum.repos.d/elasticsearch.repo
在repo中添加如下内容
[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
Java环境安装
elasticsearch 需要java环境支持,执行如下命令
安装java 环境yum install java -y版本低直接安装9.0
去镜像网站下载jdk
cd /usr/local
wget https://repo.huaweicloud.com/java/jdk/9.0.1+11/jdk-9.0.1_linux-x64_bin.tar.gz
tar -zxvf jdk-9.0.1_linux-x64_bin.tar.gz
配置JAVA_HOME
vi /etc/profile
内容如下:
export JAVA_HOME=/usr/local/jdk-9.0.1
export JRE_HOME=/usr/local/jdk-9.0.1/jre
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
使修改生效
source /etc/profile
查看是否安装成功
java -version
验证是否安装好
java -version
Elasticsearch 安装和配置
安装
yum -y install elasticsearch
报错
解决
##设置为自启动
systemctl enable elasticsearch
配置
配置文件路径:/etc/elasticsearch/elasticsearch.yml
核心参数
# 配置文件都在 /etc/elasticsearch/ 目录下
vim /etc/elasticsearch/elasticsearch.yml
# 集群名称
: jhxxb
# 节点名称
: node-1
# 数据文件与日志文件存放目录
path.data: /home/esData/es
path.logs: /home/esData/log
# 网络设置
network.host: 0.0.0.0
http.port: 9200
# 集群设置
cluster.initial_master_nodes: ["node-1"]
# 修改配置中目录的用户与用户组,不然无法启动
chown -R elasticsearch:elasticsearch /var/lib/elasticsearch
chown -R elasticsearch:elasticsearch /var/log/elasticsearch
命令介绍
- 启动
systemctl start elasticsearch.service - 停止
systemctl stop elasticsearch.service
验证
curl -X GET http://localhost:9200
输出结果如下
{
"name" : "node-1",
"cluster_name" : "app-log",
"cluster_uuid" : "oVk4kUzKTCOsc2zaViOMXA",
"version" : {
"number" : "6.8.13",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "be13c69",
"build_date" : "2020-10-16T09:09:46.555371Z",
"build_snapshot" : false,
"lucene_version" : "7.7.3",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
修改elasticsearch占用内存
vim /etc/elasticsearch/jvm.options
-Xms2g
-Xmx2g
注意:不能留空格否则会报格式不正确
Logstash 安装
第一步已经设置repo所以可直接安装,如果没有需自行按照第一步设置
安装
yum -y install logstash
手动添加systemd服务
/usr/share/logstash/bin/system-install
完成后会创建脚本/etc/systemd/system/logstash.service
启动:
systemctl start logstash
出现这个错误则需要生成lgstash.service文件
sudo /usr/share/logstash/bin/system-install /etc/logstash/startup.options systemd
原因:这是由于jdk版本太低造成的,jdk版本需要在9.0以上,因此需要重新安装jdk。
查看状态
tail -f /var/log/messages
查看系统日志
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000083e80000, 1366294528, 0) failed;
原因就是内存无法分配的问题 (这要看遇到的具体是什么了)
现执行命令 free -m 查看内存是不是还有 最主要的是 看有没有交换空间 swap (这很重要)如果没有交换空间 或者交换空间比较小 要先安装交换空间 或者增大空间
(1)、创建swapfile:
root权限下,创建swapfile # dd if=/dev/zero of=swapfile bs=1024 count=500000
(有时会遇到dd命令不识别 可能是你安装过一次了 没事 先把swapfile删除就ok了)
(2)、将swapfile设置为swap空间
mkswap swapfile
(3)、启用交换空间,这个操作有点类似于mount操作(个人理解):
swapon swapfile (删除交换空间 swapoff swapfile)
至此增加交换空间的操作结束了,可以使用free命令查看swap空间大小是否发生变化;
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release
解决办法是修改jvm.options文件配置vim /etc/logstash/jvm.options,将
-XX:+UseConcMarkSweepGC 改为 -XX:+UseG1GC
自启动
systemctl enable logstash
启动完之后内存占用达到 200%–300% 解决:
- 查看logstash的log
tail -f /var/log/logstash/logstash-plain.log
# tail -f 可以让log这样需要实时刷新的文件自动刷新 发现有如下报错
配置放在后面讲,和FileBeat一起讲更容易理解
Kibana 安装和配置
安装
第一步 有的话这部省略直接安装
# 下载并安装公共签名密钥
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
# 添加源
vim /etc/yum.repos.d/kibana.repo
[kibana-7.x]
name=Kibana repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
# 安装
yum install -y kibana
# 配置
vim /etc/kibana/kibana.yml
server.host: "0.0.0.0"
# 不要用 127.0.0.1,可能会提示 Kibana server is not ready yet
elasticsearch.hosts: ["http://192.168.8.41:9200"]
i18n.locale: "zh-CN"
# 刷新服务配置
systemctl daemon-reload
# 开机自启
systemctl enable kibana.service
# 启动
systemctl start kibana.service
# 查看状态
systemctl status kibana.service
默认端口为 5601 浏览器ip:5601
设置自动启
systemctl enable kibana
安装redis
FileBeat 安装和配置
建议rpm安装 这样后台运行方便
yum install https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.16.2-x86_64.rpm
配置
配置路径:vi /etc/filebeat/filebeat.yml
启动 systemctl start filebeat
wget安装
直接到ELK官网下载安装filebeat:https:///cn/products(deb for Debian/Ubuntu, rpm for Redhat/Centos/Fedora, mac for OS X, and win for Windows).
cd /usr/local
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.16.2-linux-x86_64.tar.gz
tar -zxvf filebeat-7.16.2-linux-x86_64.tar.gz
mv filebeat-7.16.2-linux-x86_64 filebeat
设置后台运行
./filebeat -e -c filebeat.yml >/dev/null 2>&1 &
配置
配置路径:vi /usr/local/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /xxxx/dispatch.log
fields:
log_source: jobs
output.redis:
hosts:["xxxxxyyyyyzzzz.redis.rds.aliyuncs.com"]
port:6379
password:
db:2
timeout:5
key:"logstash_list"
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["localhost:9200"]
注解:FileBeat 是转发日志内容到指定的管道对象(这里使用的是阿里云的redis),其中需要注意的是 log_source 这个是我自定义的日志来源,方便后面Logstash进行日志处理。上面的配置就是讲 日志 放到 redis队列中,队列叫做:logstash_list
启动
./filebeat -e -c filebeat.yml
#重启:
使用ps -ef| grep logstash 查到之后,直接kill -9 pid
根据错误提示,猜测/etc/filebeat/filebeat.yml配置存在错误
错误很明显,缩进格式错误或者多余的空格啥的,导致配置报错,修改缩进即可解决 ,filebeat.yml对缩进要求很严格
Logstash 配置
配置
前面说过,关于Logstash的配置放到FileBeat安装之后,这个没有先后顺序,只是方便大家理解 才专门单独放到后面讲解。FileBeat 将 日志放到了redis中。那么Logstash就要从redis中取出数据。
配置路径:/etc/logstash/conf.d/log.conf
input {
redis {
data_type => "list"
key => "logstash_list"
host => "xxxxxxxx"
port => 6379
password => ""
db => 15
}
}
filter{
grok{
match => {"message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response:int} (?:-|%{NUMBER:bytes:int}) \"(?:-|%{DATA:referrer})\" \"%{DATA:user_agent}\" (?:%{IP:proxy}|-) %{DATA:upstream_addr} %{NUMBER:upstream_request_time:float} %{NUMBER:upstream_response_time:float}"}
match => {"message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response:int} (?:-|%{NUMBER:bytes:int}) \"%{DATA:referrer}\" \"%{DATA:user_agent}\" \"%{DATA:proxy}\""}
}
geoip{
source => "clientip"
}
date {
match => ["timestamp","dd/MMM/YYYY:HH:mm:ss Z"]
locale => "en"
}
mutate{
# remove_field => ["message","timestamp","request","url_arg"]
}
}
output{
elasticsearch {
hosts => "localhost:9200"
index => "nginx-access-log-%{+YYYY.MM.dd}"
}
}
注解:
- 上面的input配置的和FileBeat同一个Redis配置,说明从Redis获取数据。
- filter 区域表示过滤处理,上面是根据我自己的业务进行日志丢弃(因为有些日志记录是没有意义的)。根据来源进行 数据匹配 然后单独存储更改值( 如下图,将message字段中的job_id 单独提取作为一个字段 )
- filter 中的 mutate 配置了删除一些字段,有些字段都一样,存在没意义,减少存储日志量
output 配置中 判断来源,然后设置存储在Elasticsearch 中并且索引规则按照定义好的生成(如下图)
启动 systemctl start logstash