ES實時索引原理

2021-08-22 07:11:01 字數 2836 閱讀 2971

目錄結構:

data——nodes——indices——shade(lucence分片)

比如:/opt/search/elasticsearch-node1/data/elasticsearch/nodes/0/indices/logstash-custom-2018.07.27/0/index

這裡第乙個0即是es的節點,indices是es的索引,第二個0是兩個主分片之一,再下面的index是lucence級別的索引,不在es管控範圍了

-rw-rw-r-- 1 elk elk 28810702 jul 27 12:07 _azn.fdt

-rw-rw-r-- 1 elk elk    26297 jul 27 12:07 _azn.fdx

-rw-rw-r-- 1 elk elk     3284 jul 27 12:07 _azn.fnm

-rw-rw-r-- 1 elk elk  7354691 jul 27 12:07 _azn_lucene50_0.doc

-rw-rw-r-- 1 elk elk  3752835 jul 27 12:07 _azn_lucene50_0.pos

-rw-rw-r-- 1 elk elk 10424860 jul 27 12:07 _azn_lucene50_0.tim

-rw-rw-r-- 1 elk elk   203984 jul 27 12:07 _azn_lucene50_0.tip

-rw-rw-r-- 1 elk elk  6571232 jul 27 12:07 _azn_lucene54_0.***

-rw-rw-r-- 1 elk elk     1489 jul 27 12:07 _azn_lucene54_0.dvm

-rw-rw-r-- 1 elk elk   581435 jul 27 12:07 _azn.nvd

-rw-rw-r-- 1 elk elk       98 jul 27 12:07 _azn.nvm

-rw-rw-r-- 1 elk elk      570 jul 27 12:07 _azn.si

-rw-rw-r-- 1 elk elk  8744349 jul 27 14:16 _gt5.fdt

-rw-rw-r-- 1 elk elk     6505 jul 27 14:16 _gt5.fdx

-rw-rw-r-- 1 elk elk     3284 jul 27 14:16 _gt5.fnm

-rw-rw-r-- 1 elk elk  1694649 jul 27 14:16 _gt5_lucene50_0.doc

-rw-rw-r-- 1 elk elk   936611 jul 27 14:16 _gt5_lucene50_0.pos

-rw-rw-r-- 1 elk elk  2835340 jul 27 14:16 _gt5_lucene50_0.tim

-rw-rw-r-- 1 elk elk    50466 jul 27 14:16 _gt5_lucene50_0.tip

-rw-rw-r-- 1 elk elk  1631937 jul 27 14:16 _gt5_lucene54_0.***

-rw-rw-r-- 1 elk elk     1525 jul 27 14:16 _gt5_lucene54_0.dvm

-rw-rw-r-- 1 elk elk   140036 jul 27 14:16 _gt5.nvd

-rw-rw-r-- 1 elk elk       98 jul 27 14:16 _gt5.nvm

-rw-rw-r-- 1 elk elk      570 jul 27 14:16 _gt5.si

lucence級別的索引是這種格式的,同乙個檔名不同字尾的一大堆合起來是乙個索引segment。

es實時索引原理:

先校驗json,確保索引對映語法正確。lucence每次生成的倒排索引,成為乙個segment,然後用另乙個commit檔案,記錄索引內所有的segment,生成segment的資料來源則是記憶體中的buffer,lucence會把文件攢到記憶體buffer裡,定時(預設1s重新整理一下)或者等到呼叫/_flush函式(可以根據業務情況手動設定重新整理頻率,不要太頻繁)時把buffer區的內容寫到新的segment裡,也就是新的倒排索引,然後更新commit檔案。相當於乙個個索引的桶,segment生成後將不會改變。以實現實時索引。segment會隨機merge成更大的segment,同時刪除舊的segment。

注意buffer在往segment裡刷資料時,首先會寫道檔案系統的快取裡,這時雖然可以查詢得到,但一旦出現斷電等情況索引資料不會被持久化。

一般八核/十二核伺服器單節點es足夠跑滿,它跟redis這種不一樣,redis單執行緒,沒法利用多核優化,所以要開多個例項

du -sh * 檢視目錄檔案大小

df -h檢視硬碟分割槽占用

一般下,乙個index下乙個type足夠,而且es中type的概念不清晰,只是個標識

磁碟同步translog buffer:

這個就是為了避免memory buffer刷到檔案系統快取中時突發意外情況丟失資料,memory buffer刷的同時,文件會被記錄在translog buffer中,有點類似redis的aof。同時commit point的時間點也在,類似git。由此保證資料完整,和mysql等rdb不同的是,mysql的binlog可以持久化,而es的translog會定時重新整理。需要注意的是,translog本身也是寫到檔案系統快取裡的,它每隔5s會被強制重新整理到磁碟上。無副本的情況下,可能導致5s的資料丟失。

同樣需要注意,開的es副本占用的資源和單節點es相同。

segment從檔案系統重新整理到磁碟,更新commit

清空translog

預設30分鐘間隔/512mb閾值(或者呼叫/_flush介面)

Sphinx實時索引

1,首先建立乙個表用來儲存主索引和增量索引的id值 create table if not exists sph counter s id int 10 unsigned not null auto increment,p id int 11 not null,primary key s id 2,...

Sphinx 實時索引

index rtsearchd 實時索引不需要indexer,直接開啟searchd。usr local sphinx bin searchd c usr local sphinx etc csft rt.conf sphinx的實時索引配置本身並不需要資料來源 source 它的資料是要通過程式利...

Sphinx 實時索引

index rtsearchd 實時索引不需要indexer,直接開啟searchd。usr local sphinx bin searchd c usr local sphinx etc csft rt.conf sphinx的實時索引配置本身並不需要資料來源 source 它的資料是要通過程式利...