ELK+Kafka部署
目錄
1.背景
2.ELK的配置
2.1.下載
2.2.關(guān)閉防火墻
2.3.安裝elasticsearch
2.4.安裝Logstash
2.5.安裝Kibana
2.6.Java日志輸出到Logstash
2.7.OSS版本
3.Kafka的配置
3.1.zookeeper搭建
3.2.kafka搭建
4.整合
1.背景
高日志壓力情況下,為了避免Logstash直接向ElasticSearch寫入的壓力過大導(dǎo)致中間過程堆積,采用Logstash——Kafka——Logstash——ElasticSearch的方案,由Kafka緩沖一下數(shù)據(jù)壓力。
2.ELK的配置
參見《ELK搭建及Java程序接入》
2.1.下載
官網(wǎng)下載Elasticsearch、Logstash、Kibana
https://www.elastic.co/
https://www.elastic.co/cn/downloads/
我下載的都是7.1.1版本,最好統(tǒng)一版本
(注意,這幾個都是試用版,過一段時間會過期,如果需要長期使用,得下載文末的oss版本)
?
2.2.關(guān)閉防火墻
systemctl stop firewalld
systemctl disable firewalld
?
2.3.安裝elasticsearch
在 Linux 環(huán)境中,elasticsearch 不允許以 root 權(quán)限來運行。
如果以 root 身份運行 elasticsearch,會提示這樣的錯誤:
can not run elasticsearch as root
解決方法:使用非 root 權(quán)限賬號運行 elasticsearch
# 創(chuàng)建用戶組
groupadd elk
# 創(chuàng)建新用戶,-g elk 設(shè)置其用戶組為 elk,-p elk 設(shè)置其密碼為 elk
useradd elk -g elk -p elk
# 更改 /opt 文件夾及內(nèi)部文件的所屬用戶及組為 elk:elk
chown -R elk:elk /opt # 假設(shè)你的 elasticsearch 安裝在 opt 目錄下
# 切換賬號
su elk
?
解壓elasticsearch
tar xzvf elasticsearch-7.1.1-linux-x86_64.tar.gz
運行
cd elasticsearch-7.1.1
bin/elasticsearch
測試
curl http://localhost:9200
?
默認(rèn)只能用localhost訪問,如需開啟外部訪問,需修改配置
vi config/elasticsearch.yml
去掉network.host的注釋并修改為本機(jī)ip
network.host: 0.0.0.0
discovery.seed_hosts: ["127.0.0.1","[::1]"]
?
?
此時啟動可能會報錯
ERROR: [3] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
?
如果不配置discovery.seed_hosts會報錯
[3]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
?
?
?
vm.max_map_count 不低于 262144
問題:vm.max_map_count?表示虛擬內(nèi)存大小,它是一個內(nèi)核參數(shù)。elasticsearch 默認(rèn)要求?vm.max_map_count?不低于 262144。
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
解決方法:
你可以執(zhí)行以下命令,設(shè)置?vm.max_map_count?,但是重啟后又會恢復(fù)為原值。
sysctl -w vm.max_map_count=262144
持久性的做法是在?/etc/sysctl.conf?文件中修改?vm.max_map_count?參數(shù):
echo "vm.max_map_count=262144" > /etc/sysctl.conf sysctl -p
?
nofile 不低于 65536
問題:?nofile?表示進(jìn)程允許打開的最大文件數(shù)。elasticsearch 進(jìn)程要求可以打開的最大文件數(shù)不低于 65536。
解決方法:
echo "* soft nofile 65536" > /etc/security/limits.conf
echo "* hard nofile 131072" > /etc/security/limits.conf
?
reboot重啟后即可正常啟動
?
后臺啟動
nohup bin/elasticsearch > service.out&
?
跟蹤后臺啟動的輸出
tail -f service.out
?
看進(jìn)程
[elk@localhost xx]$ ps -ef|grep opt
elk 2095 1750 11 13:42 pts/0 00:02:51 /opt/elasticsearch-7.1.1/jdk/bin/java -Xms1g -Xmx1g -XX:+UseConc……/opt/elasticsearch-7.1.1/lib/* org.elasticsearch.bootstrap.Elasticsearch
elk 2183 2095 0 13:42 pts/0 00:00:00 /opt/elasticsearch-7.1.1/modules/x-pack-ml/platform/linux-x86_64/bin/controller
?
?
2.4.安裝Logstash
解壓
tar xzvf logstash-7.1.1.tar.gz
運行
cd logstash-7.1.1
bin/logstash -f config/logstash-sample.conf
或后臺啟動
nohup bin/logstash -f config/logstash-sample.conf > service.out&
?
如果沒有JAVA_HOME,需設(shè)置JAVA_HOME,注意使用root用戶
vi /etc/profile
添加如下內(nèi)容
export JAVA_HOME=/opt/elasticsearch-7.1.1/jdk
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
配置立即生效執(zhí)行
source /etc/profile
?
看進(jìn)程
$ ps -ef|grep opt
elk 2460 2317 68 14:01 pts/1 00:03:37 /opt/elasticsearch-7.1.1/jdk/bin/java ……/opt/logstash-7.1.1/logstash-core/lib/jars/slf4j-api-1.7.25.jar org.logstash.Logstash -f config/logstash-sample.conf
?
?
2.5.安裝Kibana
解壓
tar xzvf kibana-7.1.1-linux-x86_64.tar.gz
?
cd kibana-7.1.1-linux-x86_64
需要修改elasticsearch的ip端口則改一下配置
vi config/kibana.yml
去掉這兩行的注釋并修改
server.host: "192.168.91.149" #需修改才能從其他機(jī)器訪問
elasticsearch.hosts: ["http://localhost:9200"]
?
運行
bin/kibana
或后臺啟動
nohup bin/kibana > service.out&
?
訪問地址
http://localhost:5601
?
看進(jìn)程
[elk@localhost kibana-7.1.1-linux-x86_64]$ ps -ef |grep node
elk 2658 1750 99 14:09 pts/0 00:00:12 bin/../node/bin/node --no-warnings --max-http-header-size=65536 bin/../src/cli
?
2.6.Java日志輸出到Logstash
?
cd logstash-7.1.1
vi config/logstash.conf
添加如下內(nèi)容
input {
? beats {
? ? port => 5044
? }
? tcp {
? ? # host:port就是上面appender中的 destination,
? ? # 這里其實把logstash作為服務(wù),開啟9250端口接收logback發(fā)出的消息
? ? host => "0.0.0.0" port => 9250 mode => "server" tags => ["tags"] codec => json_lines
? }
}
?
output {
? elasticsearch {
? ? hosts => ["http://localhost:9200"]
? }
}
kill掉原來的logstash后啟動
nohup bin/logstash -f config/logstash.conf > service.out&
?
Java代碼修改
pom.xml增加依賴
<dependency>
? ? <groupId>net.logstash.logback</groupId>
? ? <artifactId>logstash-logback-encoder</artifactId>
? ? <version>6.1</version>
</dependency>
logback.xml按需調(diào)整
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
? ? <!--
? ? destination 是 logstash 服務(wù)的 host:port,
? ? 相當(dāng)于和 logstash 建立了管道,將日志數(shù)據(jù)定向傳輸?shù)?logstash
? ? -->
? ? <destination>192.168.91.149:9250</destination>
? ? <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<root level="INFO">
? ? <!-- appender referenced after it is defined -->
? ? <appender-ref ref="STDOUT"/>
? ? <appender-ref ref="LOGSTASH" />
</root>
此時啟動java程序,如果啟動成功,日志就進(jìn)入es了
?
日志查看
進(jìn)入kibana web頁面
點擊左側(cè)Discover按鈕,會自動進(jìn)入創(chuàng)建索引,創(chuàng)建索引logstash-*
?
點擊下一步Next step
Time Filter field name選擇@timestamp,點擊Create index pattern按鈕等待創(chuàng)建索引成功
?
此時再次點擊左側(cè)Discover按鈕,進(jìn)入熟悉的索引查詢頁面了
?
區(qū)分應(yīng)用
實際應(yīng)用過程中,多個app日志混在一起,需要增加額外入庫字段進(jìn)行區(qū)分,此時修改java程序的logback.xml,添加customFields配置節(jié)即可。
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
? ? <!--
? ? destination 是 logstash 服務(wù)的 host:port,
? ? 相當(dāng)于和 logstash 建立了管道,將日志數(shù)據(jù)定向傳輸?shù)?logstash
? ? -->
? ? <destination>192.168.91.149:9250</destination>
? ? <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
? ? ? ? <customFields>{"appname":"whqtest"}</customFields>
? ? </encoder>
</appender>
?
logback.xml也可以采用變量的寫法
<configuration>
?? ?<!-- 項目的appid -->
?? ?<property name="APP_ID" value="whqtest"/>
?? ?………………
?? ?<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
?? ? ? ?<!--
?? ? ? ?destination 是 logstash 服務(wù)的 host:port,
?? ? ? ?相當(dāng)于和 logstash 建立了管道,將日志數(shù)據(jù)定向傳輸?shù)?logstash
?? ? ? ?-->
?? ? ? ?<destination>192.168.91.149:9250</destination>
?? ? ? ?<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
?? ? ? ? ? ?<customFields>{"appname":"${APP_ID}"}</customFields>
?? ? ? ?</encoder>
?? ?</appender>
?? ?………………
</configuration>
2.7.OSS版本
一段時間后啟動kibana報錯
Elasticsearch cluster did not respond with license information.
需要下載oss版本
https://www.elastic.co/cn/downloads/elasticsearch-oss
https://www.elastic.co/cn/downloads/logstash-oss
https://www.elastic.co/cn/downloads/kibana-oss
?
?
OSS版部署問題
如果連接es超時
vi es的目錄/config/jvm.options
增大-Xms和-Xmx到2g
?
增大es連接超時時間
vi config/kibana.yml
elasticsearch.requestTimeout: 90000
?
連接es返回錯誤:master_not_discovered_exception
es服務(wù)器修改
vi /etc/hostname 設(shè)置機(jī)器名為node1
node1
vi /etc/hosts
127.0.0.1 node1
vi es目錄/config/elasticsearch.yml
node.name: node1
discovery.seed_hosts: ["127.0.0.1"]
cluster.initial_master_nodes: ["node1"]
————————————————
版權(quán)聲明:本文為CSDN博主「洪岐」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/whq12789/article/details/92832436
3.Kafka的配置
3.1.zookeeper搭建
參見《centos7 zookeeper3.5.6單點部署》
官網(wǎng)下載
https://zookeeper.apache.org/
下載
https://zookeeper.apache.org/releases.html
直接部署的包
https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/apache-zookeeper-3.5.6-bin.tar.gz
源碼包(下載這個比較麻煩,需要安裝maven,然后mvn package進(jìn)行編譯)
https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/current/apache-zookeeper-3.5.6.tar.gz
部署
#安裝jdk1.8
?yum install -y java-1.8.0-openjdk
#部署zookeeper
tar xvzf apache-zookeeper-3.5.6-bin.tar.gz
mv apache-zookeeper-3.5.6-bin /opt
cd /opt/apache-zookeeper-3.5.6-bin/conf
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
修改
dataDir=/data/zookeeper
#該目錄為數(shù)據(jù)保存目錄
mkdir -p /data/zookeeper
cd /opt/apache-zookeeper-3.5.6-bin/
bin/zkServer.sh start
輸出如下,STARTED表示成功。
ZooKeeper JMX enabled by default
Using config: /opt/apache-zookeeper-3.5.6-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
連接測試
bin/zkCli.sh -server 127.0.0.1:2181
出現(xiàn)如下命令輸入框則表示連接成功
WatchedEvent state:SyncConnected type:None path:null
[zk: 127.0.0.1:2181(CONNECTING) 0]
此時輸入
ls /
可以查看zookeeper根目錄有一個zookeeper文件:
[zk: 127.0.0.1:2181(CONNECTED) 2] ls /
[zookeeper]
————————————————
版權(quán)聲明:本文為CSDN博主「洪岐」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/whq12789/article/details/103122786
3.2.kafka搭建
參見《centos7 kafka2.3.1單點部署》
kafka下載
http://kafka.apache.org/downloads
http://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.3.1/kafka_2.12-2.3.1.tgz
部署
tar xvzf kafka_2.12-2.3.1.tgz
mv kafka_2.12-2.3.1 /opt/
cd /opt/kafka_2.12-2.3.1/
vi config/server.properties
修改
listeners=PLAINTEXT://192.168.81.145:9092 ???#注意,這里一定要有客戶端可訪問的ip,否則非本機(jī)連接調(diào)用第二次會異常
log.dirs=/data/kafka-logs
啟動
bin/kafka-server-start.sh config/server.properties &
如果輸出出現(xiàn)
[2019-11-18 15:17:08,052] INFO [KafkaServer id=0] started (kafka.server.KafkaServer)
表示成功啟動
停止服務(wù)
bin/kafka-server-stop.sh?
測試
啟動生產(chǎn)者
bin/kafka-console-producer.sh --broker-list 192.168.81.145:9092 --topic test
然后隨便輸入幾行消息
啟動消費者
bin/kafka-console-consumer.sh --bootstrap-server 192.168.81.145:9092 --topic test --from-beginning
消費者會獲取到生產(chǎn)者輸入的幾行消息
————————————————
版權(quán)聲明:本文為CSDN博主「洪岐」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/whq12789/article/details/103123372
?
4.整合
接下來,將logstash拷貝出一份改名logstash2
logstash目錄的配置修改為:
vi config/logstash.conf
input {
? tcp {
? ? # 這里其實把logstash作為服務(wù),開啟9250端口接收logback發(fā)出的消息
? ? host => "0.0.0.0" port => 9250 mode => "server" tags => ["tags"] codec => json_lines
? }
}
output {
? kafka {
? ? ? ? ? bootstrap_servers => "192.168.81.145:9092,192.168.81.145:9093,192.168.81.145:9094" ? ?# kafka 集群主機(jī)
? ? ? ? ? topic_id => "web-log" ? ? ? ? # 主題名稱,會自動創(chuàng)建
? ? ? ? ? #compression_type => "snappy" ?# 壓縮方式
? ? ? ? ? codec => json ?#注意這里向kafka輸出日志為json格式
? ? ? ? }
}
logstash2目錄的配置修改:
vi config/logstash.conf
? ? input {
? ? ? ?kafka {
? ? ? ? ?bootstrap_servers => "192.168.81.145:9092,192.168.81.145:9093,192.168.81.145:9094" ? ?# kafka 集群主機(jī)
? ? ? ? ?topics_pattern => "web-log"
? ? ? ? ?consumer_threads => 5
? ? ? ? ?decorate_events => true
? ? ? ? ?auto_offset_reset => "latest"
? ? ? ? ?group_id => "logstash"
? ? ? ? ?codec => json ? #從kafka中直接取json格式日志
? ? ? ? }
? ? }
? ? output {
? ? ? ? elasticsearch {
? ? ? ? ? ?hosts => ["192.168.81.145:9200"]
? ? ? ? ? ?index => "sc-%{+YYYY.MM.dd}"
? ? ? ? }
? ? }
接下來kill掉logstash,然后兩個目錄下分別執(zhí)行
nohup bin/logstash -f config/logstash.conf > service.out&
啟動兩個logstash服務(wù)
啟動測試的java程序后
bin/kafka-console-consumer.sh --bootstrap-server 192.168.81.145:9092 --topic web-log
這個就能接收到第一個logstash輸入的json日志
kibana中也可以看到elasticsearch中“sc-日期”的索引數(shù)據(jù)了。
?
配置過程中參見了
https://www.elastic.co/guide/en/logstash/current/index.html
展開Input plugins和Output plugins有相應(yīng)的配置說明。
總結(jié)
以上是生活随笔為你收集整理的ELK+Kafka部署的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 适合程序员的简历模板
- 下一篇: 流量数据集学习