天天看點

mysql 5.1 互為主從_Mysql主從 讀寫分離(一主一從或一主多從),雙機熱備(互為主從)...

什麼是主從複制

當mysql資料庫的資料量太大的時候,查詢資料就很吃力了,無論怎麼優化都會産生瓶頸,這時我們需要增加伺服器裝置來實作分布式資料庫,首先要了解主從資料庫伺服器的版本的需求,主從mysql的安裝運作版本需一緻。是以,我們利用mysql自帶的REPLICATION來實作mysql多機主從同步的功能,mysql版本為5.7進行示範。

mysql 5.1 互為主從_Mysql主從 讀寫分離(一主一從或一主多從),雙機熱備(互為主從)...

什麼是讀寫分離

就是把對資料庫的讀操作和寫操作分離開,将讀寫壓力分擔到多台伺服器上,通常用于讀遠大于寫的場景。讀寫分離的基本原理是讓主資料庫處理事務性增、改、删操作(INSERT、UPDATE、DELETE),而從資料庫處理SELECT查詢操作。資料庫複制被用來把事務性操作導緻的變更同步到叢集中的從資料庫。資料多了之後,對資料庫的讀、寫就會很多。寫庫就一個,讀庫可以有多個,利用主從複制負責主庫和多個讀庫的資料同步。

mysql 5.1 互為主從_Mysql主從 讀寫分離(一主一從或一主多從),雙機熱備(互為主從)...

什麼是雙機熱備(互為主從)

互為主從也叫主主同步,是在主從同步的基礎上還增加了,主也同步從的bin-log,利用 keepalive的虛拟ip 也叫vip 他的作用就是監控兩個資料庫 預設設定是master1,如果master1挂了就去Master2 ,如果master2挂了就去master1,消除了以往一主一從和一主多從的 master單點問題,由此可以實作資料庫的高可用。

mysql 5.1 互為主從_Mysql主從 讀寫分離(一主一從或一主多從),雙機熱備(互為主從)...

主從同步配置的步驟

1、master:修改資料庫配置檔案vi /etc/my.cnf

2、master:給slave資料庫放權,建立一個用于同步的賬戶,密碼,并授予bin-log權限

3、slave:修改資料庫配置檔案vi /etc/my.cnf

4、slave:設定2建立的賬戶 master_host , master_user, master_password

主從同步方式

我們平時所提到的主從同步,主主同步預設采取的異步同步方式, 從MySQL5.5開始,MySQL以插件的形式支援半同步複制。如何了解半同步呢?首先我們來看看異步,全同步的概念

異步複制(Asynchronous replication)

MySQL預設的複制即是異步的,主庫在執行完用戶端送出的事務後會立即将結果返給給用戶端,并不關心從庫是否已經接收并處理,這樣就會有一個問題,主如果crash掉了,此時主上已經送出的事務可能并沒有傳到從上,如果此時,強行将從提升為主,可能導緻新主上的資料不完整。

全同步複制(Fully synchronous replication)

指當主庫執行完一個事務,所有的從庫都執行了該事務才傳回給用戶端。因為需要等待所有從庫執行完該事務才能傳回,是以全同步複制的性能必然會收到嚴重的影響。

半同步複制(Semisynchronous replication)

介于異步複制和全同步複制之間,主庫在執行完用戶端送出的事務後不是立刻傳回給用戶端,而是等待至少一個從庫接收到并寫到relay log中才傳回給用戶端。相對于異步複制,半同步複制提高了資料的安全性,同時它也造成了一定程度的延遲,這個延遲最少是一個TCP/IP往返的時間。是以,半同步複制最好在低延時的網絡中使用。

下面來看看半同步複制的原理圖:

mysql 5.1 互為主從_Mysql主從 讀寫分離(一主一從或一主多從),雙機熱備(互為主從)...

java讀寫分離動态切換資料源

mysql 5.1 互為主從_Mysql主從 讀寫分離(一主一從或一主多從),雙機熱備(互為主從)...

1.手寫DynamicDataSource extends AbstractRoutingDataSource 實作determineCurrentLookupKey方法,HandleDataSource.get()取出值,可以是資料源名稱也可以根據取出值實作多從的負載均衡

2.配置多個資料源名稱master,salve1,salve2....,都組裝到DynamicDataSource targetDateSource中去

3. 手寫HandleDataSource用線程變量來存放目前線程資料源

4. 手寫一個DataSourceAspect切面,切入點sql語句字首(select,update,delete,insert) 或者注解自定義注解(如@DateSource("salve2"))将對應資料源名稱或自定義值設定到HandleDataSource中