路由乙個文件到乙個分片中
當索引乙個文件的時候,文件會被儲存到乙個主分片中。
elasticsearch 如何知道乙個文件應該存放到哪個分片中呢?當我們建立文件時,它如何決定這個文件應當被儲存在分片1
還是分片2
中呢?
首先這肯定不會是隨機的,否則將來要獲取文件的時候我們就不知道從何處尋找了。實際上,這個過程是根據下面這個公式決定的:
shard = hash(routing) % number_of_primary_shards
routing
是乙個可變值,預設是文件的_id
,也可以設定成乙個自定義的值。routing
通過 hash 函式生成乙個數字,然後這個數字再除以number_of_primary_shards
(主分片的數量)後得到 餘數
。這個分布在0
到number_of_primary_shards-1
之間的餘數,就是我們所尋求的文件所在分片的位置。
這就解釋了為什麼我們要在建立索引的時候就確定好主分片的數量
並且永遠不會改變這個數量:因為如果數量變化了,那麼所有之前路由的值都會無效,文件也再也找不到了。
你可能覺得由於 elasticsearch 主分片數量是固定的會使索引難以進行擴容。實際上當你需要時有很多技巧可以輕鬆實現擴容。我們將會在擴容設計
一章中提到更多有關水平擴充套件的內容。
所有的文件 api(get
、index
、delete
、bulk
、update
以及mget
)都接受乙個叫做routing
的路由引數 ,通過這個引數我們可以自定義文件到分片的對映。乙個自定義的路由引數可以用來確保所有相關的文件——例如所有屬於同乙個使用者的文件——都被儲存到同乙個分片中。我們也會在擴容設計
這一章中詳細討論為什麼會有這樣一種需求。
分布式儲存
塊儲存,檔案儲存,物件儲存區別 分布式儲存的應用場景相對於其儲存介面,現在流行分為三種 物件儲存 也就是通常意義的鍵值儲存,其介面就是簡單的get put del和其他擴充套件,如七牛 又拍 swift s3 塊儲存 這種介面通常以qemu driver或者kernel module的方式存在,這種...
分布式儲存
普通儲存 das 直連式儲存。nas 連線式儲存。san 儲存網路。大檔案分布儲存 gfs google file system google檔案系統 hdfs hadoop distributed file system hadoop分布式檔案系統 小檔案分布儲存 adfs ali distrib...
分布式文件儲存資料庫 MongoDB
mongodb是乙個介於關聯式資料庫和非關聯式資料庫之間的產品,是非關聯式資料庫當中功能最豐富,最像關聯式資料庫的。他支援的資料結構非常鬆散,是類似json的bjson格式,因此可以儲存比較複雜的資料型別。mongo最大的特點是他支援的查詢語言非常強大,其語法有點類似於物件導向的查詢語言,幾乎可以實...