修改ES分片規則

2022-02-18 23:28:51 字數 1522 閱讀 3343

**:

es查詢的時候預設是隨機從一些分片中查詢資料,可以通過配置讓es從某些分片中查詢資料

1:_local

指查詢操作會優先在本地節點有的分片中查詢,沒有的話再在其它節點查詢。

2:_primary:指查詢只在主分片中查詢

3:_primary_first:指查詢會先在主分片中查詢,如果主分片找不到(掛了),就會在副本中查詢。

4:_only_node:指在指定id的節點裡面進行查詢,如果該節點只有要查詢索引的部分分片,就只在這部分分片中查詢,所以查詢結果可能不完整。如_only_node:123在節點id為123的節點中查詢。

5:_prefer_node:nodeid 優先在指定的節點上執行查詢

6:custom (string) value:隨機指定乙個值就可以。

7:_shards:0,1,2,3,4:查詢指定分片的資料

8:自定義:_only_nodes:nodeid1,nodeid2,nodeid3根據多個節點進行查詢

es預設沒有提供這種查詢方式,所以就只能修改原始碼了。

首先找到org.elasticsearch.cluster.routing.operation.plain.plainoperationrouting這個類,es搜尋時獲取分片資訊是通過這個類的。它的preferenceactivesharditerator()方法就是根據條件來找出響應的分片。

看原始碼可知其主要是根據preference這個引數來決定取出的分片的。如果沒有指定該引數,就隨機抽取分片進行搜尋。

下面的**就是根據上面說的不同情況進行的一些判斷,使用的switch case語句。

在裡面多增加一項only_nodes,這個可以接收多個節點id,這個引數需要配置到preference列舉類中,還要在這個類中的switch判斷中判斷引數_only_nodes。新增case語句。

接下來就需要完善plainoperationrouting類中的case語句判斷邏輯了。

首先獲取傳遞過來的所有節點id,以逗號分割。獲取乙個節點id的陣列,下面迴圈判斷傳遞的節點是否存在,如果不存在就拋異常。

下面就返回乙個方法的返回值,這個方法是需要我們自己實現的,這個方法可以參考上面的onlynodeactiveinitializingshardsit這個方法。

接下來完善onlynodesactiveshardsit這個方法,

這樣的話就可以從使用者指定的多個節點中獲取資料。

把專案重新打包,放到伺服器上重新啟動。

es 分片數量

適當的提公升分片數量可以提公升建立索引的速度 一般情況下 乙個索引庫建立5 20個分片是最合適的 注意 如果分片過少或者過多,都會降低檢索的速度 分片數過多會導致 1 會導致開啟比較多的檔案 2 分片是儲存在不同機器上的,分片數越多,機器之間的互動也就越多 分片數太少導致 單個分片索引過大,降低整體...

Spark Parquet分片規則

之前提到parquet.block.size所控制的parquet row group大小是乙個需要調優的spark引數。其中重要一點,就是控制任務的併發度。在hadoop裡,任務的併發預設是以hdfs block為單位的,而spark裡多了一種選擇,即以rowgroup為基本單位。在呼叫hivec...

mycat分片規則

mycat 分片規則 mycat全域性表 如果你的業務中有些資料類似於資料字典,比如配置檔案的配置,常用業務的配置或者資料量不大很少變動的表,這些表往往不 是特別大,而且大部分的業務場景都會用到,那麼這種表適合於mycat全域性表,無須對資料進行切分,只要在所有的分片上儲存一 份資料即可,mycat...