一、前言
在資料量大的企業級實踐中,Elasticsearch
顯得非常常見,特別是資料表超過千萬級後,無論怎麼最佳化,還是有點力不從心!使用中,最首先的問題就是怎麼把千萬級資料同步到Elasticsearch
中,在一些開源框架中知道了,有專門進行同步的!那就是Logstash
。在思考,同步完怎麼檢視呢,這時Kibana
映入眼簾,視覺化的介面,讓使用更加的得心應手哈!!這就是三劍客ELK
。不過大多時候都是進行日誌採集的,小編沒有用,只是用來解決一個表的資料量大,查詢慢的!後面小編在專門搭建日誌採集的ELK
。
二、三者介紹
1. Elasticsearch
Elasticsearch 是一個分散式
、RESTful
風格的搜尋
和資料分析引擎
,能夠解決不斷湧現出的各種用例。作為 Elastic Stack 的核心,Elasticsearch 會集中儲存您的資料,讓您飛快完成搜尋,微調相關性,進行強大的分析,並輕鬆縮放規模。
2. Kibana
Kibana 是一個免費且開放的使用者介面
,能夠讓您對 Elasticsearch 資料進行視覺化
,並讓您在 Elastic Stack 中進行導航。您可以進行各種操作,從跟蹤查詢負載,到理解請求如何流經您的整個應用,都能輕鬆完成。
3. Logstash
Logstash 是免費且開放的伺服器端資料處理管道
,能夠從多個來源採集資料,轉換資料,然後將資料傳送到您最喜歡的“儲存庫”中。
三、版本選擇
現在最新版就是8.5
,最新的教程少和問題未知,小編選擇7版本的,求一手穩定哈!
於是去hub.docker
檢視了一下,經常用的版本,最終確定為:7.17.7
官方規定:
安裝 Elastic Stack 時,您必須在整個堆疊中使用相同的版本。例如,如果您使用的是 Elasticsearch 7.17.7,則安裝 Beats 7.17.7、APM Server 7.17.7、Elasticsearch Hadoop 7.17.7、Kibana 7.17.7 和 Logstash 7.17.7
四、搭建mysql
1. 拉去MySQL映象
sudo docker pull mysql:5.7
)
2. Docker啟動MySQL
sudo docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
####這裡往下是解釋,不需要貼上到linux上#############
--name 指定容器名字
-v 將對應檔案掛載到linux主機上
-e 初始化密碼
-p 容器埠對映到主機的埠(把容器的3306對映到linux中3306,這樣windows上就可以訪問這個資料庫)
-d 後臺執行
3. Docker配置MySQL
vim /mydata/mysql/conf/my.cnf # 建立並進入編輯
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
4. Docker重啟MySQL使配置生效
docker restart mysql
5. 新增資料庫
6. 新建測試表
DROP TABLE IF EXISTS `sys_log`;
CREATE TABLE `sys_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '日誌主鍵',
`title` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '模組標題',
`business_type` int(2) NULL DEFAULT 0 COMMENT '業務型別(0其它 1新增 2修改 3刪除)',
`method` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '方法名稱',
`request_method` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '請求方式',
`oper_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '操作人員',
`oper_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '請求URL',
`oper_ip` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '主機地址',
`oper_time` datetime(0) NULL DEFAULT NULL COMMENT '操作時間',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1585197503834284034 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '操作日誌記錄' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
五、ELK搭建準備
1. 建立掛載的檔案
es掛載:
mkdir -p /mydata/elk/elasticsearch/{config,plugins,data,logs}
kibana掛載:
mkdir -p /mydata/elk/kibana/config
logstash掛載:
mkdir -p /mydata/elk/logstash/config
2. ES掛載具體配置
vim /mydata/elk/elasticsearch/config/elasticsearch.yml
輸入下面命令:
http.host: 0.0.0.0
xpack.security.enabled: false
http.host:任何地址都可以訪問。
xpack.security.enabled:關閉密碼認證
3. Kibana掛載具體配置
vim /mydata/elk/kibana/config/kibana.yml
內容:
server.host: 0.0.0.0
elasticsearch.hosts: [ "http://192.168.239.131:9200" ]
elasticsearch.hosts:指向es地址
4. Logstash掛載具體配置
vim /mydata/elk/logstash/config/logstash.yml
內容:
http.host: 0.0.0.0
xpack.monitoring.elasticsearch.hosts: [ "http://192.168.239.131:9200" ]
記錄存放:
touch log
chmod 777 log
vim /mydata/elk/logstash/config/logstash.conf
內容:
jdbc_driver_library
:指定必須要自己下載mysql-connector-java-8.0.28.jar
,版本自己決定,下載地址;
statement
:如果sql長,可以指定sql檔案,直接指定檔案所在位置,這裡的位置都為容器內部的地址;
last_run_metadata_path
:上次記錄存放檔案對應上方的log。
input {
stdin {
}
jdbc {
jdbc_connection_string => "jdbc:mysql://192.168.239.131:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC"
jdbc_user => "root"
jdbc_password => "root"
jdbc_driver_library => "/usr/share/logstash/config/mysql-connector-java-8.0.28.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "300000"
statement => "SELECT id, title, business_type, method, request_method, oper_name, oper_url, oper_ip, oper_time FROM sys_log"
schedule => "*/1 * * * *"
use_column_value => false
tracking_column_type => "timestamp"
tracking_column => "oper_time"
record_last_run => true
jdbc_default_timezone => "Asia/Shanghai"
last_run_metadata_path => "/usr/share/logstash/config/log"
}
}
output {
elasticsearch {
hosts => ["192.168.239.131:9200"]
index => "sys_log"
document_id => "%{id}"
}
stdout {
codec => json_lines
}
}
流水線指定上面的配置檔案:
vim /mydata/elk/logstash/config/pipelines.yml
內容:
- pipeline.id: sys_log
path.config: "/usr/share/logstash/config/logstash.conf"
最終/mydata/elk/logstash/config/
下的檔案
防止儲存沒有修改許可權,可以把上面建的資料夾和檔案賦予修改許可權:
chmod 777 檔名稱
五、執行容器
0. docker compose一鍵搭建
在elk目錄建立:
vim docker-compose.yml
內容如下:
version: '3'
services:
elasticsearch:
image: elasticsearch:7.17.7
container_name: elasticsearch
ports:
- "9200:9200"
- "9300:9300"
environment:
- cluster.name=elasticsearch
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
volumes:
- /mydata/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins
- /mydata/elk/elasticsearch/data:/usr/share/elasticsearch/data
- /mydata/elk/elasticsearch/logs:/usr/share/elasticsearch/logs
kibana:
image: kibana:7.17.7
container_name: kibana
ports:
- "5601:5601"
depends_on:
- elasticsearch
environment:
I18N_LOCALE: zh-CN
volumes:
- /mydata/elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
logstash:
image: logstash:7.17.7
container_name: logstash
ports:
- "5044:5044"
volumes:
- /mydata/elk/logstash/config:/usr/share/logstash/config
depends_on:
- elasticsearch
一定要在docker-compose.yml
所在目錄執行命令!!
執行:
docker compose up -d
完成後可以跳到5
進行檢視kibana!!
1. 執行ES
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" -v /mydata/elk/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /mydata/elk/elasticsearch/data:/usr/share/elasticsearch/data -v /mydata/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.17.7
2. 執行Kibana
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.239.131:9200 -p 5601:5601 -d kibana:7.17.7
3. 執行Logstash
docker run -d -p 5044:5044 -v /mydata/elk/logstash/config:/usr/share/logstash/config --name logstash logstash:7.17.7
4. 容器完結圖
5. 訪問Kibana
http://192.168.239.131:5601/app/home#/
六、新建索引
PUT /sys_log
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0,
"index": {
"max_result_window": 100000000
}
},
"mappings": {
"dynamic": "strict",
"properties": {
"@timestamp": {
"type": "date"
},
"@version": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"business_type": {
"type": "integer"
},
"title": {
"type": "text"
},
"method": {
"type": "text"
},
"request_method": {
"type": "text"
},
"oper_name": {
"type": "text"
},
"oper_url": {
"type": "text"
},
"oper_ip": {
"type": "text"
},
"oper_time": {
"type": "date"
},
"id": {
"type": "long"
}
}
}
}
七、測試
新增幾條記錄,然後檢視Logstash日誌
docker logs -f logstash
我們去kibana看一下是否已存在:
輸入命令:
GET /sys_log/_search
{
"query": {
"match_all": {}
}
}
我們看到存在6條,和mysql一致!!
八、總結
話費了一天時間,終於搭建完成了,太不容易了!下篇文章搭建ELK日誌,歡迎點個關注,等待更新哈!!
如果對你有幫助,還請不要吝嗇您的發財小手,一鍵三連是我寫作的動力,謝謝大家哈!!
可以看下一小編的微信公眾號文章首發看,歡迎關注,一起交流哈!!