ELK与Elasticsearch集群部署

elk简述

传统日志管理问题

在项目初期的时候,大家都是赶着上线,一般来说对日志没有过多的考虑,当然日志量也不大,所以用log4j就够了,随着应用的越来越多,日志散落在各个服务器的logs文件夹下,确实有点不大方便

当我们需要日志分析的时候你大概会这么做:直接在日志文件中 grep、awk 就可以获得自己想要的信息

但是这样的方式有很多问题:

  1. 日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询

  2. 应用太多,面临数十上百台应用时你该怎么办

  3. 随意登录服务器查询log对系统的稳定性及安全性肯定有影响

  4. 如果使用人员对Linux不太熟练那面对庞大的日志无从下手

elk简介

ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件

  1. ElasticSearch
    这是一个基于Lucene的分布式全文搜索框架,可以对logs进行分布式存储,有点像hdfs。此为ELK的核心组件,日志的分析以及存储全部由es完成

  2. LogStash
    它可以流放到各自的服务器上收集Log日志,通过内置的ElasticSearch插件解析后输出到ES中

  3. Kibana
    它可以多维度的展示es中的数据。这也解决了用mysql存储带来了难以可视化的问题。他提供了丰富的UI组件,简化了使用难度

elk作用

  1. 日志统一收集,管理,访问。查找问题方便安全

  2. 使用简单,可以大大提高定位问题的效率

  3. 可以对收集起来的log进行分析

  4. 能够提供错误报告,监控机制

elk架构选择

一般使用普通架构即可

普通架构
  1. ElasticSearch:核心 提供查询,全文检索

  2. Kibana:页面展示,及方便查询

  3. Logstash:收集日志 主要有过滤功能,格式化,和其他个性化需求

使用场景:
能解决50G以下的log,这个50g指的是es里面的总量–此时一般es所在的机器配置是8G,es比较吃cpu内存

高级架构
  1. ElasticSearch:核心 提供查询,全文检索

  2. Kibana:页面展示,及方便查询

  3. FileBeat :轻量级收集日志系统,速度快,稳定不占资源

  4. Redis:缓冲,防止把es搞垮了,和kafka二者取其一

  5. Kafka:消息中间件,可缓存大数据量,日志一般存半个月

使用场景:
适用于一天产生几十g日志
推荐算法模型–》元数据来源于log,redis和kafka还有优势是做推荐的时候,可以即分发给es也分发给推荐算法

elk部署

下载地址:

1
https://www.elastic.co/cn/products

本次安装的版本信息:
JDK1.8
elasticsearch-5.6.4
logstash-5.6.3
kibana-5.2.0

elasticSearch部署

下载的包传到服务器上解压后

修改es的配置
1
2
cd elasticsearch-5.6.4/config/
vi elasticsearch.yml

要修改的内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 集群名称 配置集群使用-非集群不配
#cluster.name: my-application
# 这个节点的名称
node.name: node-1
# 数据存放目录-注意启动elasticsearch的用户必须有该目录的读写权限
path.data: /tmp/elasticsearch/data
# 日志存放目录-注意启动elasticsearch的用户必须有该目录的读写权限
path.logs: /tmp/elasticsearch/logs
# Lock the memory on startup:
bootstrap.memory_lock: false
# 解决启动异常:ERROR: bootstrap checks failed
bootstrap.system_call_filter: false
# 允许访问的ip 0.0.0.0表示允许所有
network.host: 0.0.0.0
# 允许外部访问的http端口
http.port: 9200
# 安装elastic-head插件需要-作用是跨域
http.cors.enabled: true
http.cors.allow-origin: "*"

修改linux配置

elasticSearch不允许root用户启动,新建用户用于启动elasticSearch

1
2
3
4
5
# 创建elasticsearch用户
groupadd elasticsearch
useradd elasticsearch -g elasticsearch -p 123456
# 赋权限
chown elasticsearch:elasticsearch -R /app/elasticsearch-5.6.4

es5.0后修改limit限制,不修改启动会报错
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

1
2
3
4
5
vi /etc/security/limits.conf
# 下面的elasticsearch是上面创建的elasticsearch用户名称
# 格式: username hard nofile 65536
elasticsearch hard nofile 65536
elasticsearch soft nofile 65536

解决max number of threads [1024] for user [apps] is too low, increase to at least [2048] 报错

1
2
3
4
5
vi /etc/security/limits.d/90-nproc.conf
修改
* soft nproc 1024
* soft nproc 2048

解决max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]报错

1
2
echo 'vm.max_map_count=262144'>> /etc/sysctl.conf
sysctl -p

