ELK日志分析系统
系统版本:
CentOS release 6.9
软件版本:
jdk-8u121-linux-x64
elasticsearch-5.5.1
x-pack-5.5.1
logstash-2.3 .2
kafka_2.11-0.10.0.0
zookeeper-3.4.9
kibana-5.5.1
elasticsearch-head
filebeat-1.2.3
ELK作用:
随着业务量的增长,每天业务服务器将会产生上亿条的日志,单个日志文件达几个GB,这时我们发现用Linux自带工具,cat grep awk 分析越来越力不从心了,而且除了服务器日志,还有程序报错日志,分布在不同的服务器,查阅繁琐。
能解决的痛点:
1、大量不同种类的日志成为了运维人员的负担,不方便管理;
2、单个日志文件巨大,无法使用常用的文本工具分析,检索困难;
3、日志分布在多台不同的服务器上,业务一旦出现故障,需要一台台查看日志。
系统架构图:
#备注:我们一共使用三台机器,所以具体得配置和架构图有所出入,具体根据现实情况来配置
第一层、数据采集层
最左边的是业务服务器集群,上面安装了filebeat做日志采集,同时把采集的日志分别发送给两个logstash服务。
第二层、数据处理层,数据缓存层
logstash服务把接受到的日志经过格式处理,转存到本地的kafka broker+zookeeper 集群中。
第三层、数据转发层
这个单独的Logstash节点会实时去kafka broker集群拉数据,转发至ES DataNode。
第四层、数据持久化存储
ES DataNode 会把收到的数据,写磁盘,建索引库。
第五层、数据检索,数据展示
ES Master + Kibana 主要协调ES集群,处理数据检索请求,数据展示。
#公司自身使用架构图分析
第一层、elasticsearch集群
elasticsearch一共四个节点,两个主节点,两个数据节点,其中一台机器上部署两个节点一个数据节点一个主节点,另外两台每台部署一个节点
第二层、logstash数据采集
两个logstash收集客户端filebeat发送来的数据,并且存入kafka集群,再用另一个logstash从kafka集群取出数据,将数据发送到elasticsearch的数据节点
第三层、kafka集群
三台机器都安装了kafka集群,数据会同步,所以不论哪一台挂了,都不会影响数据的正常
系统调优,JVM调优:
# 配置系统最大打开文件描述符数
vim /etc/sysctl.conf
fs.file-max=65535
# 配置进程最大打开文件描述符
vim /etc/security/limits.conf
# End of file
* soft nofile 131072
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
jdk模块安装:
上传1.8版本或者以上得JDK到/usr/local/,然后解压配置/etc/profile,配置项如下:
export JAVA_HOME=/usr/local/jdk1.8.0_121
export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
elasticsearch模块安装与配置:
#备注:因为elasticsearch不允许使用root用户来启动,所以我们要新建一个用户来启动,我这边使用elk可自行定义
useradd -m -d /opt/elk elk
#上传elstacisearch到/opt/elk,解压修改配置
#修改elk占用得最小最大内存,我将主节点设置为2g得内存,data数据节点设置为6g内存,主要情况看自身机器配置来设定
vim /opt/elk/elasticsearch5_1/config/jvm.options
-Xms2g
-Xmx2g
#因为我们需要一个用户要通过用户名和密码来登陆kibana所以我们要把elasticsearch和kibana都安装x-pack这个插件
/opt/elk/elasticsearch5_1/bin/elasticsearch-plugin install file:/opt/elk/x-pack-5.5.1.zip
#修改elasticsearch得配置,具体配置如下
# ---------------------------------- Cluster -----------------------------------
#设置elasticsearch组得命名
cluster.name: elk_log
# ------------------------------------ Node ------------------------------------
#设置此节点是否是主节点,主节点来控制其他得数据节点,我自身设置了两个主节点,两个数据节点
node.name: elk_node1
node.master : true
node.data : false
# ----------------------------------- Paths ------------------------------------
#设置日志路径和数据路径
path.data: /opt/elk/elasticsearch5_1/elk/data
path.logs: /opt/elk/elasticsearch5_1/elk/logs
# ----------------------------------- Memory -----------------------------------
#是否锁定内存
bootstrap.memory_lock: true
# ---------------------------------- Network -----------------------------------
#设置此节点得Ip和绑定得端口
network.host: 192.168.172.110
http.port: 9201
transport.tcp.port : 9301
# --------------------------------- Discovery ----------------------------------
#设置主节点得地址,和能存在几个主节点
discovery.zen.ping.unicast.hosts: ["192.168.172.110:9301", "192.168.172.112:9302"]
discovery.zen.minimum_master_nodes: 1
# ---------------------------------- X-pack -------------------------------------
#这样不设置的话启动的时候会又error报错
bootstrap.system_call_filter: false
#这是head插件需要的参数,但是如果开启了head那么xpack.security.enabled必须要设置成false不然需要输入密码head获取不到状态,数据节点可以不加
http.cors.enabled: true
http.cors.allow-origin: "*"
#设置是否开启密码验证
xpack.security.enabled: true
#设置是否开启监控
xpack.monitoring.enabled: true
xpack.graph.enabled: false
#设置自动创建索引
action.auto_create_index: true
#其他几个节点如果是主节点就跟上面这个一样配置,不过Node部分的node.name、Network部分的全部、Paths部分的全部需要修改其他的配置都不变。如果是数据节点的话Node部分的全部都要修改要把node.master改成false node.data改成true、Network的部分全部修改、Paths的部分全部修改
另外data节点的/opt/elk/elasticsearch5_1/config/jvm.options更具自身机器的性能修改成了6G
#备注:大致得配置就是上面这些了,下面就是启动了./bin/elasticsearch -d 表示后台启动,不过第一次启动得时候先不要加-d来看一下elasticsearch启动是否正常
kafka和zookeeper模块安装配置:
zookeeper:
#上传zookeeper到/opt目录下解压
tar zxf zookeeper-3.4.9.tar.gz
#编辑zookeeper配置文件zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper_data
clientPort=2181
#我这里三台服务器组了一个集群所以每一台上面都要安装zookeeper并添加下面得配置
server.1=192.168.172.110:12888:13888
server.2=192.168.172.111:12888:13888
server.3=192.168.172.112:12888:13888
#要创建一个myid文件,每一台都要写入自己对应得数字(数字参考上面得server)
echo 1 > /opt/zookeeper_data/myid
#启动zookeeper和查看状态
/opt/zookeeper/bin/zkServer.sh start
/opt/zookeeper/bin/zkServer.sh status
#备注:其他两台zoo.cfg配置都相同不同的是对应server.2 和server.3 去创建myid
kafka:
#编辑kafka配置文件server.properties
#kafka server id
broker.id=1
#port
port = 9092
host.name = 192.168.172.110
#线程设置
num.network.threads=9
num.io.threads=16
#此处默认
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
#默认配置日志路径要修改
log.dirs=/opt/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
log.flush.interval.messages=10000
log.flush.interval.ms=3000
#抓取得日志要保存多久(小时)
log.retention.hours=12
#日志多大分割
log.segment.bytes=1073741824
#多久检测一次
log.retention.check.interval.ms=300000
#配置zookeeper地址和超时时间
zookeeper.connect=192.168.172.110:2181,192.168.172.111:2181,192.168.112:2181
zookeeper.connection.timeout.ms=6000
#备注:另外两台相同,就是broker.id要修改一下
#写入/etc/hosts三台机器的hostname和ip地址每一台都要写
#kafka启动命令:kafka-server-start.sh -daemon config/server.properties
#kafka新建topic
./bin/kafka-topics.sh --create --zookeeper 192.168.169.79:2181 --replication-factor 3 --partitions 2 --topic (主题名字) ecplogs --replication-factor (有几个节点就写多少)
#列出有那些topics
./bin/kafka-topics.sh --list --zookeeper 192.168.169.79:2181
#删除一个消息主题topics
./bin/kafka-topics.sh --zookeeper (所有集群的zookeeper) --delete --topics ecplogs
#备注:建立topic分区可以让你把两个不同部门的业务放到不同的分区里面
filebeat模块配置:
#上传filebeat到需要采集数据的客户端/opt下并且解压
vim filebeat.yml
#就写一下格式如何写
filebeat:
prospectors:
-
paths:
- "/opt/access-common/access-common/logs/access-common.log"
input_type: log
document_type: access-common
output:
logstash:
#通过5044端口去让logstash接收
hosts: ["192.168.172.111:5044","192.168.172.112:5044"]
#备注:添加其他项目的日志地址和type只要添加标红的这个格式就可以了
logstash模块配置:
#logstash有接收filebeat和转发到elasticsearch data节点两个配置,因为公司要看完整日志,所以不做任何得规则
#接收filebeat的logstash,上传logstash到/opt/解压修改配置文件logstash_filebeat.conf
input {
beats {
codec => multiline {
pattern => "^2017"
negate => true
what => "previous"
}
port => 5044
}
}
output {
kafka {
bootstrap_servers => "192.168.172.110:9092,192.168.172.111:9092,192.168.172.112:9092"
topic_id => "paylog"
}
}
#发送到elasticsearch的logstash的配置,只启动一个发送到elasticsearch data节点就足够了
input{
kafka {
group_id => "logstash"
topic_id => "paylog"
reset_beginning => false
consumer_threads => 50
decorate_events => true
zk_connect => "192.168.172.110:2181,192.168.172.111:2181,192.168.112:2181"
}
}
output {
########################174.85#######################
if [type] == "3rd-adv-access" {
elasticsearch {
hosts => ["192.168.172.110:9203","192.168.172.111:9204"]
index => "3rd-adv-access-%{+YYYY.MM.dd}"
manage_template => true
user => elastic password => skymobi
}
}
}
#备注:logstash启动命令 ./bin/logstash -w 10 -b 2000 -f ../config/logstash_data.conf
kibana模块的安装和配置:
#上传kibana到/opt解压,因为要使用密码登陆kibana所以kibana要安装x-pack插件
./bin/kibana-plugin install file:/opt/elk/x-pack-5.5.1.zip
#修改kibana配置文件kibana.yml
server.port: 5601
server.host: "192.168.172.110"
#配置elasticsearch主节点的地址,如果一个挂了他会检测另一个
elasticsearch.url: "http://192.168.172.110:9201"
elasticsearch.url: "http://192.168.172.112:9202"
#设置登陆kibana的时候的账号密码
elasticsearch.username: "elastic"
elasticsearch.password: "skymobi"
xpack.security.enabled: true
xpack.monitoring.enabled: true
xpack.graph.enabled: false
xpack.reporting.enabled: false
#备注:kibana启动命令 nohup /opt/kibana/bin/kibana &