一、ELK 是什麼?
ELK = Elasticsearch + Logstash + Kibana
- Elasticsearch:背景分布式存儲以及全文檢索。
- Logstash: 資料導入導出的工具。
- Kibana:資料可視化展示界面。
ELK架構為資料分布式存儲、可視化查詢和日志解析建立了一個功能強大的管理鍊。三者互相配合,取長補短,共同完成分布式大資料處理工作。
注意: ELK技術棧有 version check,軟體大版本号需要一緻,本文以 6.4.0 版本為例。
二、Elasticsearch
源碼下載下傳位址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch
2.1、下載下傳 Elasticsearch 源碼
mkdir /usr/local/elk/es1
wget https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-4-0
2.2、建立 es 使用者
useradd es
2.3、解壓源碼并修改其所有者
tar zxvf elasticsearch-6.4.0.tar.gz
chown -R es:es elasticsearch-6.4.0
2.4、修改 Elasticsearch 的配置檔案
修改Elasticsearch的配置檔案:/usr/local/elk/elasticsearch-6.4.0/config/elasticsearch.yml
cluster.name: elasticsearch
node.name: es-1
path.data: /data/elasticsearch/es1/data
bootstrap.memory_lock: true
network.host: 192.168.167.205
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["node205.data:9300","node205.data:9301","node205.data:9302"]
discovery.zen.minimum_master_nodes: 2
gateway.recover_after_nodes: 1
action.destructive_requires_name: true
2.5、背景啟動 Elasticsearch
Elasticsearch 不能以 root 使用者啟動,是以改用 es 使用者啟動。
su – es
cd /usr/local/elk/es/es1/elasticsearch-6.4.0
./bin/elasticsearch –d
可根據 logs/elasticsearch.log 檔案來監測 Elasticsearch 服務運作狀況。
注意:如果Elasticsearch服務啟動失敗,可參考 第五章 FAQ 處理問題。
2.6、停止Elasticsearch
根據 Elasticsearch 的端口号來停止該服務:
netstat -ntlp | grep 9200 | awk '{print $7}' | awk -F '/' '{print $1}' | xargs kill -9
三、Logstash
Logstash 是開源的伺服器端資料處理管道,能夠同時 從多個來源采集資料、轉換資料,然後将資料發送到您最喜歡的 “存儲庫” 中。logstash收集日志基本流程為:
Input –> filter –> output
源碼下載下傳位址:https://www.elastic.co/cn/downloads/logstash
1.1、下載下傳Logstash源碼
cd /usr/local/elk
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.4.2.tar.gz
1.2、建立 es 使用者(如已建立,請略過該步驟)
useradd es
1.3、解壓源碼并修改其所有者
tar zxvf logstash-6.4.0.tar.gz
chown -R es:es logstash-6.4.0
1.4、示例:将mysql表資料導入到Elasticsearch
1.4.1、建立配置檔案
su - es
cp -r config/logstash-sample.conf config/face.conf
修改 face.conf 配置檔案如下所示:
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.
input {
jdbc{
jdbc_connection_string => "jdbc:mysql://192.168.167.204:3316/db0?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&tinyInt1isBit=false"
jdbc_user => "mycat"
jdbc_password => "mycat123"
jdbc_driver_library => "/usr/local/mysql-connector-java-5.1.46.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
jdbc_default_timezone =>"Asia/Shanghai"
statement_filepath => "./sql/face.sql"
schedule => "* * * * *"
# type => "mycat"
# 是否記錄上次執行結果, 如果為真,将會把上次執行到的 tracking_column 字段的值記錄下來,儲存到 last_run_metadata_path 指定的檔案中
record_last_run => true
# 是否需要記錄某個column 的值,如果record_last_run為真,可以自定義我們需要 track 的 column 名稱,此時該參數就要為 true. 否則預設 track 的是 timestamp 的值.
use_column_value => true
# 如果 use_column_value 為真,需配置此參數. track 的資料庫 column 名,該 column 必須是遞增的. 一般是mysql主鍵
tracking_column => "id"
tracking_column_type => "numeric"
last_run_metadata_path => "./face_last_id"
lowercase_column_names => false
}
}
filter {
if [sex] == 1 {
mutate {
add_field => { "tags" => "男"}
}
}
if [sex] == 2 {
mutate {
add_field => { "tags" => "女"}
}
}
if [sex] == 0 {
mutate {
add_field => { "tags" => "未知"}
}
}
}
output {
elasticsearch {
hosts => ["http://192.168.167.205:9200"]
#index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
index => "face_card"
document_id => "%{id}"
#user => "elastic"
#password => "changeme"
}
stdout {
codec => json_lines
}
}
1.4.2、添加 sql 檔案
建立 face.sql 檔案
su - es
mkdir sql
touch face.sql
修改 face.sql 檔案内容如下所示
select * from face_card where id > :sql_last_value order by id limit 1000
1.4.3、建立索引
打開 postman,執行 PUT 請求來建立 Elasticsearch 索引,索引名稱為 face_card ,指定分片數為 5 ,副本數為 2 :
PUT http://192.168.167.205:9200/face_card
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 2
}
}
1.4.4、執行導數程式
su - es
cd /usr/local/elk/logstash-6.4.0
./bin/logstash -f ./config/face.conf
1.4.5、查詢索引内容
使用postman工具,執行GET請求來檢視索引内容:
GET /face_card/_search
傳回示例如下圖所示:
四、Kibana
源碼下載下傳位址:https://www.elastic.co/cn/downloads/past-releases#kibana
4.1、下載下傳 Kibana 源碼
cd /usr/local/elk
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.4.0-linux-x86_64.tar.gz
4.2、建立 es 使用者(如已建立,請略過該步驟)
useradd es
4.3、解壓源碼并修改其所有者
tar zxvf kibana-6.4.0-linux-x86_64.tar.gz
chown -R es:es kibana-6.4.0-linux-x86_64
4.4、修改kibana.yml配置檔案
修改Kibana配置:config/kibana.yml
server.port: 5601
server.host: "node205.data"
elasticsearch.url: "http://node205.data:9200"
logging.dest: /usr/local/elk/kibana-6.4.0-linux-x86_64/logs/kibana.log
4.5、背景啟動Kibana
用es使用者背景啟動Kibana
su - es
cd /usr/local/elk/kibana-6.4.0-linux-x86_64
nohup ./bin/kibana > /dev/null 2>&1 &
可根據 logs/kibana.log 檔案來監測Kibana服務運作狀況。
五、FAQ
5.1、max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
修改 /etc/security/limits.conf 檔案,增加配置,來改變使用者 es 每個程序最大同時打開檔案數的大小:
es soft nofile 65535
es hard nofile 65537
可切換到es使用者下,然後通過下面2個指令檢視目前數量:
- ulimit -Hn
- ulimit -Sn
注意:使用者退出重新登入後配置才會重新整理生效。
1.2. max number of threads [3818] for user [es] is too low, increase to at least [4096]
最大線程個數太低。修改配置檔案 /etc/security/limits.conf ,增加配置:
es - nproc 4096
# 或者
es soft nproc 4096
es hard nproc 4096
可切換到es使用者下,然後通過下面2個指令檢視目前最大線程數:
- ulimit -Hu
- ulimit –Su
1.3. max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
修改 /etc/sysctl.conf 檔案,在文末增加配置
vm.max_map_count=262144
執行指令sysctl -p生效。
1.4. memory locking requested for elasticsearch process but memory is not locked
修改 /etc/security/limits.conf 檔案,增加配置:
* soft memlock unlimited
* hard memlock unlimited
1.5. 啟動Elasticsearch服務,顯示被killed
可能Elasticsearch所在的機器記憶體不足。
1.6. 服務啟動後,在浏覽器通路不了9200端口
systemctl stop firewalld