启动测试

启动

1
2
3
#切换到elasticsearch用户
su elasticsearch
./elasticsearch-5.6.4/bin/elasticsearch

开放端口

1
2
3
4
5
vi /etc/sysconfig/iptables
# 在打开的文件中加入如下内容
-A INPUT -p tcp -m state --state NEW -m tcp --dport 9200 -j ACCEPT
# 重启防火墙
service iptables restart

浏览器访问测试:

http://es所在机器ip:9200/
出现一串包含版本信息的json即为安装成功

logstash部署

解压,在config目录建:logstash.conf,输入以下内容

1
vi logstash.conf

配置包含input ,filter,output三大块
其中input是吸取logs文件下的所有log后缀的日志文件
filter是一个过滤函数,配置则可进行个性化过滤
output配置了导入到hosts为127.0.0.1:9200的elasticsearch中,每天一个索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
input {
file {
type => "log"
path => "/logs/*.log"
start_position => "beginning"
}
}
output {
stdout {
codec => rubydebug { }
}
elasticsearch {
hosts => "127.0.0.1"
index => "log-%{+YYYY.MM.dd}"
}
}

start_position:
是监听的位置,默认是end,即一个文件如果没有记录它的读取信息,则从文件的末尾开始读取,也就是说,仅仅读取新添加的内容。对于一些更新的日志类型的监听,通常直接使用end就可以了;相反,beginning就会从一个文件的头开始读取。但是如果记录过文件的读取信息,则不会从最开始读取。重启读取信息不会丢失

bin目录下启动logstash了,配置文件设置为config/logstash.conf
启动命令:

1
./logstash -f ../config/logstash.conf

配置不同的logpath
在config目录下建立多个.conf文件,每个文件指定不同path
指定启动目录:

1
./logstash -f ../config

kibana部署

这个安装比较简单,解压后在kibana.yml文件中指定一下你需要读取的elasticSearch地址和可供外网访问的bind地址就可以了

1
vi kibana-5.2.0-linux-x86_64/config/kibana.yml

修改内容如下:

1
2
3
server.host: "0.0.0.0"
# 如果是集群则配置master节点
elasticsearch.url: http://localhost:9200

启动

1
./bin/kibana

开放端口

1
2
3
4
5
vi /etc/sysconfig/iptables
# 在打开的文件中加入如下内容
-A INPUT -p tcp -m state --state NEW -m tcp --dport 5601 -j ACCEPT
# 重启防火墙
service iptables restart

浏览器访问测试:
http://kibana所在机器ip:5601/

创建索引:

进入之后,在左侧栏菜单最后一项,创建索引,进入时没有创建按钮
我们在本机的/logs文件夹下创建一个简单的1.log文件,内容为“hello world”,然后在kibana上将logstash- 改成 log ,Create按钮就会自动出来

mark

插件安装

elastic-head插件

下载
https://github.com/mobz/elasticsearch-head/archive/master.zip

解压

1
2
3
unzip elasticsearch-head-master.zip
#没有zip命令的可以安装一下
#yum install -y unzip zip

执行命令

1
curl --silent --location https://rpm.nodesource.com/setup | bash -

如果没安装nodejs的话需要安装

1
yum install -y nodejs

如果node.js版本过低,则需要升级
升级node.js

1
2
3
4
# 第一步:首先安装 n 模块:
npm install -g n
# 第二步:升级node.js到最新稳定版
n stable

修改配置

1
2
3
4
5
cd elasticsearch-head-master
npm install grunt --save-dev
# 如果失败升级下node
npm install
vi Gruntfile.js

在connect节点下 增加hostname属性,设置为* 注意加,号

mark

修改head链接

1
vi elasticsearch-head-master/_site/app.js


1
this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://localhost:9200";

把localhost修改成自己es的服务器地址

1
this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://192.168.x.x:9200";

如果之前没在es的配置文件中配置以下内容的话,配置下(我上面es已经配置)

1
2
http.cors.enabled: true
http.cors.allow-origin: "*"

运行

1
2
cd elasticsearch-head-master/node_modules/grunt/bin
./grunt server &

开放端口

1
2
3
4
5
vi /etc/sysconfig/iptables
# 在打开的文件中加入如下内容
-A INPUT -p tcp -m state --state NEW -m tcp --dport 9100 -j ACCEPT
# 重启防火墙
service iptables restart

浏览器访问测试:
http://插件所在服务器ip:9100

elasticSearch集群部署

