美文网首页
elk 5.x的部署

elk 5.x的部署

作者: marility | 来源:发表于2017-05-04 22:01 被阅读0次

    前言

    elk是由elasticsearch、logstash、kibana三者组成

    其中elasticsearch主要负责数据存储与搜索

    logstash主要负责收集日志信息以及对日志信息的切片索引等处理

    kibana则是一个web界面,负责将信息进行图形展示

    一般与上述三者使用的还有filebeat和redis

    filebeat为c编写,不象logstash那样为java编写对资源占用高,所以可以替代logstash进行日志信息的收集

    而redis作为一个缓存服务器,logstash收集分析的数据可以先在redis中暂存形成队列,同时再经由其它logastash将日志传送于elasticsearch,这也部分符合于elk的去中心化思想。

    elk 5.0发布于2016/10/26,相比于2.x,有着一些毁灭性的变更,比如在elasticsearch的data目录下,index不再以logstash中的名称设定命名,而是直接以hash值命名。
    同时也增加x-pack、beats、cloud三个插件,其中x-pack可以通过kibana对elasticsearch和kibana进行资源的监控。
    更多变更可以查看:

    elasticsearch变更

    logstash变更

    kibana变更

    本文安装环境:

    centos 7.0
    OpenJDK 1.8.0_111
    

    elasticsearch和logstash均为java编写,故对java版本有要求,最低java版本为1.8.0_73,可以通过java -version查看java版本

    同时可以使用filebeat替代logstash进行日志收集与传递,

    elasticsearch+logstash+kibana的安装

    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.1.1.rpm
    wget https://artifacts.elastic.co/downloads/logstash/logstash-5.1.1.rpm
    wget https://artifacts.elastic.co/downloads/kibana/kibana-5.1.1-x86_64.rpm
    
    yum –y localinstall elasticsearch-5.1.1.rpm logstash-5.1.1.rpm kibana-5.1.1-x86_64.rpm
    

    elasticsearch的配置设定

    [root@iZ258xanrejZ ~]# grep -v ^# /etc/elasticsearch/elasticsearch.yml
    cluster.name: elk             ##elk cluster名称
    node.name: node-1             ##多节点时nodenama不能相同
    path.data: /elk/data          ##数据目录路径
    path.logs: /elk/logs          ##日志目录路径
    bootstrap.memory_lock: true   ##内存锁设定,一定要打开
    network.host: 0.0.0.0         ##监听本机所有地址
    http.port: 9200               ##默认端口
    

    同时此配置文件为yml格式,所以设置荐均需要顶格开始,不能留有空格

    创建日志与数据路径

    mkdir -pv /elk/{data,logs}
    chown -R elasticsearch.elasticsearch /elk
    

    在5.x中加强了bootstrap_check,任何与预设不符的均无法正常启动elasticsearch,相关详细要求可以查询>>>官方说明

    其中几个重要设置为

    1. 堆大小检测
    vim /etc/elasticsearch/jvm.options
    -Xms2g
    -Xmx2g
    

    最大堆内存和最小堆内存两者值设定为一至,同时尽可能大,同时不要超过32G,最大堆内存和最小堆内存如果不一致,在启动中的时候会进行内存大小自动调整,可能会出现中断的情况,为了避免此情况的产生,所以heap_check中要求最大内存最小内存相当,本例中设置为2G

    1. 内存锁定检测
      /etc/elasticsearch/elasticsearch.yml中设定,设定bootstrap.memory_lock的值为true
    2. 文件打开数
      /etc/security/limits.conf增加elasticsearch最大文件打开数为65536
    elasticsearch soft nofile 65536
    elasticsearch hard nofile 65536
    

    除此之外还有其它几个选项需要更改,但在实际安装中,未出现需求,其它启动检测项次可以查阅上述官网说明

    在内存锁定检测,除了在要设定bootstrap.memory_lock的值为true之外,在/usr/lib/systemd/system/elasticsearch.service也需要开打LimitMEMLOCK=infinity设定,否则会出现内存未锁定的报错,在官方文档中并未找到对应说明,可能为5.1.1版本的一个bug。

    启动elasticsearch和查看elasticsearch状态

    systemctl start elasticsearch.service
    systemctl status elasticsearch.service
    

    通过web访问对应的9200端口,可以查看到对应的节点信息


    curlelastic

    命令行中查看elasticsearch cluster状态和node状态

    elk-health

    logstash的配置

    logstash中主要存在三个部分:input,filter,output

    input:从哪里取得日志,其中日志文件路径必须为绝对路径,但可以使用*匹配所有进行递归

    filter:对日志作如何过滤,比如增加字段,删减字段等

    output:将日志切片后输出到哪去

    logstash的标准输入输出检测

    /usr/share/logstash/bin/logstash -e "input {stdin{}} output{stdout{ codec=>"rubydebug"}}"

    然后输入任意值时会发现屏幕区域会输出对应相同的值,如下图,说明logstash输入输出ok

    logstash-e

    本文中举例对nginx的访问日志进行收集,可以使用grok通过正则表达式对nginx进行过滤切片,但会对性能产生一定的影响,所以将nginx的日志格式设置成json格式,可减少对资源的占用

    nginx的日志格式设定如下:

    log_format json     
            '{"@timestamp":"$time_iso8601",'
            '"host":"$server_addr",'
            '"clientip":"$remote_addr",'
            '"size":$body_bytes_sent,'
            '"responsetime":$request_time,'
            '"upstreamtime":"$upstream_response_time",'
            '"upstreamhost":"$upstream_addr",'
            '"http_host":"$host",'
            '"url":"$uri",'
            '"domain":"$host",'
            '"xff":"$http_x_forwarded_for",'
            '"referer":"$http_referer",'
            '"status":"$status"}';
    access_log  /var/log/nginx/access.log  json;
    

    对应nginx的日志内容如下:

    {"@timestamp":"2016-12-28T14:40:37+08:00","host":"123.56.189.18","clientip":"101.226.99.195","size":3700,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"123.56.189.18","url":"/index.html","domain":"123.56.189.18","xff":"-","referer":"-","status":"200"}

    该日志是否符合json格式可通过进行验证>>点我

    logstash对nginx的日志输入输出配置文件如下

    [root@iZ258xanrejZ ~]# cat /etc/logstash/conf.d/system.conf
    input {
        file {
            type => "tomcatlog"     ##type名称,可自行命令
            path => "/var/log/tomcat/localhost_access_log.*.txt" ##日志文件的绝对路径,可以使用*代表所有
        start_position => "beginning"   ##文件读取位置,beginning意思第一次读取时从最开始处读取
        }
        file {
            type => "nginxlog"
            path => "/var/log/nginx/access.log"
                    start_position => "beginning"
            codec => "json"
        }
    
    
    }
    
    filter {
            if [type] == "nginxlog" {   ##过滤类型
            geoip {
                    source => "clientip"  ##过滤内容来源
                    target => "geoip"     ##属性设定值
                    database => "/etc/logstash/GeoLite2-City.mmdb"  ##地图加载路径
                    add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]  ##字段增加纬度
                    add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}"  ]  ##字段增加经度
            }
        mutate {
          convert => [ "[geoip][coordinates]", "float"] ##将经度纬度信息转变为坐标,类型为float型
        }
     }
    }
    
    
    output {
        if [type] == "tomcatlog" {   ##type类型与input中保持一致
        elasticsearch {
                    hosts => ["localhost:9200"]  ##output的es主机
                    index => "logstash-tomcat-messages-%{+YYYY.MM.dd}"
          ##index命令,需要带上时间格式,同时要使用geoip时进行tile map制图时index命名必须以logstash-开头,否则会出现找不到geoip type的错误
                    user => marility  ##在安装x-pack后需要验证的用户密码,不安装x-pack可不用
                    password => chunlanyy
        }}
        else if [type] == "nginxlog" {   ##多个type时使用else进行匹配即可
        elasticsearch {
                    hosts => ["localhost:9200"]
                    index => "logstash-nginx-messages-%{+YYYY.MM.dd}"
                    user => marility
                    password => chunlanyy
        }}
    }
    

    logstash配置文件的检查

    /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/system.conf -t

    logstash的启动命令

    /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/system.conf

    启动后可以在elasticsearch的data目录下看到一些文件的出现,即为存储的数据

    kibana的配置设置

    [root@iZ258xanrejZ ~]# grep -v ^# /etc/kibana/kibana.yml | grep -v ^$
    server.port: 5601
    server.host: "0.0.0.0"
    elasticsearch.url: "http://localhost:9200"
    

    其中elasticsearch.url的值必须设定,为elasticsearch的主机ip

    访问kibana:

    在浏览器中输入http://kibana服务器ip:5601

    kibanaimage

    elk5.x查看index名称的方法

    由于elasticsearch5.x的index名称命名为hash命名方式,故无法在elasticsearch的data目录中查看,如下图


    elkindex

    此hash值的index无法在kibana中添加

    可使用curl http://localhost:9200/_cat/shards?pretty查看

    shards

    然后再在kibana中添加,下图中的星号可点击,即为进入kibana时显示的默认index

    index-add

    复制查看到的shards名称在如下位置添加即可

    index.add

    在index中按所需查找

    index-add

    制作统计ip访问次数的图表

    ipaccess

    可以依图中步骤进行选择,可作的图表除了直方图还有饼图等,可以依图标进行自己选择,所操作方式一致。

    同时除了ip的访问等,还可以统计其它field内容,比如http状态码

    制作ip地图分布

    此需要使用到geoip地图数据库,同时elk 5.x需要使用最新的地图数据信息,2.x中的数据库不适用于5.x

    wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz
    gunzip GeoLite2-City.mmdb.gz
    

    geoip工作原理:通过对input的type进行filter,通过地图ip数据库,进行解析,同时将其解析得到的geoip信息添加到index中,以便后续进行统计。

    解释一下在output中的index不以logstash-开头会出现在kibana中能看到geoip的相关信息,但是field显示为unknown的原因。

    因为index格式为[nginx-access-]YYYY-MM的日志文件由logstash输出到Elasticsearch;在elasticsearch 中,所有的数据都有一个类型,什么样的类型,就可以在其上做一些对应类型的特殊操作。geo信息中的location字段是经纬度,我们需要使用经纬度来定位地理位置;在 elasticsearch 中,对于经纬度来说,要想使用 elasticsearch 提供的地理位置查询相关的功能,就需要构造一个结构,并且将其类型属性设置为geo_point,此错误明显是由于我们的geo的location字段类型不是geo_point。

    我们可以查看elasticsearch中对logstash的预设模板信息

    [root@iZ258xanrejZ logstash]# curl -umarility http://localhost:9200/_template/logstash?pretty
    Enter host password for user 'marility':
    {
      "logstash" : {
        "order" : 0,
        "version" : 50001,
        "template" : "logstash-*",
        "settings" : {
          "index" : {
            "refresh_interval" : "5s"
          }
        },
        "mappings" : {
          "_default_" : {
            "dynamic_templates" : [
              {
                "message_field" : {
                  "path_match" : "message",
                  "mapping" : {
                    "norms" : false,
                    "type" : "text"
                  },
                  "match_mapping_type" : "string"
                }
              },
              {
                "string_fields" : {
                  "mapping" : {
                    "norms" : false,
                    "type" : "text",
                    "fields" : {
                      "keyword" : {
                        "type" : "keyword"
                      }
                    }
                  },
                  "match_mapping_type" : "string",
                  "match" : "*"
                }
              }
            ],
            "_all" : {
              "norms" : false,
              "enabled" : true
            },
            "properties" : {
              "@timestamp" : {
                "include_in_all" : false,
                "type" : "date"
              },
              "geoip" : {
                "dynamic" : true,
                "properties" : {
                  "ip" : {
                    "type" : "ip"
                  },
                  "latitude" : {
                    "type" : "half_float"
                  },
                  "location" : {
                    "type" : "geo_point"
                  },
                  "longitude" : {
                    "type" : "half_float"
                  }
                }
              },
              "@version" : {
                "include_in_all" : false,
                "type" : "keyword"
              }
            }
          }
        },
        "aliases" : { }
      }
    }
    

    在其中我们可以看到预设中对location的type设定为geo_point类型。

    但我们可以看到index格式为[nginx-access-]YYYY-MM时,其映射信息

    使用curl -umarility http://localhost:9200/nginx-messages-2016.12.25/_mapping?pretty来查看,(index名称因人而异)可以查到其中location的type类型实际上为double类型。而不是geoip类型,故在使用tile map的时候会出现找不到geoip字段的错误,虽然你可以在index中找到geoip等字段。

    然后有人就很奇怪,为什么elasticsearch中对logstash的模块设定location类型是geoip,之前说过的可以在对应字段进行任性的修改等,但是为什么index格式为[nginx-access-]YYYY-MM时不按模块来进行字段类型的转化呢?这是因为字段修改在es中默认设定只对logstash-开头的格式index进行修改转化。所以我们如果要使用geoip,我们必须将index格式设定为logstash-*

    geoip的地图显示

    kibana > visualize > tile map

    Geo Coordinates > Geohash >Field > geoip.location

    geoip2

    x-pack插件的安装

    x-pack的相当于是对2.x版本中使用较多的head、bigdesk、watcher、sheild等插件的一次整体封装,主要提供对elk nodes和cluster的状态监控和安全防护等。

    x-pack的安装

    elasticsearch和kibana均需要安装

    安装命令

    /usr/share/elasticsearch/bin/elasticsearch-plugin install x-pack
    /usr/share/kibana/bin/kibana-plugin install x-pack
    

    插件安装后需要对elasticsearchkibana重启。

    x-pack安装完之后,再次登陆kibana web页面或者使用curl命令查看elasticsearch信息时需要验证,其中curl 命令使用验证可以查看之前的截图

    初始账户:elastic

    初始密码:changeme

    x-pack用户验证的添加与修改

    对x-pack用户和角色操作可以通过role api或者直接在kibana的web页面进行操作

    以下为api的添加role和user


    createrole

    对应代码:

    curl -XPOST -u elastic 'localhost:9200/_xpack/security/role/chunlanyy--role' -d '{
      "indices" : [
        {
          "names" : [ "all" ],
          "privileges" : [ "all" ]
        },
        {
          "names" : [ "all" ],
          "privileges" : [ "manage", "read", "index" ]
        }
      ]
    }'
    
    createuser

    对应代码:

    curl -XPOST -u elastic 'localhost:9200/_xpack/security/user/chunlanyy-user' -d '{
      "password" : "marility",
      "full_name" : "marilty",
      "email" : "chunlanyy@gmail",
      "roles" : [ "all" ]
    }'
    

    通过web页面,可以查看到user和role的生成,


    createuser22

    修改chunlanyy-user用户的密码:

    curl -XPUT -u elastic 'localhost:9200/_xpack/security/user/chunlanyy-user/_password' -d '{
      "password" : "123456"
    }'
    

    这些均为通过api进行操作,当然也可以直接在kibana的web页面进行操作,如上截图,可在Management中进行点击添加以及修改

    加入了x-pack的验证功能时,在logstash的配置中,output中务必要添加对应的用户和密码,否则会出现无法传递日志信息给elasticsearchr的错误,相关添加方法可以翻阅之前的logstash配置

    相关文章

      网友评论

          本文标题:elk 5.x的部署

          本文链接:https://www.haomeiwen.com/subject/cigdtxtx.html