索引的構成 在看IndicesService服務中移除索引的前提,先瞭解一個Index類的構成,也就是索引的一些基本信息,代碼貼圖如下: 主要的信息就兩個:一個是name,表示索引名稱,一個是uuid,表示索引的唯一標識。ok,瞭解這個之後。我們開始表述我們的正題,索引是怎麼刪除的,要刪除哪些信息。 ...
索引的構成
在看IndicesService服務中移除索引的前提,先瞭解一個Index類的構成,也就是索引的一些基本信息,代碼貼圖如下:
主要的信息就兩個:一個是name,表示索引名稱,一個是uuid,表示索引的唯一標識。ok,瞭解這個之後。我們開始表述我們的正題,索引是怎麼刪除的,要刪除哪些信息。
index刪除過程
在indicesService類中的removeIndex方法進行索引的刪除操作, 執行流程如下:
1:創建一個Map<String,IndexService>類型的HashMap叫做newIndices,將indicesService中indices中的數據複製到newIndices中
2:通過uuid將newIndices中的IndexService移除,並返回IndexService對象
3:通過unmodifiableMap方法,將newIndices 賦值給indices,並將indices設置為final。
備註: unmodifiableMap是一個java內置方法,將指定的對象設置為final並返回新的對象。這裡indices初始化是一個volatile(不懂volatile可查閱具體資料),通過一個新的map對象,也就是newIndices來保證indices操作的線程安全.因為newIndices是線程內部,屬於線程私有。
4:關閉分片,將分片的狀態置為close,將移除原因設置為DELETE
5:關閉bitsetFilterCache,indexCache,indexFieldData,mapperService,refreshTask,fsyncTask,trimTranslogTask,globalCheckpointTask這些服務
6:執行刪除操作,如果刪除失敗,將索引添加到pendingDeletes 中,表示當前索引已經掛起,為不可用的狀態。
備註:執行刪除主要是文件刪除操作,刪除的文件是我們配置的節點data目錄下,每個目錄${basepath}/nodes/0/indices下,basepath是我們在安裝集群時創建的路徑,而nodes/0/indices是預設路徑,在indices中以index的uuid為文件夾名稱的文件夾是所有的數據目錄,在刪除的時候就是通過uuid來刪除這個目錄。這個目錄我查看的是5.1.1的版本。
要刪除的信息就是上面截圖中的文件夾。這也是我們數據的主要存儲目錄
7:刪除所有的index元數據信息(這個起到一個保護機制,保證刪除索引不會重新作為一個新的空索引導入,所以徹底刪除掉。但是後面的ES版本應該會將元數據信息做一個備份或者標誌一個已刪除的狀態,而不是全部刪除清空)
ok,索引的刪除操作就是這樣的,在後面會繼續分析這服務的其他操作,索引的創建,分片等elasticsearch的一些知識,中間還會涉及到一些內置的配置信息,會告訴你通過這些配置我們可以起到怎樣的作用,怎麼優化elasticseach等。