1. Docker安裝
看之前的文章
docker ubuntu完全卸載docker及再次安裝
Ubuntu安裝 Docker
此外,Docker偶爾會出現(xiàn)這種問題dial tcp: lookup registry-1.docker.io on 192.168.1.1:53: no such host
參考Docker----執(zhí)行docker pull 下載鏡像時報dial tcp: lookup registry-1.docker.io on 192.168.1.1:53: no such host錯誤的解決辦法
- 修改“/etc/resolv.conf”, 增加幾個nameserver
nameserver 8.8.8.8
nameserver 8.8.4.4
- 再執(zhí)行如下兩條命令即可
systemctl daemon-reload
systemctl restart docker
2. 拉鏡象
參考https://blog.csdn.net/at1358/article/details/114921506
#下載ELK使用的鏡像
docker pull elasticsearch:7.8.0
docker pull kibana:7.8.0
docker pull logstash:7.8.0
docker pull mobz/elasticsearch‐head:5
# 此外,創(chuàng)建自己的網(wǎng)橋,方便elk通信,參考https://blog.csdn.net/weixin_42763696/article/details/132140038
docker network create mynetwork
2.1 ElastciSearch
20230815更新:一定要在ES啟動的時候增加如下配置,否則全量同步數(shù)據(jù)的時候會爆炸。參考文章Docker部署ES服務(wù),全量同步的時候內(nèi)存爆炸,ES自動關(guān)閉,CPU100%
discovery.type=single-node
ES_JAVA_OPTS="-Xms64m -Xmx512m"
#安裝elasticsearch,創(chuàng)建一個elk文件夾, 后面的elk日志采集系統(tǒng)的配置文件都放在這里面
#創(chuàng)建elk使用配置文件的目錄
mkdir -p /data/elk
#創(chuàng)建es使用的目錄
mkdir /data/elk/conf -p
#配置es的配置文件
cat >/data/elk/conf/elasticsearch.yml<<'EOF'
cluster.name: "docker-cluster"
network.host: 0.0.0.0
# 訪問ID限定,0.0.0.0為不限制,生產(chǎn)環(huán)境請設(shè)置為固定IP
transport.host: 0.0.0.0
# elasticsearch節(jié)點名稱
node.name: node-1
# elasticsearch節(jié)點信息
cluster.initial_master_nodes: ["node-1"]
# 下面的配置是關(guān)閉跨域驗證可以實現(xiàn)瀏覽器查看es的數(shù)據(jù)
http.cors.enabled: true
http.cors.allow-origin: "*"
EOF
#創(chuàng)建es使用的存儲卷把數(shù)據(jù)映射出來
[root@centos7 ~]# docker volume create elasticsearch
elasticsearch
#創(chuàng)建并啟動elasticsearch容器
docker run -di -p 9200:9200 -p 9300:9300 --name=elasticsearch --network mynetwork -v /data/elk/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" --mount src=elasticsearch,dst=/usr/share/elasticsearch elasticsearch:7.8.0
#把宿主機(jī)的配置文件映射到es作為配置文件
/data/elk/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
#把es的容器安裝目錄映射到宿主機(jī)
--mount src=elasticsearch,dst=/usr/share/elasticsearch
#創(chuàng)建成功
[root@centos7 elasticsearch]# docker run -di -p 9200:9200 -p 9300:9300 --name=elasticsearch -v /data/elk/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml --mount src=elasticsearch,dst=/usr/share/elasticsearch elasticsearch:7.6.0
317d2a274ec64500c44a7c8c0bea60175c2183a66e8e6e8a5554bc223e836e58
#對存儲卷創(chuàng)建軟連接實現(xiàn)快速訪問
/data/docker/volumes/elasticsearch/_data/
ln -s /data/docker/volumes/elasticsearch/_data/ /data/elk/es
Elasticsearch使用9200端口作為HTTP REST API的默認(rèn)端口,用于與客戶端進(jìn)行通信。而9300端口是Elasticsearch節(jié)點之間進(jìn)行通信的默認(rèn)端口,用于集群內(nèi)部的節(jié)點間通信。
接下來測試安裝是否完成。注意:下面的命令有可能有問題,curl瞬間docker就炸了
#測試是否安裝成功
[root@centos7 es]# curl 127.0.0.1:9200
{
"name" : "node-1",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "CK6xnBvaTciqRtWhjZf7WA",
"version" : {
"number" : "7.6.0",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "7f634e9f44834fbc12724506cc1da681b0c3b1e3",
"build_date" : "2020-02-06T00:09:00.449973Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
注意:如果需要添加插件時,需要將容器的插件目錄映射到實際的路徑中或者通過命令
(如安裝ik分詞器:docker cp ik elasticsearch:/usr/share/elasticsearch/plugins/)將其拷貝到容器中
解決方案參考docker啟動es(解決9200端口訪問不到)
- 檢查docker啟動的log
docker logs -f 容器id
- 發(fā)現(xiàn)虛擬內(nèi)存開的太小了
- 修改虛擬內(nèi)存參數(shù)
# 查看參數(shù)大小
cat /proc/sys/vm/max_map_count
# 設(shè)置參數(shù)
sysctl -w vm.max_map_count=262144
由于暴露端口可能導(dǎo)致信息泄露或者遭受攻擊
(你的Elasticsearch在“裸奔”嗎?),因此建議不要暴露端口
2.2 Kibana
#安裝kibana
#kibana主要用于對elasticsearch的數(shù)據(jù)進(jìn)行分析查看。注意選擇的版本必須和elasticsearch的版本相同或者低,建議和elasticsearch的版本相同,否則會無法將無法使用kibana。
#創(chuàng)建配置文件
cat >/data/elk/conf/kibana.yml<<'EOF'
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://elasticsearch:9200"] # 這里需要參考我下面的docker網(wǎng)絡(luò)訪問配置
# 操作界面語言設(shè)置為中文
i18n.locale: "zh-CN"
EOF
#創(chuàng)建kibana使用的容器卷
docker volume create kibana
#創(chuàng)建并啟動kibana容器
docker run -di --name kibana -p 5601:5601 --network mynetwork -v /data/elk/conf/kibana.yml:/usr/share/kibana/config/kibana.yml --mount src=kibana,dst=/usr/share/kibana kibana:7.8.0
#把宿主機(jī)的kibana配置文件映射到容器內(nèi)部
# -v /data/elk/conf/kibana.yml:/usr/share/kibana/config/kibana.yml
#把容器內(nèi)的kibana的安裝目錄映射到宿主機(jī)的容器卷方便管理
# --mount src=kibana,dst=/usr/share/kibana
#創(chuàng)建kibana容器卷的軟連接方便管理
ln -s /data/docker/volumes/kibana/_data/ /data/elk/kibana
此時直接curl 127.0.0.1:5601
,有可能遇到問題Kibana server is not ready yet
,解決方法參考kibana解決Kibana server is not ready yet問題
20230807更新:本質(zhì)問題是如何在docker中訪問別的容器,參考我新的博客讓ELK在同一個docker網(wǎng)絡(luò)下通過名字直接訪問
方法1(對我有效)
將配置文件kibana.yml中的elasticsearch.url改為正確的鏈接,默認(rèn)為: http://elasticsearch:9200 或者 http://127.0.0.1:9200 ,改為http://自己的IP地址 或者 docker的地址:9200
至于為什么有效,是因為這里的localhost是容器內(nèi)的localhost,如果es在另一個容器中就訪問不到了。
docker0 是 Docker 引擎創(chuàng)建的默認(rèn)網(wǎng)絡(luò)橋接接口。當(dāng)你在 Docker 中創(chuàng)建容器時,默認(rèn)情況下,Docker 會為每個容器分配一個虛擬網(wǎng)絡(luò)接口,并將其連接到 docker0 網(wǎng)橋上。
docker0 網(wǎng)橋充當(dāng)了 Docker 主機(jī)和容器之間的網(wǎng)絡(luò)橋梁。它的主要作用是實現(xiàn)容器與 Docker 主機(jī)以及其他容器之間的通信。通過 docker0 網(wǎng)橋,Docker 主機(jī)可以與容器進(jìn)行網(wǎng)絡(luò)通信,并提供容器之間的網(wǎng)絡(luò)互連性。
我也是給改成了docker的地址變好了方法2 關(guān)閉防火墻
# 關(guān)閉之后再查看防火墻狀態(tài)
systemctl stop firewalld.service
systemctl status firewalld.service
# 永久關(guān)閉防火墻,重啟系統(tǒng)也不會開啟防火墻
systemctl disable firewalld.service
kibana配置密碼參考https://blog.csdn.net/IT_road_qxc/article/details/121858843直接在yml配置即可
```
# 此處設(shè)置elastic的用戶名和密碼
elasticsearch.username: miima
elasticsearch.password: miima
```
參考新方法,需要用到nginx kibana+nginx配置密碼 ubuntu
2.3 logstash
logstash的配置比較復(fù)雜
1. 首先啟動容器,獲取配置文件
# 啟動容器
docker run -d --name=logstash logstash:7.2.0
# 查看日志
docker logs -f logstash
直到最后有successfully字段即可
2. 創(chuàng)建所需要的掛載文件,并拷貝配置
# 創(chuàng)建文件夾,用于保存同步用的conf文件
mkdir -p /data/elk/conf/logstash/config/conf.d
mkdir -p /data/elk/conf/logstash/config/lastrun
# 拷貝配置
docker cp logstash:/usr/share/logstash/config /data/elk/conf/logstash/
docker cp logstash:/usr/share/logstash/data /data/elk/conf/logstash/
docker cp logstash:/usr/share/logstash/pipeline /data/elk/conf/logstash/
修改配置logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://127.0.0.1:9200" ] # 如果在docker中,則使用docker的ip address或者服務(wù)器IP(需要保證服務(wù)器公網(wǎng)可以訪問)
# 在下面新建conf后,將這個注釋解鎖
# path.config: /usr/share/logstash/config/conf.d/*.conf
path.logs: /usr/share/logstash/logs
# logstash如果CPU占用太高,可以試試這個
# 參考https://blog.csdn.net/weixin_43390992/article/details/105232927、https://juejin.cn/post/6844904184131633160
# pipeline.workers: 4
3. 命令行啟動
刪除之前的容器,重新啟動一個新的容器
docker run \
--name logstash \
--network mynetwork \
--restart=always \
-p 5044:5044 \
-p 9600:9600 \
-e ES_JAVA_OPTS="-Duser.timezone=Asia/Shanghai" \
-v /opt/docker/logstash/config:/usr/share/logstash/config \
-v /opt/docker/logstash/data:/usr/share/logstash/data \
-v /opt/docker/logstash/pipeline:/usr/share/logstash/pipeline \
-d logstash:7.8.0
遞歸為文件夾賦予權(quán)限
chmod -R 777 /data/elk/conf/logstash/
查看日志docker logs -f --tail 10 logstash
主要看Successfully started Logstash API endpoint
4. 配置mysql自動同步
首先確認(rèn)是否有 logstash-input-jdbc
插件,一般7.x版本都默認(rèn)有。
# 進(jìn)入容器
docker exec -it logstash bash
# 查詢是否有 logstash-input-jdbc
./bin/logstash-plugin list --verbose
# 如果沒有就安裝插件(一般默認(rèn)安裝)
./bin/logstash-plugin install logstash-input-jdbc
# 退出容器
exit
提前創(chuàng)建對應(yīng)文件夾,并遞歸為文件夾賦予權(quán)限
在conf路徑下創(chuàng)建jdbc.conf
文件,格式如下
注意:這里的elasticsearch host需要寫ip地址,即使在同一個docker的network下,好像也不會通過域名解析道對應(yīng)ip
詢問chatgpt,原因如下
這是因為Logstash的配置文件在解析時是靜態(tài)的,它不會動態(tài)解析域名。如果您希望使用域名作為Elasticsearch的主機(jī)地址,您可以手動將域名解析為IP地址,并將IP地址用于Logstash的配置。或者,您可以使用負(fù)載均衡器或代理服務(wù)器來處理域名解析和請求轉(zhuǎn)發(fā)。
input{
jdbc{
# 連接數(shù)據(jù)庫
jdbc_connection_string => "jdbc:mysql://47.108.13.175:3306/edu?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false"
jdbc_user => "root"
jdbc_password => "HBcloud.1024"
# 連接數(shù)據(jù)庫的驅(qū)動包
jdbc_driver_library => "/usr/share/logstash/config/jars/mysql-connector-java-8.0.20.jar"
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
codec => plain { charset => "UTF-8" }
# 數(shù)據(jù)追蹤
# 追蹤的字段
# 在配置中,tracking_column 參數(shù)的值應(yīng)該是你的數(shù)據(jù)庫表中的一個列名,該列的值會隨著數(shù)據(jù)的插入而遞增或變化。jdbc 輸入插件將使用這個列的值來確定從數(shù)據(jù)庫中檢索哪些新的數(shù)據(jù)。
tracking_column => "update_time"
# 上次追蹤的元數(shù)據(jù)存放位置
last_run_metadata_path => "/usr/share/logstash/config/lastrun/logstash_jdbc_last_run"
# 設(shè)置時區(qū)
jdbc_default_timezone => "Asia/Shanghai"
# sql 文件地址
# statement_filepath => ""
# sql 注意sql_last_value
# 這里的SQL語言需要保證和mysql中一致,比如用了MySQL的關(guān)鍵字定義的列名,那就需要`{列名}`的方式進(jìn)行搜索
statement => "SELECT g.merchant_id AS id,g.nickname AS nickname,g.avatar_name AS avatarName,g.`desc` AS `desc`,g.contacts AS contacts,g.province AS province,g.city AS city,g.district AS district,g.address AS address, ST_AsText(g.coordinate) AS coordinate FROM wbc_merchant g WHERE g.update_time > :sql_last_value"
# 是否清除 last_run_metadata_path 的記錄,如果為真那么每次(指重啟,或者用logstash直接執(zhí)行conf文件的時候)都相當(dāng)于從頭開始查詢所有的數(shù)據(jù)庫記錄
clean_run =>false
# 這是控制定時的,重復(fù)執(zhí)行導(dǎo)入任務(wù)的時間間隔,第一位是分鐘 當(dāng)前意思是每分鐘執(zhí)行一次
# 可以參考https://cron.qqe2.com/,在線Cron表達(dá)式生成器
schedule => "* * * * *"
}
}
# 過濾器,進(jìn)行一些數(shù)據(jù)處理
filter {
## 避免有可能報錯的_id類型不識別的問題
mutate {
copy => { "_id" => "[@metadata][_id]"}
remove_field => ["_id"]
}
## meat是json格式,但是不做處理的話,放到es中好像會變成字符串格式
## 用下列過濾器處理數(shù)據(jù),變成實打?qū)嵉膉son(也就是es中的object類型)
# 去掉空值
mutate {
strip => ["meta"]
}
# 轉(zhuǎn)化為json
json {
source => "meta"
target => "Meta"
}
# 刪除字段
#mutate{
# remove_field => "Meta"
# }
# 變回來
#mutate{
# rename => { "Meta2" => "meta" }
# }
}
output{
elasticsearch{
# 要導(dǎo)入到的Elasticsearch所在的主機(jī)
hosts => "132.232.41.245:9200"
# 要導(dǎo)入到的Elasticsearch的索引的名稱
index => "merchant_index"
# 類型名稱(類似數(shù)據(jù)庫表名)
document_type => "merchanteso"
# 主鍵名稱(類似數(shù)據(jù)庫表名),必須是唯一ID
# 如果想要保證你的數(shù)據(jù)庫不出現(xiàn)重復(fù)的數(shù)值,那就要好好設(shè)置他
# 我的方案是和tracking_column一致,但這樣可能會導(dǎo)致無法插入新數(shù)據(jù),因此document_id必須得是唯一的
document_id => "%{id}"
}
stdout{
# JSON 格式輸出
codec => json_lines
}
}
需要注意的是這里需要下載jar文件,可以參考這片博客不同版本mysql-connector-java的jar包下載地址。下載后將壓縮包解壓到本機(jī)(非docker)/opt/docker/logstash/config
的路徑下,并提取出jar文件。
此外,elasticsearch的hosts和yaml文件中的保持一致即可。
這里的_id可能有些迷惑,可以參考https://github.com/elasticquent/Elasticquent/issues/53,
@ronytampubolon,您可以嘗試此代碼來刪除 _id 字段
filter {
mutate {
copy => { "_id" => "[@metadata][_id]"}
remove_field => ["_id"]
}
}
output {
elasticsearch {
index => "rdbms_sync_idx" // your index
document_id => "%{[@metadata][_id]}"
}}`
3. 數(shù)據(jù)展示
1. 加入索引
根據(jù){IP}:5601訪問kibana,對于剛剛插入數(shù)據(jù)庫的數(shù)據(jù)進(jìn)行檢索。
輸入索引,并選擇時間字段。
完成上面一步就ok了
2. 展示數(shù)據(jù)
進(jìn)入discover展示數(shù)據(jù)文章來源:http://www.zghlxwxcb.cn/news/detail-633940.html
注意:如果時間字段用的過去的時間,而不是插入數(shù)據(jù)庫的時間,需要在搜索的時候需要格外注意時間設(shè)置,比如我用的是新聞發(fā)布的時間作為時間字段文章來源地址http://www.zghlxwxcb.cn/news/detail-633940.html
到了這里,關(guān)于Ubuntu服務(wù)器ELK部署與實踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!