创新路
我们一直在努力

【学习】ELK的安装与使用

ELK

一、json 语法规则

    – 数据在名称/值对中

    – 数据由逗号分隔

    – 大括号保存对象

    – 中括号保存数组

    json 数据的书写格式是:名称/值对。

        – 名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值,例如:    "凶猛的动物" : "老虎"


    cat  >f1 <<EOF    注:<<是读到EOF终止,把内容写入f1  >:导入  >>:追加

    stdin 0 标准输入()

    stdin 1 标准输出()

    stdin 2 标准错误()

注:数字代表文件描述符,每打开一个文件就会赋予一个文件描述符,我们不能直接对文件进行操作,只能通过文件描述符这个接口进行操作,对文件描述符操作,就是对文件的操作    //ulimit -n 可查看打开文件数量限制(也就是一共有多少个文件描述符)exec 可以修改文件描述符,例如 exec 1>ff //ff文件修改成标准输出,所输入的所有命令的执行结果都会标准输出到ff的文件里面

 

ELK简介

    1.ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写

        – Elasticsearch:负责日志检索和储存

        – Logstash:负责日志的收集和分析、处理

        – Kibana:负责日志的可视化

        – 这三款软件都是开源软件,通常是配合使用,而且又先后归于 Elastic.co 公司名下,故被简称为 ELK

 

    2.ElasticSearch 是一个基于Lucene(apache项目组的开放源代码的全文检索引擎工具包) 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful API web 接口,(就是一个nosql数据库,JAVA开发的)分布式实时文件存储

 相关概念:

    – Node: 装有一个 ES 服务器的节点。

    – Cluster: 有多个Node组成的集群

– Document: 一个可被搜素的基础信息单元(文档)

– Index: 拥有相似特征的文档的集合

– Type: 一个索引中可以定义一种或多种类型

– Filed: ES 的最小单位,相当于数据的某一列

– Shards: 索引的分片,每一个分片就是一个 Shard

– Replicas: 索引的拷贝


ES 与关系型数据库的对比

ES ,文档归属于一种 类型 (type) ,而这些类型存在于索引 (index) ,类比传统关系型数据库

– DB -> Databases -> Tables -> Rows -> Columns

关系型 数据库         表        行        列

– ES -> Indices -> Types -> Documents -> Fields

– ES     索引      类型        文档       域(字段)

 

一、ES集群的安装

    1.准备12G内存的虚拟机

    2.修改为静态IP192.168.1.11,hostname设置为es1

        修改hosts文件,包括本机再内

    3.安装JDK,至少要求是JAVA7,强烈推荐OpenJDK 1.8

        yum install -y java-1.8.0-openjdk

    4.直接安装elasticsearch的包

  yum -y install elasticsearch-2.3.4-1.noarch

    5. 修改配置文件/etc/elasticsearch/elasticsearch.yml

       network.host: 0.0.0.0

    6.启动服务,设置开机自启

       systemctl enable elasticsearch

       systemctl start elasticsearch

    7.ss 92009300端口是否启动,注意JAVA的启动有点慢,30s后还未启动前面估计有错误

    8.curl http://192.168.4.11:9200/ 访问显示nameversion等就ok

 

    1.在准备n台虚拟机,配置静态IP,设置hostname

    2.在每台主机上配置hosts文件,其余的主机包括自己的主机

    3.安装JDK1.8

    4.安装elasticsearch

    5.修改配置文件/etc/elasticsearch/elasticsearch.yml

      cluster.name: nsd1803       //设置集群的名字

      node.name: 本机主机名称     //设置本机主机的名称

      network.host: 0.0.0.0   //设置网络,可以设置成本机的IP,也可写0.0.0.0最好

      discovery.zen.ping.unicast.hosts: ["es1", "es2", "es3"]

      注意:发现主机的这一条可以不需要把所与的节点写完,可以只写几个,但是启动服务的时候必须先启动写在上面的节点,本机才能寻找到其他的节点,不然后会独立生成一个集群,节点少的话建议能写完就写完,避免出错

    6.依次启动服务,查看92009300的端口

    7.验证:curl http://任意一台节点IP:9200/_cluster/health?pretty,可以查看到集群有几台主机

ES插件的使用

    head 插件:

        – 它展现ES集群的拓扑结构,并且可以通过它来进行索引(Index)和节点(Node)级别的操作

        – 它提供一组针对集群的查询API,并将结果以json和表格形式返回

        – 它提供一些快捷菜单,用以展现集群的各种状态

    kopf 插件

        – 是一个ElasticSearch的管理工具

        – 它提供了对ES集群操作的API

    bigdesk 插件

        – elasticsearch的一个集群监控工具

        – 可以通过它来查看es集群的各种状态,:cpu、内存使用情况,索引数据、搜索情况,http连接数


