Kafka學習筆記(3)----Kafka的數據復制(Replica)與Failover

1. CAP理論

  1.1 Cosistency(一致性)

  通過某個節點的寫操作結果對后面通過其他節點的讀操作可見。

  如果更新數據后,并發訪問的情況下可立即感知該更新,稱為強一致性

  如果允許之后部分或全部感知不到該更新,稱為弱一致性。

  若在之后的一段時間(通常該時間不是固定的)后,一定可以感知到該更新,稱為最終一致性。

  1.2 Availability(高可用性)

  即是任何一個沒有發生故障的節點必須在有限的時間內返回合理的結果(不論是正確的還是錯誤的)。

  1.3 Partition tolerance(分區容錯性)

  部分節點宕機或者是無法與其他節點通信時,各分區間還可以保持分部式系統的功能,比如上海和北京兩個網絡分區,當上海分區光纖或其他原因導致網絡不通時,北京上海兩個分區之間不可通信,但是最起碼要保證北京的分區中的分布式系統功能可用。

  1.4 CAP理論

  分布式系統中,一致性,可用性,分區容忍性最多只可同時滿足兩個,但是一般分區容錯性都是需要保障的,因此很多時候都是在可用性和一致性之間做權衡。如下一幅圖講解了CP和AP的兩種模式的具體表現形式:

?

  首先看CP模式,N1和N2之間代表了網絡通信,C表示客戶端,X表示新寫入的數據,Y表示舊數據,當C向N2發起請求時,由于N2與N1之間網絡通信異常,會導致N2不能同步到N1中的x,在保證一致性的情況下,此時N2不會正常返回處理結果,要么是等待網絡連接成功,將N1的Y獲取過來,保證數據一致,要么系統出現錯誤,這樣的情況是不能保證高可用的,但是保證了數據一致性。

  AP模式下,N1和N2之間代表了網絡通信,C表示客戶端,X表示新寫入的數據,Y表示舊數據,當C向N2發起請求時,由于N2與N1之間網絡通信異常,會導致N2不能同步到N1中的X,但是N2不會等待N1連接成功,或是返回錯誤信息,而是返回之前老的數據x,這樣系統能夠正常的運行,但是數據的一致性并沒有保證,此時選擇了系統的高可用方案。

  1.5 一致性的方案

  1.5.1 Master-slave(主從模式)

  RDBMS的讀寫分離即為典型的Master-slave方案

  同步復制可保證強一只性,但是會行影響性能(因為Master必須要等待所有的salve都接收到到更新才能返回)

  異步復制提高可用性,但是會降低一致性,因為Master只需要自己寫操作完成,就立即返回,同時向Slave進行復制,這期間可能會出現某個或多個Slave由于網絡或其他原因沒有更新到數據,造成數據不一致性。

  1.5.2 WNR

  主要用于去中心化(P2P)的分布式系統中。DynamoDB與Cassandra即采用此方案,N代表副本數,W代表每次寫操作要保證的最少寫成功的副本數,R代表每次讀至少讀取的副本數,當W+R>N時,可保證每次讀取的數據至少有一個副本具有最新的更新,多個寫操作的順序難以保證,可能導致多副本間的寫操作順序不一致,Dynamo通過向量時鐘保證最終一致性。這里可以通過時間戳或者是自增主鍵之類的方式來保證過濾出讀取的最新的數據。

  1.5.3 Paxos及其變種

  Google的Chubby,Zookeeper的Zab,RAFT等

2. Kafka的數據復制(Replica)

  Kafka提供了Replica保證了數據一致性

  2.1 Replica

  當某個Topic的replication-factor為N切N大于1時,每個Partition都會有N個副本(Replica),Replica的個數小于等于Broker數,即對每個Partition而言每個Broker上只會有一個Replica,因此可用Broker ID表示Replica,所有Partition的所有Replica默認情況會均勻分布到所有Broker上,如圖:

  圖中可以看到,Broker中存的是Topic2的Partition0和Topic2的Partition2的Replica,但是在Broker2中卻存了Topic2的Partition1和Topic2的Partition0的Replica,所以默認的Partition都是分布在集群節點上的,replica也一樣。這就可以保證到某個節點掛掉之后,其他的節點中保存的replica仍然可以向消費者推送或被拉取消息,保證消息不丟失。

  注意:

  假如當前我們搭建了三個Broker的集群,但是我此時指定4個Replica時,會出現org.apache.kafka.common.errors.InvalidReplicationFactorException: Replication factor: 4 larger than available brokers: 3異常,如圖:

 2.2?Data Replication(數據復制)要解決的問題

  2.2.1 如何Propagate(備份)消息

  如下圖:

  當producer想leader節點發送消息時,其余follower節點(個人理解跟slave類似)將會如其他mq的consumer一樣去從主節點的topic中將數據拉取或被推送到自身節點中。這樣當leader節點掛掉之后,consumer訪問集群時,仍然可以從其他的follower中獲取到最新數據,防止了數據丟失。

  2.2.2 何時Commit

  ISR:?Leader會維護一個與其基本保持同步的Replica列表,該列表稱為ISR(in-sync Replica),如果一個Follower比Leader落后太多,或者超過一定時間未發起數據復制請求,則Leader將其從ISR中移除,當ISR中所有Replica都向Leader發送ACK時,Leader即Commit(告訴Producer消息發送成功)。

  Commit策略

  1. 在Server中配置

  replica.lag.time.max.ms:默認100000,最大未發起數據復制請求的時間。

  replica.lag.max.messages:最大落后消息數,根據自身需要配置

  2. Topic配置

  min.insync.replicas=1: ISR列表最小個數,默認1,只有當request.required.acks為-1時才生效,如果ISR中的副本數少于min.insync.replicas配置的數量時,客戶端會返回異常:org.apache.kafka.common.errors.NotEnoughReplicasExceptoin: Messages are rejected since there are fewer in-sync replicas than required。

  3. Produce配置

  request.required.acks=1,默認為1,roducer發送數據到leader,leader寫本地日志成功,返回客戶端成功;此時ISR中的副本還沒有來得及拉取該消息,leader就宕機了,那么此次發送的消息就會丟失,當為-1時,當producer設置request.required.acks為-1時,min.insync.replicas指定replicas的最小數目(必須確認每一個repica的寫數據都是成功的),如果這個數目沒有達到,producer會產生異常。

  2.2.3?如何處理Replica恢復

  如圖:

