ELk日志分析收集工具

日志收集的重要性

分析日志的意义:

  1. 分析日志监控系统运行的状态

  2. 分析日志来定位程序的bug

  3. 分析日志监控网站的访问流量

  4. 分析日志可以知道哪些sql语句需要优化

收集工具分类

  1. 日志易:国内一款监控、审计、权限管理,收费软件

  2. splunk:按流量收费,国外软件,主要三个部件组成:Indexer、Search Head、Forwarder

    • Indexder提供数据的存储,索引,类似于elasticsearch的作用
    • Search Head负责搜索,客户接入,从功能上看,一部分是kibana的UI是运行,在Search Head上的,提供所有的客户端可视化功能,还有一部分,是提供分布式的搜索功能,具有Elasticsearch部分功能
    • Forwarder负责数据接入,类似Logstash或者filebeat
  3. elk

elk简单介绍

ELK官网:https://www.elastic.co/cn/

ELK官方文档:https://www.elastic.co/guide/index.html

ELK中文手册:http://kibana.logstash.es/content/elasticsearch/monitor/logging.html

核心组成

ELK是elasticsearch、Logstashh和Kibana三个系统的首字母组合。

  • Elasticsearch 是一个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

    主要功能:用来做数据存储(也是种数据库)、数据搜索、数据分析

  • Logstash 是一个完全开源的工具,它可以对你的日志进行收集,过滤,并将其存储供以后使用(如:搜索)。

  • Kibana 也是一个开源和免费的工具,Kibana可以为Logstash 和 ElasticSearch 提供的日志分析友好的 Web 页面,可以帮助汇总、分析和素搜索重要数据日志。

四大部件

  1. Logstash:logstash server端用来搜集日志;
  2. Elasticsearch:存储各类日志;
  3. Kibanana:web化接口用作查询和可视化日志
  4. Logstash Forwarder:Logstash client端用来通过 lumberjack 网络协议发送日志到 logstash server;

ELK工作流程

在需要收集日志的所有服务器上部署logstash,作为logstash agent(logstash shipper)用于监控并过滤收集日志,将过滤后的内容发送到 Redis,然后logstash indexer将日志收集在一起交给全文搜索ElasticSearch,可以用ElasticSearch进行自定义搜索通过Kibana 来结合自定义搜索进行页面展示。

部署方式

第一种方式 L-E-K方式:不添加任何其他辅助系统,部署简单快速,容易上手。

 第二种方式:在L-E-K方式之间加一个redis辅助,这样能够减少日志在服务端的积压,把压力转移到ELK服务器上。这种方式添加redis之后,由于redis是内存系统所以相应速度快,而且可以在redis后添加多个消费系统(Logstash),来扩展消费能力,增强处理速度。

 第三种方式:ELK+filebeat+kafka+zookeeper集群架构 kafka做缓存

什么是倒排索引

1. 信息存储到es时,首先把每条语句分成一个一个的词语
2. 根据搜索的内容,进行分配,有匹配到的权重+1
3. 把匹配到的语局给呈现出来

elasticsearch介绍

elasticsearch应用场景

1. 电商平台
2. 高亮显示搜索的词条信息
3. 日志分析elk

elasticsearch特点

1. 高性能:
    es可以支持一主多从,水平扩展方便
2. 高可用性:一个主节点宕机后不影响用户的使用。
3. 用户使用方便快捷:es采用Java开发,即使不懂Java代码,一样可以使用
4. 功能丰富,配置简单
5. 采用restful封装的接口,可以通过http发起请求

elasticsearch部署方法

安装方式 优点 对运维的要求
docker 部署方便、开箱即用、启动迅速 需要会docker知识、需要制作镜像、修改配置麻烦、数据需要挂载目录
tar 部署灵活、对系统侵占性小 需要写启动脚本文件、目录需要提前规划
rpm 部署方便、启动脚本安装即用、存放目录标准化 软件各个组件分散在不同的目录、卸载不彻底、默认配置需要修改
ansible 极其灵活、批量部署速度快 需要学习ansible语法、需要提前规划、需要专人维护

es安装前环境准备

es安装准备

  • 系统版本:centos7.6
  • ip地址:10.0.0.240
  • 主机名:es01
  • 内存:2G+

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/=enforcing/=disabled/g' /etc/selinux/config

配置yum源

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo  --安装软件需要

安装jdk

下载地址:https://www.oracle.com/java/technologies/javase-jdk8-downloads.html

注:需要注册账号才可以下载软件包,请使用180以上版本,否侧会出现报错

elk软件包链接:https://pan.baidu.com/s/1wtNI6Zt6f9JDvl6gD2F_6w 提取码:nu1s

mkdir -p /opt/es-software
cd /opt/es-software
rpm -ivh jdk-8u102-linux-x64.rpm
​
## 版本测试
java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)

es部署

上传es软件

注:如果想下载新的es软件包,我们可以去清华源下载

cd /opt/es-software
rpm -ivh elasticsearch-6.6.0.rpm

查看es安装配置文件位置

rpm -qc elasticsearch
/etc/elasticsearch/elasticsearch.yml    --主配置文件
/etc/elasticsearch/jvm.options          --jvm虚拟机配置
/etc/init.d/elasticsearch       --init启动文件
/etc/sysconfig/elasticsearch    --ES环境变量的相关文件
/usr/lib/sysctl.d/elasticsearch.conf    --ES环境变量的相关配置
/usr/lib/systemd/system/elasticsearch.service   --服务启动文件

修改es配置文件

egrep  -v '^$|#' /etc/elasticsearch/elasticsearch.yml
##配置内容
vim  /etc/elasticsearch/elasticsearch.yml
node.name: es01
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true         ---锁定内存,在启动时会报错
network.host: 10.0.0.240,127.0.0.1
http.port: 9200
​
##启动服务
systemctl start elasticsearch
systemctl enable elasticsearch
systemctl edit elasticsearch
[Service]
LimitMEMLOCK=infinity
​
##重新载入,并重新启动服务
systemctl daemon-reload
systemctl restart elasticsearch
​
##检查端口是否开启
netstat -lntup
-- 正常开启的端口为9200和9300
tcp6       0      0 127.0.0.1:9200          :::*           LISTEN      10066/java          
tcp6       0      0 10.0.0.240:9200         :::*           LISTEN      10066/java          
tcp6       0      0 127.0.0.1:9300          :::*           LISTEN      10066/java          
tcp6       0      0 10.0.0.240:9300         :::*           LISTEN      10066/java     
  • 给java程序设定启动大小
vim /etc/elasticsearch/jvm.options
-Xms1g
-Xmx1g
systemctl start elasticsearch  --如果没有,建议这个命令多启动几下

