ELK是什么?

一般来说,为了提高服务可用性,服务器需要部署多个实例,每个实例都是负载均衡转发的后的,如果还用老办法登录服务器去tail -f xxx.log,有很大可能错误日志未出现在当前服务器中,还需要重复这个过程直到找到日志才能进行问题定位。两三台还好,成百上千个实例呢?人力有时穷。此时ELK闪亮登场了,那么ELK是什么?

ELK是全文本分布式日志搜索系统,包含Elasticsearch(索引库)/Logstash (过滤日志保存到索引库)/ Kibana (查看日志的前端工具)

本文内容说明

本文选用单体架构,多个组件都是单体形式进行部署,包含的组件有ELK(ElasticsearchLogstashKibana)、ZookeeperKafka 还有一个基于Kafka Client的客户端(logback接口的实现),通过这些组件的整合完成单体日志系统的搭建,这里使用的是下载的tar.gz,而不是直接安装的,配置部分可参考

系统架构图如下

这里用Kafka做的缓冲层,防止日志写入量过大,logstash和elasticsearch两者写入速率跟不上导致的数据丢失

后续会给大家带来点docker-compose版的demo级的elk集群,敬请期待!

环境准备

  • Ubuntu Server 18.04.2 (可替换为Centos 7, 因为都是Systemd的),请确保有足够的内存与硬盘空间
  • ELK 7.1.1
  • Kafka_2.12-2.2.0
  • Zookeeper使用Kafka自带的
  • 生成日志的demo,代码见https://github.com/HellxZ/LogDemo

出现的问题汇总

问题汇总请参考ELK搭建过程中出现的问题与解决方法汇总,基本上我测试过程中的ELK问题均已解决

Kafka外网无法连接的问题请参考

搭建过程

以下的相对位置均为下载文件的目录,请注意。另文中使用了nohup方式后台,每次执行命令后使用ctrl +c 来结束不会影响进程,使用tail -f xxx.out查看日志

配置Elasticsearch

tar zxvf elasticsearch-7.1.1-linux-x86_64.tar.gz # 解压
mkdir single-elk # 创建目录改名移动
mv elasticsearch-7.1.1 single-elk/elasticsearch
cd single-elk/elasticsearch && vim config/elasticsearch.yml # 进入配置文件夹,修改es配置文件 # 要修改的内容有
# 1.放开node.name注释,节点名可DIY
node.name: node-1
# 2.放开network.host,修改ip为当前服务器ip或0.0.0.0,供外部访问
network.host: 0.0.0.0
# 3.放开cluster.initial_master_nodes,指定当前node.name名称即可
cluster.initial_master_nodes: ["node-1"] #与node.name保持一致
bootstrap.memory_lock: true #锁内存,防止内存占用过大,官方推荐使用系统内存的一半,但不要达到32GB
# 保存退出 ES_JAVA_OPTS="-Xms512m -Xmx512m" bin/elasticsearch -d # 后台启动es,默认绑定端口号9200和9300,接口访问9200测试,9300为es集群之间通信

当日志中提示

ERROR: [1] bootstrap checks failed
[1]: memory locking requested for elasticsearch process but memory is not locked

如果当前主机可以分配给Es的超过1G,可以不设置bootstrap.memory_lock: true,这里自然说的是测试环境;正式环境还是需要限制内存,如上方的-Xmx -Xms等,官方推荐是占用系统内存的50%,但不要超过32G。可以通过ES_JAVA_OPTS进行限制,如果仍未能解决问题,请参考https://www.cnblogs.com/hellxz/p/11009634.html

浏览器访问http://192.168.87.133:9200/ (自行替换ip)

可选用elasticsearch-head查看,github上最新版只到了5,个人维护版有6的,还是没有7,给官方提issue,官方人员表示暂时没有意愿升级,因为大体可用,除了每个ES的分片等信息匹配不到了。。。看他们兴趣缺缺的样子,就不使用插件安装到es中了,改用的google-chrome插件,如图



已经给官方提issue了,官方回应现在在github上最新代码已经改了,如有需要,可以使用npm启动,支持es7.x

配置Zookeeper与Kafka

tar -zxvf kafka_2.12-2.2.0.tgz
mv kafka_2.12-2.2.0 single-elk/kafka
cd single-elk/kafka; vim config/zookeeper.properties #修改下data-dir就可以了,保存退出
vim config/server.properties #修改kafka配置 #需要修改内容如下
listeners=PLAINTEXT://kafka:9092
advertised.listeners=PLAINTEXT://kafka:9092
#保存退出 #编辑/etc/hosts,在hosts文件中追加kafka映射,注意是内网ip需要替换
192.168.87.133 kafka #其实写127.0.0.1也行 == nohup bin/zookeeper-server-start.sh config/zookeeper.properties > zookeeper.out & #启动zookeeper,出现绑定端口号即成功
nohup bin/kafka-server-start.sh config/server.properties > kafka.out & #启动kafka
#日志中出现started即成功

