主頁 >  其他 > 解密Elasticsearch:深入探究這款搜索和分析引擎

解密Elasticsearch:深入探究這款搜索和分析引擎

2023-05-07 08:12:34 其他

作者:京東保險 管順利

開篇

最近使用Elasticsearch實作畫像系統,實作的dmp的資料中臺能力,同時調研了競品的架構選型,以及重溫了redis原理等,特此做一次es的總結和回顧,網上沒看到有人用Elasticsearch來完成畫像的,我來做第一次嘗試,

背景說完,我們先思考一件事,使用記憶體系統做資料庫,他的優點是什么?他的痛點是什么?

一、原理

這里不在闡述全貌,只聊聊通訊、記憶體、持久化三部分,

通訊

es集群最小單元是三個節點,兩個從節點搭配保證其高可用也是集群化的基礎,那么節點之間RPC通訊用的是什么?必然是netty,es基于netty實作了Netty4Transport的通訊包,初始化Transport后建立Bootstrap,通過MessageChannelHandler完成接收和轉發,es里區分server和client,如圖1,序列化使用的json,es在rpc設計上偏向于易用、通用、易理解,而不是單追求性能,

圖1

有了netty的保駕護航使得es放心是使用json序列化,

記憶體

圖2

es記憶體分為兩部分【on heap】和【off heap】,on heap這部分由es的jvm管理,off heap則是由lucene管理,on heap 被分為兩部分,一部分可以回收,一部分不能回收,

能回收的部分index buffer存盤新的索引檔案,當被填滿時,緩沖區的檔案會被寫入到磁盤segment上,node上共享所有shards,

不能被回收的有node query cache、shard request cache、file data cache、segments cache

node query cache是node級快取,過濾后保存在每個node上,被所有shards共享,使用bitset資料結構(布隆優化版)關掉了評分,使用的LRU淘汰策略,GC無法回收,

shard request cache是shard級快取,每個shard都有,默認情況下該快取只存盤request結果size等于0的查詢,所以該快取不會被hits,但卻快取hits.total,aggregations,suggestions,可以通過clear cache api清除,使用的LRU淘汰策略,GC無法回收,

file data cache 是把聚合、排序后的data快取起來,初期es是沒有doc values的,所以聚合、排序后需要有一個file data來快取,避免磁盤IO,如果沒有足夠記憶體存盤file data,es會不斷地從磁盤加載資料到記憶體,并洗掉舊的資料,這些會造成磁盤IO和引發GC,所以2.x之后版本引入doc values特性,把檔案構建在indextime上,存盤到磁盤,通過memory mapped file方式訪問,甚至如果只關心hits.total,只回傳doc id,關掉doc values,doc values支持keyword和數值型別,text型別還是會創建file data,

segments cache是為了加速查詢,FST永駐堆內記憶體,FST可以理解為前綴樹,加速查詢,but!!es 7.3版本開始把FST交給了堆外記憶體,可以讓節點支持更多的資料,FST在磁盤上也有對應的持久化檔案,

off heap 即Segments Memory,堆外記憶體是給Lucene使用的, 所以建議至少留一半的記憶體給lucene,

es 7.3版本開始把tip(terms index)通過mmp方式加載,交由系統的pagecache管理,除了tip,nvd(norms),dvd(doc values), tim(term dictionary),cfs(compound)型別的檔案都是由mmp方式加載傳輸,其余都是nio方式,tip off heap后的效果jvm占用量下降了78%左右,可以使用_cat/segments API 查看 segments.memory記憶體占用量,

由于對外記憶體是由作業系統pagecache管理記憶體的,如果發生回收時,FST的查詢會牽扯到磁盤IO上,對查詢效率影響比較大,可以參考linux pagecache的回收策略使用雙鏈策略,

持久化

es的持久化分為兩部分,一部分類似快照,把檔案快取中的segments 重繪(fsync)磁盤,另一部分是translog日志,它每秒都會追加操作日志,默認30分鐘刷到磁盤上,es持久化和redis的RDB+AOF模式很像,如下圖