ES 插件安装、查看

         – 查看安装的插件

  /usr/share/elasticsearch/bin/plugin list

安装插件

  /usr/share/elasticsearch/bin/plugin install ftp://192.168.4.254/head.zip

  /usr/share/elasticsearch/bin/plugin install file:///tmp/kopf.zip

         这里必须使用 url 的方式进行安装,如果文件在本地,我们也需要使用 file:// 的方式指定路径,例如文件在/tmp/xxx 下面,我们要写成 file:///tmp/xxx

删除使用 remove 指令


访问插件 head

  http://装插件的节点IP:9200/_plugin/head

    注意:这个插件里面索引,新建索引的副本最好写两个,一台100G储存,5台就只能存500*三分之一的数据,两个副本最合适

访问插件 kopf

  http://192.168.1.11:9200/_plugin/kopf

访问插件 bigdesk

  http://192.168.1.11:9200/_plugin/bigdesk


RESTful API 调用

      – JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。

      – json 传输的就是一个字符串

      – python 中对应的 字符串,列表,字典都可以转换成对应的 json 格式

Rest API 的简单使用

      – _cat API 查询集群状态,节点信息

      – v 参数显示详细信息  //v可以显示每个参数(字段)的意思

         http://192.168.4.15:9200/_cat/health?v 

      – help 显示帮助信息

http://192.168.4.15:9200/_cat/health?help

RESTful API 增加索引 『PUT

  – 创建一个索引,并设置分片数量与副本数量(在地址栏里面PUT上传数据)

     curl -XPUT 'http://192.168.1.11:9200/te/' -d '{

       "settings":{

         "index":{

           "number_of_shards": 5,

           "number_of_replicas": 1

         }

       }

     }'

注:

     -d:是向服务器发送一段数据

     te:是索引的名字

     Shards是分片数量

     Replicas是副本数量

RESTful API 插入数据 『PUT

   curl -XPUT 'http://192.168.1.11:9200/te/teach/1' -d '{

      "title": "阶段1",

      "name": {"first": "逗比1", "last": "张三"},

      "age":25

      }'

  curl -XPUT 'http://192.168.1.11:9200/te/teach/2' -d '{

      "title": "阶段2",

      "name": {"first": "逗比2", "last": "李四"},

      "age":25

      }'

RESTful API 更改数据『POST

  curl -XPOST 'http://192.168.1.11:9200/te/teach/2/_update' -d'{

    "doc":{

    "age":18

    }

  }'

RESTful API 查询数据『GET

  curl -XGET 'http://192.168.1.11:9200/te/teach/1'

  curl -XGET 'http://192.168.1.11:9200/te/teach/1?pretty'

RESTful API 删除数据『DELETE

  curl -XDELETE 'http://192.168.1.11:9200/te/teach/1‘

  curl -XDELETE 'http://192.168.1.11:9200/te'

  注意:支持删根,所以只能在内网使用!

 

二、Kibana 安装(注意这个软件不能用80端口)

• kibana是什么

  – 数据可视化平台工具

特点:

  – 灵活的分析和可视化平台

  – 实时总结和流数据的图表

  – 为不同的用户显示直观的界面

  – 即时分享和嵌入的仪表板

安装:1.创建一台虚拟机1G内存就行kibana IP192.168.1.100 hostname kinbana

      2.yumkibana

      3.修改kibana的默认配置文件

           默认安装在/opt/kibana下面

           配置文件在/opt/kibana/config/kibana.yml

      4.kibana.yml 的配置

– server.port: 5601

– server.host: "0.0.0.0"

– elasticsearch.url: "http://192.168.1.11:9200"

– kibana.index: ".kibana"

– kibana.defaultAppId: "discover"

– elasticsearch.pingTimeout: 1500

– elasticsearch.requestTimeout: 30000

– elasticsearch.startupTimeout: 5000

      5.– elasticsearch.url 需要配置为我们 ES 集群的地址之外,其他保持默认值就可以了

设置开机启动

systemctl enable kibana

启动服务

systemctl start kibana

– web 访问 kibana

http://192.168.1.100:5601/

数据的批量导入有索引类型的数据

  使用 _bulk关键字批量导入数据(如果需要副本几个,那么就先创建索引,然后再导入)

    – 批量导入数据使用 POST 方式,数据格式为 json,url编码使用 data-binary

    – 导入含有 index 配置的 json 文件

      gzip –d logs.jsonl.gz

      curl -XPOST 'http://192.168.4.14:9200/_bulk' –data-binary @logs.jsonl

      

  gzip –d shakespeare.json.gz

  curl -XPOST 'http://192.168.4.14:9200/_bulk' –data-binary @shakespeare.json

 

