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、日志分布在多台不同的服务器上,业务一旦出现故障,需要一台台查看日志。

系统架构图:

ELK日志分析系统_第1张图片

#备注:我们一共使用三台机器,所以具体得配置和架构图有所出入,具体根据现实情况来配置

第一层、数据采集层

最左边的是业务服务器集群,上面安装了filebeat做日志采集,同时把采集的日志分别发送给两个logstash服务。

第二层、数据处理层,数据缓存层

logstash服务把接受到的日志经过格式处理,转存到本地的kafka broker+zookeeper 集群中。

第三层、数据转发层

这个单独的Logstash节点会实时去kafka broker集群拉数据,转发至ES DataNode。

第四层、数据持久化存储

ES DataNode 会把收到的数据,写磁盘,建索引库。

第五层、数据检索,数据展示

ES Master + Kibana 主要协调ES集群,处理数据检索请求,数据展示。

 

#公司自身使用架构图分析

ELK日志分析系统_第2张图片

第一层、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 &