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

ELK 是旧时的一个称呼,是由基础架构Elasticsearch、Logstash、Kibana组成,发展到现在,其实ELK已经不单单只有这三个组件,越来越多的组件加入这个大家庭,为了方便大家还是延续以前的习惯,继续称呼这套系统为ELK。
主要组件:
BEATS:Beats 平台集合了多种单一用途数据采集器。它们从成百上千或成千上万台机器和系统向 Logstash 或 Elasticsearch 发送数据。其中包括Filebeat、Metricbeat、Packetbeat、Winlogbeat、Auditbeat、Heartbeat、Functionbeat,重点了解Filebeat。Filebeat是一款轻量级,占用服务资源非常少的数据收集引擎,它是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: ELKnode.name: node-1 #每个节点都需要修改path.data: data/espath.logs: home/es/logsbootstrap.memory_lock: truenetwork.host: 172.16.10.160http.port: 9200thread_pool.bulk.queue_size: 1000discovery.zen.ping.unicast.hosts: ["172.16.10.160:9300", "172.16.10.161:9300", "172.16.10.162:9300"]discovery.zen.minimum_master_nodes: 2http.cors.enabled: truehttp.cors.allow-origin: "*"http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Typexpack.security.enabled: truexpack.security.transport.ssl.enabled: truexpack.security.transport.ssl.verification_mode: certificatexpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12xpack.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 portport: 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:9092num.network.threads=5num.io.threads=8socket.send.buffer.bytes=102400socket.receive.buffer.bytes=102400socket.request.max.bytes=104857600log.dirs=/usr/local/kafka/logsnum.partitions=2num.recovery.threads.per.data.dir=5offsets.topic.replication.factor=2transaction.state.log.replication.factor=2transaction.state.log.min.isr=2log.flush.interval.messages=5000log.flush.interval.ms=2000log.retention.hours=72log.segment.bytes=1073741824log.retention.check.interval.ms=300000zookeeper.connect=172.16.10.160:2181,172.16.10.161:2181,172.16.10.162:2181 #zookeeper地址zookeeper.connection.timeout.ms=6000group.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: 5601server.host: "172.16.10.163"server.name: "ELK"elasticsearch.url: "http://172.16.10.161:9200"elasticsearch.username: "kibana"elasticsearch.password: "xxxxxxx"logging.quiet: truelogging.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 => 2decorate_events => falsetopics => ["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: logenabled: truepaths:- /home/admin/${servername}/logs/common.30dt.logmultiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}' #正则表达式multiline.negate: true #默认为false,表示匹配pattern的行合并到上一行;true表示不匹配pattern的行合并到上一行multiline.match: after #after表示合并到上一行的末尾,before表示合并到上一行的行首multiline.timeout: 10stail_files: false #表示从最新一行开始,不重复读取fields:log_topics: ZT #跟output.kafka的topic与logstash的output对应service: prod-k8s-${servername}filebeat.config.modules:path: ${path.config}/modules.d/*.ymlreload.enabled: truereload.period: 3soutput.kafka:hosts: ["172.16.10.164:9092", "172.16.10.165:9092"]topic: '%{[fields][log_topics]}'partition.round_robin:reachable_only: falserequired_acks: 1compression: gzipmax_message_bytes: 1000000logging.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,感兴趣的可以先关注,期待后续文章······
历史文章
Traefik 2.0 Now GA! Traefik V2真正来了!





