暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

运维神器 -- ELK

devops运维先行者 2019-11-21
451

1、简介

ELK 已经成为目前最流行的集中式日志解决方案,它主要是由Beats、Logstash、Elasticsearch、Kibana等组件组成,来共同完成实时日志的收集,存储,展示等一站式的解决方案,可谓是运维人员人手必备的神器。

2、组件

ELK 是旧时的一个称呼,是由基础架构Elasticsearch、Logstash、Kibana组成,发展到现在,其实ELK已经不单单只有这三个组件,越来越多的组件加入这个大家庭,为了方便大家还是延续以前的习惯,继续称呼这套系统为ELK

主要组件:

  • BEATS:Beats 平台集合了多种单一用途数据采集器。它们从成百上千或成千上万台机器和系统向 Logstash 或 Elasticsearch 发送数据。其中包括Filebeat、Metricbeat、Packetbeat、Winlogbeat、Auditbeat、Heartbeat、Functionbeat,重点了解FilebeatFilebeat是一款轻量级,占用服务资源非常少的数据收集引擎,它是ELK家族的新成员,可以代替Logstash作为在应用服务器端的日志收集引擎,支持将收集到的数据输出到Kafka,Redis等队列。
  • Logstash:Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。数据收集引擎,相较于Filebeat比较重量级,但它集成了大量的插件,支持丰富的数据源收集,对收集的数据可以过滤,分析,格式化日志格式。
  • Elasticsearch:Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。分布式数据搜索引擎,基于Apache Lucene实现,可集群,提供数据的集中式存储,分析,以及强大的数据搜索聚合功能
  • Kibana:通过 Kibana,您可以对自己的 Elasticsearch 进行可视化,还可以在 Elastic Stack 中进行导航,这样您便可以进行各种操作了,从跟踪查询负载,到理解请求如何流经您的整个应用,都能轻松完成。数据的可视化平台,通过该web平台可以实时的查看 Elasticsearch 中的相关数据,并提供了丰富的图表统计功能

3、架构

三种常见的架构

架构一

采用最基础的架构:Elasticsearch + Logstash + Kibana,在各应用服务器端分别部署一个Logstash组件,作为日志收集器,然后将Logstash收集到的数据过滤、分析、格式化处理后发送至Elasticsearch存储,最后使用Kibana进行可视化展示,这种架构不足的是:Logstash比较耗服务器资源,所以会增加应用服务器端的负载压力。

架构二

采用Filebeat作为日志收集器的架构:Elasticsearch + Logstash + Kibana + Filebeat,该架构与第一种架构唯一不同的是:应用端日志收集器换成了Filebeat,Filebeat轻量,占用服务器资源少,所以使用Filebeat作为应用服务器端的日志收集器,一般Filebeat会配合Logstash一起使用,一般小公司都会采用这套架构。

架构三

引入缓存队列的部署架构:该架构在第二种架构的基础上引入了Kafka消息队列(还可以是其他消息队列),将Filebeat收集到的数据发送至Kafka,然后在通过Logstasth读取Kafka中的数据,这种架构主要是解决大数据量下的日志收集方案,使用缓存队列主要是解决数据安全与均衡Logstash与Elasticsearch负载压力,一般有点数据量的都会选这种架构。

选型

第一种架构在目前来看已经不适用了,完全可以采用架构二来替代第一种架构,对于第三种架构,数据量比较大可以采用,可以缓解Logstasth的压力,减少数据丢失的可能。

三、部署Elasticsearch

