Develop #7
已結束Logstash建置
是由 martin zhuo 於 約 1 年 前加入. 於 約 1 年 前更新.
0%
檔案
| clipboard-202412021023-rnoag.png (22.8 KB) clipboard-202412021023-rnoag.png | martin zhuo, 2024-12-02 02:23 | ||
| clipboard-202412021023-msgkv.png (31.5 KB) clipboard-202412021023-msgkv.png | martin zhuo, 2024-12-02 02:23 | ||
| clipboard-202412021155-8eyrr.png (39.5 KB) clipboard-202412021155-8eyrr.png | martin zhuo, 2024-12-02 03:55 | ||
| clipboard-202412061150-gk9kw.png (83.7 KB) clipboard-202412061150-gk9kw.png | martin zhuo, 2024-12-06 03:51 | ||
| clipboard-202412091742-egljx.png (23 KB) clipboard-202412091742-egljx.png | martin zhuo, 2024-12-09 09:42 | ||
| clipboard-202412091750-4uecz.png (816 KB) clipboard-202412091750-4uecz.png | martin zhuo, 2024-12-09 09:50 | ||
| clipboard-202412101815-kesxv.png (115 KB) clipboard-202412101815-kesxv.png | martin zhuo, 2024-12-10 10:15 |
是由 martin zhuo 於 約 1 年 前更新 · 已被編輯
11/29在momo佈署logstash摘要:
五點網管開通防火牆後,
第一次測試,logstash每5秒讀取DB 1000筆資料佔用太多資源
第二次測試,改每10秒讀取500筆,仍然佔用太多資源
第三次測試,經momo DBA建index,及我們配合index修改sql語句。每10秒讀取500筆。讀取DB資料有變快,佔用資源有下降。
避免資料儲存有誤,logstash存在ES新建的兩個index,正元grafana監控的dashboard也同步更新index,可看到11/25之後及即時的資料,正元回饋沒問題。
待修改:
- index改回舊的
- 存入ES的_id改回舊的,Chris版本改為veriid_trans_id
- SQL語句修改,減少冗長的搜尋時間:
WHERE create_datetime > (:sql_last_value::timestamp - interval '300 seconds') AND date(create_datetime) >= '2024-11-25' AND create_datetime < '${DB_QUERY_START_TIME}' ORDER BY create_datetime ASC - pipeline的schedule修改,撈history資料周期間隔設長一點,目前momo測試用10秒: "*/10 * * * * *",並將schedule設為參數
- 將dockerfile做成base image,之後build image以base image做修改,不用上網抓package
是由 martin zhuo 於 約 1 年 前更新 · 已被編輯
1.已更新gitlab
2.待確認ES的document_id從何而來 -> 目前估計是從Elasticsearch自動生成的 _id,通常是隨機的UUID經base64編碼20到22個字符 -> 改veriid_trans_id當ES index的_id
3.SQL語句修改,刪掉create_time > :sql_last_value 、date(create_time)改create_time便於使用index

4.history資料無急迫性,一個月估220萬筆,若每2分鐘撈500筆,一周可達250萬筆。config新增參數SCHEDULE、HISTORY_SCHEDULE,並測試完成
5.已新增docker base image 之 Dockerfile
週四 MOMO 預計完成項目:
1.確認上周LOGSTASH是否正常
2.確認PG、ES資料筆數是否一致
3.確認資源負載是否正常
4.確認ES index(veri_id_momo_tb_model_account_takeover_predict_data_v2.0、veri_id_momo_tb_model_fraud_detect_predict_data_v2.0) _id是否是veriid_trans_id
5.佈署LOGSTASH,撈取11月資料
6.觀察機器資源附載狀況
7.考慮刪除ES index(veri_id_momo_tb_model_account_takeover_predict_data_v2.0、veri_id_momo_tb_model_fraud_detect_predict_data_v2.0)舊資料,也可下次再刪
8.修改正元(Thomas)看的dashboard index
是由 martin zhuo 於 約 1 年 前更新 · 已被編輯
12/5 MOMO佈署logstash工項:
- momo的dba回覆,他們11/29七點後 裝pg的機器掛掉,可能因此影響到我們docker也掛掉,目前調降讀db頻率: 100筆/20秒
- 11/29 佈署的logstash同步資料,確認筆數一致
- 目前佈署新版logstash,cpu限制2.5、memory 限制4G
- ES index的document_id不是veridi-trans-id
- 已佈署LOGSTASH,設定撈取11/1之後的資料,及即使同步的資料
- 目前觀察十分鐘 cpu佔用最多1.5顆、memory1.56 GB
- 目前11月無舊資料,因此資料不會重複,安排下次刪除11月前的舊資料
- 正元(Thomas)看的dashboard已改回原index
是由 martin zhuo 於 約 1 年 前更新 · 已被編輯
12/6 :
確認MOMO ES 12/5資料筆數(SmartFDS 23萬、ATO 23萬、FD 23萬)
203的ES 12/5資料筆數(SmartFDS 23萬、ATO 18.9萬、FD 23萬)
http://192.168.10.203:5601/app/dashboards#/create?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:'2024-02-29T16:00:00.000Z',to:now))


是由 martin zhuo 於 約 1 年 前更新
是由 martin zhuo 於 約 1 年 前更新 · 已被編輯
issue: no living connections in the pool
推估為 太多thread在等待寫入DB,且超過ES的最大連線數

