mysql 副本 同步_副本機制與副本同步

·

1.管理其他副本的節點稱為Follower。每當Leader將新數據寫入本地存儲d的副本時,也會將數據更改寫入日志之中。每個Follower會從Leader那里獲取修改日志,并相應地更新數據到的本地副本之中,這樣,所有的在Follower上副本的修改順序會和Leader保持相同的順序。

·

1.當客戶端需要從系統之中讀取數據時,它可以查詢Leader或其他Follower。(注:Follower與Leader之中的數據存在延遲,無法保證強一致性)寫入請求只能由Leader來響應,或是由Follower轉發給Leader。

許多關系數據庫在同步副本時使用這樣的機制,如PostgreSQL,MySQL,Oracle Data Guard 和SQL Server。同時許多非關系型數據庫與分布式消息隊列也采用這樣的機制,包括MongoDB,Rethinkd,Kafka,RabbitMQ。

在副本進行主從復制時一個重要細節是復制是同步還是異步發生的?(在關系數據庫中,這往往是一個可配置的選項。在其他系統之中,如Ceph,是系統默認的)

由上圖可知,同步復制有相當大的延遲,而異步復制的響應相當快速。但是異步復制卻不能保證完成所需要多長時間。有些情況下,Follower的數據可能比Leader上的數據落后幾分鐘或更多。如:節點之間存在網絡問題或節點的故障恢復。如果Leader失敗且不可恢復,則尚未復制到Follower的任何寫操作都將丟失。

而同步復制的優點是保證了Follower與Leader之間的副本一致性,一旦任意一個Leader失效了,任何一個Follower的數據都與Leader相同。但是同步復制一旦出現網絡或節點的故障,會導致無法處理寫入。Leader必須阻止所有寫入并等待Follow上的副本再次可用。如果所有的Follower都是同步復制,那么任何一個節點的中斷都會導致整個系統癱瘓。在實際運用之中,如果在數據庫上啟用同步復制,通常其中一個副本是同步復制的,而另一個是異步復制的。如果同步的副本變得不可用或十分緩慢,可以將同步操作切換到另一個異步副本之中。這樣保證了至少兩個節點上有一個數據的最新副本:Leader和一個同步Follower。這種配置稱之為半同步。(鏈式復制也是類似于半同步的一種復制機制,不丟失數據但仍能提供良好性能和可用性的復制方法。)

有時我們需要添加新的Follower來增加副本的數量,或者替換失敗的節點。此時就需要確保新的Follower擁有一個正確的副本的數據。僅僅將數據文件從一個節點復制到另一個節點通常是不夠的:客戶端不停向系統寫入數據,所以數據副本總是處于不斷變化的狀態。這里可以簡單地通過鎖定系統,使其拒絕客戶端的寫請求來使各個副本上保持一致,但這樣會大大降低系統的可用性。所以我們需要一個不停機的方式來添加新的Follower:

·1.在某個時間點對Leader的副本進行快照,并且將快照復制到新加入的Follower節點。

·2 .Follower連接到Leader,并向Leader請求快照之后所有的數據更改。通常是Leader節點的日志序列號。

·

1.當Follower處理完快照之后的數據更改之后,它就可以正常處理來自Leader的數據更改了。

在分布式系統之中,任何節點都可能出現故障,而能夠在不停機的情況下重新啟動單個節點是操作和維護是十分必要的。盡管每個節點故障,但我們需要讓一個節點停機的影響盡可能小。

·Follower故障

在Follower的本地磁盤上,都保存著從Leader收到的數據更改的日志。當一個Follower崩潰并重新啟動,或者Leader與Follower之間的網絡暫時中斷。Follower可從它的日志找到故障發生之前處理的最后一個事務,然后連接到Leader并請求在Follower斷開連接的時候發生的所有數據變化。(這個流程和添加新的Follower其實是同樣的思路)

·Leader故障

在處理Leader的失敗時顯然會更為棘手:其中一個Follower需要被提升為新的Leader,客戶端也需要識別并且將后續的請求發送給新的Leader,而其他的Follower則需要開始在新Leader之下工作。處理Leader故障通常是如下的流程:

·1、確認Leader失效。絕大多數系統使用超時機制:如果一個節點不響應一段時間,例如,30秒,它被認為是失效了。(如果是中心化的系統可以采用Lease機制。筆者在碩士生階段對Cassandra數據庫有過系統的調研,在Cassandra中采用了由日本學者Naohiro Hayashibara提出的《The Phi Accrual Failure Detector》失敗探測算法,通過多維度累積量來判斷節點是否失效,不失為一個好的解決方案,十分適合類P2P架構的分布式系統)

·2、選取新的Leader。在中心化架構之中,如HDFS,新的Leader可以用中心化節點指定。而在非中心化的架構之中,則可以通過選舉過程來完成,分布式系統之中的選舉協議有很多:2PC,3PC,Paxos,Raft等等。

·3、調整系統配置以使用新的Leader。如果舊的Leader回歸到集群,它可能仍然認為自己是Leader,這時需要確保舊的Leader成為Follower并承認新的Leader。

如果是異步復制的場景,新的Leader可能舊的Leader之前的完整的寫入信息。最常見的解決方案是丟棄舊Leader之前寫入多于新Leader的信息丟棄,但是這顯然違反了數據系統寫入持久性的要求。

在某些故障場景中,可能會出現兩個節點都認為他們是Leader,這種情況被稱為腦裂。此時兩個Leader都會接受寫請求,數據很可能會出現丟失或損壞。

什么時候進行故障切換也是一個值得探討的問題:較長的超時時間意味著在Leader失效的情況下恢復時間更長。然而,如果時間太短,可能會有不必要的故障轉移。例如,臨時負載高峰時刻可能導致節點的響應時間增加到超時,那么不必要的故障轉移會使情況變得更糟,而不是更好。為此,一些運營團隊更愿意執行手動的故障轉移,即使系統本身支持自動的故障轉移。

日志在副本的一致性之中是至關重要的,所以我們接下來簡要的梳理一下日志復制可用的方法:

·Statement-Based復制

在最簡單的情況下,Leader將每個寫請求通過日志的形式發送給Follower。每個Follower解析和執行對應的操作語句,雖然這聽起來很合理,但是實際操作中會存在一些坑:

(1)非確定性函數,如now()獲得當前的日期和時間或rand()得到一個隨機數,這樣會導致副本之間的不一致。(這里可以轉換思維,用一個確定的修改值,來替換不確定性的函數調用)

(2)如果使用一個自動遞增的列,或如果他們依賴于數據庫中的現有數據(例如,更新…在條件),他們必須執行完全相同的順序在每個副本,否則也會產生不一致性。(異步轉發,亂序到達。這個可以通過操作序列號等強制要求進行規避。)

(3)有副作用的語句(例如觸發器、存儲過程、用戶定義函數)可能會導致每個副本上出現不同的副作用。

·Write-ahead日志復制

日志是一個只包含所有寫入操作的字節序列。我們可以使用完全相同的日志來在另一個節點上構建一個副本。Leader將日志寫入磁盤之后,將它通過網絡發送給Follower。當Follower處理這個日志時,它構建了一個與Leader完全相同的數據結構的副本。這種方式的缺點是:日志在非常低的級別上描述數據。這使得數據拷貝與存儲引擎緊密耦合。

·Row-based日志復制

Row-based與Write-ahead的方法類似,但是它允許復制日志與存儲引擎內部分離。這種日志稱為邏輯日志,邏輯日志通常是描述在一個行的粒度上記錄寫入操作:

對于插入的行,日志包含所有列的新值。

對于已刪除的行,日志包含足夠的信息以唯一地標識刪除的行。(主鍵)

對于更新的行,日志包含足夠的信息以唯一地標識更新的行,以及所有列的新值。

由于邏輯日志與存儲引擎內部分離,因此可以更容易地保持向后兼容,從而允許Leader與Follower運行不同版本的數據系統,甚至是不同的存儲引擎。同時,邏輯日志格式對外部應用程序也更容易解析。可以將邏輯日志的內容發送到外部系統(如用于離線分析的數據倉庫),或者用于構建自定義索引和緩存。