使用 _bulk 批量导入没有索引类型的数据

  – 我们需要在 url 里面制定 index type

    gzip –d accounts.json.gz

curl -XPOST 'http://192.168.4.14:9200/accounts/act/_bulk?pretty' –data-binary  @accounts.json

 

数据批量查询

curl -XGET http://192.168.1.11:9200/_mget?pretty -d '

{

  docs:[

    {"_index": "oo",

     "_type": "xx",

     "_id": 99

    },

    {"_index": "shakespeare",

     "_type": "act",

     "_id": 80730

    },

    {"_index": "logstash-2015.05.20",

     "_type": "log",

     "_id": "AWTo2xXm16RGslV6jxJR"

    }

  ]

}'

http://192.168.1.100:5601/上(kibana的网页)可以做很多操作,先连接库(先连接索引),后可以创建图表等等

 

三、Logstash部分  

  帮助文档地址https://www.elastic.co/guide/en/logstash/current/index.html

  主要要做数据的集中处理

  1.先准备一台至少2G内存的虚拟机,配yum

  2.安装logstash前需要JDK的依赖包,推荐使用1.8.0的,不要太低的版本

  3.yumlogstash

 

logstash 特点:

    – 所有类型的数据集中处理

    – 不同模式和格式数据的正常化

    – 自定义日志格式的迅速扩展

    – 为自定义数据源轻松添加插件

 

logstash 工作结构

– { 数据源 } ==>

       input { } ==>

            filter { } ==>

                 output { } ==>

                     { ES }

 

logstash 里面的类型

  – 布尔值类型: ssl_enable => true

  – 字节类型:bytes => "1MiB"

  – 字符串类型: name => "xkops"

  – 数值类型: port => 22

  – 数组: match => ["datetime","UNIX"]

  – 哈希: options => {k => "v",k2 => "v2"}

  – 编码解码: codec => "json"

  – 路径: file_path => "/tmp/filename"

  – 注释: #logstash 部分

 

logstash 条件判断

  – 等于: ==

  – 不等于: !=

  – 小于: <

  – 大于: >

  – 小于等于: <=

  – 大于等于: >=

  – 匹配正则: =~

  – 不匹配正则: !~logstash 部分

logstash 条件判断

  – 包含: in

  – 不包含: not in

  – : and

  – : or

  – 非与: nand

  – 非或: xor

  – 复合表达式: ()

  – 取反符合:!()

 注意:/etc/logstash/logstash.conf有三个部分,分别是input{} filter{} output{},插件在/opt/logstash/bin/logstash-plugin list 可以查看列表,名字写的哪儿就只能在哪儿用Codec表示编码,可以用在所有的区域段

 

logstash 配置文件 logstash.conf

input{

  stdin{}

}

 

filter{

 

}

 

output{

  stdout{}

}

可以测试我们所写的标准输入输出(输入什么就输出什么):/opt/logstash/bin/logstash -f /etc/logstash/logstash.conf

 

Input模块

例:本地文件插件file

input{

  stdin{ codec => "json"}  //标准输入,从屏幕上输入json格式

  file {

     path => [ "/tmp/a.log", "/tmp/b.log" ]       //从文件里面读取,读日志

     sincedb_path => "/etc/logstash/sincedb.log"    //读文件读到哪儿的记录文件

     start_position => "beginning"   //从哪儿开始读,beginning是从文件的头开始读,但是必须先删除记录位置的文件

     type => "filelog"  //凡是从文件里面读的,给个filelog标记

  }

}

filter{}

output{

  stdout{ codec => "rubydebug" }   //标准输出,转换成rubydebug易读的格式

}

 

例: tcp/udp插件

input{

  stdin{ codec => "json"}

  file {

     path => [ "/tmp/a.log", "/tmp/b.log" ]

     sincedb_path => "/etc/logstash/sincedb.log"

     start_position => "beginning"

     type => "filelog"

  }

  tcp {             //tcp的插件

    port => 8888     //监听端口

    mode => "server"    //模式为服务器,如果是客户端填client

    host => "0.0.0.0"    //监听任何IP地址   如果是客户端填写服务器的IP

    type => "tcplog"    //配置一个类型

  }

  udp {            //udp插件

    port => 9999          //监听本机9999端口,udp只有server服务器,没有客户端,因为传输数据都是客户端直接把包扔给某IP某端口,不需要建立连接

    type => "udplog"    

  }

 

}