下载es

    #版本elasticsearch-6.5.4
    $wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.4.tar.gz
    $tar zxvf elasticsearch-6.5.4.tar.gz
    $useradd es
    $mv elasticsearch-6.5.4 home/es/
    $chown -R es.es home/es/
    $chown -R es.es data/es/

    系统环境调优

    $vi etc/security/limits.conf

      #增加:
      * - nofile 65536
      * - memlock unlimited
      $vi etc/sysctl.conf
      #增加:vm.max_map_count=655360
      $sysctl -p

      安装es

      #切换用户
      $su - es

      $cd elasticsearch-6.5.4/

      #修改config/elasticsearch.yml

        cluster.name: ELK
        node.name: node-1 #每个节点都需要修改
        path.data: data/es
        path.logs: home/es/logs
        bootstrap.memory_lock: true
        network.host: 172.16.10.160
        http.port: 9200
        thread_pool.bulk.queue_size: 1000
        discovery.zen.ping.unicast.hosts: ["172.16.10.160:9300", "172.16.10.161:9300", "172.16.10.162:9300"]
        discovery.zen.minimum_master_nodes: 2


        http.cors.enabled: true
        http.cors.allow-origin: "*"
        http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
        xpack.security.enabled: true
        xpack.security.transport.ssl.enabled: true
        xpack.security.transport.ssl.verification_mode: certificate
        xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
        xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12

        $mkdir home/es/logs

        #修改config/jvm.options

          -Xms12g
          -Xmx12g

          $mkdir config/certs

          #创建ca文件
          bin/elasticsearch-certutil ca

          $ls ./certs/elastic-certificates.p12

          $./elasticsearch-6.5.4/bin/elasticsearch -d

          #激活trial基础试用版
          $curl -H "Content-Type:application/json" -XPOST http://172.16.10.160:9200/_xpack/license/start_trial?acknowledge=true

          #设置各用户密码
          $./bin/elasticsearch-setup-passwords interactive

          $cd elasticsearch-6.5.4/modules/x-pack-core/

          #从百度网盘本地传送破解jar包
          $mv x-pack-core-6.5.4.jar x-pack-core-6.5.4.jar.bak

          $mv home/es/x-pack-core-6.5.3.jar x-pack-core-6.5.4.jar

          #分别将certs的ca文件与破解jar包分发到各个es节点
          kill es重启es

          四、部署elasticsearch-head

            $curl -sL https://rpm.nodesource.com/setup_8.x | bash -
            $yum install -y nodejs
            $yum -y install git
            $git clone git://github.com/mobz/elasticsearch-head.git
            $cd elasticsearch-head
            $npm install npm@latest -g
            $npm config set registry=https://registry.npm.taobao.org
            $npm install phantomjs-prebuilt@2.1.16 --ignore-scripts
            $npm install -g grunt-cli
            $npm install grunt --save-dev
            $npm install
            $nohup npm run start &

            $vi Gruntfile.js

              #指定ip port
              port: 9800,
              hostname: '172.16.10.160',
              base: '.',
              keepalive: true

              $vi _site/app.js

                #指定uri地址
                this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://172.16.10.160:9200";

                五、部署Kafka

                  $wget http://mirror.bit.edu.cn/apache/kafka/2.1.0/kafka_2.12-2.1.0.tgz
                  $tar zxvf kafka_2.12-2.1.0.tgz
                  $mv kafka_2.12-2.1.0 usr/local/kafka
                  $cd usr/local/kafka/

                  #修改配置文件config/server.properties

                    broker.id=0   #每个节点都需要修改
                    listeners=PLAINTEXT://172.16.10.164:9092
                    num.network.threads=5
                    num.io.threads=8
                    socket.send.buffer.bytes=102400
                    socket.receive.buffer.bytes=102400
                    socket.request.max.bytes=104857600
                    log.dirs=/usr/local/kafka/logs
                    num.partitions=2
                    num.recovery.threads.per.data.dir=5
                    offsets.topic.replication.factor=2
                    transaction.state.log.replication.factor=2
                    transaction.state.log.min.isr=2
                    log.flush.interval.messages=5000
                    log.flush.interval.ms=2000
                    log.retention.hours=72
                    log.segment.bytes=1073741824
                    log.retention.check.interval.ms=300000
                    zookeeper.connect=172.16.10.160:2181,172.16.10.161:2181,172.16.10.162:2181 #zookeeper地址
                    zookeeper.connection.timeout.ms=6000
                    group.initial.rebalance.delay.ms=0

                    #启动kafka节点
                    $./bin/kafka-server-start.sh -daemon ./config/server.properties

                    六、部署Kibana

                      $wget https://artifacts.elastic.co/downloads/kibana/kibana-6.5.4-linux-x86_64.tar.gz
                      $tar zxvf kibana-6.5.4-linux-x86_64.tar.gz
                      $mv kibana-6.5.4-linux-x86_64 /usr/local/kibana
                      $cd /usr/local/kibana/config

                      #修改kibana.yml

                        server.port: 5601
                        server.host: "172.16.10.163"
                        server.name: "ELK"
                        elasticsearch.url: "http://172.16.10.161:9200"
                        elasticsearch.username: "kibana"
                        elasticsearch.password: "xxxxxxx"
                        logging.quiet: true
                        logging.timezone: Asia/Shanghai

                        #启动kibana
                        $nohup ./bin/kibana &

                        七、部署Logstash

                          $wget https://artifacts.elastic.co/downloads/logstash/logstash-6.5.4.tar.gz
                          $tar zxvf logstash-6.5.4.tar.gz
                          $mv logstash-6.5.4 /usr/local/logstash
                          $cd /usr/local/logstash/config/
                          $mkdir conf.d
                          $touch conf.d/startdt-app.conf

                          #修改startdt-app.conf配置文件

                            input {
                            kafka {
                            bootstrap_servers => ["172.16.10.164:9092,172.16.10.165:9092"]
                            client_id => "logstash-zt"
                            group_id => "logstash-zt"
                            auto_offset_reset => "latest"
                            consumer_threads => 2
                            decorate_events => false
                            topics => ["ZT"]
                            codec => json {
                            charset => "UTF-8"
                            }
                            }
                            }
                            output {
                            if [fields][service] {
                            elasticsearch {
                            hosts => ["172.16.10.160:9200","172.16.10.161:9200","172.16.10.162:9200"]
                            index => "bz-%{[fields][service]}-%{+YYYY.MM.dd}"
                            user => "elastic"
                            password => "xxxxxxxxxx"
                            }
                            }
                            }
                              $mkdir certs
                              #从es的config/certs里scp ca文件
                              $ls ./certs/elastic-certificates.p12
                                #修改jvm.options
                                #不需要超过32G,只需超过物理内存一半以上最优
                                -Xms12g
                                -Xmx12g

                                #启动
                                $nohup ./bin/logstash &

                                八、安装Filebeat

                                $curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.5.4-x86_64.rpm

                                $rpm -ivh filebeat-6.5.4-x86_64.rpm

                                #修改/etc/filebeat/filebeat.yml

                                      filebeat.inputs:
                                  - type: log
                                  enabled: true
                                  paths:
                                  - /home/admin/${servername}/logs/common.30dt.log
                                  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}' #正则表达式
                                  multiline.negate: true #默认为false,表示匹配pattern的行合并到上一行;true表示不匹配pattern的行合并到上一行
                                  multiline.match: after #after表示合并到上一行的末尾,before表示合并到上一行的行首
                                  multiline.timeout: 10s
                                  tail_files: false #表示从最新一行开始,不重复读取
                                  fields:
                                  log_topics: ZT #跟output.kafka的topic与logstash的output对应
                                  service: prod-k8s-${servername}
                                  filebeat.config.modules:
                                  path: ${path.config}/modules.d/*.yml
                                  reload.enabled: true
                                  reload.period: 3s
                                  output.kafka:
                                  hosts: ["172.16.10.164:9092", "172.16.10.165:9092"]
                                  topic: '%{[fields][log_topics]}'
                                  partition.round_robin:
                                  reachable_only: false
                                  required_acks: 1
                                  compression: gzip
                                  max_message_bytes: 1000000
                                  logging.level: warning


                                  $/etc/init.d/filebeat start

                                  九、运维命令

                                  • 1.kafka创建topic:./bin/kafka-topics.sh --create --zookeeper 172.16.10.160:2181,172.16.10.161:2181,172.16.10.162:2181 --replication-factor 1 --partitions 2 --topic ZT
                                  • 2.kafka查看topic:./bin/kafka-topics.sh --list --zookeeper 172.16.10.160:2181,172.16.10.161:2181,172.16.10.162:2181
                                  • 3.ES内置账号密码修改、自定义角色自定义账号、ldap及AD认证:东西比较多,分享一个blog【https://www.leiyawu.com/2018/05/07/es/】

                                  结语

                                  运维神器系列刚开始,首先介绍每个公司都会用到的ELK日志系统,后续会继续讲怎么用ELK,感兴趣的可以先关注,期待后续文章······

                                  历史文章

                                  Prometheus 监控架构  -- 生产级别

                                  Let's encrypt 通配域名(二级, 三级)

                                  Traefik版本升级与生产使用

                                  Traefik 2.0 Now GA! Traefik V2真正来了!



                                  文章转载自devops运维先行者,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                  评论