副本可以增加系統的可伸縮性(處理比單個機器處理更多的請求)和降低延遲(將副本放置在離用戶更近的地方)。寫入操作必須通過Leader副本,但是只讀查詢可以在任何副本上進行。對于一次寫入,多次讀取的應用來說,采用讀擴展架構是十分合理的。但是由于上文提及的原因,我們通常不會采用同步復制的方式。這將導致數據出現明顯的不一致性:如果您同時對Leader和Follwer執行相同的查詢,可能會得到不同的結果,因為并不是所有的寫入實時在Follower上反饋。這種不一致性僅僅是暫時狀態,所以這種情況被稱為最終一致性。

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

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

相關文章

mongodb 輸出數組字段_MongoDb文檔操作、索引操作

學習主題:MongoDb學習目標:掌握mongodb文檔的更新掌握mongodb文檔的刪除掌握mongodb文檔的查找掌握mongodb文檔的條件操作符掌握mongodb中的索引操作Mongodb的更新方式Update()函數更新Save()函數更新Mongodb的update更新?Update用于更新已存…

表情符號mysql utf8mb4_mysql utf8mb4與emoji表情

一 什么是Emojiemoji就是表情符號;詞義來自日語(えもじ,e-moji,moji在日語中的含義是字符)表情符號現已普遍應用于手機短信和網絡聊天軟件。emoji表情符號,在外國的手機短信里面已經是很流行使用的一種表情。手機上如何使用emoji&…

html自適應_web前端入門到實戰:HTML 文檔流,設置元素浮動,導致父元素高度無法自適應的解決方法...

元素浮動定義float 屬性定義元素在哪個方向浮動。以往這個屬性總應用于圖像,使文本圍繞在圖像周圍,不過在 CSS 中,任何元素都可以浮動。浮動元素會生成一個塊級框,而不論它本身是何種元素。如果浮動非替換元素,則要指定…

idea 遠程調試_我的天!你竟然不會用IDEA遠程調試Tomcat...

# 準備工作明確的遠程服務器的IP地址,某些我是:192.168.92.128關掉服務器防火墻:service iptables stop# 本地遠程服務器配置添加遠程服務器,如下圖復制遠程服務器自動生成的JVM參數,等下有用,如下圖&#…

mysql異步查詢 java_基于 mysql 異步驅動的非阻塞 Mybatis

雖然 spring5 也推出了 WebFlux 這一套異步技術棧,這種極大提升吞吐的玩法在 node 里玩的風生水起,但 java 世界里異步依舊不是主流,Vertx 倒是做了不少對異步的支持,但是其對于數據訪問層的封裝依舊還是挺精簡的,傳統…

跨域獲取后臺數據undefined_同源策略amp;JSONP跨域

同源策略&JSONP跨域同源策略 對于同源的定義,MDN給出了這樣的解釋:如果兩個頁面的協議,端口(如果有指定)和主機都相同,則兩個頁面具有相同的源。如何確定兩個頁面是否同源,只要比較兩個頁面…

python 除數不能為零的報錯有哪些_【社區精選40】Python錯誤處理及代碼調試方法(文末贈書中獎名單)...

本文整理自愛數據學院中的問答更多精彩問答,進入下方社區網站查看http://www.lovedata.cn/invitation社區精選話題 第40期Python錯誤處理及代碼調試方法一次寫完代碼程序并能夠正常運行的概率很小很小,總會有各種各樣的錯誤bug需要處理。有的報錯簡單&a…

利用python批量查詢企業信息_python實現批量獲取指定文件夾下的所有文件的廠商信息...

本文實例講述了python實現批量獲取指定文件夾下的所有文件的廠商信息的方法。分享給大家供大家參考。具體如下:功能代碼如下:import os, string, shutil,reimport pefileimport codecs, sysimport wximport struct#輸出中打印Unicode字符#sys.stdout co…

mac mysql prefpane_【MySQL數據庫開發之一】Mac下配置安裝數據庫-MySQL

本站文章均為那么從今天開始陸續會更新數據庫和Hibernate框架的博文,也是Himi學習的歷程記錄,希望大家能共同討論和研究;OK,本篇簡單介紹安裝吧,首先到MySQL官方網站:如上圖:點擊DOWNLOAD &…

