本文給你們分享一下,如何搭建一個最爲流行的ELK架構,上一篇博文中已經給你們分享過ELK架構的演變之路,html
也給出了當下最爲流行的ELK日誌架構,那就是filebeat+kafka(zookeeper)+logstash+elasticsearch+kibana。java
ELK的版本比較多,5.X版本和6.X版本之間差距較大,若是是打算新上系統的同仁,建議使用6.X版本,新版本的確功能node
提高較大,並且可視化功能也作的比早期的版本都要美觀及強大。固然使用新版須要投入更多的時間及精力深刻研究,linux
畢竟新版技術文檔不全,會有不少的不明之處等待着自行趟坑,但對於考慮ELK往後的可運維性以及勇於挑戰自我學力nginx
能力的同仁,仍是推薦使用新版的。web
官方提供的安裝方式有兩種,一種是基於二進制包展開的安裝方式,另外一種是直接使用rpm包進行安裝。考慮到安裝的便捷性正則表達式
及可維護性,咱們選擇rpm安裝方式。kafka和zookeeper官方是沒有發行rpm包的,因此只能使用二進制方式安裝。apache
環境展現:bootstrap
OS:CentOS 7.4.1708vim
filebeat:6.4.0
zookeeper:kafka 內置版本
kafka:2.12-2
logstash:6.4.0
elasticsearch:6.4.0
kibana:6.4.0
本次演示(固然筆者的生產環境已經正式使用這套ELK了),全部節點均採用單節點方式
爲了節約資源,咱們將對所需節點進行壓縮
壓縮後資源分佈以下:
kibana+elasticsearch:192.168.10.101
logstash+kafka+zookeeper:192.168.10.102
filebeat+nginx:192.168.10.150
全部節點基礎工具安裝及設定,保持統一(iptables禁用、SELinux禁用)
yum install -y net-tools lrzsz telnet vim dos2unix bash-completion\
ntpdate sysstat tcpdump traceroute nc wget
echo -e "\nset nu\nset ai\nset nohlsearch\nset ts=4" >> /etc/vimrc && source /etc/vimrc
echo 'HISTTIMEFORMAT="+%F %T "' >> /etc/profile && source /etc/profile
sed -i s/'#ListenAddress 0/ListenAddress 0/' /etc/ssh/sshd_config && systemctl restart sshd
systemctl disabled postfix
systemctl disable postfix
sed -i s/^SELINUX=enforcing/SELINUX=disabled/ /etc/selinux/config
setenforce 0
systemctl disable firewalld
systemctl stop firewalld
iptables -F
kibana elasticsearch logstash kafka zookeeper
以上軟件均是java語言基礎,因此有以上服務的節點都須要jdk環境,
因爲咱們使用ELK stack的是官方較新版本6.4.0,查詢官方推薦後決定使用升級穩定版java-1.8
爲了保持安裝的便捷性咱們同樣使用yum安裝方式進行安裝
yum install -y java-1.8.0-openjdk-devel
kibana+elasticsearch:192.168.10.101
此節點的安裝過程
安裝jdk環境
yum install -y java-1.8.0-openjdk-devel
安裝elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.0.rpm
yum install -y elasticsearch-6.4.0.rpm
cp /etc/elasticsearch/elasticsearch.yml{,.bak}
vim /etc/elasticsearch/elasticsearch.yml
elasticsearch顯式配置內容
grep ^[[[:alnum:]] /etc/elasticsearch/elasticsearch.yml
cluster.name: my-es
node.name: node-1
path.data: /data/elasticsearch
path.logs: /data/log/elasticsearch
network.host: 0.0.0.0
建立數據目錄及日誌目錄
mkdir -pv /data/{elasticsearch,log/elasticsearch}
chown elasticsearch /data/{elasticsearch,log/elasticsearch}
設定開機自啓及啓動服務
systemctl enable elasticsearch
systemctl start elasticsearch
elasticsearch默認監聽9200和9300端口
9200用於對用戶提供服務
9300用於集羣事務通訊
安裝kibana
因爲和elasticsearch安裝在同一個節點上了,因此不須要再次安裝jdk環境了
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.4.0-x86_64.rpm
vim /etc/kibana/kibana.yml
kibana顯示配置
grep ^[[:alnum:]] /etc/kibana/kibana.yml
server.host: "0.0.0.0"
設定開機自啓及啓動服務
systemctl enable kibana
systemctl start kibana
kibana默認監聽5601端口(自身就是一個web服務器)
logstash+kafka+zookeeper:192.168.10.102
此節點的安裝過程
zookeeper+kafka安裝配置
安裝jdk環境
yum install -y java-1.8.0-openjdk-devel
cd /opt && wget https://www.apache.org/dyn/closer.cgi?path=/kafka/2.0.0/kafka_2.12-2.0.0.tgz
tar xf kafka_2.12-2.0.0.tgz
配置kafka內置的zookeeper
cp /opt/kafka_2.12-2.0.0/config/zookeeper.properties{,bak}
vim /opt/kafka_2.12-2.0.0/config/zookeeper.properties
zookeeper顯式配置以下
rep ^[[:alnum:]] /opt/kafka_2.12-2.0.0/config/zookeeper.properties
dataDir=/data/zookeeper
clientPort=2181
maxClientCnxns=0
配置kafka
cp /opt/kafka_2.12-2.0.0/config/server.properties{,bak}
vim /opt/kafka_2.12-2.0.0/config/server.properties
kafka的顯示配置以下
grep ^[[:alnum:]] /opt/kafka_2.12-2.0.0/config/server.properties
broker.id=0
listeners=PLAINTEXT://192.168.10.102:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/data/kafka
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=localhost:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0
注意:
listeners須要明確指定kafka通訊須要監聽的IP地址,不能使用0.0.0.0,不然沒法啓動
爲了系統安全和配置的標準化
咱們須要給zookeeper和kafka建立一個系統用戶,使用這個系統用戶來管理zookeeper和kafka進程
useradd -M -d /opt/kafka_2.12-2.0.0 -r -s /sbin/nologin kafka
建立zookeeper和kafka的數據目錄
mkdir -pv /data/{zookeeper,kafka}
chown kafka /data/{zookeeper,kafka}
爲了使用方便,咱們給zookeeper和kafka各寫了一個服務管理腳本
以避免每次啓動腳本寫很長的命令,以及忘記使用kafka系統用戶啓動服務
zookeeper服務腳本
cat zk.sh
#!/usr/bin/env bash
#@Author: Lucker
#@Company: BS
#@Email: 183530300@qq.com
#@Date: 2018-08-22 14:12:17
#@Last Modified by: Lucker
#@Last Modified time: 2018-08-22 18:00:48
#@Description: zookeeper service management script
kafka_home=/opt/kafka_2.12-2.0.0
case $1 in
start)
sudo -u kafka $kafka_home/bin/zookeeper-server-start.sh \
-daemon $kafka_home/config/zookeeper.properties
;;
stop)
sudo -u kafka $kafka_home/bin/zookeeper-server-stop.sh
;;
*)
echo -e "\033[32mUsage: $0 [start|stop]\033[0m"
exit 1
;;
esac
kafka服務腳本
cat kafka.sh
#!/usr/bin/env bash
#@Author: Lucker
#@Company: BS
#@Email: 183530300@qq.com
#@Date: 2018-08-22 14:12:17
#@Last Modified by: Lucker
#@Last Modified time: 2018-08-22 14:12:17
#@Description: kafka service management script
kafka_home=/opt/kafka_2.12-2.0.0
case $1 in
start)
sudo -u kafka $kafka_home/bin/kafka-server-start.sh \
-daemon $kafka_home/config/server.properties
;;
stop)
sudo -u kafka $kafka_home/bin/kafka-server-stop.sh
;;
*)
echo -e "\033[32mUsage: $0 [start|stop]\033[0m"
exit 1
;;
esac
logstash安裝配置
因爲和kafka安裝在同一個節點上了,因此不須要再次安裝jdk環境了
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.4.0.rpm
yum install -y logstash-6.4.0.rpm
配置logstash的jvm
grep -v ^# /etc/logstash/jvm.options | tr -s [[:space:]]
-Xms1g
-Xmx1g
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
-Djava.awt.headless=true
-Dfile.encoding=UTF-8
-Djruby.compile.invokedynamic=true
-Djruby.jit.threshold=0
-XX:+HeapDumpOnOutOfMemoryError
-Djava.security.egd=file:/dev/urandom
-Xms -Xmx 若是logstash是專機專用的,建議調大此處的內存數值以提高logstash的性能
logstash官方預設配置文件
cat /etc/default/logstash
LS_HOME="/usr/share/logstash"
LS_SETTINGS_DIR="/etc/logstash"
LS_PIDFILE="/var/run/logstash.pid"
LS_USER="logstash"
LS_GROUP="logstash"
LS_GC_LOG_FILE="/data/log/logstash/gc.log"
LS_OPEN_FILES="16384"
LS_NICE="19"
SERVICE_NAME="logstash"
SERVICE_DESCRIPTION="logstash"
LS_GC_LOG_FILE 建議修改成標準化的日誌存放目錄
grep ^[[:alnum:]] /etc/logstash/startup.options
LS_HOME=/usr/share/logstash
LS_SETTINGS_DIR=/etc/logstash
LS_OPTS="--path.settings ${LS_SETTINGS_DIR}"
LS_JAVA_OPTS=""
LS_PIDFILE=/var/run/logstash.pid
LS_USER=logstash
LS_GROUP=logstash
LS_GC_LOG_FILE=/data/log/logstash/gc.log
LS_OPEN_FILES=16384
LS_NICE=19
SERVICE_NAME="logstash"
SERVICE_DESCRIPTION="logstash"
變動/etc/logstash/startup.options內容以後須要使用$LS_HOME/bin/system-install
推送變動到啓動腳本環境預配置文件/etc/default/logstash中
/usr/share/logstash/bin/system-install /etc/logstash/startup.options systemd 6.4.0
使用效果以下所示
/usr/share/logstash/bin/system-install /etc/logstash/startup.options systemd 6.4.0
Using provided startup.options file: /etc/logstash/startup.options
Manually creating startup for specified platform: systemd
Manually creating startup for specified platform (systemd) version: 6.4.0
Successfully created system startup script for Logstash
以上的動做和直接修改/etc/default/logstash效果等同
logstash主配文件顯示配置以下
grep ^[[:alnum:]] /etc/logstash/logstash.yml
node.name: logstash-test
path.data: /data/logstash
path.logs: /data/log/logstash
cat /etc/logstash/conf.d/logstash-es.conf
input {
kafka {
bootstrap_servers => "192.168.10.102:9092"
topics=> ["elk"]
consumer_threads => 5
decorate_events => true
}
}
output {
elasticsearch {
hosts => ["192.168.10.101:9200"]
index => "elk-%{+YYYY.MM.dd}"
}
}
這裏配置的logstash只是作了一個轉發的工做,從kafka隊列中獲取消息並轉發給elasticsearch進行索引並存儲,
沒有對日誌作任何的格式處理,要想擁有較理想的效果,的確須要在此啓用filter插件,使用grok正則表達式進行
數據字段的拆分後再送往elasticsearch
建立logstash的數據及日誌目錄
mkdir -pv /data/{logstash,log/logstash}
chown logstash /data/{logstash,log/logstash}
設定開機自啓及啓動服務
systemctl enable logstash
systemctl start logstash
logstash默認監聽9600端口
filebeat+nginx:192.168.10.150
此節點的安裝過程
因爲此節點模擬業務服務器,只須要安裝日誌收集工具filebeat便可,所以無需安裝jdk環境
下載並安裝filebeat
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.4.0-x86_64.rpm
yum install -y filebeat-6.4.0-x86_64.rpm
cp /etc/filebeat/filebeat.yml{,.bak}
filebeat顯式配置以下
grep -v ^[[:space:]]*# /etc/filebeat/filebeat.yml | tr -s [[:space:]]
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/*.log
- type: log
enabled: true
paths:
- /var/log/nginx/*.log
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
output.kafka:
enabled: true
hosts: ["192.168.10.102:9092"]
topic: elk
filebeat從本機抓取日誌後輸出到kafka列隊中
vim /etc/init.d/filebeat
args="-c /etc/filebeat/filebeat.yml -path.home /usr/share/filebeat -path.config
/etc/filebeat -path.data /var/lib/filebeat -path.logs /var/log/filebeat"
若是要想修改filebeat的自身日誌的保存路徑,須要在在此啓動腳本中進行修改
因爲nginx只是爲了測試效果,徹底採用默認安裝,爲了方便測試效果,使用腳本批量生成了一些測試頁面,腳本內容以下
cat index.sh
for i in {0..9}
do
echo "test page 100$i" > /usr/share/nginx/html/index${i}.html
done
爲了方便產生日誌,使用如腳本批量訪問測試
cat curl.sh
for i in {0..9}
do
curl 127.0.0.1/index${i}.html
done
至此爲止,初步配置完成了,剩下的就是全面的聯調了。
爲了可以節省調試時間,建議你們從數據源頭開始作調試,
第一步:查看使用curl.sh批量訪問後nginx的access日誌收集是否正常
第二步:查看filebeat的日誌文件有沒有自身配置錯誤信息以及轉發數據到kafka隊列是否正常
此步驟能夠在kafka服務器端使用命令行方式消費kafka中的消息進行雙邊確認
具體操做見下文
第三步:確認kafka服務自己正常的狀況下,查看logstash日誌,若是logstash和其它服務共用節點時
須要注意該節點的內存資源是否充足,不然logstash會由於內存不足直接啓動失敗,筆者這次
安裝就再現過此問題
第四步:若是前面三步驗證都沒問題的狀況下,elasticsearch裏面如今生產了少許的日誌數據,但只要有
數據存入elasticsearch,就會產生logstash out插件中預約義好的index,此時可能經過elasticsearch
提供的查詢API驗證elasticsearch是否正常接收了來自logstash轉發過來的日誌數據
具體操做見下文
第五步:確認elasticsearch裏面有數據之後,就可使用瀏覽器打開es_server_ip:5601頁面進行建立index模式
注意:IE瀏覽器作此步的測試有問題,建議使用Chrome
若是elasticsearch中沒有數據時,是沒法在kibana頁面中建立index模式
elasticsearch配置正確性驗證命令
以易讀方式查詢es中的可查詢的接口列表
[root@es-kibana ~]# curl 127.0.0.1:9200/_cat
=^.^=
/_cat/allocation
/_cat/shards
/_cat/shards/{index}
/_cat/master
/_cat/nodes
/_cat/tasks
/_cat/indices
/_cat/indices/{index}
/_cat/segments
/_cat/segments/{index}
/_cat/count
/_cat/count/{index}
/_cat/recovery
/_cat/recovery/{index}
/_cat/health
/_cat/pending_tasks
/_cat/aliases
/_cat/aliases/{alias}
/_cat/thread_pool
/_cat/thread_pool/{thread_pools}
/_cat/plugins
/_cat/fielddata
/_cat/fielddata/{fields}
/_cat/nodeattrs
/_cat/repositories
/_cat/snapshots/{repository}
/_cat/templates
[root@es-kibana ~]#
以易讀方式查詢es中的有效索引
[root@es-kibana ~]# curl 127.0.0.1:9200/_cat/indices
green open .kibana r6Vr3NxEQSC_jJizl3dNXg 1 0 2 0 10.2kb 10.2kb
yellow open elk-2018.08.22 7Oou4ODYSD27QYsZgxMOig 5 1 10 0 25.2kb 25.2kb
[root@es-kibana ~]#
以易讀方式查詢es中健康狀態
[root@es-kibana ~]# curl 127.0.0.1:9200/_cat/health
1534912178 12:29:38 my-es yellow 1 1 6 6 0 0 5 0 - 54.5%
[root@es-kibana ~]#
kafka配置正確性驗證命令
命令行方式生產kafka消息
/opt/kafka/bin/kafka-console-producer.sh --broker-list 192.168.10.102:9092 --topic elk
命令行方式消費kafka中的消息
/opt/kafka_2.12-2.0.0/bin/kafka-console-consumer.sh --bootstrap-server 192.168.10.102:9092 \
--topic elk --from-beginning
總體ELK系統搭建過程並不複雜,但前提條件是你在打算使用這套系統時得首先理解清楚ELK系統的工做原理,
不然根本無從下手,或是你參照本文把demo搭建出來了,但調試過程可能都調不通。