圖3

上圖是一個完整寫入流程,磁盤也是分segment記錄資料,這里濡染跟redis很像,但是內部機制沒有采用COW(copy-on-write),這也是查詢和寫入并行時load被打滿的原因所在,

小結

es記憶體和磁盤的設計上非常巧妙,零拷貝上采用mmap方式,磁盤資料映射到off heap,也就是lucene,為了加速資料的訪問,es每個segment都有會一些索引資料駐留在off heap里;因此segment越多,瓜分掉的off heap也越多,這部分是無法被GC回收!

結合以上兩點可以清楚知道為什么es非常吃記憶體了,

二、應用

用戶畫像系統中有以下難點需要解決,

1.人群預估:根據標簽選出一類人群,如20-25歲的喜歡電商社交的男性,20-25歲∩電商社交∩男性,通過與或非的運算選出符合特征的clientId的個數,這是一組,

我們組與組之前也是可以在做交并差的運算,如既是20-25歲的喜歡電商社交的男性,又是北京市喜歡擼鐵的男性,(20-25歲∩電商社交∩男性)∩(20-25歲∩擼鐵∩男性),對于這樣的遞回要求在17億多的畫像庫中,秒級回傳預估人數,

2.人群包圈選:上述圈選出的人群包, 要求分鐘級構建,

3.人包判定:判斷一個clientId是否存在若干個人群包中,要求10毫秒回傳結果,

我們先嘗試用es來解決以上所有問題,

人群預估,最容易想到方案是在服務端的記憶體中做邏輯運算,但是圈選出千萬級的人群包人數秒級回傳的話在服務端做代價非常大,這時候可以吧計算壓力拋給es存盤端,像查詢資料庫一樣,使用一條陳述句查出我們想要的資料來,

例如mysql

select a.age from a where a.tel in (select b.age from b);

對應的es的dsl類似于

