本篇主要講工做中的真實經歷,咱們怎麼打造億級日誌平臺,同時手把手教你們創建起這樣一套億級 ELK 系統。日誌平臺具體發展歷程能夠參考上篇 「從 ELK 到 EFK 演進」html
廢話很少說,老司機們座好了,咱們準備發車了~~~node
總體架構主要分爲 4 個模塊,分別提供不一樣的功能nginx
Filebeat:輕量級數據收集引擎。基於原先 Logstash-fowarder 的源碼改造出來。換句話說:Filebeat就是新版的 Logstash-fowarder,也會是 ELK Stack 在 Agent 的第一選擇。git
Kafka: 數據緩衝隊列。做爲消息隊列解耦了處理過程,同時提升了可擴展性。具備峯值處理能力,使用消息隊列可以使關鍵組件頂住突發的訪問壓力,而不會由於突發的超負荷的請求而徹底崩潰。github
Logstash :數據收集處理引擎。支持動態的從各類數據源蒐集數據,並對數據進行過濾、分析、豐富、統一格式等操做,而後存儲以供後續使用。web
Elasticsearch :分佈式搜索引擎。具備高可伸縮、高可靠、易管理等特色。能夠用於全文檢索、結構化檢索和分析,並能將這三者結合起來。Elasticsearch 基於 Lucene 開發,如今使用最廣的開源搜索引擎之一,Wikipedia 、StackOverflow、Github 等都基於它來構建本身的搜索引擎。apache
Kibana :可視化化平臺。它可以搜索、展現存儲在 Elasticsearch 中索引數據。使用它能夠很方便的用圖表、表格、地圖展現和分析數據。json
Filebeat: 6.2.4 Kafka: 2.11-1 Logstash: 6.2.4 Elasticsearch: 6.2.4 Kibana: 6.2.4 相應的版本最好下載對應的插件
咱們就以比較常見的 Nginx 日誌來舉例說明下,日誌內容是 JSON 格式bootstrap
{"@timestamp":"2017-12-27T16:38:17+08:00","host":"192.168.56.11","clientip":"192.168.56.11","size":26,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"192.168.56.11","url":"/nginxweb/index.html","domain":"192.168.56.11","xff":"-","referer":"-","status":"200"} {"@timestamp":"2017-12-27T16:38:17+08:00","host":"192.168.56.11","clientip":"192.168.56.11","size":26,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"192.168.56.11","url":"/nginxweb/index.html","domain":"192.168.56.11","xff":"-","referer":"-","status":"200"} {"@timestamp":"2017-12-27T16:38:17+08:00","host":"192.168.56.11","clientip":"192.168.56.11","size":26,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"192.168.56.11","url":"/nginxweb/index.html","domain":"192.168.56.11","xff":"-","referer":"-","status":"200"} {"@timestamp":"2017-12-27T16:38:17+08:00","host":"192.168.56.11","clientip":"192.168.56.11","size":26,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"192.168.56.11","url":"/nginxweb/index.html","domain":"192.168.56.11","xff":"-","referer":"-","status":"200"} {"@timestamp":"2017-12-27T16:38:17+08:00","host":"192.168.56.11","clientip":"192.168.56.11","size":26,"responsetime":0.000,"upstreamtime":"-","upstreamhost":"-","http_host":"192.168.56.11","url":"/nginxweb/index.html","domain":"192.168.56.11","xff":"-","referer":"-","status":"200"}
爲何用 Filebeat ,而不用原來的 Logstash 呢?vim
緣由很簡單,資源消耗比較大。
因爲 Logstash 是跑在 JVM 上面,資源消耗比較大,後來做者用 GO 寫了一個功能較少可是資源消耗也小的輕量級的 Agent 叫 Logstash-forwarder。
後來做者加入 elastic.co 公司, Logstash-forwarder 的開發工做給公司內部 GO 團隊來搞,最後命名爲 Filebeat。
Filebeat 須要部署在每臺應用服務器上,能夠經過 Salt 來推送並安裝配置。
$ wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4-darwin-x86_64.tar.gz
tar -zxvf filebeat-6.2.4-darwin-x86_64.tar.gz mv filebeat-6.2.4-darwin-x86_64 filebeat cd filebeat
修改 Filebeat 配置,支持收集本地目錄日誌,並輸出日誌到 Kafka 集羣中
$ vim fileat.yml filebeat.prospectors: - input_type: log paths: - /opt/logs/server/nginx.log json.keys_under_root: true json.add_error_key: true json.message_key: log output.kafka: hosts: ["192.168.0.1:9092,192.168.0.2:9092,192.168.0.3:9092"] topic: 'nginx'
Filebeat 6.0 以後一些配置參數變更比較大,好比 document_type 就不支持,須要用 fields 來代替等等。
$ ./filebeat -e -c filebeat.yml
生產環境中 Kafka 集羣中節點數量建議爲(2N + 1 )個,這邊就以 3 個節點舉例
直接到官網下載 Kafka
$ wget http://mirror.bit.edu.cn/apache/kafka/1.0.0/kafka_2.11-1.0.0.tgz
tar -zxvf kafka_2.11-1.0.0.tgz mv kafka_2.11-1.0.0 kafka cd kafka
修改 Zookeeper 配置,搭建 Zookeeper 集羣,數量 ( 2N + 1 ) 個
ZK 集羣建議採用 Kafka 自帶,減小網絡相關的因素干擾
$ vim zookeeper.properties tickTime=2000 dataDir=/opt/zookeeper clientPort=2181 maxClientCnxns=50 initLimit=10 syncLimit=5 server.1=192.168.0.1:2888:3888 server.2=192.168.0.2:2888:3888 server.3=192.168.0.3:2888:3888
Zookeeper data 目錄下面添加 myid 文件,內容爲表明 Zooekeeper 節點 id (1,2,3),並保證不重複
$ vim /opt/zookeeper/myid 1
分別啓動 3 臺 Zookeeper 節點,保證集羣的高可用
$ ./zookeeper-server-start.sh -daemon ./config/zookeeper.properties
kafka 集羣這邊搭建爲 3 臺,能夠逐個修改 Kafka 配置,須要注意其中 broker.id 分別 (1,2,3)
$ vim ./config/server.properties broker.id=1 port=9092 host.name=192.168.0.1 num.replica.fetchers=1 log.dirs=/opt/kafka_logs num.partitions=3 zookeeper.connect=192.168.0.1: 192.168.0.2: 192.168.0.3:2181 zookeeper.connection.timeout.ms=6000 zookeeper.sync.time.ms=2000 num.io.threads=8 num.network.threads=8 queued.max.requests=16 fetch.purgatory.purge.interval.requests=100 producer.purgatory.purge.interval.requests=100 delete.topic.enable=true
分別啓動 3 臺 Kafka 節點,保證集羣的高可用
$ ./bin/kafka-server-start.sh -daemon ./config/server.properties
查看 topic 是否建立成功
$ bin/kafka-topics.sh --list --zookeeper localhost:2181 nginx
Kafka-manager 是 Yahoo 公司開源的集羣管理工具。
能夠在 Github 上下載安裝:https://github.com/yahoo/kafka-manager
若是遇到 Kafka 消費不及時的話,能夠經過到具體 cluster 頁面上,增長 partition。Kafka 經過 partition 分區來提升併發消費速度
Logstash 提供三大功能
若是使用 Filter 功能的話,強烈推薦你們使用 Grok debugger 來預先解析日誌格式。
$ wget https://artifacts.elastic.co/downloads/logstash/logstash-6.2.4.tar.gz
$ tar -zxvf logstash-6.2.4.tar.gz $ mv logstash-6.2.4 logstash
修改 Logstash 配置,使之提供 indexer 的功能,將數據插入到 Elasticsearch 集羣中
$ vim nginx.conf input { kafka { type => "kafka" bootstrap_servers => "192.168.0.1:2181,192.168.0.2:2181,192.168.0.3:2181" topics => "nginx" group_id => "logstash" consumer_threads => 2 } } output { elasticsearch { host => ["192.168.0.1","192.168.0.2","192.168.0.3"] port => "9300" index => "nginx-%{+YYYY.MM.dd}" } }
$ ./bin/logstash -f nginx.conf
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.tar.gz
$ tar -zxvf elasticsearch-6.2.4.tar.gz $ mv elasticsearch-6.2.4.tar.gz elasticsearch
$ vim config/elasticsearch.yml cluster.name: es node.name: es-node1 network.host: 192.168.0.1 discovery.zen.ping.unicast.hosts: ["192.168.0.1"] discovery.zen.minimum_master_nodes: 1
經過 -d 來後臺啓動
$ ./bin/elasticsearch -d
打開網頁 http://192.168.0.1:9200/, 若是出現下面信息說明配置成功
{ name: "es-node1", cluster_name: "es", cluster_uuid: "XvoyA_NYTSSV8pJg0Xb23A", version: { number: "6.2.4", build_hash: "ccec39f", build_date: "2018-04-12T20:37:28.497551Z", build_snapshot: false, lucene_version: "7.2.1", minimum_wire_compatibility_version: "5.6.0", minimum_index_compatibility_version: "5.0.0" }, tagline: "You Know, for Search" }
Cerebro 這個名字你們可能以爲很陌生,其實過去它的名字叫 kopf !由於 Elasticsearch 5.0 再也不支持 site plugin,因此 kopf 做者放棄了原項目,另起爐竈搞了 cerebro,以獨立的單頁應用形式,繼續支持新版本下 Elasticsearch 的管理工做。
$ wget https://artifacts.elastic.co/downloads/kibana/kibana-6.2.4-darwin-x86_64.tar.gz
$ tar -zxvf kibana-6.2.4-darwin-x86_64.tar.gz $ mv kibana-6.2.4-darwin-x86_64.tar.gz kibana
$ vim config/kibana.yml server.port: 5601 server.host: "192.168.0.1" elasticsearch.url: "http://192.168.0.1:9200"
$ nohup ./bin/kibana &
建立索引頁面須要到 Management -> Index Patterns 中經過前綴來指定
綜上,經過上面部署命令來實現 ELK 的整套組件,包含了日誌收集、過濾、索引和可視化的所有流程,基於這套系統實現分析日誌功能。同時,經過水平擴展 Kafka、Elasticsearch 集羣,能夠實現日均億級的日誌實時處理。
全部好的架構設計首要的原則並非追求先進,而是合理性,要與公司的業務規模和發展趨勢相匹配,任何一個公司,哪怕是如今看來規模很是大的公司,好比 BAT 之類,在一開始,其系統架構也應簡單和清晰的。
但隨着業務範圍不斷擴充,業務規模不斷擴大,系統漸進複雜和龐大,讓全部系統都遇到高可用的問題。那咱們該如何避免相似的問題,構建高可用系統呢?
爲此我特地寫了一個專欄《帶你玩轉高可用》,將多年來在百度和滬江的架構設計實戰經驗,集結成這個專欄。
本專欄總共包含 15 篇文章,分紅三大模塊詳細解釋高可用架構的相關知識:
概念篇:介紹高可用架構理論與演進,這塊比較偏理論。不過對於咱們理解整套體系仍是有必須的。
工程篇:介紹常見互聯網分層中每一層高可用是怎麼作的,包含 DNS、服務層、緩存層、數據層等
問題篇:介紹怎麼排查線上經常使用的故障,包括機器、應用層等維度故障定位
專欄每週都會更新,持續 64 天。在這將近 2 個月內,我會帶着你們去全面瞭解高可用架構的方方面面,同時會將遇到的這些問題和對應的解決方案拋出來,但願你們不要重複我遇到過的坑。同時也期待你們提出有意思的問題。
專欄地址:帶你玩轉高可用