这里写kafka是因为外网访问的时候需要去用域名换ip,注册到zookeeper中的key包含了域名,所以本文中使用的是修改/etc/hosts的方式,我不知道其他人是怎么解决这个问题的,如果您有更好的方式,欢迎下方评论!

配置Logstash

tar zxvf logstash-7.1.1.tar.gz # 解压
mv logstash-7.1.1 single-elk/logstash
cd single-elk/logstash
vim config/logstash.conf # 创建配置文件,设置参数可参考logstash.sample.conf,详情见官网

使用自定义的配置文件需要在启动时指定。

# logstash.conf
# 本人配置的是使用kafka做了一层缓冲层,这个不用我多说了,请按需配置
input {
kafka {
bootstrap_servers => "192.168.87.133:9092"
topics => ["all_logs"]
group_id => "logstash"
codec => json
}
}
# 过滤器我没有配置,目前只是先看看效果
filter {
} output {
elasticsearch {
hosts => ["192.168.87.133:9200"]
index => "all-logs-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "changeme"
}
stdout {
codec => rubydebug
}
}

保存退出

nohup bin/logstash -f config/logstash.conf > logstash.out & #后台启动Logstash

看到日志中出现Successfully started Logstash API endpoint {:port=>9600},即启动成功

配置Kibana

# Kibana是基于node.js的前端项目,不过我测试服务器没装node.js也正常启动,看来ELK这些都自带了依赖环境
tar zxvf kibana-7.1.1-linux-x86_64.tar.gz
mv kibana-7.1.1-linux-x86_64 single-elk/kibana
cd single-elk/kibana && vim config/kibana.yml
#kibana.yml 以下配置均为解开注释,修改而成,使用搜索修改
# 指定kibana占用端口号,如无其它端口需要,可以不开启,默认5601
server.port: 5601
# 指定kibana绑定的ip地址,这里写kibana所在的ip即可
server.host: "192.168.87.133"
# es节点的ip地址
elasticsearch.hosts: ["http://192.168.87.133:9200"]
# kibana.index是kibana在es中创建的索引,会保存搜索记录,无需改变
kibana.index: ".kibana"
# 设置查询es超时时间,单位为milliseconds必须为整数
elasticsearch.requestTimeout: 30000
# 其余按需配置
# 中文化
i18n.locale: "zh-CN"
#保存退出
nohup bin/kibana > kibana.out & # 后台启动kibana

出现Server running at http://192.168.87.133:5601"类似字样,启动完成,访问看看

配置测试代码

使用代码的环境需要设置hosts文件,映射到kafka为刚才的ip,我的是192.168.87.133 kafka

项目是springboot的直接启动DemoApplication就好,还可以通过访问TestController中的方法来生产日志。

Connection to node -1 could not be established. Broker may not be available.出现这个问题请参考【Kafka问题解决】Connection to xxx could not be established. Broker may not be available.检查配置文件。

如需修改kafka的映射名称,记得修改logback-spring.xml中的<producerConfig>bootstrap.servers=your-kafka-domain:kafka-port</producerConfig>

查看效果

使用Elasticsearch-head

进入google-chrome的Elasticsearch-head插件,连接项目我们可以简单看到多出了几个绿色的0

当然了,由于这个插件官方没有对Elasticsearch 7.X进行优化支持,显示的图并不准确,好在我们可以看到索引和数据浏览

我的虚拟机没内存了。。所以集群状态变成yellow了,仅为只读状态,大家可以通过在配置文件中限制es的内存,默认是1G的。官方建议设置内存为系统内存的一半,但不要超过32GB,且最大内存与最小内存最好相等防止经常GC,参考自config/elasticsearch.yml

启动es的时候就需要指定内存参数, 如ES_JAVA_OPTS="-Xms512m -Xmx512m" bin/elasticsearch -d

使用kibana

此时我已经修复了内存不够的问题,配置文件也在上边更新了,大家可以放心测试

访问<你的kibana-ip:5601> 我的是<192.168.87.133:5061>

Kibana默认是不会给我们添加展示的索引的,需要我们去匹配,这里我们去添加

下一步,选择@timestamp或者其它,我这里选择@timestamp,然后创建索引模式即可

索引创建完成,我们去仪表盘查看下,点这个Discover

结束

最近在做ELK日志系统这块,还做了个demo级的docker-compose的ELK集群,因为生产环境我们是不会将多个es和多个kafka放在同一台机器上的。稍后我会整理下发上来,供大家借鉴。