"""
雖然 Elasticsearch(ES)允許配置較多的連線池數量,但如果在 Logstash 中出現「連線池不足」的問題,通常是因為以下幾個原因:
-
Logstash 請求超過預設的並發數量
Logstash 的 pipeline.workers 設定:這會決定最多有多少個工作線程同時執行。如果 pipeline.workers 設定為 12,則 Logstash 會啟動最多 12 個線程,這些線程會同時向 Elasticsearch 發送請求。儘管 Elasticsearch 的連線池可能配置較大,但如果 Logstash 的請求頻繁超過 Elasticsearch 所能處理的並發請求數量,會導致連線池不足。
多次併發的請求:每個 Logstash 執行的線程會並行發送 _bulk 請求到 Elasticsearch。這可能會造成短時間內過多的並發請求。如果 Elasticsearch 端的連線池設置較小或資源不足,可能無法同時處理如此高的並發請求。 -
Elasticsearch 的連線池設置過小
連線池限制:Elasticsearch 的內部連線池有最大連線數的設置。如果該設置較小,可能無法滿足來自多個客戶端(如 Logstash 或其他應用)的並發請求。即使 Logstash 端有多個線程,若 Elasticsearch 無法支持如此多的同時請求,仍然會出現「連線池不足」的情況。
連線池的大小:如果 Elasticsearch 的 HTTP 客戶端設置了過低的最大連線數(比如默認設置),則當請求數量超過這個上限時,後續的請求會被拒絕或延遲。 -
Elasticsearch 節點資源不足
ES 節點資源瓶頸:即使配置了足夠的連線池大小,若 Elasticsearch 節點的 CPU、內存、磁碟等資源達到瓶頸,也會導致處理請求的能力下降,無法處理來自 Logstash 或其他客戶端的高並發請求。這樣即便有足夠的連線池空間,仍然會出現性能問題。
集群負載過高:如果集群內其他節點的負載較高,或者集群資源不夠,ES 可能會對外部請求進行限制,造成請求等待或拒絕。 -
Logstash 請求的批量大小(flush_size)設置過大
批量請求大小過大:Logstash 向 Elasticsearch 發送的每批數據(即 _bulk 請求)的大小由 flush_size 決定。如果這個設置過大(例如超過 1000 條記錄),每次寫入請求的大小將會非常大,這會對 Elasticsearch 造成較高的負擔,可能導致請求排隊或無法及時處理。
寫入延遲:大批量寫入請求可能會導致等待時間過長,從而進一步加劇連線池的壓力。
"""
相關FLDS/DLDS同步資料問題: #10
是由 martin zhuo 於 約 1 年 前更新 · 已被編輯
12/12 修改logstash docker:
只啟動即時pipeline的docker,限制2 CPU、2.5 MEMORY

是由 martin zhuo 於 約 1 年 前更新
- 私人 從 否 變更為 是
目前logstash設定:為從PG撈取11/1-11/30的所有資料,以每100筆批次讀取。
一旦數據提取完成,Logstash 將其放入內部事件處理管道中,而寫入ES以flush_size批次寫入。
預設flush_size=500筆,idle_flush_time=1s。flush_size 不能超过 Logstash 的 pipeline.batch.size,否则将以pipeline.batch.size为批量发送的大小。
pipeline.batch.size 是 Logstash 處理事件時的內部批量大小。
idle_flush_time是Logstash在累積到flush_size之前的等待時間,但超過了 idle_flush_time,Logstash 會強制執行批量操作
Logstash 並非一次性將整個查詢結果載入內存,而是按 db_fetch_size 分批讀取以減少內存壓力。
output {
elasticsearch {
flush_size => 20000
idle_flush_time => 10
在每次input->filter階段休息幾秒再執行filter->output,讓大量請求都等待兩秒再執行,並不能達到每次output都等待一段時間間隔的效果,因為query階段
filter {
ruby {
code => "sleep(2)" # 每次事件處理後延遲 2 秒
Logstash 的處理方式是 流式處理(streaming processing),並不會等待所有數據(例如你的 1 千萬筆 SQL 查詢結果)都讀取完畢後才進入後續的 filter 和 output 階段。相反,它會依據 pipeline.batch.size 等配置,分批處理數據。
Logstash 的處理流程
Input 插件
Input 插件(例如 JDBC 插件)負責從數據源(如數據庫)查詢數據。
查詢結果會被逐步送入 Logstash 的內部隊列,而不會一次性讀取所有數據。
Pipeline 緩衝機制
Logstash 的管道有內部緩衝,受 pipeline.batch.size 和 pipeline.workers 控制。
每次從內部隊列提取最多 pipeline.batch.size 條事件,進入 filter 和 output 階段。
Filter 和 Output 階段
提取的批次事件會經過 filter 插件處理。
經過過濾後的數據進入 output 插件(如 Elasticsearch 插件)進行寫入。
整個流程是以批次方式分段執行,直到所有數據都被處理。
對應措施:
1.目前logstash等待連線5秒 / retry 5次 -> 可考慮延長時間及retry次數
2.增加logstash每次寫入DB的時間間隔
3.延長logstash等待連線時間:5s -> 30s
4.調高ES連線池總數量
5.更改SQL設計為,撈取PG 11/1-11/2資料,下一個排程撈取11/2-11/3資料,依此類推
是由 martin zhuo 於 約 1 年 前更新
將logastash拆分2個docker即時資料pipeline、歷史資料pipeline,目前運作正常,因此close issue

