ELK是一套完整的日志集中处理方案,由三个开源软件简称组成:
E:ElasticSearch ES 是一个开源的,分布式的存储检索引擎(索引型的非关系型数据库)。存储日志 java代码开发的,基于Lucene结构开发的一套全文检索引擎。拥有一个web接口,用户可以通过浏览器的形式和ES组件进行通信。
作用:存储,允许全文搜索,结构化搜索(索引点),索引点可以支持大容量的日志数据,也可以搜索不同类型的文档。
K:kiabana 图形化界面。可以更好的分析存储在ES上的日志数据。提供了一个图形化的界面,来浏览ES上的日志数据。(汇总,分析,搜索)
L:Logstash 数据收集引擎,支持动态的(实时),从各种服务应用收集日志资源,还可以收集到日志数据进行过滤,分析,丰富,统一格式等等操作。然后把数据同步到es存储引擎。由RUBY语言编写的,运行在java虚拟机上的一个强大的数据处理工具,数据传输,格式化处理,格式化输出、主要用来处理日志。
数据收集工具:
fliebeat 轻量级的开源的,日志队列,收集的速度较快,但是没有数据分析和过滤的能力,一般结合logstash一块使用
kafka 中间键消息队列
RabbitMQ 中间键消息队列
elk:
es:存储数据,索引型的数据库
logstash:收集日志信息,然后安装标准化格式发送给你ES(rubydebug的格式)
K:可视化工具,更人性化的显示用户信息,方便用户检索查询
总结:ELK的作用,当我们管理一个大集群时,需要分析和定位的日志就会很多,每一台服务器分别去分析,将会耗时耗力,所以我们应运而生了一个集中统一的日志管理和分析系统,极大的提高了定位问题的效率。
日志系统的特征:
1.收集,可以收集基本上市面上常用的软件日志
2.传输,收集到的日志需要发送到ES上
3.存储,ES负责存储数据
4.UI:图形化界面(kiabana)
三台主机:
es1:192.168.233.20 (2核4G)
es2:192.168.233.30 (2核4G)
logstash kiabana:192.168.233.10(4核8G)
三台组件,最少2核4G
所有:
systemctl stop firewalld
setenforce 0
java -version
1.8.0
es1,es2
cd /opt
ls
拖进
elasticsearch-6.7.2.rpm
rpm -ivh elasticsearch-6.7.2.rpm
cd /etc/elasticsearch
ls
cp elasticsearch.yml elasticsearch.yml.bak
vim elasticsearch.yml
el1:
el2:
el1:
el2
el1:
33行 不改
如果改
el2:
33行
37行
44行 别开,开了起不来 注释掉
55行
60行
71行
el2:
44行 别开,开了起不来 注释掉
55行
60行
71行
el2:
grep -v "^#" /etc/elasticsearch/elasticsearch.yml
el1:
grep -v "^#" /etc/elasticsearch/elasticsearch.yml
ES的性能调优:
机器优化
修改打开的最大文件数:
vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 32000
* hard nproc 32000
* soft memlock unlimited
* hard memlock unlimited
重启生效
reboot
el1,el2按上述操作配置性能优化(也可以不做)
用户优化
vim /etc/systemd/system.conf
G
o
DefaultLimitNOFILE=65536
##一个用户会话的默认最大文件描述符的限制量
文件描述符:用于标识打开文件或者IO资源限制的整数。
DefaultLimitNPROC=32000
#一个用户可以打开的最大进程数量的限制32000,一个用户的终端可以运行多少个进程
DefaultLimitMEMLOCK=infinity
##一个用户的终端默认锁定内存的限制,不限制##
也是重启生效
内核优化:
ES是基于Lucene架构,实现的一款索引型数据库。Lucene可以利用操作系统的内存来缓存ES的索引数据。
提供更快的查询速度。在工作中我们会把系统的一半内存留给Lucene
机器内存小于64G,50%给es,50%给操作系统,让操作系统的内存给Lucene缓存数据
机器内存大于64G,ES分配4-32G即可,其他的都给操作系统。
vim /etc/sysctl.conf
vm.max_map_count=262144
#一个进程可以拥有的最大内存映射区参数。
内存映射:将文件或者其他设备映射进程空间的方法。允许进程直接读取或写入文件,无需常规的IO方式。映射的空间越大,ES和Lucene的速度越快。
2g/262144
4g/4194304
8g/8388608
sysctl-p
el1,el2:
systemctl restart elasticsearch.service
systemctl enable elasticsearch.service
netstat -antp | grep 9200
tail -f /var/log/elasticsearch/my-elk-cluster.log
cd /etc/elasticsearch
测试:访问 192.168.233.20:9200
访问 192.168.233.30:9200
http://192.168.233.20:9200/_cluster/health?pretty 查看健康状态
所有:
cd /opt
拖进去
node-v8.2.1.tar.gz
yum install gcc gcc-c++ make -y
tar zxvf node-v8.2.1.tar.gz
cd node-v8.2.1
./configure
make && make install
cd ..
拖进去
phantomjs-2.1.1-linux-x86_64.tar.bz2
tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src/
cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin
cp phantomjs /usr/local/bin
cd /opt
拖进去Elasticsearch-head
unzip elasticsearch-head-master.zip
cd /opt/elasticsearch-head-master/
npm config set registry http://registry.npm.taobao.org/
npm install
vim /etc/elasticsearch/elasticsearch.yml
末尾添加
http.cors.enabled: true ##开启跨域访问支持,默认为 false
http.cors.allow-origin: "*" ###指定跨域访问允许的域名地址为所有
systemctl restart elasticsearch
netstat -antp | grep 9200
cd /opt/elasticsearch-head-master
npm run start &
netstat -antp | grep 9100
测试 192.168.233.10:9100
curl -X PUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
logstash kiabana:
java -version
cd /opt
拖进去 logstash-6.7.2.rpm
cd /opt
rpm -ivh logstash-6.7.2.rpm
systemctl start logstash.service
systemctl enable logstash.service
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
logstash的命令常用选项:
-f 指定配置文件,根据配置文件识别输入和输出流
-e 测试,从命令行当中获取输入,然后经过logstash加工之后,形成一个标准输出
-t 检测配置文件是否正确,然后退出
logstash -e 'input { stdin{} } output { stdout{} }'
###所有的键盘命令行输出,转化成标准输出(rubydebug的模式),6.0之后,logstash的默认输出格式就是rubydebug的标准输出
test1
guoqi
logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.233.20:9200","192.168.233.20:9200"] } }' --path.data /opt/test1
郭旗真的帅!
区分不同的数据存放目录。
6.0之后的logstash自带的输出格式rubydebug,自动的把输出格式,定义为统一标准格式输出
cd /opt
拖进去 rpm -ivh kibana-6.7.2-x86_64.rpm
rpm -ivh kibana-6.7.2-x86_64.rpm
ls
vim /etc/kibana/kibana.yml
set nu
第2行
第7行
第28行
第37行
第96行
第113
wq!
touch /var/log/kibana.log
chown kibana:kibana /var/log/kibana.log
systemctl start kibana.service
systemctl enable kibana.service
netstat -antp | grep 5601
测试
访问 192.168.233.10:5601
否
mkdir /opt/log
cd /opt/log
cd /etc/logstash/conf.d
vim system.conf
input {
file{
path => "/var/log/messages"
type => "system"
start_position => "beginning" ##从头开始收集 end 从尾开始
}
}
output {
elasticsearch {
hosts => ["192.168.233.20:9200","192.168.233.30:9200"]
index => "system-%{+YYYY.MM.dd}"
}
}
wq!
pwd
rm -rf /opt/test1
logstash -f system.conf --path.data /opt/test1
查看 访问192.168.233.20:9200
192.168.233.10:5610
cd /etc/logstash/
vim logstash.yml
systemctl restart logstash.service
cd /var/lib
chmod 777 messages
yum -y install httpd
systemctl restart httpd
cd /opt
cd logs
chmod 777 /etc/httpd/logs/access_log
chmod 777 error_log
vim httpd.conf
input {
file{
path => "/etc/httpd/logs/access_log"
type => "access"
start_position => "beginning"
}
file{
path => "/etc/httpd/logs/error_log"
type => "error"
start_position => "beginning"
}
}
output {
if [type] == "access" {
elasticsearch {
hosts => ["192.168.233.12:9200","192.168.233.13:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.66.15:9200","192.168.66.16:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
ls
logstash -f httpd.conf --path.data /opt/test2 &
elk:
es:存储数据,索引型的数据库
logstash:收集日志信息,然后安装标准化格式发送给你ES(rubydebug的格式)
K:可视化工具,更人性化的显示用户信息,方便用户检索查询
hhtp的日志,写一个nginx的logstash的配置收集文件,提醒一下要使用json格式
vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
yum install nginx -y
nginx -v
systemctl start nginx
systemctl enable nginx
日志在
/var/log/nginx/access.log
/var/log/nginx/error.log
vim /etc/nginx/nginx.conf
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - remote_user \[time_local] "$request" '
'$status body_bytes_sent "http_referer" '
'"http_user_agent" "http_x_forwarded_for"';
log_format json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"referer":"$http_referer",'
'"agent":"$http_user_agent",'
'"status":"$status"}';
#access_log /var/log/nginx/access.log main;
access_log /var/log/nginx/access.log json;
sendfile on;
#tcp_nopush on;
client_max_body_size 100M;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
systemctl restart nginx
/etc/logstash/conf.d
vim nginx.conf
input {
file {
path => "/var/log/nginx/access.log"
start_position => "end"
type => "access"
}
file {
path => "/var/log/nginx/error.log"
start_position => "end"
type => "error"
}
}
output {
if [type] == "access" {
elasticsearch {
hosts => ["192.168.66.15:9200","192.168.66.16:9200"]
index => "nginx_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.66.15:9200","192.168.66.16:9200"]
index => "nginx_error-%{+YYYY.MM.dd}"
}
}
}
logstash -f nginx.conf --path.data /opt/test3 &
vim /usr/share/nginx/html/index.html
this is test
访问几次页面nginx 192.168.66.17:80