ES 的默認配置,是綜合了數據可靠性、寫入速度、搜索實時性等因素。實際使用時,我們需要根據公司要求,進行偏向性的優化。
寫優化
假設我們的應用場景要求是,每秒 300 萬的寫入速度,每條 500 字節左右。
針對這種對於搜索性能要求不高,但是對寫入要求較高的場景,我們需要盡可能的選擇恰當寫優化策略。
綜合來說,可以考慮以下幾個方面來提升寫索引的性能:
- 加大 Translog Flush ,目的是降低 Iops、Writeblock。
- 增加 Index Refresh 間隔,目的是減少 Segment Merge 的次數。
- 調整 Bulk 線程池和隊列。
- 優化節點間的任務分布。
- 優化 Lucene 層的索引建立,目的是降低 CPU 及 IO。
①批量提交
ES 提供了 Bulk API 支持批量操作,當我們有大量的寫任務時,可以使用 Bulk 來進行批量寫入。
每次提交的數據量為多少時,能達到最優的性能,主要受到文件大小、網絡情況、數據類型、集群狀態等因素影響。
④減少 Refresh 的次數 Lucene 在新增數據時,采用了延遲寫入的策略,默認情況下索引的 refresh_interval 為 1 秒。 Lucene 將待寫入的數據先寫到內存中,超過 1 秒(默認)時就會觸發一次 Refresh,然后 Refresh 會把內存中的的數據刷新到操作系統的文件緩存系統中。 如果我們對搜索的實效性要求不高,可以將 Refresh 周期延長,例如 30 秒。 這樣還可以有效地減少段刷新次數,但這同時意味着需要消耗更多的Heap內存。 如下所示: index.refresh_interval:30s