以上配置完成后,elk已经可以正常使用,这里在记录下es集群的部署,这里在一台机器上部署集群,上面已经部署好的es为主节点,其 elasticsearch.yml 的配置内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#-----------------cluster集群新加配置------------------
# 集群名称 注意一个集群里面的机器一定要保持一致
cluster.name: "my-es-cluster"
# 尽量配置机器差作为主节点 注意只有两个节点的话第二个请配置为false
node.master: true
node.data: true
http.enabled: true
transport.tcp.port: 9300
# 单播(unicast)协议,指定要发现的节点信息了,可以不指定端口[默认9300]
discovery.zen.ping.unicast.hosts: ["192.168.112.50","192.168.112.50:8300"]
#默认是1看到的具有master节点资格的最小数量,然后才能在集群中做操作。官方的推荐值是(N/2)+1,如果只有2个节点设为1
discovery.zen.minimum_master_nodes: 1
# ping的超时时间,如果网络差则延长
# discovery.zen.ping.timeout: 60s
# 设置集群中自动发现其他节点时ping连接的超时时间
# discovery.zen.ping.timeout: 180s
#-------------cluster集群在单机基础上可能要修改配置------------------
# 这个节点的名称 同一个集群里面的名字不能相同
node.name: node-1
# 数据存放目录-注意启动elasticsearch的用户必须有该目录的权限
path.data: /tmp/elasticsearch/data
# 日志存放目录-注意启动elasticsearch的用户必须有该目录的权限
path.logs: /tmp/elasticsearch/logs
# 允许外部访问的端口
http.port: 9200
#-----------------单机和集群不变的配置------------------
bootstrap.memory_lock: false
# 解决启动异常:ERROR: bootstrap checks failed
bootstrap.system_call_filter: false
# 允许访问的ip 0.0.0.0表示允许所有
network.host: 0.0.0.0
# head插件跨域
http.cors.enabled: true
http.cors.allow-origin: "*"

复制一份主节点的es或重新解压一份es,修改其 elasticsearch.yml 的配置内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#-----------------cluster集群新加配置------------------
# 集群名称 注意一个集群里面的机器一定要保持一致
cluster.name: "my-es-cluster"
# 尽量配置机器差作为主节点 注意只有两个节点的话第二个请配置为false
node.master: false
node.data: true
http.enabled: true
transport.tcp.port: 8300
# 单播(unicast)协议,指定要发现的节点信息了,可以不指定端口[默认9300]
discovery.zen.ping.unicast.hosts: ["192.168.112.50","192.168.112.50:8300"]
#默认是1看到的具有master节点资格的最小数量,然后才能在集群中做操作。官方的推荐值是(N/2)+1,如果只有2个节点设为1
discovery.zen.minimum_master_nodes: 1
# ping的超时时间,如果网络差则延长
# discovery.zen.ping.timeout: 60s
# 设置集群中自动发现其他节点时ping连接的超时时间
# discovery.zen.ping.timeout: 180s
#-------------cluster集群在单机基础上可能要修改配置------------------
# 这个节点的名称 同一个集群里面的名字不能相同
node.name: node-2
# 数据存放目录-注意启动elasticsearch的用户必须有该目录的权限
path.data: /tmp/elasticsearch/data-node2
# 日志存放目录-注意启动elasticsearch的用户必须有该目录的权限
path.logs: /tmp/elasticsearch/logs-node2
# 允许外部访问的端口
http.port: 8200
#-----------------单机和集群不变的配置------------------
bootstrap.memory_lock: false
# 解决启动异常:ERROR: bootstrap checks failed
bootstrap.system_call_filter: false
# 允许访问的ip 0.0.0.0表示允许所有
network.host: 0.0.0.0
# head插件跨域
http.cors.enabled: true
http.cors.allow-origin: "*"

如果一台机器内存不够,可以修改es的内存配置,例如这里可以将master内存改小一点

1
2
cd config
vi jvm.options

将2G改为1G

1
2
-Xms1g
-Xmx1g

为了方便查看我将上面es的文件夹做了重命名,因此给elasticsearch重新授权

1
2
chown elasticsearch:elasticsearch -R /app/elasticsearch-node1
chown elasticsearch:elasticsearch -R /app/elasticsearch-node2

添加公作节点使用的外部端口

1
2
3
4
5
vi /etc/sysconfig/iptables
# 在打开的文件中加入如下内容
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8200 -j ACCEPT
# 重启防火墙
service iptables restart

启动工作节点,在启动master节点

1
2
3
su elasticsearch
# 分别切换到两个es的安装目录,启动
./bin/elasticsearch

成功启动后控制台打印

mark

启动head插件,在浏览器访问

mark


-------------本文结束感谢您的阅读-------------