如何防止 Elasticsearch 服務 OOM ?
ES 和傳統關係型資料庫有很多區別, 比如傳統資料中普遍都有一個叫“最大連線數”的設定。目的是使資料庫系統工作在可控的負載下,避免出現負載過高,資源耗盡,誰也無法登入的局面。
那 ES 在這方面有類似引數嗎?答案是沒有,這也是為何 ES 會被流量打爆的原因之一。
針對大併發訪問 ES 服務,造成 ES 節點 OOM,服務中斷的情況,極限科技旗下的 產品(以下簡稱 “極限閘道器”)可從兩個方面入手,保障 ES 服務的可用性。
- 限制最大併發訪問連線數。
- 限制非重要索引的請求速度,保障重要業務索引的訪問速度。
下面我們來詳細聊聊。
架構圖
所有訪問 ES 的請求都發給閘道器,可部署多個閘道器。
限制最大連線數
在閘道器配置檔案中,預設有最大併發連線數限制,預設最大 10000。
entry: - name: my_es_entry enabled: true router: my_router max_concurrency: 10000 network: binding: $[[env.GW_BINDING]] # See `gateway.disable_reuse_port_by_default` for more information. reuse_port: true
使用壓測程式測試,看看到達 10000 個連線後,能否限制新的連線。
超過的連線請求,被丟棄。更多資訊參考 。
限制索引寫入速度
我們先看看不做限制的時候,測試環境的寫入速度,在 9w - 15w docs/s 之間波動。雖然峰值很高,但不穩定。
接下來,我們透過閘道器把寫入速度控制在最大 1w docs/s 。
對閘道器的配置檔案 gateway.yml ,做以下修改。
env: # env 下新增 THROTTLE_BULK_INDEXING_MAX_BYTES: 40485760 #40MB/s THROTTLE_BULK_INDEXING_MAX_REQUESTS: 10000 #10k docs/s THROTTLE_BULK_INDEXING_ACTION: retry #retry,drop THROTTLE_BULK_INDEXING_MAX_RETRY_TIMES: 10 #1000 THROTTLE_BULK_INDEXING_RETRY_DELAY_IN_MS: 100 #10router: # route 部分修改 flow - name: my_router default_flow: default_flow tracing_flow: logging_flow rules: - method: - "*" pattern: - "/_bulk" - "/{any_index}/_bulk" flow: - write_flowflow: #flow 部分增加下面兩段 - name: write_flow filter: - flow: flows: - bulking_indexing_limit - elasticsearch: elasticsearch: prod max_connection_per_node: 1000 - name: bulking_indexing_limit filter: - bulk_request_throttle: indices: "test-index": max_bytes: $[[env.THROTTLE_BULK_INDEXING_MAX_BYTES]] max_requests: $[[env.THROTTLE_BULK_INDEXING_MAX_REQUESTS]] action: $[[env.THROTTLE_BULK_INDEXING_ACTION]] retry_delay_in_ms: $[[env.THROTTLE_BULK_INDEXING_RETRY_DELAY_IN_MS]] max_retry_times: $[[env.THROTTLE_BULK_INDEXING_MAX_RETRY_TIMES]] message: "bulk writing too fast" #觸發限流告警message自定義 log_warn_message: true
再次壓測,test-index 索引寫入速度被限制在了 1w docs/s 。
限制多個索引寫入速度
上面的配置是針對 test-index 索引的寫入速度控制。如果想新增其他的索引,新增一段配置即可。
比如,我允許 abc 索引寫入達到 2w docs/s,test-index 索引最多不超過 1w docs/s ,可配置如下。
- name: bulking_indexing_limit filter: - bulk_request_throttle: indices: "abc": max_requests: 20000 action: drop message: "abc doc寫入超閾值" #觸發限流告警message自定義 log_warn_message: true "test-index": max_bytes: $[[env.THROTTLE_BULK_INDEXING_MAX_BYTES]] max_requests: $[[env.THROTTLE_BULK_INDEXING_MAX_REQUESTS]] action: $[[env.THROTTLE_BULK_INDEXING_ACTION]] retry_delay_in_ms: $[[env.THROTTLE_BULK_INDEXING_RETRY_DELAY_IN_MS]] max_retry_times: $[[env.THROTTLE_BULK_INDEXING_MAX_RETRY_TIMES]] message: "bulk writing too fast" #觸發限流告警message自定義 log_warn_message: true
限速效果如下
更多資訊參考
。
限制讀請求速度
我們先看看不做限制的時候,測試環境的讀取速度,7w qps 。
接下來我們透過閘道器把讀取速度控制在最大 1w qps 。
繼續對閘道器的配置檔案 gateway.yml 做以下修改。
- name: default_flow filter: - request_path_limiter: message: "Hey, You just reached our request limit!" rules: - pattern: "/(?P<index_name>abc)/_search" max_qps: 10000 group: index_name - elasticsearch: elasticsearch: prod max_connection_per_node: 1000
再次進行測試,讀取速度被限制在了 1w qps 。
限制多個索引讀取速度
上面的配置是針對 abc 索引的寫入速度控制。如果想新增其他的索引,新增一段配置即可。
比如,我允許 abc 索引讀取達到 1w qps,test-index 索引最多不超過 2w qps ,可配置如下。
- name: default_flow filter: - request_path_limiter: message: "Hey, You just reached our request limit!" rules: - pattern: "/(?P<index_name>abc)/_search" max_qps: 10000 group: index_name - pattern: "/(?P<index_name>test-index)/_search" max_qps: 20000 group: index_name - elasticsearch: elasticsearch: prod max_connection_per_node: 1000
多個閘道器限速
限速是每個閘道器自身的控制,如果有多個閘道器,那麼後端 ES 叢集收到的請求數等於多個閘道器限速的總和。
本次介紹就到這裡了。相信大家在使用 ES 的過程中也遇到過各種各樣的問題。歡迎大家來我們這個平臺分享自己的問題、解決方案等。如有任何問題,請隨時聯絡我,期待與您交流!
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70029458/viewspace-3007930/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在 Node 服務中發生 OOM 時,如何監控記憶體?OOM記憶體
- Spark任務OOM問題如何解決?SparkOOM
- ElasticSearch(七) Elasticsearch在Centos下搭建視覺化服務ElasticsearchCentOS視覺化
- 阿里雲釋出 Elasticsearch 雲服務阿里Elasticsearch
- 從物件儲存服務同步資料到Elasticsearch物件Elasticsearch
- 如何服務化
- 如何防止網站被侵入,如何防止網站被掛馬,如何防止網站被入侵?網站
- 利用Elasticsearch實現地理位置、城市搜尋服務Elasticsearch
- 【ElasticSearch】 使用AWS雲ES服務來分析程式日誌Elasticsearch
- 如何防止DNS汙染?DNS
- 如何使用Google服務Go
- 記錄一次docker快速啟動elasticsearch單機服務DockerElasticsearch
- 如何有效防止sql注入SQL
- 如何防止 goroutine 洩露Go
- 如何防止XSS攻擊
- eureka如何管理服務呼叫
- 如何理解服務端渲染?服務端
- python如何建立web服務PythonWeb
- [Linux]如何給Nginx新增服務LinuxNginx
- 如何使用thrift 服務引擎元件元件
- kubernetes如何訪問pod服務
- 如何為NFS服務安全加固NFS
- 本地生活服務如何推廣?
- JDBC 如何有效防止 SQL 注入JDBCSQL
- Redis如何防止高併發?Redis
- 如何防止 goroutine 洩露(二)Go
- Android App 如何防止抓包AndroidAPP
- 網站如何防止攻擊網站
- Kubernetes 服務部署最佳實踐(二) ——如何提高服務可用性
- 從零搭建Spring Boot腳手架(7):Elasticsearch應該獨立服務Spring BootElasticsearch
- inmemory OOM了OOM
- OOM(Out Of Memory)OOM
- win10 如何刪除服務 win10刪除服務方法Win10
- 如何管理服務業務中的專案收入?
- 如何用 React 做服務端渲染React服務端
- 如何管理企業通訊服務?
- 如何檢測雲服務的效能?
- 如何實現高效地IT服務管理