{"query":{"bool":{"must":[{"bool":{"must":[{"term":{"a9aa8uk0":{"value":"age18-24","boost":1.0}}},{"term":{"a9ajq480":{"value":"male","boost":1.0}}}],"adjust_pure_negative":true,"boost":1.0}},{"bool":{"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}}}

這樣使用es的高檢索性能來滿足業務需求,無論所少組,組內多少的標簽,都打成一條dsl陳述句,來保證秒級回傳結果,

使用官方推薦的RestHighLevelClient,實作方式有三種,一種是拼json字串,第二種呼叫api去拼字串,我使用第三種方式BoolQueryBuilder來實作,比較優雅,它提供了filter、must、should和mustNot方法,如

     /**
     * Adds a query that <b>must not</b> appear in the matching documents.
     * No {@code null} value allowed.
     */
    public BoolQueryBuilder mustNot(QueryBuilder queryBuilder) {
        if (queryBuilder == null) {
            throw new IllegalArgumentException("inner bool query clause cannot be null");
        }
        mustNotClauses.add(queryBuilder);
        return this;
    }

    /**
     * Gets the queries that <b>must not</b> appear in the matching documents.
     */
    public List<QueryBuilder> mustNot() {
        return this.mustNotClauses;
    }

使用api的可以大大的show下編代碼的能力,

構建人群包,目前我們圈出最大的包有7千多萬的clientId,想要分鐘級別構建完(7千萬資料在條件限制下35分鐘構建完)需要注意兩個地方,一個是es深度查詢,另一個是批量寫入,

es分頁有三種方式,深度分頁有兩種,后兩種都是利用游標(scroll和search_after)滾動的方式檢索,

scroll需要維護游標狀態,每一個執行緒都會創建一個32位唯一scroll id,每次查詢都要帶上唯一的scroll id,如果多個執行緒就要維護多個游標狀態,search_after與scroll方式相似,但是它的引數是無狀態的,始侄訓針對對新版本的搜索器進行決議,它的排序順序會在滾動中更改,scroll原理是將doc id結果集保留在協調節點的背景關系里,每次滾動分批獲取,只需要根據size在每個shard內部按照順序取回結果即可,

寫入時使用執行緒池來做,注意使用的阻塞佇列的大小,還要選擇適的拒絕策略(這里不需要拋例外的策略),批量如果還是寫到es中(比如做了讀寫分離)寫入時除了要多執行緒外,還有優化寫入時的refresh policy,

人包判定介面,由于整條業務鏈路非常長,這塊檢索,上游服務設定的熔斷時間是10ms,所以優化要優化es的查詢(也可以redis)畢竟沒負責邏輯處理,使用執行緒池解決IO密集型優化后可以達到1ms,tp99高峰在4ms,

三、優化、瓶頸與解決方案

以上是針對業務需求使用es的解題方式,還需要做回應的優化,同時也遇到es的瓶頸,

1.首先是mapping的優化,畫像的mapping中fields中的type是keyword,index要關掉,人包中的fields中的doc value關掉,畫像是要精確匹配;人包判定只需要結果而不需要取值,es api上人包計算使用filter去掉評分,filter內部使用bitset的布隆資料結構,但是需要對資料預熱,寫入時執行緒不易過多,和核心數相同即可;調整refresh policy等級,手動刷盤,構建時index.refresh_interval 調整-1,需要注意的是停止刷盤會加大堆記憶體,需要結合業務調整刷盤頻率,構建大的人群包可以將index拆分成若干個,分散存盤可以提高回應,目前幾十個人群包還是能支撐,如果日后成長到幾百個的時候,就需要使用bitmap來構建存盤人群包,es對檢索性能很卓越,但是如遇到寫操作和查操作并行時,就不是他擅長的,比如人群包的資料是每天都在變化的,這個時候es的記憶體和磁盤io會非常高,上百個包時我們可以用redis來存,也可以選擇使用MongoDB來存人包資料,

四、總結

以上是我們使用Elasticsearch來解決業務上的難點,同時發現他的持久化沒有使用COW(copy-on-write)方式,導致在實時寫的時候檢索性能降低,

使用記憶體系統做資料源有點非常明顯,就是檢索塊!尤其再實時場景下堪稱利器,同時痛點也很明顯,實時寫會拉低檢索性能,當然我們可以做讀寫分離,拆分index等方案,

除了Elasticsearch,我們還可以選用ClickHouse,ck也是支持bitmap資料結構,甚至可以上Pilosa,pilosa本就是BitMap Database,

參考

貝殼DMP平臺建設實踐

Mapping parameters | Elasticsearch Reference [7.10] | Elastic

Elasticsearch 7.3 的 offheap 原理

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/551815.html

標籤:其他

上一篇:CUDA 的亂數演算法 API

下一篇:返回列表

標籤雲
其他(158565) Python(38118) JavaScript(25404) Java(18023) C(15222) 區塊鏈(8262) C#(7972) AI(7469) 爪哇(7425) MySQL(7165) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5335) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4565) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1965) Web開發(1951) HtmlCss(1932) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1874) .NETCore(1857) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 解密Elasticsearch:深入探究這款搜索和分析引擎

    最近使用Elasticsearch實作畫像系統,實作的dmp的資料中臺能力。同時調研了競品的架構選型。以及重溫了redis原理等。特此做一次es的總結和回顧。網上沒看到有人用Elasticsearch來完成畫像的。我來做第一次嘗試。 ......

    uj5u.com 2023-05-07 08:12:34 more
  • CUDA 的亂數演算法 API

    參考自 Nvidia cuRand 官方 API 檔案 一、具體使用場景 如下是是在 dropout 優化中手寫的 uniform_random 的 Kernel: #include <cuda_runtime.h> #include <curand_kernel.h> __device__ inl ......

    uj5u.com 2023-05-07 08:12:30 more
  • 決議智慧園區的發展瓶頸

    智能化工園區通過資訊化實作工業管理的數字化和網路化,實作對生產程序的全面監控和實時資料采集。這使企業能夠更好地管理,及時發現問題并采取相應的措施來降低成本。此外,智慧化管理提高了企頁澩的使用效率,避免浪費和重復利用資源,降低成本。 在當前經濟發展和技術進步的背景下,智慧園區的建設已經成為推進城市數 ......

    uj5u.com 2023-05-07 08:12:23 more
  • 使用Aidlux,輕松落地電力巡檢AI應用

    本專案參考AidLux AI 實戰訓練營內容,3-4個課時落地AI應用 電力線路是電力系統的重要組成部分, 它的安全可靠運行直接關系到一個國家經濟的穩定發展。 電力線路一旦出現故障,則有可能影響到成片區域的供電安全, 嚴重的甚至造成不可估量的損失。 因此, 預防電力線路故障預防歷來是電力系統的一項重 ......

    uj5u.com 2023-05-07 08:11:57 more
  • 倆小伙一晚上寫了個 AI 應用,月入兩萬??(文末附開發教程)

    開發出一款能夠與 AI 對話生成和編輯思維導圖的工具,聽起來似乎只能是一群專業的 AI 背景團隊花費大量的時間和精力訓練模型,打磨應用才能完成的事情。 但是,兩名大學生卻在一夜之間完成了,就像煉金術士將庸俗的材料轉化成黃金一樣,他們將代碼轉化為了神奇的工具,下面我們來一起揭開這個神奇工具背后的秘密。 ......

    uj5u.com 2023-05-07 08:11:45 more
  • CUDA 的亂數演算法 API

    參考自 Nvidia cuRand 官方 API 檔案 一、具體使用場景 如下是是在 dropout 優化中手寫的 uniform_random 的 Kernel: #include <cuda_runtime.h> #include <curand_kernel.h> __device__ inl ......

    uj5u.com 2023-05-07 08:11:34 more
  • 【問題排查篇】一次業務問題對 ES 的 cardinality 原理探究

    小編作業中負責業務的一個服務端系統,使用了 Elasticsearch 服務做資料存盤,業務運營人員反饋,用戶在使用該產品時發現,用戶后臺統計的訂單筆數和匯出的訂單筆數不一致!對此進行排查并進行總結 ......

    uj5u.com 2023-05-07 08:11:10 more
  • 分布式場景下,如何對外提供易變的服務,打造可靠的注冊中心?

    摘要:本文講了關于服務發現的很多干貨內容,核心內容為服務發現組件的選擇、網關的介紹、 客戶端側如何發給已發現的服務。 本文分享自華為云社區《分布式場景下,如何對外提供易變的服務,打造可靠的注冊中心?》,作者:breakDawn。 隨著云原生的概念越來越火,服務的架構應該如何發展和演進,成為很多程式員 ......

    uj5u.com 2023-05-07 08:10:55 more
  • Istio資料面新模式:Ambient Mesh技術決議

    摘要:Ambient Mesh以一種更符合大規模落地要求的形態出現,克服了大多數Sidecar模式的固有缺陷,讓用戶無需再感知網格相關組件,真正將網格下沉為基礎設施。 本文分享自華為云社區《華為云云原生團隊:Istio資料面新模式 Ambient Mesh技術決議》,作者: 云容器大未來。 如果說在 ......

    uj5u.com 2023-05-07 08:10:32 more
  • Grafana 系列-統一展示-1-開篇

    本文為系列文章-Grafana 統一展示,包括 Metrics、Tracing、Logging,并盡量實作在它們之間相互跳轉。通過 Grafana
    LTM(Loki、Tempo、Mimir)可以實作比較完美的效果,但是即使沒有 Grafana LTM, 通過其他 Grafana +
    其他工具... ......

    uj5u.com 2023-05-07 08:10:03 more