es存儲訂單
㈠ ES數據存儲可靠性和寫入流程
https://www.elastic.co/guide/en/elasticsearch/guide/2.x/near-real-time.html
https://www.elastic.co/guide/en/elasticsearch/guide/2.x/merge-process.html
1、數據存儲可靠性保證原理
1.1 translog機制
當一個文檔寫入Lucence後是存儲在內存中的,即使執行了refresh操作仍然是在文件系統緩存中,如果此時伺服器宕機,那麼這部分數據將會丟失
當進行文檔寫操作時會先將文檔寫入Lucene,然後寫入一份到translog,寫入translog是落盤的
tips:如果對可靠性要求不是很高,也可以設置非同步落盤,可以提高性能,由配置index.translog.rability和index.translog.sync_interval控制
tips:translog是追加寫入,因此性能比較好
先寫入Lucene再寫入translog。原因是寫入Lucene可能會失敗,為了減少寫入失敗回滾的復雜度,因此先寫入Lucene
1.2 flush操作
refresh_interval定時觸發 或當translog達到index.translog.flush_threshold_size(默認512mb),ES會觸發一次flush操作:先執行refresh操作將buffer中的數據生成segment,然後調用lucene的commit方法將所有內存中的segment fsync到磁碟,最後會清空translog中的數據(6.x版本為了實現sequenceIDs,不刪除translog) 。
1.3 merge操作
refresh操作會產生大量的小segment,因此產生的每個文件都會消耗文件句柄,內存,CPU 使用等各種資源。更重要的是每個查詢請求都要順序檢查每個segment; segment越多檢索會越慢.
ES會運行一個檢測任務,在後台把近似大小的segment合並成一個新的大segment,並刪除舊segment
1.4、多副本機制
ES有多副本機制(默認是1個副本),一個分片的主副分片不能分片在同一個節點上,進一步保證數據的可靠性。
2、ES寫索引的流程
㈡ ES大數據量下的查詢優化
filesystem類似於我們在mysql上建立一層redis緩存;
es的搜索引擎嚴重依賴於底層的filesystem cache,如果給filesystem cache更多的內存,盡量讓內存可以容納所有的indx segment file索引數據文件,那麼你搜索的時候就基本都是走內存的,性能會非常高。
兩者差距非常大,走磁碟和走systenfile cache的讀取的性能差距可以說是秒級和毫秒級的差距了;
要讓es性能要好,最佳的情況下,就是我們的機器的內存,至少可以容納你的數據量的一半
最佳的情況下,是僅僅在es中就存少量的數據,存儲要用來搜索的那些索引,內存留給filesystem cache的,如果就100G,那麼你就控制數據量在100gb以內,相當於是,你的數據幾乎全部走內存來搜索,性能非常之高,一般可以在1秒以內
的少數幾個欄位就可以了,比如說,就寫入es id name age三個欄位就可以了,然後你可以把其他的欄位數據存在mysql裡面,我們一般是建議用 es + hbase 的一個架構。
hbase的特點是適用於海量數據的在線存儲,就是對hbase可以寫入海量數據,不要做復雜的搜索,就是做很簡單的一些根據id或者范圍進行查詢的這么一個操作就可以了
如果確實內存不足,但是我們又存儲了比較多的數據,比如只有30g給systemfile cache,但是存儲了60g數據情況,這種情況可以做數據預熱;
我們可以將一些高頻訪問的熱點數據(比如微博知乎的熱榜榜單數據,電商的熱門商品(旗艦版手機,榜單商品信息)等等)提前預熱,定期訪問刷到我們es里;(比如定期訪問一下當季蘋果旗艦手機關鍵詞,比如現在的iphone12)
對於那些你覺得比較熱的,經常會有人訪問的數據,最好做一個專門的緩存預熱子系統,就是對熱數據,每隔一段時間,提前訪問一下,讓數據進入filesystem cache裡面去。這樣下次別人訪問的時候,一定性能會好一些。
我們可以將冷數據寫入一個索引中,然後熱數據寫入另外一個索引中,這樣可以確保熱數據在被預熱之後,盡量都讓他們留在filesystem os cache里,別讓冷數據給沖刷掉。
盡量做到設計document的時候就把需要數據結構都做好,這樣搜索的數據寫入的時候就完成。對於一些太復雜的操作,比如join,nested,parent-child搜索都要盡量避免,性能都很差的。
es的分頁是較坑的 ,為啥呢?舉個例子吧,假如你每頁是10條數據,你現在要查詢第100頁,實際上是會把 每個shard上存儲的前1000條數據都查到 一個協調節點上,如果你有個5個shard,那麼就有5000條數據,接著 協調節點對這5000條數據進行一些合並、處理,再獲取到最終第100頁的10條數據。
因為他是分布式的,你要查第100頁的10條數據,你是不可能說從5個shard,每個shard就查2條數據?最後到協調節點合並成10條數據?這樣肯定不行,因為我們從單個結點上拿的數據幾乎不可能正好是所需的數據。我們必須得從每個shard都查1000條數據過來,然後根據你的需求進行排序、篩選等等操作,最後再次分頁,拿到裡面第100頁的數據。
你翻頁的時候,翻的越深,每個shard返回的數據就越多,而且協調節點處理的時間越長。非常坑爹。所以用es做分頁的時候,你會發現越翻到後面,就越是慢。
我們之前也是遇到過這個問題,用es作分頁,前幾頁就幾十毫秒,翻到10頁之後,幾十頁的時候,基本上就要5~10秒才能查出來一頁數據了
你系統不允許他翻那麼深的頁,或者產品同意翻的越深,性能就越差
如果是類似於微博中,下拉刷微博,刷出來一頁一頁的,可以用scroll api
scroll api1 scroll api2
scroll會一次性給你生成所有數據的一個快照,然後每次翻頁就是通過游標移動 ,獲取下一頁下一頁這樣子,性能會比上面說的那種分頁性能也高很多很多
scroll的原理實際上是保留一個數據快照,然後在一定時間內,你如果不斷的滑動往後翻頁的時候,類似於你現在在瀏覽微博,不斷往下刷新翻頁。那麼就用scroll不斷通過游標獲取下一頁數據,這個性能是很高的,比es實際翻頁要好的多的多。
缺點:
㈢ ES的存儲系統
ES 內嵌式存儲系統ES (內嵌式存儲系統(embedded storage,ES))
內嵌式存儲系統(embedded storage,ES),就是把存儲介質內嵌在伺服器中,就好比現在PC中的硬碟。
優點是安裝簡單,維護方便。
缺點是每個伺服器所能夠連接的存儲介質很有限,同時存儲容量和存取速度都受到伺服器性能的限制。內嵌式存儲系統的一個致使缺點是所存儲信息的安全性和可用性必須依賴伺服器,如果伺服器出現故障,其所存儲的信息將不可用。
所以說,內嵌式存儲系統是一個封閉的系統。

㈣ 為什麼ES不適合做數據存儲
es?
什麼意思?
es文件管理器?》
