1. 程式人生 > 其它 >企業級實戰模組二:ELK+Filebeat+Kafka+ZooKeeper構建大資料日誌分析平臺案例(上)

企業級實戰模組二:ELK+Filebeat+Kafka+ZooKeeper構建大資料日誌分析平臺案例(上)

企業級實戰模組二:ELK+Filebeat+Kafka+ZooKeeper構建大資料日誌分析平臺案例(上)

1 日誌分析平臺架構圖

此架構稍微有些複雜,因此,這裡做一下架構解讀。 這個架構圖從左到右,總共分為5層,每層實現的功能和含義分別介紹如下:

第一層、資料採集層

資料採集層位於最左邊的業務伺服器叢集上,在每個業務伺服器上面安裝了filebeat做日誌收集,然後把採集到的原始日誌傳送到Kafka+zookeeper叢集上。

第二層、訊息佇列層

原始日誌傳送到Kafka+zookeeper叢集上後,會進行集中儲存,此時,filbeat是訊息的生產者,儲存的訊息可以隨時被消費。

第三層、資料分析層

Logstash作為消費者,會去Kafka+zookeeper叢集節點實時拉取原始日誌,然後將獲取到的原始日誌根據規則進行分析、清洗、過濾,最後將清洗好的日誌轉發至Elasticsearch叢集。

第四層、資料持久化儲存

Elasticsearch叢集在接收到logstash傳送過來的資料後,執行寫磁碟,建索引庫等操作,最後將結構化的資料儲存到Elasticsearch叢集上。

第五層、資料查詢、展示層

Kibana是一個視覺化的資料展示平臺,當有資料檢索請求時,它從Elasticsearch叢集上讀取資料,然後進行可視化出圖和多維度分析。

2 環境與角色說明

2.1 伺服器環境與角色

作業系統統一採用Centos7.9版本,各個伺服器角色如下表所示:

伺服器配置主機名角色IP地址所屬叢集
1C1G filebeat-server 業務伺服器+filebeat 192.168.5.3 業務伺服器叢集
1C2G kafka-zk-01 Kafka+ ZooKeeper 192.168.5.4 KB叢集
1C2G kafka-zk-02 Kafka+ ZooKeeper 192.168.5.5 KB叢集
1C2G kafka-zk-03 Kafka+ ZooKeeper 192.168.5.6 KB叢集
1C2G logstash-server Logstash、Kibana
192.168.5.7 資料轉發
1C2G Elasticsearch-01 ES Master、ES NataNode 192.168.5.8 ES叢集
1C2G Elasticsearch-02 ES Master、ES NataNode 192.168.5.9 ES叢集
1C2G Elasticsearch-03 ES Master、ES NataNode 192.168.5.10 ES叢集

2.2 軟體環境與版本

下表詳細說明了安裝軟體對應的名稱和版本號,其中,ELK三款軟體推薦選擇一樣的版本,

軟體名稱版本號說明
JDK JDK 1.8.0_231 Java環境解析器
Kafka kafka_2.13-3.0.0 訊息通訊中介軟體
zookeeper apache-zookeeper-3.7.0-bi 資源排程、協作
elasticsearch elasticsearch-7.15.0-linux-x86_64 日誌儲存
Logstash logstash-7.15.0-linux-x86_64 日誌收集、過濾、轉發
filebeat filebeat-7.15.0-linux-x86_64 前端日誌收集器
kibana kibana-7.15.0-linux-x86_64 日誌展示、分析

3 設定基礎環境以及安裝JDK環境(所有伺服器執行)

3.1 設定基礎環境

關閉防火牆及selinux

systemctl stop firewalld && systemctl disable firewalld

swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

修改主機名

hostnamectl set-hostname "hostname" && bash

3.2 選擇合適版本並下載JDK

Zookeeper 、elasticsearch和Logstash都依賴於Java環境,並且elasticsearch和Logstash要求JDK版本至少在JDK1.7或者以上,因此,在安裝zookeeper、Elasticsearch和Logstash的機器上,必須要安裝JDK,一般推薦使用最新版本的JDK