系統新模塊增加需要哪些步驟_想要吸引人流,兒童樂園需要增加哪些新設備呢...

兒童樂園是現今最火爆的一個投資項目,因為它的主要消費群體是孩子,而現在的家長們對孩子們的寵愛,基本都會答應讓孩子們去兒童樂園里面玩耍。但是兒童樂園的投資經營者也會遇見一些小問題,例如兒童樂園添加設備要怎么選擇呢&#…

php mysql 圖像_php-向/從MySQL數據庫插入/查看圖像

我在DB中插入圖像時遇到問題.該表具有以下結構:> id-> INT(3)->自動增量>名稱-> VARCHAR(30)> extension-> VARCHAR(10)[可能太短]> img-> MEDIUMBLOB插入圖像的PHP代碼為:if($_FILES[file][error]0){$result is_uploaded_f…

照片打印預覽正常打印空白_小米發布口袋照片打印機,可無墨打印3寸背膠照片...

9月11日消息,小米推出一款小米口袋照片打印機。與之前的小米米家照片打印機相比,這款新品更加小巧便攜,體積接近充電寶大小,凈重僅181g,便于隨身攜帶。小米口袋照片打印機采用ZINK無墨技術打印,即使用嵌入紙…

c中獲取python控制臺輸出_在真實的tim中用C捕獲控制臺python打印

我正在嘗試從C創建一個python進程,并從python腳本獲取打印結果。在這就是我的C代碼:namespace ConsoleApp1{public class CreateProcess{public String PythonPath { get; set; }public String FilePath { get; set; }public String Arguments { get; se…

python三大編程語言_程序員最需要的三種編程語言

隨著科學技術的進步和新技術的進步,編程語言的種類越來越多,變化是程序員需要跟蹤和學習許多語言 然而,有太多的語言無法一一掌握 在目前的形式中,最需要掌握的三種編程語言是 現在判斷還不晚 坦白說,找工作很容易 它可…

MySQL優化調優有沒有做過_MySQL 調優/優化的 100 個建議

MySQL是一個強大的開源數據庫。隨著MySQL上的應用越來越多,MySQL逐漸遇到了瓶頸。這里提供 101 條優化 MySQL 的建議。有些技巧適合特定的安裝環境,但是思路是相通的。我已經將它們分成了幾類以幫助你理解。MySQL監控MySQL服務器硬件和OS(操作系統)調優&…

python語句print(type([1、2、3、4))_Python 學習第一天

一、學習內容1.print:表示輸出print (“hello world”)單行注釋:#多行注釋:“““ ”””2.運算符注意:才表示等于,!表示不等于3.位運算符~按位取反:~104.變量和賦值teacher“老馬的…

mysql核心參數_MySQL技術體系之核心參數

本文主要基于MySQL 5.7版本的數據庫環境,總結my.cnf文件中核心參數的配置使用,讓更多的人對MySQL技術體系有更全面、更專業的深度了解。一、客戶端核心參數1、port端口號,默認33062、socketSocket文件地址,默認以.sock為文件名稱后…

svd降維 python案例_SVD(奇異值分解)Python實現

注: 在《SVD(異值分解)小結 》中分享了SVD原理,但其中只是利用了numpy.linalg.svd函數應用了它,并沒有提到如何自己編寫代碼實現它,在這里,我再分享一下如何自已寫一個SVD函數。但是這里會利用到SVD的原理,…

salt 啟動mysql_saltsack自動化配置day03:服務部署mysql部署

一、MySQL集群需求分享1、抽象:功能模塊把基礎的寫成通用服務部署也要抽象出來模塊redis內存有的多,有的少,可以config set在線更改redis 安裝、配置、啟動mysql 安裝、配置(my.cnf可以統一 目錄默認配置可以統一)master: server_id 1111slav…

jtag引腳定義_從逆向分析的角度學習硬件調試技巧JTAG,SSD和固件提取

我想從逆向的角度做了深入了解JTAG,JTAG是許多嵌入式CPU使用的硬件級別調試機制,我希望通過這篇文章從逆向工程師的角度解釋如何使用JTAG,并在此過程中提供一些實際示例。0x01 研究目標通過這篇文章,我希望做到以下幾點&#xff1…