標籤:操作 部分 dump 作用 模式 級聯 服務區 程式 線程進程
Master/Slave
Master: write/read,寫操作都在主節點上操作
Slaves: read,讀操作都是從節點這邊發出
為什麼要複製?
冗餘:promte(提升為主),異地災備,可以通過人工或者工具程式(MHA)實現
擴充:轉移一部分“讀”請求;
支援安全的備份操作;
測試需要;
主/從架構實現:
在主節點上啟用二進位日誌,從節點啟動連接線程,請求主節點把這個事件發給自己一份,從節點上有一個線程叫IO Thread,主節點上啟用dump thread,IO Thread從節點將接受到的日誌儲存到中繼日誌,從伺服器上的SQL THread負責從中繼日誌裡產生一份資料。這樣的資料同步方式是非同步。主伺服器負責寫操作,從伺服器負責讀操作。
主從有可能導致主從資料不一致。如主服務多線程進程,從服務區是單線程進程,有可能導致主從資料不一致,從伺服器的資料可能會落後於主伺服器,這個問題是不可避免的,只能儘早發現,將不正確的資料手動更改,如果資料差別很大,手動恢複很難,可以在主伺服器上做備份,把資料直接回複到從伺服器上。
主伺服器存到二進位log,存到從伺服器上是非同步作業的。傳輸是單向的。但是這裡有個問題,如果寫操作超出主伺服器的效能,解決方案,使用雙主模型
主從複製的三種形式:同步複製,非同步複製,半同步複製
同步複製:
雙主模型:寫操作都在本地寫,同步給另一個節點,放到relay中。
主伺服器都要啟動中繼日誌和二進位日誌,所有發給本節點的寫操作,都要記錄到二進位日誌中,並通過dump thread發給對端主伺服器,對端主伺服器通過io thread將收到的資料存放區到中繼日誌中,並依靠sql thread實現重放。主節點實現了冗餘。每個節點都可以讀和寫操作。這種操作可以降低讀請求,每個伺服器負載一半的請求,但是寫操作的請求數量是一樣的,因為,雙主的伺服器都要寫入一份資料。
利用中介軟體的讀寫分離器實現請求讀寫分離,中介軟體可以利用keepalive實現冗餘。但是有了雙主模型,就不需要讀寫分離,只需要用haproxy或者nginx或者lvs來實現請求的四層調度將請求調度到不同伺服器上即可。
mysql主從複製弊端可能運行一段時間後,根據商務邏輯的不一樣,可能導致主從資料不一致,導致得到的資料不一致。該情況在資料要求強一致的情況下是不允許存在的。
在主伺服器上,操作是多線程並行的,但是記錄到二進位檔案中是串列記錄,從伺服器是單線程運行擷取資料,這樣導致從伺服器拉取資料的速度落後於主伺服器,導致了資料的差異,長此以往會導致資料嚴重不一致。如果這裡設定讀寫分離,可能導致從伺服器上讀出的資料是錯誤的。雙主模型同樣有這個問題。主從資料不一致,建議解決辦法是手動修改資料。如果資料差別太大,將從伺服器關閉,在主伺服器上做備份,恢複到從伺服器上。
非同步複製:
一主多從;
一從一主;
級聯複製;一主複製給一從,同時,這個從伺服器又是其他伺服器的主,其他從伺服器到這個轉送伺服器複製資料,級聯的作用是降低主伺服器的壓力。中間的這個從伺服器要啟用二進位日誌和中繼日誌,同時,中間這台從伺服器僅起到過渡的作用,不需要儲存資料,因此將block hole引擎用於這個中間從伺服器上,使得不會產生資料儲存,但是中繼日誌和二進位日誌都有正常儲存,起到過渡的效果。
迴圈複製;多主模式下,採用迴圈複製,但是鏈條更長,可能導致資料落後嚴重。
雙主複製;
半同步複製:
一從多主模型:每個主伺服器提供不同的資料庫,master只保證slaves中的一個操作成功,就返回,其他slave不管。這個功能,是由google為MYSQL引入的。
資料庫 之 Mysql複製概念介紹