從oracle官網下載linux-64版本的JDK,下載時,選擇適合自己機器執行環境的版本,oracle官網提供的JDK都是二進位制版本的,因此,JDK的安裝非常簡單,只需將下載下來的程式包解壓到相應的目錄即可。安裝過程如下:

tar zxvf jdk-8u231-linux-x64.tar.gz

mv jdk1.8.0_231/ /usr/local/java

3.3 設定JDK的環境變數

要讓程式能夠識別JDK路徑,需要設定環境變數,這裡我們將JDK環境變數設定到/etc/profile檔案中。新增如下內容到/etc/profile檔案最後:

cat <<EOF>>/etc/profile
#Java環境變數
set java environment
JAVA_HOME=/usr/local/java/
JRE_HOME=/usr/local/java/jre/
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
EOF

然後執行如下命令讓設定生效:

source /etc/profile

java -version

4 安裝並配置elasticsearch叢集(部分伺服器執行)

4.1 elasticsearch叢集的架構與角色

在ElasticSearch的架構中,有三類角色,分別是Client Node、Data Node和Master Node,搜尋查詢的請求一般是經過Client Node來向Data Node獲取資料,而索引查詢首先請求Master Node節點,然後Master Node將請求分配到多個Data Node節點完成一次索引查詢。

叢集中每個角色的含義介紹如下:

master node:

可以理解為主節點,主要用於元資料(metadata)的處理,比如索引的新增、刪除、分片分配等,以及管理叢集各個節點的狀態。elasticsearch叢集中可以定義多個主節點,但是,在同一時刻,只有一個主節點起作用,其它定義的主節點,是作為主節點的候選節點存在。當一個主節點故障後,叢集會從候選主節點中選舉出新的主節點。

data node:

資料節點,這些節點上儲存了資料分片。它負責資料相關操作,比如分片的CRUD、搜尋和整合等操作。資料節點上面執行的操作都比較消耗 CPU、記憶體和I/O資源,因此資料節點伺服器要選擇較好的硬體配置,才能獲取高效的儲存和分析效能。

client node:

客戶端節點,屬於可選節點,是作為任務分發用的,它裡面也會存元資料,但是它不會對元資料做任何修改。client node存在的好處是可以分擔data node的一部分壓力,因為elasticsearch的查詢是兩層匯聚的結果,第一層是在data node上做查詢結果匯聚,然後把結果發給client node,client node接收到data node發來的結果後再做第二次的匯聚,然後把最終的查詢結果返回給使用者。這樣,client node就替data node分擔了部分壓力

4.2 安裝elasticsearch與授權

elasticsearch的安裝非常簡單,首先從官網https://www.elastic.co/下載頁面找到適合的版本,可選擇zip、tar、rpm等格式的安裝包下載

mkdir /usr/local/elk

tar -zxvf elasticsearch-7.15.0-linux-x86_64.tar.gz -C /usr/local/elk/

由於ElasticSearch可以接收使用者輸入的指令碼並且執行,為了系統安全考慮,需要建立一個單獨的使用者用來執行elasticSearch,這裡建立的普通使用者是es,操作如下:

groupadd es 
useradd es -g es

然後將elasticsearch的安裝目錄都授權給es使用者,操作如下:

chown -R es:es /usr/local/elk/elasticsearch-7.15.0

4.3 作業系統調優

作業系統以及JVM調優主要是針對安裝elasticsearch的機器。對於作業系統,需要調整幾個核心引數,fs.file-max主要是配置系統最大開啟檔案描述符數,建議修改為655360或者更高,vm.max_map_count影響Java執行緒數量,用於限制一個程序可以擁有的VMA(虛擬記憶體區域)的大小,系統預設是65530,建議修改成262144或者更高。將下面內容新增到/etc/sysctl.conf檔案中:

cat <<EOF>>/etc/sysctl.conf
fs.file-max=655360
vm.max_map_count = 262144
EOF

