ELK部署

ELK部署

八月 08, 2019

ELK部署准备工作:

准备2台机器,这样才能完成分布式集群的实验,当然能有更多机器更好:
1
2
3
• 192.168.10.31   master

• 192.168.10.32 data
角色划分:

• 2台机器全部安装jdk1.8,因为elasticsearch是java开发的

• 2台全部安装elasticsearch (后续都简称为es)

• master节点上需要安装kibana

• data上安装 logstash

ELK版本信息:
1
2
3
4
5
6
7
• Elasticsearch-6.4.1

• logstash-6.4.1

• kibana-6.4.1

• filebeat-6.4.1

所有机器做好解析,关闭防火墙,selinux

elasticsearch安装:

1.布署java环境(略) - 所有节点

wget http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-linux-x64.tar.gz?AuthParam=1534736266_209f12f1830b23a1b152e15116e28b4a

1
2
3
#tar xvf jdk-8u181-linux-x64.tar.gz
mkdir /usr/local/java
mv jdk1.8.0_181 /usr/local/java/
1
2
3
4
5
6
7
8
9
vim /etc/profile

#RPF install JDK
JAVA_HOME=/usr/local/java/jdk1.8.0_181
JRE_HOME=$JAVA_HOME/jre
CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.
jar:$JAVA_HOME/lib/tools.jar
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME JRE_HOME PATH CLASSPATH
1
2
source /etc/profile
java -version

2.安装elasticsearch - 所有节点

1
2
3
4
5
6
7
useradd elk      #elasticsearch不能以root用户运行,必须要创建一个普通用户运行
echo 123|passwd --stdin elk
tar xf elasticsearch-6.4.1.tar.gz
mv elasticsearch-6.4.1 /usr/local/elasticsearch
chown -R elk.elk /usr/local/elasticsearch/
mkdir -p /data/es-data
chown -R elk.elk /data/es-data

3.配置es-master

1
2
cd /usr/local/elasticsearch/
egrep -v "^#" config/elasticsearch.yml
1
2
3
4
5
6
7
8
9
cluster.name: es-cluster
node.name: master
node.master: true
node.data: true
path.data: /data/es-data
bootstrap.memory_lock: true
network.host: 0.0.0.0
<http.port:> 9200
dis-covery.zen.ping.unicast.hosts: ["192.168.10.31", "192.168.10.32"]

4.配置es-data

在master的基础上作如下修改:

1
2
3
4
5
node.name: data

node.master: false

node.data: true

5.启动服务: 先启动master, 再启动data

1
2
#su - elk
$/usr/local/elasticsearch/bin/elasticsearch -d #-d 以守护进程方式运行

6.验证

查看端口: es服务会监听两个端口,其中9200为传输数据用,9300为集群通信用

1
2
3
netstat -tanp |grep java
tcp6 0 0 :::9200 :::* LISTEN 1238/java
tcp6 0 0 :::9300 :::* LISTEN 1238/java

查看服务情况:

1
curl 192.168.10.31:9200

查看集群的详细信息:

1
curl 192.168.10.31:9200/_cluster/state?pretty
常见问题:

解决方法: 使用普通用户运行

问题[1]:

进程最大可同时打开文件数太小,至少要65536

1
2
echo  "elk soft nofile 65536" >> /etc/security/limits.conf 
echo "elk hard nofile 65536" >> /etc/security/limits.conf
1
2
su - elk
Last login: Sun Oct 7 12:25:56 CST 2018 on pts/0
1
2
ulimit -n
65536
问题[2]:

请求锁内存失败,因为linux系统默认能让进程锁住的内存为45k 解决方法:

1
2
3
[root@logstash ~]# echo "elk soft memlock unlimited" >> /etc/security/limits.conf

[root@logstash ~]# echo "elk hard memlock unlimited" >> /etc/security/limits.conf
问题[3]:

解决方法:

1
[root@logstash ~]# echo vm.max_map_count=262144 >> /etc/sysctl.conf
1
2
[root@logstash ~]# sysctl -p
vm.max_map_count = 262144

安装问题汇总: http://www.cnblogs.com/jstarseven/p/6803054.html

使用curl命令操作elasticsearch:https://zhaoyanblog.com/archives/732.html

Kibana安装:

1解压

1
2
tar xf kibana-6.4.1-linux-x86_64.tar.gz
mv kibana-6.4.1-linux-x86_64 /usr/local/kibana

2.配置