?

  1. 可以看到SR={A,B,C},Leader(A)節點中存在m1,m2,m3三條消息,F(B)存在m1,m2兩條消息,f(c)只存在m1一消息,所以這里只會提交m1這條消息,因為m2這條消息還沒有在ISR中完成復制。它只會提交三個ISR中都存在的消息。

  2. 當L(A)在將消息m2復制到B,C之后掛掉,此時ISR中只有{B,C},B被選舉成為新的主節點,當m2,m1都存在于B,C節點中時,B將會提交m1,m2兩條消息,不會提交m3消息。

  3. 此時消息將都會發送到B節點上,C節點同步了B節點中的新發的消息m4,m5之后,將會提交m4,m5.

  5.此時A節點連接集群成功或重啟,可以使用了,它會從B節點中同步從m1,到m5的消息,直到它的消息與B和C中的一致為止,此時的Replica將會變成ISR={A,B,C},完成了Replica的恢復。這里我們發現m3并沒有存在了,這里并不是丟失了,只是當沒有主節點提交m3這條消息時,它將會自動反饋到Producer,Producer會重試,或做其他處理,當重試成功后可能m3消息將會append到m5的后面,所以consumer消費消息時,我們保證的順序性不是producer發送消息的順序,而是commit時的順序。

  2.2.4?如何處理Replica全部宕機

  當ISR中的Replica全部宕機時,可以通過如下方式處理:

  1. 等待ISR中任一Replica恢復,并選它為Leader。

  缺點:等待時間較長,降低可用性(因為不能使用所有集群節點),因此或ISR中的所有Replica都無法恢復或者數據丟失,則該Partition將永不可用。

  2.?選擇第一個恢復的Replica為新的Leader,無論它是否在ISR中。

  缺點:并未包含所有已被之前Leader Commit過的消息(因為它不在之前的ISR中),因此會造成數據丟失,但是它提高了可用節點的范圍,可用性比較高。

原文 Kafka學習筆記(3)----Kafka的數據復制(Replica)與Failover

轉載于:https://www.cnblogs.com/xiaoshen666/p/10867414.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248942.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248942.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248942.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

H5頁面隨機數字鍵盤支付頁面

H5頁面隨機數字鍵盤支付頁面 有個H5支付的業務需要隨機數字的鍵盤 參考了下文:https://blog.csdn.net/Mr_Smile2014/article/details/52473351 做了一些小修改: 在原有的基礎上,增加了一些按鍵反饋的效果。 每個按鍵加上邊框。 最終效果&…

expressjs路由和Nodejs服務器端發送REST請求 - - ITeye博客

Nodejs創建自己的server后,我們如果需要從客戶端利用ajax調用別的服務器端的數據API的接口,這時候出現了ajax跨域問題。 一種是利用在客戶端解決跨域問題 這種方案大家可以去網上查查 另一種方案是在服務器端去請求別的服務器,然后將數據再…

Jmeter操作mysql數據庫測試

