擴容
副本分片可以動態的增加副本分片的數目,但是主分片不可以。
擴容本質上就是遷移分片至新的節點以達到擴容的目的。
如果有6個分片(3主3從),那麼就可以擴容至6個節點。每個節點存放一個分片,並且每個分片擁有該節點的全部資源。
如果想要擴容超過6個節點怎麼辦?
主分片的數目在創建索引的時候就已經確定。這個數目定義了這個索引能夠存儲的最大數據量。但是讀操作可以被主分片和副本分片同時處理,所以增大副本分片的數量可以提高吞吐量,集羣搜索性能將大幅度提升。
如果只是在一個集羣同數量的節點上增加副本數量並不會增加性能,因爲每個分片從節點上分到的資源會變少,需要增加硬件資源來提升吞吐量。
副本分片數量增加數據冗餘性。
擴容的兩種方法
方式一:垂直擴容
例如當前的服務器能夠容納1T的數量,現在數據量達到了10T,直接購買一臺10T的服務器進行替換。
方式二:水平擴容
增加多臺擁有類似性能的服務器構成集羣。
es一般採用方式二水平擴容的方式進行擴容。從成本上來說,內存容量小,並且性能相對較低的服務器相比較與內存容量大,性能好的服務器,在價格上的差距不是一個量級的。從另一方面來說,elasticSearch是一套分佈式的系統,分佈式的存在也是爲存放大量的數據。講到elasticSearch的擴容,自然就會想到shard和replica shard。
elasticSearch擁有cluster discovery(集羣發現機制),當我們啓動一個新的節點,該節點會發現集羣並且自動加入到集羣中。並且es集羣會自動進行各個shard之間的數據均衡處理。並且當節減少時,es集羣也會自動將減少的節點中的數據移到其他正在運行的節點中。所以elasticSearch一般選擇水平擴容的方式
容災
ES有很完善的容災機制,候選master一般有多個,data節點也有多個,因此節點異常的時候通過訪問切換到其他節點來容災。
1.故障發現
master會定時去ping其他節點(包括其他master節點),datanode也會去ping master節點。
Discovery.zen.fd.ping_interval=1s 默認每隔1秒探測1次
Discovery.zen.fd.ping_timeout=30s 默認ping探測的超時時間爲30秒
Discovery.zen.fd.ping_retry=3 默認重試3次
2.節點切換
master節點切換
當其他節點探測到master異常且超過重試次數後,候選master節點會進行競爭,規則:
1.每次選舉每個節點會把自己所知道的候選master節點根據nodeid進行一次排序,然後選出第一個節點,暫且認爲它是master節點
2.如果對某個幾點的投票數達到 候選master數/2+1 個(防止腦裂的發生)並且該節點也選舉自己爲master,那麼這個節點即爲master,否則重新選舉。
data節點切換
當master節點檢測到某個data節點有異常的時候:
1.master剔除該data節點,如果有副本,此時數據不丟失,集羣狀態爲yellow;如果沒有副本,則數據丟失,集羣狀態爲red。
2.master找出該異常data節點的所有分片,如果該節點上有主分片,則將其他節點上的副本分片提升爲主分片;該節點的所有主分片恢復後,該異常data節點所涉及的數據讀寫都恢復正常。
3.集羣狀態恢復爲green