1
2
cd /usr/local/kibana/
egrep -v "^#|^$" config/kibana.yml
1
2
3
4
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "[http://192.168.10.31:9200"](http://192.168.10.31:9200)
logging.dest: /usr/local/kibana/logs/kibana.log

3.启动服务

1
/usr/local/kibana/bin/kibana &

4.查看:

1
2
3
netstat -tanp |grep 5601
tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 1460/node
kibana是使用node.js开发的,所以进程名称为node

5.浏览器访问

1
firefox 192.168.10.31:5601 &

logstash安装

1.解压

1
2
tar xf logstash-6.4.1.tar.gz
mv logstash-6.4.1 /usr/local/logstash

2.修改配置文件

1
cd /usr/local/logstash/
1
2
vim config/logstash.yml
http.host: "0.0.0.0"

3.测试

1).配置好后,先不要启动服务. 先配置一个收集远程日志的配置文件进行测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
cd config/
cp logstash-sample.conf syslog-test.conf
cat config/syslog-test.conf
input {
syslog {
type => "system-syslog" #定义类型,可自定义
port => 51400 #定义监听端口
}
}
output {
stdout { #将接收到的日志输出到标准输出
codec => rubydebug
}
}
2).检测文件有没有错误
1
2
3
4
/usr/local/logstash/bin/logstash  -f syslog-test.conf  --config.test_and_exit
Configuration OK #检测成功
选项: -f 指定配置文件
--config.test_and_exit 检测配置并退出,如果不加这个就是启动服务了
3).如果检测成功,启动测试服务
1
/usr/local/logstash/bin/logstash  -f syslog-test.conf
4).另开一个终端查看端口
1
2
3
netstat -tuanp |grep 51400     
tcp6 0 0 :::51400 :::* LISTEN 10901/java
udp 0 0 0.0.0.0:51400 0.0.0.0:* 10901/java
5).在另外的机器上配置将日志发送过来,这一步在另外一台机器上操作
1
2
vim /etc/rsyslog.conf
*.* @@192.168.10.32:51400
1
2
systemctl restart rsyslog
su - elk
6).在logstash上看有没有输出

终端中以JSON的格式打印了收集到的日志,测试成功。

4.以上第3步只是测试,这一步我们需要重新改一下配置文件,让收集的日志信息输出到es服务器中,而不是当前终端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cp syslog-test.conf  syslog.conf
cat syslog.conf
input {
syslog {
type => "system-syslog"
port => 51400
}
}
output {
elasticsearch {
hosts => ["[http://192.168.10.31:9200"\]](http://192.168.10.31:9200)
index => "system-syslog-%{+YYYY.MM.dd}"
}
}

5.测试配置文件

1
/usr/local/logstash/bin/logstash -f syslog.conf --config.test_and_exit

6.如果测试没有问题,启动服务

1
/usr/local/logstash/bin/logstash -f syslog.conf  &

7.查看服务启动情况:

1
2
3
4
netstat -tanp |grep 9600
tcp6 0 0 :::9600 :::* LISTEN 11024/java
netstat -tanp |grep 51400
tcp6 0 0 :::51400 :::* LISTEN 11024/java

收集Nginx日志

方案一

nginx:

修改 nginx server 的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 log_format  json '{"@timestamp":"$time_iso8601",'
'"@version":"1",'
'"client":"$remote_addr",'
'"url":"$uri",'
'"status":"$status",'
'"domain":"$host",'
'"host":"$server_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"referer": "$http_referer",'
'"ua": "$http_user_agent"'
'}';

access_log /var/log/nginx/access_json.log json;

logstash:

1
2
3
4
5
6
7
8
9
10
11
12
13
input {
file {
path => "/var/log/nginx/access_json.log"
codec => "json" #输入预定义好的 JSON 数据,可以省略掉 filter/grok 配置,从而减轻logstash的负载
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["192.168.10.31:9200"]
index => "nginx-log-%{+YYYY.MM.dd}"
}
}

方案二

Logstash 默认自带了 apache标准日志的 grok正则:

COMMONAPACHELOG %{IPORHOST:clientip} %{USER:ident} %{NOTSPACE:auth} [%{HTTPDATE:timestamp}] “(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})” %{NUMBER:response} (?:%{NUMBER:bytes}|-)

COMBINEDAPACHELOG %{COMMONAPACHELOG} %{QS:referrer} %

对于 nginx 标准日志格式,可以发现只是最后多了一个 $http_x_forwarded_for 变量。所以 nginx 标准日志的 grok 正则定义是:

​ MAINNGINXLOG %{COMBINEDAPACHELOG} %{QS:x_forwarded_for}

logstash:直接使用访问日志
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
input {
file {
path => "/var/log/nginx/access.log"
start_position => beginning
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG} %
{QS:x_forwarded_for}"}
}
date {
match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
}
geoip {
source => "clientip"
}
}
output {
elasticsearch {
hosts => "192.168.11.10:9200"
}
}

Logstash标准日志grok正则:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns

利用filebeat采集日志

1.安装

1
2
tar xf filebeat-6.4.1-linux-x86_64.tar.gz
mv filebeat-6.4.1-linux-x86_64 /usr/local/filebeat

2.测试

1
2
3
4
5
6
7
8
9
10
11
cd /usr/local/filebeat/
vim filebeat.yml
filebeat.prospectors:
-type: log
#enabled: false #这一句要注释掉
paths:
-/var/log/messages #指定需要收集的日志文件的路径
#output.elasticsearch: #先将这几句注释掉
#hosts: ["localhost:9200"]
output.console:
enable: true
1
./filebeat -c filebeat.yml
1
#看看是否有在终端中打印日志数据,有打印则代表filebeat能够正常收集日志数据

3.测试完成后,修改配置文件,让filebeat以服务的方式启动

1
2
3
4
5
vim filebeat.yml         
#output.console: 把这两句注释掉
# enable: true
output.elasticsearch:
hosts: ["192.168.10.31:9200"] #配置es服务器的ip地址
1
#./filebeat -c filebeat.yml &

4.启动成功后,到es服务器上查看索引,可以看到新增了一个以filebeat开头的索引,这就代表filesbeat和es能够正常通信了