1. 選中線程組鼠標點擊右鍵添加-->配置元件-->JDBC Connection Configuration; 2. DataBase Connection Configuration配置 Variable Name:配置元件的的所有配置所保存的變量,自定義變量名稱(不能使用mysql作為變量名,多個…

axios發送自定義請求頭的跨域解決

前端發送來的axios請求信息 this.$axios.request({ url:http://127.0.0.1:8001/pay/shoppingcar/, method:post, headers:{ authenticate:a073b3dabbb140e8b9d28debb6a356a1 # 自定義的請求頭部信息鍵值對, }, # 接上,這種key也算是一種請求頭,需要加入django中間件內…

前端“智能”靜態資源管理 - Onebox - 博客園

前端“智能”靜態資源管理 模塊化/組件化開發,僅僅描述了一種開發理念,也可以認為是一種開發規范,倘若你認可這規范,對它的分治策略產生了共鳴,那我們就可以繼續聊聊它的具體實現了。 很明顯,模塊化/組件化…

【轉】幾張圖看懂列式存儲

幾張圖看懂列式存儲 轉載于:https://www.cnblogs.com/apeway/p/10870211.html

hive -e和hive -f的區別(轉)

大家都知道,hive -f 后面指定的是一個文件,然后文件里面直接寫sql,就可以運行hive的sql,hive -e 后面是直接用雙引號拼接hivesql,然后就可以執行命令。 但是,有這么一個東西,我的sql當中有一個s…

我們是如何做好前端工程化和靜態資源管理 - 無雄 - 博客園

我們是如何做好前端工程化和靜態資源管理 隨著互聯網的發展,我們的業務也日益變得更加復雜且多樣化起來,前端工程師也不再只是做簡單的頁面開發這么簡單,我們需要面對的十分復雜的系統性問題,例如,業務愈來愈復雜&…

Mybatis-plus之RowBounds實現分頁查詢

物理分頁和邏輯分頁 物理分頁:直接從數據庫中拿出我們需要的數據,例如在Mysql中使用limit。 邏輯分頁:從數據庫中拿出所有符合要求的數據,然后再從這些數據中拿到我們需要的分頁數據。 優缺點 物理分頁每次都要訪問數據庫&#xf…

常見的6種JavaScript設計模式

常見的6種JavaScript設計模式 構造函數模式 /*** 構造一個動物的函數 */ function Animal(name, color){this.name name;this.color color;this.getName function(){return this.name;} } // 實例一個對象 var cat new Animal(貓, 白色); console.log( cat.getName() );工…

峰度(Kurtosis)和偏度(Skewness)

峰度(Kurtosis) 定義峰度又稱峰態系數,表征概率密度分布曲線在平均值處峰值高低的特征數,即是描述總體中所有取值分布形態陡緩程度的統計量。直觀看來,峰度反映了峰部的尖度。這個統計量需要與正態分布相比較。 公式定…

1.27

測試程序提出問題并解決轉載于:https://www.cnblogs.com/JustinTimberlake/p/10028870.html

javascript設計模式系列 - LukeLin - 博客園

javascript設計模式系列 創建型: 1.抽象工廠模式(Abstract Factory) 2.構建者模式(Builder) 3.工廠方法模式(Factory Method) 4.原型模式(Prototype) 5.單例模式&a…

多功能嵌入式解碼軟件(2)

多功能嵌入式解碼軟件(2) 驗證類庫 通信協議 下面進行一個示例: 下位機需要向上位機發送3中數據幀,數據幀以功能碼來識別,每種數據幀的協議如下3個表格所示,上位機需要把這些數據按照協議解碼出來&#xff…

vue項目如何打包扔向服務器 - Hi-Sen - 博客園

當我們將 vue 項目完成后,面臨的就是如何將項目進行打包上線,放到服務器中。我使用的是 vue-cli(simple) 腳手架,所以就講一下如何將項目進行打包,并放到 tomcat 上。 如果是 vue-cli (非 simple 腳手架…

MySQL備份與恢復-mysqldump備份與恢復

這片博文主要用來介紹MySQL的備份與恢復: MySQL的備份形式可以分為如下幾種: 熱備----即不停機備份冷備----需要關閉MySQL,然后備份其數據文件。(停機備份一般是直接拷貝其datadir目錄)溫備----在線備份,對…

第六次實訓作業異常處理

第六次實訓作業異常處理 編寫一個類ExceptionTest,在main方法中使用try-catch-finally語句結構實現:在try語句塊中,編寫兩個數相除操作,相除的兩個操作數要求程序運行時用戶輸入;在catch語句塊中,捕獲被0除…

k8s學習筆記-調度之Affinity

Kubernetes中的調度策略可以大致分為兩種 一種是全局的調度策略,要在啟動調度器時配置,包括kubernetes調度器自帶的各種predicates和priorities算法,具體可以參看上一篇文章; 另一種是運行時調度策略,包括nodeAffinity…

vue-cli webpack配置分析 - chenBright - SegmentFault 思否

相信vue使用者對vue-cli都不會陌生,甚至可以說,很熟悉了,但對其webpack的配置可能知之甚少吧。 過完年回來后,我接手了公司的新項目。新項目是一個spa。很自然,我就想到了vue-cli腳手架了,當時研究一下它的…

[Xcode 實際操作]六、媒體與動畫-(6)使用UIBlurEffect給圖片添加模糊效果

目錄:[Swift]Xcode實際操作 本文將演示如何給圖像添加模糊效果。 在項目導航區,打開視圖控制器的代碼文件【ViewController.swift】 1 import UIKit2 3 class ViewController: UIViewController {4 5 override func viewDidLoad() {6 super.…