另外,還需要調整程序最大開啟檔案描述符(nofile)、最大使用者程序數(nproc)和最大鎖定記憶體地址空間(memlock),新增如下內容到/etc/security/limits.conf檔案中:

cat <<EOF>>/etc/security/limits.conf
* soft nproc 204800
* hard nproc 204800
* soft nofile 655360
* hard nofile 655360
* soft memlock unlimited
* hard memlock unlimited
EOF

最後,還需要修改/etc/security/limits.d/20-nproc.conf檔案(centos7.x系統),將:

*          soft    nproc     4096
# 修改為:
* soft nproc 20480

或者直接刪除/etc/security/limits.d/20-nproc.conf檔案也行。

sed -i 's/4096/20480/g'  /etc/security/limits.d/20-nproc.conf 

使配置檔案生效

sysctl -p

重新連線對話方塊

4.4 JVM調優

JVM調優主要是針對elasticsearch的JVM記憶體資源進行優化,elasticsearch的記憶體資源配置檔案為jvm.options,此檔案位於/usr/local/elk/elasticsearch-7.15.0/config目錄下,開啟此檔案,修改如下內容:

-Xms2g
-Xmx2g

可以看到,預設JVM記憶體為2g,可根據伺服器記憶體大小,修改為合適的值。一般設定為伺服器實體記憶體的一半最佳。

4.5 配置elasticsearch

elasticsearch的配置檔案均在elasticsearch根目錄下的config資料夾,這裡是/usr/local/elk/elasticsearch-7.15.0/config目錄,主要有jvm.options、elasticsearch.yml和log4j2.properties三個主要配置檔案。這裡重點介紹elasticsearch.yml一些重要的配置項及其含義。這裡配置的elasticsearch.yml檔案內容如下:

cat <<EOF>>/usr/local/elk/elasticsearch-7.15.0/config/elasticsearch.yml
#叢集名稱
cluster.name: cluster-es
#節點名稱, 每個節點的名稱不能重複
node.name: server-02
#ip 地址, 每個節點的地址不能重複
network.host: 0.0.0.0
#是不是有資格主節點
node.master: true
node.data: true
http.port: 9200
path.data: /data1/elasticsearch,/data2/elasticsearch
path.logs: /usr/local/elk/elasticsearch-7.15.0/logs
# head 外掛需要這開啟這兩個配置
http.cors.allow-origin: "*"
http.cors.enabled: true
http.max_content_length: 200mb
#es7.x 之後新增的配置,初始化一個新的叢集時需要此配置來選舉 master
cluster.initial_master_nodes: ["server-01"]
#es7.x 之後新增的配置,節點發現
discovery.zen.ping_timeout: 3s
discovery.seed_hosts: ["192.168.5.8:9300","192.168.5.9:9300","192.168.5.10:9300"]
gateway.recover_after_nodes: 2
network.tcp.keep_alive: true
network.tcp.no_delay: true
transport.tcp.compress: true
#叢集內同時啟動的資料任務個數,預設是 2 個
cluster.routing.allocation.cluster_concurrent_rebalance: 16
#新增或刪除節點及負載均衡時併發恢復的執行緒個數,預設 4 個
cluster.routing.allocation.node_concurrent_recoveries: 16
#初始化資料恢復時,併發恢復執行緒的個數,預設 4 個
cluster.routing.allocation.node_initial_primaries_recoveries: 16
EOF

建立儲存目錄並賦予啟動使用者許可權

mkdir -p /data{1,2}/elasticsearch/
chown es:es -R /data{1,2}/

4.6 啟動elasticsearch

切換到es使用者下啟動elasticsearch叢集即可。分別登入到server1、server2和server3三臺主機上,執行如下操作:

su - es

sh /usr/local/elk/elasticsearch-7.15.0/bin/elasticsearch -d
	其中,“-d”引數的意思是將elasticsearch放到後臺執行。 

4.7 驗證elasticsearch叢集的可用性

http://192.168.5.8:9200/_cat/nodes

5 安裝並配置ZooKeeper叢集

5.1 下載與安裝zookeeper