注:这里可能会启动失败,因为java程序比较吃内存,建议多给点内存,内存查看命令free -h

检查es是否正常使用

##浏览器的方式:
http://10.0.0.240:9200
​
##命令行的方式:
curl 10.0.0.240:9200
{
  "name" : "es01",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "LG2l_0MvRbSWuPwjPzgxFw",
  "version" : {
    "number" : "6.6.0",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "a9861f4",
    "build_date" : "2019-01-24T11:27:09.439740Z",
    "build_snapshot" : false,
    "lucene_version" : "7.6.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}
​
#创建个索引
curl -XPUT '10.0.0.240:9200/oldboy?pretty'
#往这个索引里面插入一条指定id号为1的数据
curl -XPUT '10.0.0.240:9200/oldboy/student/1?pretty' -H 'Content-Type: application/json' -d'
{
    "first_name" : "zhang",
    "last_name": "san",
    "age" : 25,
    "about" : "I love to go rock climbing", 
    "interests": [ "sports" ]
}'
#往这个索引里面插入一条随机生成一个id的数据
curl -XPUT  '10.0.0.240:9200/oldboy/student/2?pretty' -H 'Content-Type: application/json' -d' {
"first_name": "li",
"last_name" : "si",
"age" : 32,
"about" : "I like to collect rock albums", 
"interests": [ "music" ]
}'
#查询索引当中的一条数据
curl -XGET  '10.0.0.240:9200/oldboy/student/1?pretty'
#删除索引当中的一条数据
curl -XDELETE  '10.0.0.240:9200/oldboy/student/1?pretty'
#删除指定的索引
curl -XDELETE  '10.0.0.240:9200/oldboy/?pretty'
#修改系统默认的副本及分片数量
curl -XPUT '10.0.0.240:9200/_template/template_http_request_record' -H 'Content-Type: application/json' -d'
{
    "index_patterns": ["*"],
    "settings": {
    "number_of_shards" : 5,
    "number_of_replicas" : 1
    }
}'
  • ES和MySQL关系对比
数据库 index(索引)
type(类型)
字段 Fields(文档有多个字段)
doc(文档)

ES交互方式 

1.  curl命令

最繁琐复杂
最容易出错
不需要安装任何软件,只需要有curl命令

2. es-head插件

查看数据方便
操作相对容易
需要node环境

3. kibana

查看数据以及报表格式丰富
操作简单
需要java环境和安装配置kibana

head插件安装

  • 下载epel源
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

nodejs编译安装

yum install nodejs npm openssl screen -y #配置nodejs环境
​
##查看版本
node -v
npm -v 
​
##安装组件
npm install -g cnpm --registry=https://registry.npm.taobao.org   --更新为淘宝源
cd /opt/
##克隆代码
官网https://github.com/mobz/elasticsearch-head
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head/
cnpm install
screen -S es-head
cnpm run start
Ctrl+A+D
​
#通过cnpm的方式来运行head时, 发现无法链接es服务器
vim /etc/elasticsearch/elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"

在谷歌浏览器中安装插件

设置--> 扩展工具-->加载软件包(包在上面的连接目录里面es-head-0.1.4_0.crx.123ok)

  •  测试连接

使用docker

docker pull alivv/elasticsearch-head        ---docker.hub拉取镜像,对带宽有要求
docker run --name es-head -p 9100:9100 -dit elivv/elasticsearch-head

谷歌浏览器插件

插件地址:https://github.com/mobz/elasticsearch-head

修改文件名为zip后缀

解压目录

拓展程序-开发者模式-打开已解压的目录

连接地址修改为ES的IP地址

head插件和es连接错误解决

#在es配置文件最下面加入下面内容
http.cors.enabled: true
http.cors.allow-origin: "*"

head界面简单说明

对es数据库的操作

在命令行界面来对es操作

##命令行的方式:
curl 10.0.0.240:9200
{
  "name" : "es01",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "LG2l_0MvRbSWuPwjPzgxFw",
  "version" : {
    "number" : "6.6.0",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "a9861f4",
    "build_date" : "2019-01-24T11:27:09.439740Z",
    "build_snapshot" : false,
    "lucene_version" : "7.6.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}
​
#创建个索引
curl -XPUT '10.0.0.240:9200/class?pretty'
#往这个索引里面插入一条指定id号为1的数据
curl -XPUT '10.0.0.240:9200/class/student/1?pretty' -H 'Content-Type: application/json' -d'
{
    "first_name" : "zhang",
    "last_name": "san",
    "age" : 25,
    "about" : "I love to go rock climbing", 
    "interests": [ "sports" ]
}'
#往这个索引里面插入一条随机生成一个id的数据
curl -XPUT  '10.0.0.240:9200/class/student/2?pretty' -H 'Content-Type: application/json' -d' {
"first_name": "li",
"last_name" : "si",
"age" : 32,
"about" : "I like to collect rock albums", 
"interests": [ "music" ]
}'
#查询索引当中的一条数据
curl -XGET  '10.0.0.240:9200/class/student/1?pretty'
#删除索引当中的一条数据
curl -XDELETE  '10.0.0.240:9200/class/student/1?pretty'
#删除指定的索引
curl -XDELETE  '10.0.0.240:9200/class/?pretty'
#修改系统默认的副本及分片数量
curl -XPUT '10.0.0.240:9200/_template/template_http_request_record' -H 'Content-Type: application/json' -d'
{
    "index_patterns": ["*"],
    "settings": {
    "number_of_shards" : 5,
    "number_of_replicas" : 1
    }
}'

在head插件上面创建索引插入数据

示例:

#创建索引:
http://10.0.0.240:9200/class        选择--> PUT
#插入数据:
http://10.0.0.240:9200/class/student/1
{
    "first_name":"lao",
    "last_name":"wang",
    "age":25,
    "about":"l love to go rock climbing",
    "interests":["sports"]
}
#插入第二条数据:
http://10.0.0.240:9200/class/student/2      选择--> PUT
{
"first_name":"wang",
"last_name":"wu",   
"age":27,
"about":"I love to go rock climbing",
"interests":["music"] 
}
#不指定id号随机插入一条数据:
#put不支持不支持分配id号,post支持随机分配id号
http://10.0.0.240:9200/class/student/   选择-->POST
{
"first_name":"zhao",
"last_name":"liu",
"age":29,
"about":"I love to go rock climbing",
"interests":["eatting"] 
}
#查询指定id号的数据信息:
http://10.0.0.240:9200/class/student/1  选择-->GET
#查询指定索引所有数据信息:
http://10.0.0.240:9200/class/_search    选择-->GET
#删除指定的数据:
http://10.0.0.240:9200/class/student/1  选择--> DELETE
#删除指定索引里面的数据:
http:/10.0.0.240:9200/class/    选择-->DELETE
#修改副本及分片:
http://10.0.0.240:9200/_template/template_http_request_record  选择-->PUT
{
"index_patterns": ["*"],
"settings": {
        "number_of_shards" : 5
        "number_of_replicas" : 1
    }
}'

Klibana与es交互

安装kibana

kibana下载地址:https://www.elastic.co/cn/kibana

##安装kibana
cd /opt/es-software
rpm -ivh kibana-6.6.0-x86_64.rpm
​
##修改配置文件
vim /etc/kibana/kibana.yml
[root@es01 es-software]# egrep -v '^$|#' /etc/kibana/kibana.yml
server.port: 5601
server.host: "10.0.0.240"
elasticsearch.hosts: ["http://10.0.0.240:9200"]
kibana.index: ".kibana"
#启动kibana服务
systemctl start kibana
#在浏览器中测试kibana服务是否正常
http://10.0.0.240:5601

注:这里出现了一些问题,网页显示 K;ibana server is not ready yet,重新刷新网页又好了。

也可能是因为索引给删掉了,使用命令:curl -XDELETE http://10.0.0.240:9200/.kibana_2

 在kibana界面往es系统系统数据

Dev Tools--->console
#创建一个索引
PUT class
#在oldboy索引中插入一条数据
PUT class/student/1
{
  "name": "zhang san",
  "age": "29",
  "xuehao": 1
}
#随机插入一条数据
POST class/student/
{
  "name": "xiaoli",
  "age": "19",
 "xuehao": 5
}
#查询数据
GET class/student/2
GET class/_search
#删除一条数据
DELETE class/student/1
#修改系统默认的分片数和副本数
PUT _template/template_http_request_record 
{
 "index_patterns": ["*"],
 "settings": {
         "number_of_shards" : 3,
         "number_of_replicas" : 1
     }
 }

备注:

  1. 即使又某些索引不在使用,不要马上删除,可以先关闭掉,确定一段时间内没有人使用,在删除。
  2. 一但索引被创建,分片的数量不能被二次修改,副本的数量可以修改。

修改副本数量的命令

PUT /calss/_settings
{
  "number_of_replicas": 2
}

es集群部署


地址规划:

主机名 ip地址 node-name 软件 内存
es01 10.0.0.240 es01 elasticsearch、kibana 3G
es02 10.0.0.241 es02 elasticsearch 3G
es03 10.0.0.242 es03 elasticsearch 3G

安装es集群

#上传需要安装的包
mkdir /opt/es-software
cd /opt/es-software
jdk  elasticsearch
#安装包
rpm -ivh jdk-8u102-linux-x64.rpm
rpm -ivh elasticsearch-6.6.0.rpm 

修改各节点配置文件

注:这里我们进行两两配置,首尾相接

es01主机:10.0.0.240 10.0.0.241

es02主机:10.0.0.241 10.0.0.242

es03主机:10.0.0.242 10.0.0.24

  • 在10.0.0.240主机操作
vim /etc/elasticsearch/elasticsearch.yml
[root@es01 es-software]# grep -E -v '^$|#' /etc/elasticsearch/elasticsearch.yml
#cluster名称
cluster.name: es01-cluster
#node节点名称
node.name: es01
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.0.0.240,127.0.0.1
http.port: 9200
#集群连接的主机,两两串联集群
discovery.zen.ping.unicast.hosts: ["10.0.0.240", "10.0.0.241"]
#进行选举,有两个主机投票就是集群下一个老大
discovery.zen.minimum_master_nodes: 2 
http.cors.enabled: true
http.cors.allow-origin: "*"
  • 在10.0.0.241主机操作
vim /etc/elasticsearch/elasticsearch.yml
[root@es02 es-software]# grep -E -v '^$|#' /etc/elasticsearch/elasticsearch.yml
cluster.name: es01-cluster
node.name: es02
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.0.0.241,127.0.0.1
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.0.0.241", "10.0.0.242"]
discovery.zen.minimum_master_nodes: 2 
http.cors.enabled: true
http.cors.allow-origin: "*"
  • 在10.0.0.242主机操作
vim /etc/elasticsearch/elasticsearch.yml
[root@es03 es-software]# grep -E -v '^$|#' /etc/elasticsearch/elasticsearch.yml
cluster.name: es01-cluster
node.name: es03
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.0.0.242,127.0.0.1
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.0.0.242", "10.0.0.240"]
discovery.zen.minimum_master_nodes: 2 
http.cors.enabled: true
http.cors.allow-origin: "*"

注:集群启动失败排查

  1. es主配置文件有些地方有误
  2. es主进程在启动时,直接被kill -9
  3. 内存太小,虚拟机所使用的内存达不到要求

命令行查看集群节点

  • 主节点查看集群日志,如果一直出现日志就是不正常
[root@es01 ~]# tail -f /var/log/elasticsearch/es01-cluster.log
[2020-03-19T13:36:10,179][INFO ][o.e.c.s.ClusterApplierService] [es01] added {{es03}{A3kawMrWQ96njqdzXcTPKA}{obOzQrZVTyuWlvtZ8Q2SSg}{10.0.0.242}{10.0.0.242:9300}{ml.machine_memory=2076762112, ml.max_open_jobs=20, xpack.installed=true, ml.enabled=true},}, reason: apply cluster state (from master [master {es02}{C-Tt5jhCRY63fl5Z-7uxDQ}{rMfCPPbSTayguT8XNnVNwQ}{10.0.0.241}{10.0.0.241:9300}{ml.machine_memory=2076762112, ml.max_open_jobs=20, xpack.installed=true, ml.enabled=true} committed version [16]])
  • node节点查看后台进程
# netstat  -lntup
tcp6       0      0 127.0.0.1:9200          :::*                    LISTEN      55201/java          
tcp6       0      0 10.0.0.241:9200         :::*                    LISTEN      55201/java          
tcp6       0      0 127.0.0.1:9300          :::*                    LISTEN      55201/java          
tcp6       0      0 10.0.0.241:9300         :::*                    LISTEN      55201/java    

head检查集群是否正常运行

注:粗框是主分片,细框是副本分片

分片和副本的含义

  • 分片:把存储到索引里面的数据,分隔一块块的,均匀的存储到不同的节点上面,构成分布式存储分担集群的压力
  • 分片各类:分片 副本分片
  • 主分片:主要是响应修改数据的请求,同时提供查询功能
  • 副本分片:主要是提供查询的功能
  • 副本:副本就是主分片的备份

台服务器集群,最多可以宕机多少台

  1. 如果一台一台的宕机,最多可以宕机2台,(需要手动修改配置文件才能保障服务正常使用),正常情况下,一台一台的宕机(宕机一台修好一台,不影响集群的健康状态
  2. 前提是1副本,如果同时宕机2台,那么数据就会丢失,集群处于红色状态
  3. 前提是2个副本,如果同一台一台的宕机没有什么影响,即使是同时宕机2台,通过修改配置文件,也可以正常提供服务。

生产中注意事项

  1. 索引一但创建成功,分片的数量是不能再修改,但是副本的数量可以人为的修改
  2. 分片数量多少合适,如果集群中有3个节点,分片的数量为3*3个
  3. 在配置主机相互发现时,可以两两主机串起来配置

如何监控集群运行状态

curl '10.0.0.240:9200/_cluster/health?pretty'
#kibana界面
GET _cat/nodes
GET _cat/health

部署备份索引工具elasticdump

  • 编译安装nodejs
# 下载
cd /opt
wget https://nodejs.org/dist/v13.11.0/node-v13.11.0-linux-x64.tar.xz
# 解压
tar xf node-v13.11.0-linux-x64
mv node-v13.11.0-linux-x64 nodejs
##解压以后测试是否成功安装
cd node.js
./bin/node -v
v13.11.0  --版本号
##设置软连接
ln -s /optnodejs/bin/node /usr/local/bin/node
ln -s /opt/nodejs/bin/npm /usr/local/bin/npm
#使用国内淘宝镜像源(可能需要等几分钟)
npm install -g cnpm --registry=https://registry.npm.taobao.org

注:这里git已经安装,下面直接安装hexo 安装命令yum install git -y

  • 安装elasticdump

官网地址:https://github.com/taskrabbit/elasticsearch-dump

#安装es-dump,执行完这里请看下边备注
cnpm install elasticdump -g
#指定索引备份命令
mkdir /data
elasticdump \
  --input=http://10.0.0.240:9200/class \
  --output=/data/class.json \
  --type=data
#通过备份的数据来恢复
elasticdump \
--input=/data/class.json \
--output=http://10.0.0.240:9200/class
#把索引可以备份为一个压缩文件的形式(如果要恢复,必须要解压)
elasticdump \
  --input=http://10.0.0.240:9200/class \
  --output=$ \
  | gzip > /data/class.json.gz
#注意
#恢复的时候需要先解压缩成json
#恢复的时候,如果已经存在相同的数据,会被覆盖掉
#如果新增加的数据,则不影响,继续保留

备注:使用nodejs_12.16.1会导致不兼容的情况,需要升级

npm install -g n
n latest

中文分词器

有些词语原本不是一个词语,通过中文分词器,人为的把不是一个词语的词,当成一个完整的词语,然后存到es内部的词典当中。

下载安装包

官方下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases

#下载到指定目录
cd /opt/es-software
#使用命令安装(如果集群有多台机器,每台服务器都要安装)
cd /usr/share/elasticsearch
/usr/share/elasticsearch/bin/elasticsearch-plugin install  file:///opt/es-software/elasticsearch-analysis-ik-6.6.0.zip
#把es服务重启一下
systemctl restart elasticsearch
#创建一个新的索引(在kibana界面)
PUT news
#应用中文分词器的模板
curl -XPOST http://localhost:9200/news/text/_mapping -H 'Content-Type:application/json' -d'
{
        "properties": {
            "content": {
                "type": "text",
                "analyzer": "ik_max_word",
                "search_analyzer": "ik_smart"
            }
        }
}'
#往已创建好的索引里面写数据
POST /news/text/1
{"content":"美国留给伊拉克的是个烂摊子吗"}
​
POST /news/text/2
{"content":"公安部:各地校车将享最高路权"}
​
POST /news/text/3
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
​
POST /news/text/4
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}
#通过kibana进行验证词语是否能正常切分
POST /news/_search
{
    "query" : { "match" : { "content" : "中国" }},
    "highlight" : {
        "pre_tags" : ["<tag1>", "<tag2>"],
        "post_tags" : ["</tag1>", "</tag2>"],
        "fields" : {
            "content" : {}
        }
    }
}

热动态更新词典

#安装nginx服务
yum install nginx -y
#添加一个配置文件(gbk字符会出现冲突,如果发有问题,可以删除gbk)
cd /etc/nginx/conf.d/
vim www.conf
server {
    listen 80;
    server_name elk.oldboy.com;
    location / {
        root /usr/share/nginx/html/download;
        charset utf-8,gbk;
        autoindex on;
        autoindex_localtime on;
        autoindex_exact_size off;
      }
    }
#检查代码是否误
nginx - t
systemctl start nginx
#创建目录
mkdir /usr/share/nginx/html/download
#新建一个文件,存放临时要加入的词语
vim dic.txt
老男孩
老朋友
。。。
#域名解析
要修改一下host文件 
10.0.0.240 elk.oldboy.com
#在浏览器中测试一下,(当dic.txt文件发生改变时,关注modifily-time etag是否发生变化)
elk.oldboy.com
#修改IKAnalyzer.cfg.xml(集群中要是有多台服务器,每台服务器都要修改)
cd /etc/elasticsearch/analysis-ik
vim IKAnalyzer.cfg.xml
<entry key="remote_ext_dict">http://10.0.0.240/download/dic.txt</entry>
#重启elasticsearch服务
systemctl restart elasticsearch
#关注日志文件,看是否有扩展的字典内容加载,如果有加载说明扩展词典已经生效
#在kibana界面测试,根据我们新加入的词语,来创建一个词条
POST /news/text/6
{"content":"北京老女孩教育"}
POST /news/text/7
{"content":"北京老男孩教育余小闯"}
#当词条写入成功之后,可以用命令检查
POST /news/_search
{
    "query" : { "match" : { "content" : "余小闯" }},
    "highlight" : {
        "pre_tags" : ["<tag1>", "<tag2>"],
        "post_tags" : ["</tag1>", "</tag2>"],
        "fields" : {
            "content" : {}
        }
    }
}
  • 查看elasticsearch日志,字典更新是否完成
tail -f /var/log/elasticsearch/es01-cluster.log
[2020-03-20T22:28:00,576][INFO ][o.w.a.d.Monitor          ] [es01] 老男孩
[2020-03-20T22:28:00,578][INFO ][o.w.a.d.Monitor          ] [es01] 老朋友
[2020-03-20T22:28:10,586][INFO ][o.w.a.d.Monitor          ] [es01] 重新加载词典...
[2020-03-20T22:28:10,587][INFO ][o.w.a.d.Monitor          ] [es01] try load config from /etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml
[2020-03-20T22:28:10,999][INFO ][o.w.a.d.Monitor          ] [es01] [Dict Loading] http://10.0.0.240/download/dic.txt
[2020-03-20T22:28:11,030][INFO ][o.w.a.d.Monitor          ] [es01] 老男孩
[2020-03-20T22:28:11,030][INFO ][o.w.a.d.Monitor          ] [es01] 老朋友
[2020-03-20T22:28:11,030][INFO ][o.w.a.d.Monitor          ] [es01] 重新加载词典完毕.

收集日志的作用

1、今天上午10点访问web站点排名前10的ip
2、统计今天访问前10的url
3、把今天上午10点之前访问量排名前10的ip和昨天这个时间段对比一下,有什么区别
4、发现页面的响应时间超1s,导致web服务响应过慢,找出是否爬虫ip
5、信息在5分钟内给我结果
  • 工作中哪些服务器需要收集日志
代理层:nginx
web层:nginx tomcat php java
数据库:mysql  mariadb  es mongo
系统层:message  rsyslog  secure

使用filebeat收集nginx日志

安装nginx服务

#准备epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#安装nginx
yum install nginx -y
#添加配置文件
cd /etc/nginx/conf.d/
vim www.conf
server {
    listen 80;
    server_name elk.oldboy.com; 
    location / {
        root   /code/www;
        index  index.html index.htm;
    }
}
#创建目录
mkdir /code/www -p
echo "Hello china Search Nginx Log! " > /code/www/index.html
#启动nginx服务
nginx -t
systemctl start nginx
#如果配置了域名,要记得做域名解析
​
#在浏览器中访问,可以产生一些访问日志  win10HOST解析
elk.oldboy.com

部署filebeat软件

#上传需要安装的软件包并安装
rpm -ivh filebeat-6.6.0-x86_64.rpm
#修改配置文件
vim /etc/filebeat/filebeat.yml
[root@web01-243 es-software]# egrep -v '^$|#' /etc/filebeat/filebeat.yml 
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
​
output.elasticsearch:
  hosts: ["10.0.0.240:9200"]
#启动filebeat服务
systemctl start filebeat
#在head插件界面,检查是否日志已经收集成功
  • 插件显示的信息

在kibana界面添加index-patterns

在kibana界面展示收集到的日志信息

使用filebeat收集nginx的json日志

json格式转换官网:https://www.json.cn/

#修改nginx的配置文件
vim /etc/nginx/nginx.conf
log_format json '{ "time_local": "$time_local", '
                          '"remote_addr": "$remote_addr", '
                          '"referer": "$http_referer", '
                          '"request": "$request", '
                          '"status": $status, '
                          '"bytes": $body_bytes_sent, '
                          '"agent": "$http_user_agent", '
                          '"x_forwarded": "$http_x_forwarded_for", '
                          '"up_addr": "$upstream_addr",'
                          '"up_host": "$upstream_http_host",'
                          '"upstream_time": "$upstream_response_time",'
                          '"request_time": "$request_time"'
    ' }';
​
    access_log  /var/log/nginx/access.log  json;
#检查代码是否有误
nginx -t
#重启nginx服务
systemctl restart nginx
#通过浏览器来访问nginx站点,生产日志,确保日志格式是json
#虽然nginx日志格式已经为json格式,但是filebeat无法解析json格式的日志(格式对齐)
mv /etc/filebeat/filebeat.yml /etc/filebeat/filebeat.yml.bak
cat >/etc/filebeat/filebeat.yml<<EOF
filebeat.inputs:
 - type: log
   enabled: true
   paths:
     - /var/log/nginx/access.log
   json.keys_under_root: true
   json.overwrite_keys: true
output.elasticsearch:
   hosts: ["10.0.0.240:9200"]
EOF
#重启filebeat服务
systemctl restart filebeat
ps -ef | grep filebeat
#在head插件界面,检查日志是否收集成功,是已经把日志切分开

在kibana界面添加index-patterns

1、索引名称可以自定
2、把日志可以按月来收集,如果按天收集太乱
3、如果使用自定义的模板,要加入相应的配置信息

收集nginx的两种日志

#修改filebeat的配置文件
vim filebeat.yml
filebeat.inputs:
 - type: log
   enabled: true
   paths:
     - /var/log/nginx/access.log
   json.keys_under_root: true
   json.overwrite_keys: true
 - type: log
   enabled: true
   paths:
     - /var/log/nginx/error.log
output.elasticsearch:
  hosts: ["10.0.0.240:9200"]
  indices:
  - index: "nginx-access-%{[beat.version]}-%{+yyyy.MM}"
    when.contains:
      source: "/var/log/nginx/access.log"
  - index: "nginx-error-%{[beat.version]}-%{+yyyy.MM}"
    when.contains:
      source: "/var/log/nginx/error.log"
#自定义一个模板名称
setup.template.name: "nginx"
#模板格式
setup.template.pattern: "nginx-*"
setup.template.enabled: false
#覆盖以前的模板
setup.template.overwrite: true
#重新启动服务
systemctl restart filebeat
#在head界面把之前的老索引删除
#重新再生产一些访问的日志和错误日志
#再回到head界面检查日志是否正常收集

 filebeat的nginx模块功能,收集nginx普通日志

#修改nginx日志的格式
vim /etc/nginx/nginx.conf
access_log  /var/log/nginx/access.log  main;
#检查语法
nginx -t
#启动nginx服务
systemctl start nginx
#检查日志信息

打开nginx模块

#进入相应的目录
cd /etc/filebeat/modules.d
#打开nginx模块功能
filebeat modules enble nginx
mv nginx.yml.disabled nginx.yml
#修改nginx模块
vim nginx.yml
- module: nginx
  access:
    enabled: true
    var.paths: ["/var/log/nginx/access.log"]
​
  error:
    enabled: true
    var.paths: ["/var/log/nginx/error.log"]
#修改filebeat的主配置文件
vim /etc/filebeat/filebeat.yml
output.elasticsearch:
  hosts: ["10.0.0.240:9200"]
  indices:
  - index: "nginx-error-%{[beat.version]}-%{+yyyy.MM}"
    when.contains:
       fileset.name: "error"
  - index: "nginx-access-%{[beat.version]}-%{+yyyy.MM}"
    when.contains:
       fileset.name: "access"
setup.template.name: "nginx"
setup.template.pattern: "nginx-*"
setup.template.enabled: false
setup.template.overwrite: true
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: true
  reload.period: 10s
#重启filebeat服务
systemctl restart filebeat
#发现es缺少相关的插件(如果是集群,每台服务器都要安装)
2020-03-20T12:56:11.819+0800    ERROR   pipeline/output.go:100  Failed to connect to backoff(elasticsearch(http://10.0.0.240:9200)): Connection marked as failed because the onConnect callback failed: Error loading pipeline for fileset nginx/access: This module requires the following Elasticsearch plugins: ingest-user-agent, ingest-geoip. You can install them by running the following commands on all the Elasticsearch nodes:
    sudo bin/elasticsearch-plugin install ingest-user-agent
    sudo bin/elasticsearch-plugin install ingest-geoip
#解决方法,需要在每中es服务器上面安装两个插件
cd /usr/share/elasticsearch/
./bin/elasticsearch-plugin install file:///opt/es-software/ingest-geoip-6.6.0.zip
./bin/elasticsearch-plugin install file:///opt/es-software/ingest-user-agent-6.6.0.zip
#个节点重启es服务和filebeat服务
systemctl restart elasticsearch
systemctl restart filebeat
#在head界面验证日志是否正常收集

使用filebeat收集tomcat日志

部署tomcat平台

官网文档:https://www.elastic.co/guide/en/beats/filebeat/6.6/multiline-examples.html

#上传java安装包并安装
cd /opt/es-software
rpm -ivh jdk-8u102-linux-x64.rpm
#上传tomcat安装包并解压
tar xf apache-tomcat-8.5.49.tar.gz -C /opt/
ln -s /opt/apache-tomcat-8.5.49 /opt/tomcat
#启动tomcat服务,正常情况下会监听8080端口
cd /opt/tomcat/bin/
./startup.sh
#为了更好的分析日志,需要对tomcat的日志格式进行修改(162行)
vim /opt/tomcat/conf/server.xml
pattern="{&quot;clientip&quot;:&quot;%h&quot;,&quot;ClientUser&quot;:&quot;%l&quot;,&quot;authenticated&quot;:&quot;%u&quot;,&quot;AccessTime&quot;:&quot;%t&quot;,&quot;method&quot;:&quot;%r&quot;,&quot;status&quot;:&quot;%s&quot;,&quot;SendBytes&quot;:&quot;%b&quot;,&quot;Query?string&quot;:&quot;%q&quot;,&quot;partner&quot;:&quot;%{Referer}i&quot;,&quot;AgentVersion&quot;:&quot;%{User-Agent}i&quot;}"/>
#重启tomcat服务,让修改后的配置文件生效
./shutdown.sh
./startup.sh
#在浏览器中再次访问tomcat首页,产生一些新的日志
#把新的json日志,做校验处理,是否符合json格式

修改filebeat的配置文件

#进行filebeat主配置文件所在的目录
cd /etc/filebeat/
vim filebeat.yml
[root@web01-243 logs]# cat /etc/filebeat/filebeat.yml
filebeat.inputs:
 - type: log
   enabled: true
   paths:
     - /var/log/nginx/access.log
   json.keys_under_root: true
   json.overwrite_keys: true
   tags: ["access"]
 - type: log
   enabled: true
   paths:
     - /var/log/nginx/error.log
   tags: ["error"]
 - type: log
   enabled: true
   paths:
     - /opt/tomcat/logs/localhost_access_log.2020-03-21.txt
   json.keys_under_root: true
   json.overwrite_keys: true
   tags: ["tomcat"]
​
output.elasticsearch:
  hosts: ["10.0.0.240:9200"]
  indices:
  - index: "nginx-access-%{[beat.version]}-%{+yyyy.MM}"
    when.contains:
       tags: "access"
  - index: "nginx-error-%{[beat.version]}-%{+yyyy.MM}"
    when.contains:
       tags: "error"
  - index: "tomcatl-access-%{[beat.version]}-%{+yyyy.MM}"
    when.contains:
       tags: "tomcat"
setup.template.name: "nginx"
setup.template.pattern: "nginx-*"
setup.template.enabled: false
setup.template.overwrite: true
#重启filebeat服务
systemctl restart filebeat
ps -ef | grep filebeat
#到head插件界面验证,日志是否能正常收集

在kibana界面展示tomcat日志

使用filebeat收集java日志

部署一个java环境

#使用elasticsearch这个环境,修改es的配置文件
vim /etc/elasticsearch/elasticsearch.yml
aanode.name: oldboy02
#重启es服务
systemctl restart elasticsearch
#使用命令查看elasticsearch日志信息,发现有报错的信息输出
 tail -f /var/log/ealsticsearch/elasticsearch.log

安装收集日志工具

#安装filebeat工具,修改相应的主配置文件,把默认的配置文件改一名
vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/elasticsearch/elasticsearch.log
    
​
  multiline.pattern: '^\['
  multiline.negate: true
  multiline.match: after
​
output.elasticsearch:
  hosts: ["10.0.0.240:9200"]
  - index: "es-%{[beat.version]}-%{+yyyy.MM}"
setup.template.name: "es"
setup.template.pattern: "es-*"
setup.template.enabled: false
setup.template.overwrite: true
#重启filebeat服务
systemctl restart filebeat
#head界面检查日志是否能正常收集

在kibana界面展示收集的日志信息

使用filebeat收集MySQL慢日志

部署一个MySQL环境

#安装mariadb
yum install mariadb-server -y
#启动mariadb服务
systemctl start mariadb
#确认慢日志功能是否开启
show variables like '%slow_query_log%';
--------------------+--------------------+
| Variable_name       | Value              |
+---------------------+--------------------+
| slow_query_log      | OFF                |
| slow_query_log_file | web01-243-slow.log 
#开启慢日志功能
vim /etc/my.cnf
[mysqld]
slow_query_log=ON
slow_query_log_file=/var/log/mariadb/slow.log
long_query_time=1
#重新启动mariadb服务
systemctl restart mariadb
#生成一些慢查询语句
mysql
select sleep(2) user,host from mysql.user;
#确认慢日志是否生成
cat /var/log/mariadb/slow.log

修改配置文件,启用filebeat对应的模块

#开启模块化功能(加动配置文件最下方)
vim /etc/filebeat/filebeat.yml
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: true
  reload.period: 10s
#重启filebeat服务
systemctl restart filebeat
#打开mysql模块(也可以通过修改模块的名称来开启)
filebeat modules list
filebeat modules enable mysql
#修改mysql模块配置
vim /etc/filebeat/modules.d/mysql.yml
​
- module: mysql
  error:
    enabled: true
    var.paths: ["/var/log/mariadb/mariadb.log"]
​
  slowlog:
    enabled: true
    var.paths: ["/var/log/mariadb/slow.log"]
#修改filebeat的主配置文件
vim /etc/filebeat/filebeat.yml
output.elasticsearch:
  hosts: ["10.0.0.240:9200"]
  indices:
  - index: "mysql-error-%{[beat.version]}-%{+yyyy.MM}"
    when.contains:
       source: "/var/log/mariadb/mariadb.log"
  - index: "mysql-slow-%{[beat.version]}-%{+yyyy.MM}"
    when.contains:
       source: "/var/log/mariadb/slow.log"
setup.template.name: "mysql"
setup.template.pattern: "mysql-*"
setup.template.enabled: false
setup.template.overwrite: true
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: true
  reload.period: 10s
#重启filebeat服务
systemctl restart filebeat
#为了测试需要,别外生成一些慢日志和错误
#在head界面检查日志是否收集成功

kibana界面添加index-patterns

kibana界面展示收集到的日志信息

  • 错误日志信息

  •  慢日志信息

使用redis做缓存收集日志

部署redis环境

  • 架构图

  •  环境准备
主机名 IP地址 节点 服务
es01 10.0.0.240 es-cluster、es01 redis、logstash、es、nginx、kibana
es02 10.0.0.241 es02 es
es03 10.0.0.242 es03 es

官方编译下载地址https://redis.io/download

#配置epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#安装redis
yum install redis -y
#修改redis配置文件
vim /etc/redis.conf
bind 10.0.0.240
#启动redis服务
systemctl start redis

修改filebeat的配置文件

#把nginx的日志格式改为json
#修改filebeat的主配置文件
vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
  json.keys_under_root: true
  json.overwrite_keys: true
  tags: ["access"]
​
- type: log
  enabled: true
  paths:
    - /var/log/nginx/error.log
  tags: ["error"]
​
output.redis:
  hosts: ["10.0.0.240"]
  keys:
    - key: "nginx_access"
      when.contains:
        tags: "access"
    - key: "nginx_error"
      when.contains:
        tags: "error"
​
setup.template.name: "nginx"
setup.template.pattern: "nginx_*"
setup.template.enabled: false
setup.template.overwrite: true
#重启filebeat服务
systemctl restart filebeat

检查redis能否收集日志

#连接redis
redis-cli -h 10.0.0.240
#使用命令检查
info
db0:keys=1,expires=0,avg_ttl=0  -- >
​
[root@es01 conf.d]# redis-cli -h 10.0.0.240
10.0.0.240:6379> keys *
1) "nginx_error"
2) "nginx_access"
10.0.0.240:6379> LLEN nginx_error
(integer) 11
10.0.0.240:6379> LLEN nginx_access
(integer) 44

安装logstash工具

#进入目录
cd /opt/es-software
#上传logstash安装包,并安装
rpm -ivh logstash-6.6.0.rpm
#添加一个配置文件
cd /etc/logstash/conf.d
vim nginx_log.conf
input {
  redis {
    host => "10.0.0.240"
    port => "6379"
    db => "0"
    key => "nginx_access"
    data_type => "list"
  }
  redis {
    host => "10.0.0.240"
    port => "6379"
    db => "0"
    key => "nginx_error"
    data_type => "list"
  }
}
​
filter {
  mutate {
    convert => ["upstream_time", "float"]
    convert => ["request_time", "float"]
  }
}
​
output {
   stdout {}
   if "access" in [tags] {
      elasticsearch {
        hosts => "http://10.0.0.240:9200"
        manage_template => false
        index => "nginx_access-%{+yyyy.MM}"
      }
    }
    if "error" in [tags] {
      elasticsearch {
        hosts => "http://10.0.0.240:9200"
        manage_template => false
        index => "nginx_error-%{+yyyy.MM}"
      }
    }
}
#可以放到前台测试logstash能否正常取日志(如果正常,前台会打印日志信息)
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/nginx_log.conf
#在head界面验证

  •  在kibana界面添加index-patterms

使用Kafka做缓存收集日志

  • 结构图:

  •  原理图:

  • kafka是分布式发布-订阅消息系统
  • zookeeper:存储了一些关于 consumerbroker 的信息
  • producer 直接连接 Broker
  • zookeeper:保存了topic相关配置,例如topic列表,每个topic的 partition数量、副本的位置,这些分区信息及与Broker的对应关系所有, topic的访问控制信息也是由zookeeper维护的,记录消息分区与consumer之间的关系
  • broker:多个broker,其中一个会被选举为控制器。从多个broker中选出控制器,这个工作就是zookeeper负责的控制器负责管理整个集群所有分区和副本的控制,例如某个分区的leader故障了,控制器会选择新的leader
  • Producer:直接连接Broker
  • partition:一个topic可以分为多个partion,每个partion是一个有序的队列。
  • Broker:缓存代理,kafka集群中的一台或多台服务器统称broker,存储topic
  • topic:kafka处理资源的消息源(feeds of messages)的不同分类

配置hosts

注:每台主机内存建议大于3G,否则java后台进行启动失败

  • 三台主机都要配置
10.0.0.240 es01
10.0.0.241 es02
10.0.0.242 es03

安装配置zookeeper

注:三台都要配置

#把需要的软件包上传
cd /opt/es_software
#解压软件并做软件连接
tar zxf zookeeper-3.4.11.tar.gz -C /opt/
ln -s /opt/zookeeper-3.4.11/ /opt/zookeeper
#创建一个数据目录
mkdir -p /data/zookeeper
#把zoo_sample.cfg复制一个zoo.cfg文件
cp /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg
#修改zoo.cfg配置文件
vim /opt/zookeeper/conf/zoo.cfg
# 服务器之间或客户端与服务器之间维持心跳的时间间隔
# tickTime以毫秒为单位
tickTime=2000
# 集群中的follower服务器(F)与leader服务器(L)之间的初始连接心跳数
initLimit=10
# 集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数
syncLimit=5
dataDir=/data/zookeeper
# 客户端连接端口
clientPort=2181
# 三个接点配置,格式为: server.服务编号=服务地址、LF通信端口、选举端口
server.1=10.0.0.240:2888:3888
server.2=10.0.0.241:2888:3888
server.3=10.0.0.242:2888:3888

配置主机id

注:每台主机myid都不一样(三台都要配置)

echo "1" > /data/zookeeper/myid
cat /data/zookeeper/myid

zookeeper所有节点启动

/opt/zookeeper/bin/zkServer.sh start
#状态信息
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

检查节点运行状态

/opt/zookeeper/bin/zkServer.sh status
​
#es01主机状态
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower --> 追随者
#es02主机状态
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: leader  -->领导者
#es03状态
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower --> 追随者

测试zookeeper

#在一个节点上执行,创建一个频道
/opt/zookeeper/bin/zkCli.sh -server 10.0.0.240:2181
create /test "hello"
​
#在其他节点上看能否接收到
/opt/zookeeper/bin/zkCli.sh -server 10.0.0.240:2181
get /test

安装部署Kafka

注:每个节点都配置,注意ip不同

#es01操作
#上传安装包
cd /opt/es_software/
#解压并创建软连接
tar zxf kafka_2.11-1.0.0.tgz -C /opt/
ln -s /opt/kafka_2.11-1.0.0/ /opt/kafka
#创建一个日志目录
mkdir /opt/kafka/logs
#修改配置文件
vim /opt/kafka/config/server.properties
# broker的id,值为整数,且必须唯一,在一个集群中不能重复
broker.id=1
listeners=PLAINTEXT://10.0.0.240:9092
# 处理网络请求的线程数量,默认为3个
num.network.threads=3
# 执行磁盘IO操作的线程数量,默认为8个
num.io.threads=8
# socket服务发送数据的缓冲区大小,默认100KB
socket.send.buffer.bytes=102400
# socket服务接受数据的缓冲区大小,默认100KB
socket.receive.buffer.bytes=102400
# socket服务所能接受的一个请求的最大大小,默认为100M
socket.request.max.bytes=104857600
# kafka存储消息数据的目录
log.dirs=/opt/kafka/logs
# 每个topic默认的partition数量
num.partitions=1
# 在启动时恢复数据和关闭时刷新数据时每个数据目录的线程数量
num.recovery.threads.per.data.dir=1
#topic的offset的备份份数。建议设置更高的数字保证更高的可用性
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
#每个日志文件删除之前保存的时间
log.retention.hours=24
#这个属性就是每个文件的最大尺寸;当尺寸达到这个数值时,就会创建新文件
log.segment.bytes=1073741824
#检查日志分段文件的间隔时间,以确定是否文件属性是否到达删除要求。
log.retention.check.interval.ms=300000
# Zookeeper连接信息,如果是zookeeper集群,则以逗号隔开
zookeeper.connect=10.0.0.240:2181,10.0.0.241:2181,10.0.0.242:2181
# 连接zookeeper的超时时间,6s
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0

前台测试能否正常启动

/opt/kafka/bin/kafka-server-start.sh  /opt/kafka/config/server.properties

测试创建topic

注:zookeeper保存信息为:topic创建的副本是3个,分区是3个,topic主体叫做Kafkatest

/opt/kafka/bin/kafka-topics.sh --create  --zookeeper 10.0.0.241:2181,10.0.0.242:2181,10.0.0.240:2181 --partitions 3 --replication-factor 3 --topic kafkatest
#创建信息
Created topic "kafkatest".

测试获取toppid

/opt/kafka/bin/kafka-topics.sh --describe --zookeeper 10.0.0.241:2181,10.0.0.242:2181,10.0.0.240:2181 --topic kafkatest
#测试信息
Topic:kafkatest PartitionCount:3    ReplicationFactor:3 Configs:
    Topic: kafkatest    Partition: 0    Leader: 3   Replicas: 3,2,1 Isr: 3,2,1
    Topic: kafkatest    Partition: 1    Leader: 1   Replicas: 1,3,2 Isr: 1,3,2
    Topic: kafkatest    Partition: 2    Leader: 2   Replicas: 2,1,3 Isr: 2,1,3

 测试删除topic

/opt/kafka/bin/kafka-topics.sh --delete --zookeeper 10.0.0.241:2181,10.0.0.242:2181,10.0.0.240:2181 --topic kafkatest
#测试信息
Topic kafkatest is marked for deletion.
Note: This will have no impact if delete.topic.enable is not set to true.

Kafka测试命令发送信息

#创建命令
/opt/kafka/bin/kafka-topics.sh --create --zookeeper 10.0.0.241:2181,10.0.0.242:2181,10.0.0.240:2181 --partitions 3 --replication-factor 3 --topic  messagetest
#测试发送消息
/opt/kafka/bin/kafka-console-producer.sh --broker-list  10.0.0.241:9092,10.0.0.242:9092,10.0.0.240:9092 --topic  messagetest
#其他节点测试接收
/opt/kafka/bin/kafka-console-consumer.sh --zookeeper 10.0.0.241:2181,10.0.0.242:2181,10.0.0.240:2181 --topic messagetest --from-beginning
#测试获取所有的频道
/opt/kafka/bin/kafka-topics.sh  --list --zookeeper 10.0.0.241:2181,10.0.0.242:2181,10.0.0.240:2181 

测试成功放入后台

/opt/kafka/bin/kafka-server-start.sh  -daemon /opt/kafka/config/server.properties

修改filebeat配置文件

vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
  json.keys_under_root: true
  json.overwrite_keys: true
  tags: ["access"]
​
- type: log
  enabled: true
  paths:
    - /var/log/nginx/error.log
  tags: ["error"]
​
output.kafka:
  hosts: ["10.0.0.240:9092", "10.0.0.241:9092", "10.0.0.242:9092"]
  topic: 'filebeat'
​
setup.template.name: "nginx"
setup.template.pattern: "nginx_*"
setup.template.enabled: false
setup.template.overwrite: true
#重启filebeat服务
systemctl restart filebeat

修改logstash配置文件

vim /etc/logstash/conf.d/kafka.conf
input {
  kafka{
    bootstrap_servers=>"10.0.0.240:9092"
    topics=>["filebeat"]
    group_id=>"logstash"
    codec => "json"
  }
}
​
filter {
  mutate {
    convert => ["upstream_time", "float"]
    convert => ["request_time", "float"]
  }
}
​
output {
   stdout {}
   if "access" in [tags] {
      elasticsearch {
        hosts => "http://10.0.0.240:9200"
        manage_template => false
        index => "nginx_access-%{+yyyy.MM}"
      }
    }
    if "error" in [tags] {
      elasticsearch {
        hosts => "http://10.0.0.240:9200"
        manage_template => false
        index => "nginx_error-%{+yyyy.MM}"
      }
    }
}
#重新启动logstash服务
systemctl restart logstash
netstat  -lntup | grep 9092   --> 出现会慢一些
#查看logstash的日志信息
tail -f /var/log/logstash/logstash-plain.log

报错处理:

  • free -h查看内存大小
  • 查看logstash日志信息
  • Kafka配置文件内容是否正确

在head界面查看效果

访问一些错误和正确日志

 

在kibana界面添加index-patterns

在网盘包里面有一个access.tar.gz我们可以将日志放入nginx的日志里面,查看效果

cat access.log  >> /var/log/nginx/access.log
  • 正确日志信息

  •  错误日志

创建图形

 

posted @ 2020-03-22 18:27  kerwin-  阅读(1054)  评论(0编辑  收藏  举报