『壹』 redis集群添加節點怎麼保證不丟失數據
執行在任意一個客戶端下執行 cluster nodes 命令,可以看到7007 已經作為主節點添加到我們的集群中了,但是可以看到他沒有分配哈希槽,沒有分配哈希槽的話表示就沒有存儲數據的能力,所以我們需要將其他節點上的哈希槽分配到這個節點上。
『貳』 ElasticSearch核心之——分布式特性
ES支持集群模式,是一個分布式系統,其好處主要有兩個∶
es集群由多個ES 實例組成。不同集群通過集群名字來區分,可通過 cluster.name 進行修改,默認為elasticsearch。每個ES實例本質上是一個 JVM 進程,且有自己的名字,通過 node.name 進行修改
ES集群相關的數據稱為 cluster state ,主要記錄如下信息∶節點信息,比如節點名稱、連接地址等;索引信息,比如索引名稱、配置等
可以修改 cluster state 的節點稱為master節點,一個集群只能有一個 cluster state 存儲在每個節點上,master維護最新版本並同步給其他節點
master節點是通過集群中所有節點選舉產生的,可以被選舉的節點稱為 master-eligible 節點 ,相關配置如下: node.master: true
處理請求的節點即為coordinating節點,該節點為所有節點的默認角色,不能取消。路由請求到正確的節點處理,比如創建索引的請求到master節點
存儲數據的節點即為data節點,默認節點都是data類型,相關配置如下∶ node.data: true
談及副本和分片兩個概念之前,我們先說一下這兩個概念存在的意義: 解決系統可用性和增大系統容量
我們想像這樣一個場景,我們的數據只存放在一台ES伺服器上,那麼一旦這台ES出現宕機或者其他不可控因素影響的話,我們除了喪失了服務的可用性外,可能還存在著數據丟失的可能。同時,單機服務的存儲容量也無法應對項目對大數據量的要求。
系統可用性可以分為 服務可用性 和 數據可用性
服務可用性 含義為:當前服務掛掉後,是否有其他伺服器頂替當前節點提供服務支持。
數據可用性 含義為:當前服務掛掉後,存儲在當前伺服器上的數據,是否還可以對外提供訪問和修改的服務。
副本可以理解為是某個數據的復制體,副本和源數據內容一致。副本的存在可以有效地滿足系統可用性的需求,比如說,我們可以在原有節點的基礎上復制一個和源節點一模一樣的節點,這樣一旦原有節點掛掉了,另外一個節點也還是可以替代源節點提供服務,而且復制出來的節點擁有和源節點一樣的數據,這樣也保障了數據可用性。
我們在上一小節講到可以使用副本來解決系統可用性的問題,但是這里存在一個問題,不管存在多少個副本(節點),都無法增大源節點的存儲空間。在這個問題上,ES引入了Shard分片這個概念來解決問題。
看完分片的特點後可能還有人不太清楚到底什麼是分片,其實分片是n/1個源節點數據。比如說原ES集群中只有一個主節點,所有的索引數據都存儲在這個節點上。現在我們將某個索引數據分成3份,分別存放在3個ES節點上,那麼每台ES伺服器上就各自有1個分片shard。該索引的所有節點Shard分片的集合,就是索引的全部數據。
下面我們來演示一下:
為了更好的了解ES的分片機制,大家不妨在上面的案例上進一步思考兩個問題:
答案是不能。原因是我們創建索引時定義的分片數量只有3個,且都已經落在了3個節點上。所以即使再增加多一個節點,也不會有對應的Shard分片可以落在新的節點上,並不能擴大 test_shard_index 的數據容量。
答案是不能。因為新增的副本也是分布在這3個節點上,還是利用了同樣的資源。如果要增加吞吐量,還需要新增節點。
通過上面兩個問題,相信大家已經可以認識到分片的重要性,分片數過小,會導致後續無法通過增加節點實現水平擴容;(副本)分片數過大會導致一個節點上分布過多分片,造成資源浪費,同時會影響查詢性能
集群健康狀況,包括以下三種: green健康狀態,指所有主副分片都正常分配; yellow指所有主分片都正常分配,但是有副本分片未正常分配; red表示有主分片未分配
我們可以通過這個api查看集群的狀態信息: GET _cluster/health
我們也可以通過cerebro或者head插件來直接獲取當前集群的狀態
需要注意的是,即使當前集群的狀態為 red ,也並不代表當前的ES喪失了提供服務的能力。只是說未被分配主分片的索引無法正常存儲和操作而已。
這里故障轉移的意思是,當ES集群出現某個或者多個節點宕機的情況,ES實現服務可用性的應對策略。
這里我們新建一個分片為3,副本為1的索引,分片分別分布在三個節點,此時集群為 green
當master節點所在機器宕機導致服務終止,此時集群會如何處理呢?
我們可以看到,從node1主節點宕機到ES恢復集群可用性的過程中,ES有著自己的故障轉移機制,保障了集群的高可用性。我們也可以在自己的本地上去進行試驗,建好索引後,kill掉主節點,觀察集群狀態就行。
同時,此時就算node2宕機了,那麼node3也能夠很快的恢復服務的提供能力。
我們知道,我們創建的文檔最終會存儲在分片上,那麼在分布式集群的基礎上,ES集群是怎麼判斷當前該文檔最終應該落在哪一個分片上呢?
很顯然,我們需要一個可以實現文檔均勻分布到各個分片上的映射演算法,那麼常見的隨機演算法和round-robin(輪詢)演算法可以滿足需要嗎?答案是不可以,這兩個演算法雖然可以實現文檔均勻分布分片的存儲需要,但是當我們通過 DocumentId 查詢文檔時,ES並不能知道這個文檔ID到底存儲在了哪個節點的分片上,所以只能夠從所有分片上檢索,時間長。如果我們為這個問題建立一個文檔和分片映射關系的表,雖然確實可以快速定位到文檔對應的存儲分片,但是當文檔的數據量很大的時候,那麼檢索的效率也會隨之變低。
對於上面這個問題,ES提供的解決方法是 建立文檔到分片的映射演算法
es 通過如下的公式計算文檔對應的分片:
hash演算法 保證可以將數據均勻地分散在分片中
routing 是一個關鍵參數,默認是文檔id,也可以自行指定
number_of_primary_shards 是主分片數
我們可以看到,該演算法與主分片數相關, 這也是分片數一旦確定後便不能更改的原因
我們已經知道了ES是如何將文檔映射到分片上去了,下面我們就來詳細講解一下文檔創建、讀取的流程。
腦裂問題,英文為 split-brain ,是分布式系統中的經典網路問題,如下圖所示:
3個節點組成的集群,突然node1的網路和其他兩個節點中斷
解決方案為 僅在可選舉master-eligible節點數大於等於quorum時才可以進行master選舉
在講文檔搜索實時性之前,先講一下倒排索引的不可變更特性。由於倒排索引一旦生成,不可變更的特定,使得其有著以下3點好處:
下面,將針對Lucene實現文檔實時性搜索的幾個動作進行講解,分析其是如何在新增文檔後實現ES的搜索實時性的。
我們從上面的描述中知道,當我們新增了一個文檔後會新增一個倒排索引文件 segment ,但是 segment 寫入磁碟的時間依然比較耗時(難以實現實時性),所以ES藉助文件系統緩存的特性, 先將 segment 在緩存中創建並開放查詢來進一步提升實時性 ,該過程在es中被稱為refresh。
在refresh之前文檔會先存儲在一個buffer中,refresh時將 buffer中的所有文檔清空並生成 segment
es默認每1秒執行一次refresh,因此文檔的實時性被提高到1秒 ,這也是es被稱為近實時(Near Real Time)的原因
reflush雖然通過 將文檔存放在緩存中 的方式實現了秒級別的實時性,但是如果在內存中的segment還沒有寫入磁碟前發生了宕機,那麼其中的文檔就無法恢復了,如何解決這個問題呢?
ES 引入 translog 機制。寫入文檔到 buffer 時,同時將該操作寫入 translog 中。
translog文件會即時寫入磁碟(fsync),在ES 6.x中,默認每個請求都會落盤,我們也可以修改為每5秒寫一次,這樣風險便是丟失5秒內的數據,相關配置為index.translog.*。同時ES每次啟動時會檢查translog 文件,並從中恢復數據。
flush 負責將內存中的segment寫入磁碟,主要做如下的工作:
Reflush和Flush執行的時機
ES的做法是 首先刪除文檔,然後再創建新文檔
我們上面提到,新增文檔是通過新建segment來解決,刪除文檔是通過維護.del文件來進行的,假如現在我們設置的 reflush 時間間隔為1秒,那麼一小時單個ES索引就會生成3600個segment,一天下來乃至一個月下來會產生的segment文件數量更是不可想像。為了解決Segment過多可能引起的性能下降問題,ES中採用了Segment Merging(即segment合並)的方法來減少segment的數量。
執行合並操作的方式有兩種,一種是ES定時在後台進行 Segment Merging 操作,還有一種是我們手動執行 force_merge_api 命令來實現合並操作。
『叄』 名稱節點的數據保存在哪裡
名稱節點的數據保存在內存中。名稱節點作為中心伺服器,負責管理文件系統的命名空間及客戶端對文件的訪問。 名稱節點通常用來保存元數據。數據節點的數據保存在磁碟中。數據節點用來存儲具體的文件內容。數據節點在名稱節點的統一調用下進行數據塊的創建、刪除和復制等操作。數據節點可以有多個。
名稱節點的拓展
HDFS只設置唯一個名稱節點帶來的局限性,隔離問題,命名空間的限制,集群的可用性,性能的瓶頸。第2個副本放在與第1個副本不同的機架的數據節點上。第3個副本放在與第一個副本相同的機架的數據節點上。如果還有更多的副本,則繼續從集群中隨機選擇數據節點進行存放。
如果是在集群內發起寫操作請求,則把第一個副本放置在發起寫操作請求的數據節點上。如果是在集群外發起寫操作請求,則從集群內部挑選一台磁碟空間較為充足、CPU不太忙的數據節點,作為第一個副本的存放地。
『肆』 Elasticsearch 集群
分片:分片就是對數據切分成了多個部分,Elasticsearch 默認會把一個索引分成五個分片,
數據保存在分片內,分片又被分配到集群內的各個節點里
副本:副本就是對原分片的復制,和原分片的內容是一樣的,Elasticsearch 默認會生成一份副本,所以相當於是五個原分片和五個分片副本,相當於一份數據存了兩份,並分了十個分片
主節點:即 Master 節點。主節點的主要職責是和集群操作相關的內容,如創建或刪除索引,跟蹤哪些節點是群集的一部分,並決定哪些分片分配給相關的節點。穩定的主節點對集群的 健康 是非常重要的。默認情況下任何一個集群中的節點都有可能被選為主節點。索引數據和搜索查詢等操作會佔用大量的cpu,內存,io資源,為了確保一個集群的穩定,分離主節點和數據節點是一個比較好的選擇。雖然主節點也可以協調節點,路由搜索和從客戶端新增數據到數據節點,但最好不要使用這些專用的主節點。一個重要的原則是,盡可能做盡量少的工作。
數據節點:即 Data 節點。數據節點主要是存儲索引數據的節點,主要對文檔進行增刪改查操作,聚合操作等。數據節點對 CPU、內存、IO 要求較高,在優化的時候需要監控數據節點的狀態,當資源不夠的時候,需要在集群中添加新的節點。
負載均衡節點:也稱作 Client 節點,也稱作客戶端節點。當一個節點既不配置為主節點,也不配置為數據節點時,該節點只能處理路由請求,處理搜索,分發索引操作等,從本質上來說該客戶節點表現為智能負載平衡器。獨立的客戶端節點在一個比較大的集群中是非常有用的,他協調主節點和數據節點,客戶端節點加入集群可以得到集群的狀態,根據集群的狀態可以直接路由請求。
預處理節點:也稱作 Ingest 節點,在索引數據之前可以先對數據做預處理操作,所有節點其實默認都是支持 Ingest 操作的,也可以專門將某個節點配置為 Ingest 節點。
1.Master:主節點,每個集群都有且只有一個
盡量避免Master節點又是數據節點: node.data true
主節點的主要職責是負責集群層面的相關操作,管理集群變更,如創建或刪除索引,跟蹤哪些節點是群集的一部分,並決定哪些分片分配給相關的節點。
2.Voting:投票節點
node.voting_only = true(僅投票節點,即使配置了data.master = true,也不會參選, 但是仍然可以作為數據節點)。
3.Coordinating:協調節點
每一個節點都隱式的是一個協調節點,如果同時設置了data.master = false和data.data=false,那麼此節點將成為僅協調節點。
4.Master-eligible node(候選節點)
可以通過選舉成為Master的節點
5.Data node(數據節點)
主要負責數據存儲和查詢服務
配置:
這是ES節點默認配置,既作為候選節點又作為數據節點,這樣的節點一旦被選舉為Master,壓力是比較大的,通常來說Master節點應該只承擔較為輕量級的任務,比如創建刪除索引,分片均衡等。
只作為候選節點,不作為數據節點,可參選Master節點,當選後成為真正的Master節點。
既不當候選節點,也不作為數據節點,那就是僅協調節點,負責負載均衡
不作為候選節點,但是作為數據節點,這樣的節點主要負責數據存儲和查詢服務。
協調節點是如何工作的,他是怎麼找到對應的節點的?
每個節點都保存了集群的狀態,只有Master節點才能修改集群的狀態信息
集群狀態(Cluster Starte),維護了一個集群中,必要的信息
所有的節點信息
所有的索引和其相關的Mapping與Setting信息
分片的路由信息
協調節點作為es節點中的一個節點,默認情況下es集群中所有的節點都能當協調節點,主要作用於請求轉發,請求響應處理等輕量級操作。
這意味著如果它們接收到用戶請求,它們就可以處理用戶請求
status 欄位指示著當前集群在總體上是否工作正常。它的三種顏色含義如下:
green 所有的主分片和副本分片都正常運行。
yellow 所有的主分片都正常運行,但不是所有的副本分片都正常運行。
red 有主分片沒能正常運行
當索引一個文檔的時候,文檔會被存儲到一個主分片中。 Elasticsearch 如何知道一個文檔應該存放到哪個分片中呢?當我們創建文檔時,它如何決定這個文檔應當被存儲在分片 1 還是分片 2 中呢?
首先這肯定不會是隨機的,否則將來要獲取文檔的時候我們就不知道從何處尋找了。實際上,這個過程是根據下面這個公式決定的:
routing 是一個可變值,默認是文檔的 _id ,也可以設置成一個自定義的值。 routing 通過 hash 函數生成一個數字,然後這個數字再除以 number_of_primary_shards (主分片的數量)後得到 余數 。這個分布在 0 到 number_of_primary_shards-1 之間的余數,就是我們所尋求的文檔所在分片的位置。
我們可以發送請求到集群中的任一節點。 每個節點都有能力處理任意請求。 每個節點都知道集群中任一文檔位置,所以可以直接將請求轉發到需要的節點上。 在下面的例子中,將所有的請求發送到 Node 1 ,我們將其稱為 協調節點(coordinating node) 。
以下是在主副分片和任何副本分片上面 成功新建,索引和刪除文檔所需要的步驟順序:
consistency 一直性: 參數的值可以設為 one (只要主分片狀態 ok 就允許執行_寫_操作), all (必須要主分片和所有副本分片的狀態沒問題才允許執行_寫_操作), 或 quorum 。默認值為 quorum , 即大多數的分片副本狀態沒問題就允許執行_寫_操作。
master選舉當然是由master-eligible節點發起
深入理解 Elasticsearch 7.x 新的集群協調層:
https://easyice.cn/archives/332
Elasticsearch的選舉機制
https://www.jianshu.com/p/bba684897544
elasticsearch 選主流程
https://www.easyice.cn/archives/164
elasticsearch的master選舉機制
https://www.cnblogs.com/jelly12345/p/15319549.html
https://blog.csdn.net/ailiandeziwei/article/details/87856210
shard_num = hash(_routing) % num_primary_shards
其中 _ routing 是一個可變值,默認是文檔的 _id 的值 ,也可以設置成一個自定義的值。 _routing 通過 hash 函數生成一個數字,然後這個數字再除以 num_of_primary_shards (主分片的數量)後得到余數 。這個分布在 0 到 number_of_primary_shards-1 之間的余數,就是我們所尋求的文檔所在分片的位置。 這就解釋了為什麼我們要在創建索引的時候就確定好主分片的數量 並且永遠不會改變這個數量 :因為如果數量變化了,那麼所有之前路由的值都會無效,文檔也再也找不到了。
解釋:translog的作用:在執行commit之前,所有的而數據都是停留在buffer或OS cache之中,無論buffer或OS cache都是內存,一旦這台機器死了,內存的數據就會丟失,所以需要將數據對應的操作寫入一個專門的日誌問價之中,一旦機器出現宕機,再次重啟的時候,es會主動的讀取translog之中的日誌文件的數據,恢復到內存buffer和OS cache之中。
將現有的translog文件進行清空,然後在重新啟動一個translog,此時commit就算是成功了,默認的是每隔30分鍾進行一次commit,但是如果translog的文件過大,也會觸發commit,整個commit過程就叫做一個flush操作,我們也可以通過ES API,手動執行flush操作,手動將OS cache 的數據fsync到磁碟上面去,記錄一個commit point,清空translog文件
補充:其實translog的數據也是先寫入到OS cache之中的,默認每隔5秒之中將數據刷新到硬碟中去,也就是說,可能有5秒的數據僅僅停留在buffer或者translog文件的OS cache中,如果此時機器掛了,會丟失5秒的數據,但是這樣的性能比較好,我們也可以將每次的操作都必須是直接fsync到磁碟,但是性能會比較差。
如果時刪除操作,commit的時候會產生一個.del文件,裡面講某個doc標記為delete狀態,那麼搜索的時候,會根據.del文件的狀態,就知道那個文件被刪除了。
如果時更新操作,就是講原來的doc標識為delete狀態,然後重新寫入一條數據即可。
buffer每次更新一次,就會產生一個segment file 文件,所以在默認情況之下,就會產生很多的segment file 文件,將會定期執行merge操作
每次merge的時候,就會將多個segment file 文件進行合並為一個,同時將標記為delete的文件進行刪除,然後將新的segment file 文件寫入到磁碟,這里會寫一個commit point,標識所有的新的segment file,然後打開新的segment file供搜索使用。
段是不可改變的,所以既不能從把文檔從舊的段中移除,也不能修改舊的段來進行反映文檔的更新。 取而代之的是,每個提交點會包含一個 .del 文件,文件中會列出這些被刪除文檔的段信息。
當一個文檔被 「刪除」 時,它實際上只是在 .del 文件中被 標記 刪除。一個被標記刪除的文檔仍然可以被查詢匹配到, 但它會在最終結果被返回前從結果集中移除。
文檔更新也是類似的操作方式:當一個文檔被更新時,舊版本文檔被標記刪除,文檔的新版本被索引到一個新的段中。 可能兩個版本的文檔都會被一個查詢匹配到,但被刪除的那個舊版本文檔在結果集返回前就已經被移除。
由於自動刷新流程每秒會創建一個新的段 ,這樣會導致短時間內的段數量暴增。而段數目太多會帶來較大的麻煩。 每一個段都會消耗文件句柄、內存和cpu運行周期。更重要的是,每個搜索請求都必須輪流檢查每個段;所以段越多,搜索也就越慢。
Elasticsearch通過在後台進行段合並來解決這個問題。小的段被合並到大的段,然後這些大的段再被合並到更大的段。
段合並的時候會將那些舊的已刪除文檔從文件系統中清除。被刪除的文檔(或被更新文檔的舊版本)不會被拷貝到新的大段中。
合並大的段需要消耗大量的I/O和CPU資源,如果任其發展會影響搜索性能。Elasticsearch在默認情況下會對合並流程進行資源限制,所以搜索仍然 有足夠的資源很好地執行
https://blog.csdn.net/qq_21299835/article/details/106534644
『伍』 mysql集群中的數據節點是怎麼存儲數據的
問題1:數據節點實際就是單個的資料庫實例而已,所以數據存儲和一般實例沒有太多區別,如果你的意思是怎麼保證數據的存儲一致性,那這個話就多了,不過,其實當做master-slave的高級模式來理解就好了,只是沒有使用binlog的動態轉換分發而已
問題2:關於集群的數據恢復,打字太費力了,這篇文章還算詳細,你去看看好了
http://apps.hi..com/share/detail/18131208
最後,其中還給出了實際成功操作時的所有詳細軟體配置和版本
更多集群信息,看官網和論壇吧,MySQL Cluster NDB 7.1貌似已經可以在Windows下跑了
http://dev.mysql.com/doc/mysql-cluster-excerpt/5.1/en/mysql-cluster.html
『陸』 什麼是集群存儲
雲存儲是在雲計算(cloud computing)概念上延伸和發展出來的一個新的概念,是指通過集
群應用、網格技術或分布式文機房集中監控系統件系統等功能,將網路中大量各種不同類
型的存儲設備通過應用軟體集合起來協同工作,共同對外提供數據存儲和業務訪問功能的
一個系統。當雲計算系統運算和處理的核心是大量數據的存儲和管理時,雲計算系統中就
需要配置大量的存儲設備,那麼雲計算系統就轉變成為一個雲存儲系統,所以雲存儲是一
個以數據存儲和管理為核心的雲計算系統。他們基於虛擬化技術和集群架構,具有強大的
橫向擴展能力。雲存儲設備橫向擴展的方式讓存儲系統具有了無限擴展的能力,它能夠實
現控制器與硬碟的同時擴展,也就是性能與容量可以同時實現線性擴展。
集群存儲是通過將數據分布到集群中各節點的存儲方式,提供單一的使用介面與界面,使
用戶可以方便地對所有數據進行統一使用與管理。集群中所有磁碟設備整合到單一的共享
存儲池中提供給前端的應用伺服器,極大提高了磁碟利用率,可以為非結構化數據提供具
備極高IO帶寬和靈活可擴展性的存儲解決方案。
『柒』 存儲虛擬化是什麼集群存儲又是什麼
存儲虛擬化廣義上來說,就是通過映射或抽象的方式屏蔽物理設備復雜性,增加一個管理層面,激活一種資源並使之更易於透明控制。
存儲虛擬化(Storage Virtualization)最通俗的理解就是對存儲硬體資源進行抽象化表現。通過將一個(或多個)目標(Target)服務或功能與其它附加的功能集成,統一提供有用的全面功能服務。
集群存儲是指:由若干個「通用存儲設備」組成的用於存儲的集群,組成集群存儲的每個存儲系統的性能和容量均可通過「集群」的方式得以疊加和擴展。
『捌』 rac集群中節點信息存放在什麼位置
從邏輯上看,RAC集群由存儲層、網路層、集群件層、應用層4層組成。
存儲層:RAC是一個多實例、單資料庫的系統。數據文件、聯機日誌、控制文件等文件在集群中只有一份。不管有幾個節點,這些節點都平等的使用這些數據文件。
網路層:整個RAC環境中,實際有3個網路存在。一個是由public網卡接入的網路,用於對外提供數據查詢等服務;另一個是由private網卡組成的私有網路,用於RAC心跳和cache fusion;第三個是存儲設備、光纖交換機、每個節點的HBA卡組成的存儲網路。前兩個網路上面傳輸的是IP數據,而後一個網路傳輸的SCSI數據。
集群件層:在單機環境下,Oracle是運行在OS Kernel之上。OS Kernel負責管理硬體設備,並提供硬體訪問介面。Oracle不會直接操作硬體,而是由OS Kernel代替它來完成對硬體的調用請求。到了集群環境下,存儲設備是共享的。OS Kernel的設計都是針對單擊的,只能控制單擊上多個進程間的訪問,如果還依賴OS Kernel的服務,就無法保證多個主機之間的協調工作。這時就需要引入額外的控制機制,在RAC中,這個機制就是位於Oracle和OS Kernel之間的Clusterware,它會在OS Kernel之前截獲請求,然後和其他節點上Clusterware協商,最終完成上層的請求。
應用層:在介紹這一層時,需要先引入一個名詞CRS Resource,整個應用層是由若干 CRS Resource組成的。可以簡單的理解,一個Resource通常是一個進程,或者有一組進程組成的完整服務。集群環境之所以能夠提供高可用性,是因為集群軟體(CRS)對運行於其上的應用進行監視,並在發生異常時進行重啟、切換等干預手段。
『玖』 Elasticsearch 集群
一個 Elasticsearch 集群由一個或多個節點(Node)組成,每個集群都有一個共同的集群名稱作為標識。
一個 Elasticsearch 實例即一個 Node,一台機器可以有多個實例,正常使用下每個實例應該會部署在不同的機器上。Elasticsearch 的配置文件中可以通過 node.master、node.data 來設置節點類型。
node.master:表示節點是否具有成為主節點的資格
node.data:表示節點是否存儲數據
節點即有成為主節點的資格,又存儲數據。這個時候如果某個節點被選舉成為了真正的主節點,那麼他還要存儲數據,這樣對於這個節點的壓力就比較大了。Elasticsearch 默認每個節點都是這樣的配置,在測試環境下這樣做沒問題。實際工作中建議不要這樣設置,這樣相當於主節點和數據節點的角色混合到一塊了。
節點沒有成為主節點的資格,不參與選舉,只會存儲數據。在集群中需要單獨設置幾個這樣的節點負責存儲數據,後期提供存儲和查詢服務。主要消耗磁碟,內存。
不會存儲數據,有成為主節點的資格,可以參與選舉,有可能成為真正的主節點。普通伺服器即可(CPU、內存消耗一般)。
不會成為主節點,也不會存儲數據,主要是針對海量請求的時候可以進行負載均衡。普通伺服器即可(如果要進行分組聚合操作的話,建議這個節點內存也分配多一點)
在生產環境下,如果不修改 Elasticsearch 節點的角色信息,在高數據量,高並發的場景下集群容易出現腦裂等問題。
一個集群下可以有多個索引,每個索引是一系列相同格式文檔的集合 (Elasticsearch 6.x 已不支持一個索引下多個Type) 。
每個索引有一個或多個分片,每個分片存儲不同的數據。分片可分為主分片( primary shard)和復制分片(replica shard),復制分片是主分片的拷貝。默認每個主分片有一個復制分片(默認一個索引創建後會有5個主分片,即:5主+5復制=10個分片),一個索引的復制分片的數量可以動態地調整,復制分片從不與它的主分片在同一個節點上(防止單點故障)。
復制分片有兩個作用:
根據以下說明調整 elasticsearch.yml 對應參數配置,node2、node3 其他配置與node1一致。
到目前位置,集群的配置就完成了,下面我們分別啟動每個實例。
根據配置文件中的注釋:
所以我們配置了 discovery.zen.minimum_master_nodes: 2 ,所以必須有兩個主節點啟動成功,集群才算生效。
進入目錄 elasticsearch-6.2.1-1 啟動第一個節點,執行命令:bin\elasticsearch.bat。從日誌中可以看出並沒有成功,因為沒發現足夠的master節點。
當第二個master節點啟動成功時,整個集群狀態變為正常。
3個節點全部啟動成功,通過 elasticsearch-head 插件查看集群狀態,通過集群健康值:green,表示集群一切正常。目前集群內沒有任何數據,所以看不出索引與分片的情況。
Elasticsearch 一般會配合 Kibana + X-Pack 對集群數據分析、監控等,官方標配。這里使用了 elasticsearch-head 插件,一個比較小巧的工具。插件的安裝方法請看: elasticsearch-head 安裝介紹
添加測試數據:
從截圖可以看出,目前一共3個節點,一個索引 test,test 索引有5個主分片(邊框加粗),5個復制分片(邊框不加粗),分片會別均勻的分布到每個節點中。
我們嘗試幹掉node3,node3 從集群退出之後,集群在短時間內會對分片進行重新分布,當然依賴遵循主、復制分片不會在同一個Node。
如果我們繼續把node2幹掉,那麼整個集群就掛了,集群健康值:未連接。因為當前可用的主節點數 1 < discovery.zen.minimum_master_nodes 設置的 2。
我們嘗試把 discovery.zen.minimum_master_nodes 設置成 1,然後重啟啟動一個節點,會發現有一個 Unassigned 的節點,集群健康值:yellow (5 of 10)。這種情況下代表主分片全部可用,存在不可用的復制分片,5個復制分片沒有分配到節點上,不過此時的集群是可用的,我們任何請求都能處理,只是所有的操作都落到主分片上,而且可能引發單點故障。當我們把第二個節點啟動後,一切就恢復正常了,主分片的數據會同步到復制分片。
實際生產環境,每個節點可能設置不同的節點類型,我們在3個節點的基礎上再增加兩個節點,然後調整 node.master 和node.data 的值,最終設置為2個主節點,2個數據節點,1個客戶端節點。
node1 和 node2 是具有主節點選舉許可權的節點,這里 node1 被選舉為master節點。node3 和 node4 是數據節點,所以數據分片只會分配在這兩個節點上。node5 是客戶端節點,最終是對請求起到負載均衡的作用。
如果是Linux環境下,啟動可能沒有這么順利,可以參考 Linux 環境下安裝 elasticsearch 5.x、6.x 問題匯總 。
『拾』 rabbitmq集群中各節點存儲的數據一樣嗎
現在,我能提供。
怎麼寫呢代碼,採用了將分值全部送出