filter{}

output{

  stdout{ codec => "rubydebug" }

测试:echo "test udp" > /dev/udp/logstash服务器IP地址/9999

    echo "test tcp" > /dev/tdp/logstash服务武器IP地址/8888

      注意:tcp连接,客户端会产生一个随机端口号连接服务器,用于服务器把包传回

    每次都会有变化,无影响

 

例:系统日志插件

input{

  stdin{ codec => "json"}

  syslog {                         //启用系统日志插件

    host => "0.0.0.0"           //监听任何IP,不写这一项也是默认的!

    port => 514                    //监听514端口,不写默认监听514

    type => "syslog"               //给个类型名字

  }

filter{}

output{

  stdout{ codec => "rubydebug" }

}

客户机配置:

  1.在系统配置日志文件的配置文件中(/etc/rsyslog.conf文件)添加

local0.info                     @@logstashIP地址:514  

注:这个意思为创建一个local0的日志文件,日志等级为info,并且远程存放在logstash服务器上的514端口进入,@@两个为使用tcp传输协议,一个@为使用udp文件传输协议

  2.重启系统的日志系统:systemctl restart rsyslog

  3.测试,在客户机上添加测试日志记录

    logger -p local0.info -t "testlog" "hello world"

  4.服务器启动logstarsh时添加日志记录会动态显示在屏幕上

 

Filter模块

filter grok插件

  – 解析各种非结构化的日志数据插件

  – grok 使用正则表达式把飞结构化的数据结构化

  – 在分组匹配,正则表达式需要根据具体数据结构编写

  – 虽然编写困难,但适用性极广

  – 几乎可以应用于各类数据

Grok模块(匹配日志里面的各种参数信息)

格式:

filter{

  grok{

    match => ["message", "(?<name>reg)"]  //匹配正则的格式

  }

}

 

例:

input{  

  stdin{ codec => "json"}

  file {

     path => [ "/tmp/a.log" ]

     sincedb_path => "/dev/null"

     start_position => "beginning"

     type => "filelog"

}

filter{

  grok {

    match => [ "message", "%{COMBINEDAPACHELOG}" ]   //用正则匹配日志中的各项参数

  }

}

output{

  stdout{ codec => "rubydebug" }

}

//%{COMBINEDAPACHELOG} 这个是匹配事先做好的正则,不用这个就要手动写正则,事先做好的正则在/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns/路径下,打开文件后,用%{名称}调用

 

 

实验:把192.168.1.100apache日志录入elasticsearch库中

Logstash的配置文件:

input{

  beats{          //使用beat插件监听5044端口,apache日志传输过来

    port => 5044

  }

}

filter{

  if [type] == "apachelog"{   //判断为apachelog的日志,则匹配下面正则分析

    grok {

      match => [ "message", "%{COMBINEDAPACHELOG}" ]

    }

  }

}

output{

  if [type] == "apachelog"{   //判断为apachelog的日志,才output输出

      stdout{ codec => "rubydebug"}

      elasticsearch {       //elasticsearch模块是输出到elasticsearch库里面保存处理过的日志

      hosts => ["192.168.1.11:9200", "192.168.1.12:9200"]   //传给哪个主机,最好写多台,以免机器损坏

      index => "apachelog"      //保存到elasticsearch服务器中的哪个索引下,不用新建

      flush_size => 2000       //设置超过2000字节写入一次,避免负载过大

      idle_flush_time => 10    //设置10秒写入一次,避免负载过大

    }

  }

}

配置完成后启动  /opt/logstash/bin/logstash -f /etc/logstash/logstash.conf

Ss查看是否5044端口启动了

 

客户端(apache的机器)安转filebeat软件传输日志文件

  1. Yum -y install filebeat

  2.修改配置文件 /etc/filebeat/filebeat.yml

     paths:

      – /var/log/httpd/access_log   //配置apache日志文件的路径,如需要多个日志则以同样的格式写在后面 如:– /xxx/ooo/aaa

      document_type: apachelog    //设置类型为apachelog,这个名字和logstash中的判断类型必须一样!

     output:

       logstash:

         hosts: ["192.168.1.20:5044"]   //输出到哪个主机的5044端口,默认会输出到本地的elaticsearch,注释掉,解开logstash的注释

  3.启动 systemctl start filebeat

未经允许不得转载:天府数据港官方信息博客 » 【学习】ELK的安装与使用

客官点个赞呗! (0)
分享到:

评论 抢沙发

评论前必须登录!

天府云博 - 做有态度的开发&运维&设计学习分享平台!

联系我们百度云主机