1. 產品的架構是數據采集到 kafka,由 flink 讀取,送入ES
2. 這個過程中,涉及: kafka分區數,flink並行度,ES 分區數和副本
3. kafka 分區數決定了后面 flink 的並行度,最好是 kafka 的分區數和 flink 的並行度一致,flink的並行度最好和ES的分片數相等,這樣能並行寫入;
4. 寫入 ES 時,需要先決定是按天建立索引還是按月建立索引,我一般是跨度超過1年的離線數據按月建立索引,跨度不超過一個月的數據按天建立索引;另外還需要考察一天或者一個月中的數據量,如果數據量超過幾十億,分片數最好設的大一點,設置成10個以上,可以加快查詢
5. 寫入ES時,可以將副本數暫時設置為 0,以提高寫入速度,寫入完成后,可以將副本數動態修改為 1或者2;
6. 使用 kibana 對 ES 性能進行監控,Kinban 對ES的監控非常完善,足以滿足需求;
7. 使用 Kibana 監控如果發現 ES 的 index rate 與理論值相差甚遠,就要想辦法提高速度,主要有兩個辦法,分別是針對單個任務的提高速度以及建立多個任務提高速度
> 單個任務提高速度可以使用並行寫入,主要是 kafka 分區數設置的多一些,flink 任務的並行度與kakfa分區數一致,但是這種方法有時候並不能提高速度,因為寫入速度還受到其他因素影響,例如寫入數據的復雜度,IO等;
> 如果單個任務不能使 ES 接近理論速度,可以同時跑多個ES寫入任務,例如A、B、C三個任務,A任務雖然只有理論值的一半(可能是寫入的數據格式比較復雜),但是如果IO沒有達到瓶頸,通過通過疊加B、C兩個任務來使 ES 接近理論速度;
下圖是不同參數調價下的ES index 速率和 segment count值
第一個波峰的index rate 在 1200/s 參數為 3 個 shard, 3個 replica, refresh rate = 1s
第二個波峰的 index rate 在 2500/s 參數為 3個 shard, 0 個 replica, refresh rate = 12s
第三個波峰采用 2 個並發寫入,index rate 約為 5000/s,參數為 3個 shard, 0個 replica, refresh rate = 12s