1. 程式人生 > >mysql資料庫實現讀寫分離

mysql資料庫實現讀寫分離

1.mysql讀寫分離背景

在專案中使用mysql資料庫,所有的增刪改查操作都在主庫處理,隨著查詢訪問量的增加,單庫處理的壓力驟增,為了防止主庫故障,使用一主多從的方式,通過讀寫分離,把所有的查詢處理都放到從伺服器上,減少單點故障導致整個服務掛掉的情況。

2.mysql讀寫分離的實現方式

  1. 使用mysql的com.mysql.jdbc.ReplicationDriver驅動
  2. 構造不同的資料庫連線池,在service層通過判斷方法的讀寫型別,讀方法使用從資料庫連線池,寫方法使用主資料庫連線池
  3. 使用阿里的mycat或360的Atlas來實現分庫分表,讀寫分離和負載均衡等處理。

3.使用ReplicationDriver驅動實現讀寫分離

(1)mysql配置資料庫連線資訊

url=jdbc:mysql:replication://192.168.2.101:3306,192.168.2.102:3306/test
username=*****
password=*****
driver=com.mysql.jdbc.ReplicationDriver

(2)設定事務不自動提交,並且事務只讀
使用spring的事務處理比較簡單,使用註解@Transactional,把readOnly設定true,或者寫一個aop切面,統一設定需要的方法為可讀模式。

@Transactional(isolation=Isolation.DEFAULT
,propagation = Propagation.REQUIRED,readOnly = true)

(3)測試是否真的實現了讀寫分離
使用命令SHOW FULL PROCESSLIST檢視從資料庫是否有指定伺服器的連線資訊。
一主多從,從主庫向從庫進行資料同步,修改從資料庫的指定資料,查詢修改的資料來確認資料是否來自從庫。

4.構造不同的連線池,通過程式自主的確認訪問哪個資料庫

實現思想:構建一個主庫的連線池1,構建一個從庫的連線池2,使用spring aop對service層的處理做一個切面,系統定義以query,get和find等開頭的方法為讀處理,使用連線池2,從從庫中獲取資料;其他的開頭的方法預設使用連線池1。
參考文章:

http://blog.csdn.net/jack85986370/article/details/51559232

5.使用阿里的mycat或360的Atlas來實現讀寫分離

阿里的mycat和360的atlas可以實現分庫分表,讀寫分離和負載均衡等功能,對應用層無感知,和正常連線資料庫沒有區別,耦合性較小。

在專案中使用ReplicationDriver驅動簡單實現了讀寫分離,如果資料量超大,而且要做mysql的負載均衡,則要用到中介軟體來做一層代理來實現。
大家可以關注我的公眾號:不知風在何處,相互溝通,共同進步。