【7.1.1】ELK日志系统单体搭建的更多相关文章

  1. 03篇ELK日志系统——升级版集群之ELK日志系统整合springboot项目

    [ 前言:整个ELK日志系统已经搭建好了,接下来的流程就是: springboot项目中的logback日志配置通过tcp传输,把springboot项目中所有日志数据传到————>logsta ...

  2. ELK日志系统:Elasticsearch+Logstash+Kibana+Filebeat搭建教程

    ELK日志系统:Elasticsearch + Logstash + Kibana 搭建教程 系统架构 安装配置JDK环境 JDK安装(不能安装JRE) JDK下载地址:http://www.orac ...

  3. .NET下日志系统的搭建——log4net+kafka+elk

    .NET下日志系统的搭建--log4net+kafka+elk 前言     我们公司的程序日志之前都是采用log4net记录文件日志的方式(有关log4net的简单使用可以看我另一篇博客),但是随着 ...

  4. 02篇ELK日志系统——升级版集群之kibana和logstash的搭建整合

    [ 前言:01篇LK日志系统已经把es集群搭建好了,接下来02篇搭建kibana和logstash,并整合完成整个ELK日志系统的初步搭建. ] 1.安装kibana 3台服务器: 192.168.2 ...

  5. 01篇ELK日志系统——升级版集群之elasticsearch集群的搭建

    [ 前言:以前搭了个简单的ELK日志系统,以我个人的感觉来说,ELK日志系统还是非常好用的.以前没有弄这个ELK日志系统的时候,线上的项目出了bug,报错了,要定位错误是什么,错误出现在哪个java代 ...

  6. ELK +Nlog 分布式日志系统的搭建 For Windows

    前言 我们为啥需要全文搜索 首先,我们来列举一下关系型数据库中的几种模糊查询 MySql : 一般情况下LIKE 模糊查询  SELECT * FROM `LhzxUsers` WHERE UserN ...

  7. FILEBEAT+ELK日志收集平台搭建流程

    filebeat+elk日志收集平台搭建流程 1.         整体简介: 模式:单机 平台:Linux - centos - 7 ELK:elasticsearch.logstash.kiban ...

  8. 创业公司做数据分析(四)ELK日志系统 (转)

    http://blog.csdn.net/zwgdft/article/details/53842574 作为系列文章的第四篇,本文将重点探讨数据采集层中的ELK日志系统.日志,指的是后台服务中产生的 ...

  9. ELK日志系统之通用应用程序日志接入方案

    前边有两篇ELK的文章分别介绍了MySQL慢日志收集和Nginx访问日志收集,那么各种不同类型应用程序的日志该如何方便的进行收集呢?且看本文我们是如何高效处理这个问题的 日志规范 规范的日志存放路径和 ...

随机推荐

  1. AtCoder Regular Contest 062 E - AtCoDeerくんと立方体づくり / Building Cubes with AtCoDeer

    题目传送门:https://arc062.contest.atcoder.jp/tasks/arc062_c 题目大意: 给你\(N\)块正方形木板,每块木板四角有四种颜色(可以相同),木板中央有编号 ...

  2. 数论/暴力 Codeforces Round #305 (Div. 2) C. Mike and Frog

    题目传送门 /* 数论/暴力:找出第一次到a1,a2的次数,再找到完整周期p1,p2,然后以2*m为范围 t1,t2为各自起点开始“赛跑”,谁落后谁加一个周期,等到t1 == t2结束 详细解释:ht ...

  3. 水题 Codeforces Round #303 (Div. 2) A. Toy Cars

    题目传送门 /* 题意:5种情况对应对应第i或j辆车翻了没 水题:其实就看对角线的上半边就可以了,vis判断,可惜WA了一次 3: if both cars turned over during th ...

  4. mysql数据误删除(drop)的恢复. (ext3grep, extundelete)

    drop table tbl_name 物理删除.没有备份,没有二进制日志 在系统删除文件并非在存储中抹去数据,而仅仅是标识对应的block块可以被重新的分配使用.所以数据的恢复还是有希望的.但是那些 ...

  5. archsummit_bj2016

    http://bj2016.archsummit.com/schedule 大会日程 2016年12月02日,星期五 7:45-9:00 签到 8:45-9:00 开始入场 9:00-9:30 开场致 ...

  6. idea使用Git提交代码时忽略指定文件或文件夹

    简述 使用idea编写代码并使用git作为版本控制器的时候,常常不需要提交配置文件以及一些其他不需要提交的文件,可以使用.ignore插件来在上传的时候忽略一些文件或文件夹. 安装 注意:安装完成之后 ...

  7. Linux上用mvn安装node.js

    Linux上用mvn安装node.js 上一篇blog简略的讲了ubuntu系统的安装,接下来讲讲Ubuntu上的基于node.js的web开发环境的搭建. Node在快速构建网络服务有着极大的优势, ...

  8. 详解nginx.conf文件配置项(包括负载均衡)

    http://www.cnblogs.com/hsapphire/archive/2010/04/08/1707109.html #运行用户 user  nobody nobody; #启动进程 wo ...

  9. scriptPubKey and scriptSig

    First of all two matching scripts are used in two different transactions, one that transfers funds t ...

  10. dom和bom是什么?

    DOM:文档对象模型,描述了处理网页内容的方法和接口.最根本对象是document(window.document). 由于DOM的操作对象是文档,所以DOM和浏览器没有直接关系. 部署在服务器上的文 ...