ZooKeeper是用Java編寫的,需要安裝Java執行環境,可以從zookeeper官網https://zookeeper.apache.org/獲取zookeeper安裝包,將下載下來的安裝包直接解壓到一個路徑下即可完成zookeeper的安裝,

tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz

mv apache-zookeeper-3.7.0-bin /usr/local/zookeeper

5.2 配置zookeeper

zookeeper安裝到了/usr/local目錄下,因此,zookeeper的配置模板檔案為/usr/local/zookeeper/conf/zoo_sample.cfg,拷貝zoo_sample.cfg並重命名為zoo.cfg,重點配置如下內容:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper
clientPort=2181
server.1=172.16.213.51:2888:3888
server.2=172.16.213.109:2888:3888
server.3=172.16.213.75:2888:3888

cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg
scp /usr/local/zookeeper/conf/zoo.cfg [email protected]:/usr/local/zookeeper/conf/zoo.cfg
scp /usr/local/zookeeper/conf/zoo.cfg [email protected]:/usr/local/zookeeper/conf/zoo.cfg

mkdir -p /data/zookeeper
echo 1 > /data/zookeeper/myid

每個配置項含義如下:

  • tickTime:zookeeper使用的基本時間度量單位,以毫秒為單位,它用來控制心跳和超時。2000表示2 tickTime。更低的tickTime值可以更快地發現超時問題。

  • initLimit:這個配置項是用來配置Zookeeper叢集中Follower伺服器初始化連線到Leader時,最長能忍受多少個心跳時間間隔數(也就是tickTime)l

  • syncLimit:這個配置項標識Leader與Follower之間傳送訊息,請求和應答時間長度最長不能超過多少個tickTime的時間長度

  • dataDir:必須配置項,用於配置儲存快照檔案的目錄。需要事先建立好這個目錄,如果沒有配置dataLogDir,那麼事務日誌也會儲存在此目錄。

  • clientPort:zookeeper服務程序監聽的TCP埠,預設情況下,服務端會監聽2181埠。

  • server.A=B:C:D:其中A是一個數字,表示這是第幾個伺服器;B是這個伺服器的IP地址;C表示的是這個伺服器與叢集中的Leader伺服器通訊的埠;D 表示如果叢集中的Leader伺服器宕機了,需要一個埠來重新進行選舉,選出一個新的 Leader,而這個埠就是用來執行選舉時伺服器相互通訊的埠。

除了修改zoo.cfg配置檔案外,叢集模式下還要配置一個檔案myid,這個檔案需要放在dataDir配置項指定的目錄下,這個檔案裡面只有一個數字,如果要寫入1,表示第一個伺服器,與zoo.cfg文字中的server.1中的1對應,以此類推,在叢集的第二個伺服器zoo.cfg配置檔案中dataDir配置項指定的目錄下建立myid檔案,寫入2,這個2與zoo.cfg文字中的server.2中的2對應。Zookeeper在啟動時會讀取這個檔案,得到裡面的資料與zoo.cfg裡面的配置資訊比較,從而判斷每個zookeeper server的對應關係。

為了保證zookeeper叢集配置的規範性,建議將zookeeper叢集中每臺伺服器的安裝和配置檔案路徑都儲存一致。

5.3 啟動zookeeper叢集

在三個節點依次執行如下命令,啟動Zookeeper服務:

sh /usr/local/zookeeper/bin/zkServer.sh  start

Zookeeper啟動後,通過jps命令(jdk內建命令)可以看到有一個QuorumPeerMain標識,這個就是Zookeeper啟動的程序,前面的數字是Zookeeper程序的PID。

有時候為了啟動Zookeeper方面,也可以新增zookeeper環境變數到系統的/etc/profile中,這樣,在任意路徑都可以執行“zkServer.sh start”命令了,新增環境變數的內容為:

cat <<EOF>>/etc/profile
#zookeeper環境變數
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
EOF
本文摘抄或總結其他筆記,筆記不涉及任何商業用途,如果侵權請及時聯絡處理