一、前言 在數據量大的企業級實踐中,Elasticsearch顯得非常常見,特別是數據表超過千萬級後,無論怎麼優化,還是有點力不從心!使用中,最首先的問題就是怎麼把千萬級數據同步到Elasticsearch中,在一些開源框架中知道了,有專門進行同步的!那就是Logstash 。在思考,同步完怎麼查看 ...
一、前言
在數據量大的企業級實踐中,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日誌,歡迎點個關註,等待更新哈!!
如果對你有幫助,還請不要吝嗇您的發財小手,一鍵三連是我寫作的動力,謝謝大家哈!!
可以看下一小編的微信公眾號文章首發看,歡迎關註,一起交流哈!!