前言
通俗来讲,ELK 是由 Elasticsearch、Logstash、Kibana 三个开源软件的组成的一个组合体,ELK 是 elastic 公司研发的一套完整的日志收集、分析和展示的企业级解决方案,在这三个软件当中,每个软件用于完成不同的功能,ELK 又称为ELK stack,官方域名为 elastic.co,ELK stack 的主要优点有如下几个:处理方式灵活: elasticsearch 是实时全文索引,具有强大的搜索功能配置相对简单:elasticsearch 的 API 全部使用 JSON 接口,logstash 使用模块配置,kibana 的配置文件部分更简单。检索性能高效:基于优秀的设计,虽然每次查询都是实时,但是也可以达到百亿级数据的查询秒级响应。集群线性扩展:elasticsearch 和 logstash 都可以灵活线性扩展前端操作绚丽:kibana 的前端设计比较绚丽,而且操作简单
Elasticsearch: 是一个高度可扩展的开源全文搜索和分析引擎,它可实现数据的实时全文搜索
搜索、支持分布式可实现高可用、提供 API 接口,可以处理大规模日志数据,比如 Nginx、Tomcat、系统日志等功能。
Elasticsearch 使用 Java 语言开发,是建立在全文搜索引擎 Apache Lucene 基础之上的搜索引擎,https://lucene.apache.org/。
Elasticsearch 的特点:
- 实时搜索、实时分析
- 分布式架构、实时文件存储
- 文档导向,所有对象都是文档
- 高可用,易扩展,支持集群,分片与复制
- 接口友好,支持 json
Logstash: Logstash 是一个具有实时传输能力的数据收集引擎,其可以通过插件实现日志收集和转发,支持日志过滤,支持普通 log、自定义 json 格式的日志解析,最终把经过处理的日志发送给 elasticsearch。
Kibana: Kibana 为 elasticsearch 提 供 一 个 查 看 数 据 的 web 界 面 , 其 主 要 是 通 过elasticsearch 的 API 接口进行数据查找,并进行前端数据可视化的展现,另外还可以针对特定格式的数据生成相应的表格、柱状图、饼图等。
搭建环境
1.安装Elasticsearch 64.10和64.18
[root@localhost ~]# java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
cd /opt
#上传软件包
elasticsearch-6.7.2.rpm elasticsearch-head-master.zip node-v8.2.1.tar.gz phantomjs-2.1.1-linux-x86_64.tar.bz2
#二进制安装
rpm -ivh elasticsearch-6.7.2.rpm
cd /etc/elasticsearch/
mkdir bak
cp -a *.yml bak/
#修改配置文件
vim elasticsearch.yml
cluster.name: my1
#群集名称
node.name: node1
#节点名称 不能和主节点重复
node.master: true
node.data: true
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
#内存锁开启 禁止使用 swap
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["192.168.64.18:9300", "192.168.64.10:9300"]
#自动集群发现,加入主机名 使用单播 类似心跳线
#
2.系统调优
vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 32000
* hard nproc 32000
* soft memlock unlimited
* hard memlock unlimited
修改systemd服务器 在页面最后修改
DefaultLimitNOFILE=65536
DefaultLimitNPROC=32000
DefaultLimitMEMLOCK=infinity`
systemctl enable elasticsearch.service
netstat -antp | grep 9200
vim /etc/sysctl.conf
DefaultLimitNOFILE=65536
DefaultLimitNPROC=32000
DefaultLimitMEMLOCK=infinity
--------------------------------------------------------------------
/etc/systemd/system.conf 文件是用于配置 systemd 的,这是一种用于 Linux 操作系统的系统和服务管理器。通过这个文件,你可以自定义与系统操作、性能和行为相关的各种设置
- DefaultTimeoutStartSec=:设置启动服务的默认等待时间
- DefaultTimeoutStopSec=:设置停止服务的默认等待时间
- DefaultRestartSec=:设置在重新启动服务之前的默认休眠时间
- DefaultLimitNOFILE=:设置打开文件数量的默认限制
- DefaultLimitNPROC=:设置进程数量的默认限制
- DefaultLimitCORE=:设置核心文件大小的默认限制
- DefaultEnvironment=:指定服务的默认环境变量
---------------------------------------------------------------------
#重启服务器
reboot
systemctl enable elasticsearch.service
netstat -antp | grep 9200
浏览器访问
http://192.168.64.18:9200/
http://192.168.64.10:9200/
---------------------------------
http://192.168.64.18:9200/_cluster/health?pretty
可以使用插件Elasticsearch-head 查看
3.编译安装node组件
#node-v8.2.1.tar.gz 上传之opt
yum install gcc gcc-c++ make -y
cd /opt
tar zxvf node-v8.2.1.tar.gz
cd node-v8.2.1/
./configure
make && make install
4.安装 phantomjs
注:如果已经安装插件 可以不用编译安装此软件
elasticsearch-head-master.zip 到/opt
cd /opt
unzip elasticsearch-head-master.zip
cd /opt/elasticsearch-head/
#安装依赖包
npm install
---------------------------------------------------------------------
出现报错请求连接npm源失败 可以ping一下域名 可能是服务器不通 可以重新改一下DNS重新试一下。
---------------------------------------------------------------------
vim /etc/elasticsearch/elasticsearch.yml
--末尾添加以下内容--
http.cors.enabled: true #开启跨域访问支持,默认为 false
http.cors.allow-origin: "*" #指定跨域访问允许的域名地址为所有
http.cors.enabled: true
http.cors.allow-origin: "*"
systemctl restart elasticsearch
#重启服务 使配置生效
5.启动 elasticsearch-head 服务
#注意:需要在此目录下执行启动
[root@xyy10 opt]# cd elasticsearch-head-master/
npm run start &
[root@xyy10 elasticsearch-head-master]#
> elasticsearch-head@0.0.0 start /opt/elasticsearch-head- master
> grunt server
Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100
[root@xyy10 elasticsearch-head-master]# ss -natp |grep 91 00
LISTEN 0 128 *:9100 *:* users:(("grunt",pid=49891,fd=12))
验证: 插件中输入测试
插入索引测试:
curl -X PUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'.
-x 指定方法
-H 添加请求头
-d 请求体
curl -X PUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
{
"_index" : "index-demo",
"_type" : "test",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
刷新插件后 可以看见新的数据
6.在apache应用服务器上部署 Logstash 64.11
安装服务
yum -y install java
java -version
yum -y install httpd
systemctl start httpd
安装logstash
#上传二进制包到opt
cd /opt
rpm -ivh logstash-6.7.2.rpm
#开启服务
systemctl enable --now logstash.service
#做软链接
ln -s /usr/share/logstash/bin/logstash /usr/bin/
使用logstash
Logstash 命令常用选项: -f:通过这个选项可以指定 Logstash 的配置文件,根据配置文件配置 Logstash 的输入和输出流。 -e:从命令行中获取,输入、输出后面跟着字符串,该字符串可以被当作 Logstash 的配置(如果是空,则默认使用 stdin 作为输入,stdout 作为输出)。 -t:测试配置文件是否正确,然后退出。
logstash -e 'input { stdin{} } output { stdout{} }'
[INFO ] 2024-07-16 16:02:22.313 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=> 9600}
hello world #此位置输入任何内容
/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/awesome_print-1.7.0/lib/awesome_print/formatters/base_fo rmatter.rb:31: warning: constant ::Fixnum is deprecated
{
"@timestamp" => 2024-07-16T08:02:32.670Z,
"@version" => "1",
"message" => "hello wordhello world",
"host" => "xyy7"
}
使用 Logstash 将信息写入 Elasticsearch 中
logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.64.10:9200","192.168.64.18:9200"]} }'
[INFO ] 2024-07-16 00:50:12.096 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600}
# 输入信息
www.xx.com
hello world
6.1在ngin服务器上部署logstash
nginx编译安装
[root@xyy1 ~]# yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
[root@xyy1 opt]# wget http://nginx.org/download/nginx-1.18.0.tar.gz
[root@xyy1 opt]# tar zxvf nginx-1.18.0.tar.gz
[root@xyy1 opt]# cd nginx-1.18.0/
[root@xyy1 nginx-1.18.0]# ./configure --prefix=/apps/nginx \
> > --user=nginx \
> > --group=nginx \
> > --with-http_ssl_module \
> > --with-http_v2_module \
> > --with-http_realip_module \
> > --with-http_stub_status_module \
> > --with-http_gzip_static_module \
> > --with-pcre \
> > --with-stream \
> > --with-stream_ssl_module \
> > --with-stream_realip_module
[root@xyy1 nginx-1.18.0]# make -j4 && make install
useradd -M -s /sbin/nologin nginx
[root@xyy1 nginx-1.18.0]# chown -R nginx.nginx /apps/nginx
[root@xyy1 nginx-1.18.0]# vim /etc/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
#注意文件位置,绝对路径 错误启动不了
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
#注意启动文件位置
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
[root@xyy1 nginx-1.18.0]# systemctl daemon-reload
[root@xyy1 nginx-1.18.0]# systemctl start nginx.service
[root@xyy1 nginx-1.18.0]# systemctl status nginx
#####################################################################
#修改nginx配置文件 日志格式需要变更为json格式
#日志位置需要先查看 一会需要用到
[root@xyy1 logs]# pwd
/apps/nginx/logs
[root@xyy1 logs]# vim /apps/nginx/conf/nginx.conf
#修改在http模块
log_format json '{'
'"timestamp": "$time_local",'
'"remote_addr": "$remote_addr",'
'"request": "$request",'
'"status": $status,'
'"body_bytes_sent": $body_bytes_sent,'
'"http_referer": "$http_referer",'
'"http_user_agent": "$http_user_agent",'
'"http_x_forwarded_for": "$http_x_forwarded_for"'
'}';
#access_log logs/access.log main;
access_log /apps/nginx/logs/access.log json;
#重启nginx服务
[root@xyy1 opt]# systemctl restart nginx.service
安装logstash后使用
[root@xyy1 opt]# logstash -e 'input { stdin{} } output { stdout{} }'
[INFO ] 2024-07-16 16:41:13.251 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>
hello world
/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/awesome_print-1.7.0/lib/awesome_print/formatters/base_foer.rb:31: warning: constant ::Fixnum is deprecated
{
"host" => "xyy1",
"@version" => "1",
"message" => "hello world",
"@timestamp" => 2024-07-16T08:41:29.065Z
}
[root@xyy1 opt]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.64.10:9200","192.4.18:9200"]} }'
#可能会有error日志的报错 因为未设置
[INFO ] 2024-07-16 16:43:46.209 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>
wolegequ.com
^C[WARN ] 2024-07-16 16:44:21.949 [SIGINT handler] runner - SIGINT received. Shutting down.
7.安装使用kibana
rpm -ivh kibana-6.7.2-x86_64.rpm
cp kibana.yml kibana.yml.bak -a
[root@localhost kibana]# vim kibana.yml
2 server.port: 5601 #打开端口
7 server.host: "0.0.0.0" #监听端口
28 elasticsearch.hosts: ["http://192.168.64.10:9200", "http://192.168.64.18:9200"] #el服务器地址
37 kibana.index: ".kibana" #打开索引
96 logging.dest: /var/log/k.log #指定日志文件, 需要手动建立文件
114 i18n.locale: "zh-CN" #中文设置
root@xyy7 kibana]# cd /var/log/
touch k.log
chown kibana:kibana /var/log/k.log
systemctl enable --now kibana.service
[root@xyy7 log]# ss -natp |grep 5601
LISTEN 0 511 *:5601 *:* users:(("node",pid=64708,fd=19))
浏览器访问:IP:5601