SpringBoot 2.x ShardingSphere讀寫分離實戰

號外: 本文出自「公衆號:李浩東的博客」歡迎關注和轉載,保留摘要,謝謝!外有Spring Boot、Spring Cloud的詳細教程, 尾部歡迎關注!

一. 前言

面對日益增長的系統訪問量,數據庫的吞吐量面臨着巨大瓶頸。 對於同一時間有大量併發讀操做和較少寫操做類型的應用系統來講,將單一的數據庫拆分爲主庫和從庫,主庫負責處理事務性的增刪改操做,從庫負責處理查詢操做,可以有效的避免由數據更新致使的行鎖,使得整個系統的查詢性能獲得極大的改善。 經過一主多從的配置方式,能夠將查詢請求均勻的分散到多個數據副本,可以進一步的提高系統的處理能力。 使用多主多從的方式,不但可以提高系統的吞吐量,還可以提高系統的可用性,能夠達到在任何一個數據庫宕機,甚至磁盤物理損壞的狀況下仍然不影響系統的正常運行。mysql

雖然讀寫分離能夠提高系統的吞吐量和可用性,但同時也帶來了數據不一致的問題,這包括多個主庫之間的數據一致性,以及主庫與從庫之間的數據一致性的問題。而且,讀寫分離也帶來了與數據分片一樣的問題,它一樣會使得應用開發和運維人員對數據庫的操做和運維變得更加複雜。透明化讀寫分離所帶來的影響,讓使用方儘可能像使用一個數據庫同樣使用主從數據庫,是讀寫分離中間件的主要功能。ios

在上一篇文章介紹到Mysql數據庫的分庫分表,本文將介紹讀寫分離git

二. 學習計劃

  1. 安裝Mysql
  2. 配置主從複製
  3. 測試主從複製
  4. 讀寫分離
  5. 測試讀寫分離

三. 項目實戰

環境介紹

192.168.0.3  
192.168.0.4
複製代碼

3.1. 安裝Mysql數據庫

這裏不作過多介紹了 我這裏安裝的Mysql 8.0github

3.2 配置主從複製

MySQL 主從複製的方式有多種,本文主要演示基於基於日誌(binlog)的主從複製方式。spring

MySQL 主從複製(也稱 A/B 複製) 的原理
  • Master將數據改變記錄到二進制日誌(binary log)中,也就是配置文件log-bin指定的文件, 這些記錄叫作二進制日誌事件(binary log events);
  • Slave 經過 I/O 線程讀取 Master 中的 binary log events 並寫入到它的中繼日誌(relay log);
  • Slave 重作中繼日誌中的事件, 把中繼日誌中的事件信息一條一條的在本地執行一次,完 成數據在本地的存儲, 從而實現將改變反映到它本身的數據(數據重放)。

主從配置須要注意的點sql

主從服務器操做系統版本和位數一致;
Master 和 Slave 數據庫的版本要一致;
Master 和 Slave 數據庫中的數據要一致;
Master 開啓二進制日誌, Master 和 Slave 的 server_id 在局域網內必須惟一;
複製代碼
主從配置的簡要步驟

Master 上的配置shell

1.安裝數據庫;
2.修改數據庫配置文件, 指明 server_id, 3.開啓二進制日誌(log-bin);
4.啓動數據庫, 查看當前是哪一個日誌, position 號是多少;
5.登陸數據庫, 受權數據複製用戶(IP 地址爲從機 IP 地址, 若是是雙向主從, 6.這裏的還須要受權本機的 IP 地址, 此時本身的 IP 地址就是從 IP 地址);
7.備份數據庫(記得加鎖和解鎖);
8.傳送備份數據到 Slave 上;
9.啓動數據庫;
複製代碼

如下步驟, 爲單向主從搭建成功, 想搭建雙向主從須要的步驟:數據庫

登陸數據庫, 指定 Master 的地址、 用戶、 密碼等信息(此步僅雙向主從時須要)
開啓同步
查看狀態
複製代碼
  1. 主從服務器分別做如下操做:
1.一、版本一致  
1.二、初始化表,並在後臺啓動mysql  
1.三、修改root的密碼  
複製代碼
  1. 修改主服務器master:
#vim /etc/my.cnf 
[mysqld]  
log-bin=mysql-bin  //[必須]啓用二進制日誌
server-id=222 //[必須]服務器惟一ID,默認是1,通常取IP最後一段/自定義均可以的
複製代碼
  1. 鏈接數據庫 檢驗是否配置成功
mysql> mysql -u root -p
mysql> show master status;
複製代碼

能夠看到這些信息,說明前面咱們配置成功

  1. 修改從服務器slave:
#vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin   //[不是必須]啓用二進制日誌
server-id=226      //[必須]服務器惟一ID,默認是1,通常取IP最後一段/自定義均可以的
複製代碼
  1. 重複上面動做
mysql> mysql -u root -p
mysql> show master status;
複製代碼

能夠看到這些信息,說明前面咱們配置成功

  1. 重啓兩臺服務器的mysql
systemctl restart mysqld.service
複製代碼
  1. 在主服務器上創建賬戶並受權slave: 在從節點上設置主節點參數
change master to master_host='192.168.0.4',master_user='test',master_password='12root',master_log_file='mysql-bin.000001',master_log_pos=155;
複製代碼

通常不用root賬號,"%" 表示全部客戶端均可能連,只要賬號,密碼正確,此處可用具體客戶端IP代替,如192.168.0.4(主服務器的IP),增強安全 8. 開啓主從同步vim

mysql> start slave; #中止主從同步命令爲:stop slave
複製代碼
  1. 查看同步狀態
mysql> show slave status\G;
複製代碼

注:Slave_IO及Slave_SQL進程必須正常運行,即YES狀態,不然都是錯誤的狀態(如:其中一個NO均屬錯誤)
說明們的主從同步配置成功瀏覽器

注意:若是若是從庫宕機,從新啓動,要鏈接上mysql服務,執行 start slave 這個命令,開啓主從同步

3.3 測試主從複製

分別查詢兩臺服務器的數據庫

在主數據庫建立test表

mysql> create database test;
複製代碼

查詢從數據庫

咱們剛剛在主數據庫建立的test庫在從數據庫有的 說明咱們的主從是成功的

注: 編寫一shell腳本,用nagios監控slave的兩個yes(Slave_IO及Slave_SQL進程),如發現只有一個或零個yes,就代表主從有問題了,發短信警報吧

3.4 讀寫分離

  1. 在主數據庫建立ds0:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `age` int(11) DEFAULT NULL,
  `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

SET FOREIGN_KEY_CHECKS = 1;
複製代碼

從數據庫會自動同步

  1. 項目搭建 複製上一篇的項目在基礎上加以改動

application.properties 配置

# 配置真實數據源
sharding.jdbc.datasource.names=master1,slave0
# 主數據庫
sharding.jdbc.datasource.master1.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.master1.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.master1.jdbc-url=jdbc:mysql://192.168.0.3:3306/ds0?characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai
sharding.jdbc.datasource.master1.username=test
sharding.jdbc.datasource.master1.password=12root
# 從數據庫
sharding.jdbc.datasource.slave0.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.slave0.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.slave0.jdbc-url=jdbc:mysql://192.168.0.3:3306/ds0?characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai
sharding.jdbc.datasource.slave0.username=test
sharding.jdbc.datasource.slave0.password=12root
# 配置讀寫分離
# 配置從庫選擇策略,提供輪詢與隨機,這裏選擇用輪詢
sharding.jdbc.config.masterslave.load-balance-algorithm-type=round_robin
sharding.jdbc.config.masterslave.name=ms
sharding.jdbc.config.masterslave.master-data-source-name=master1
sharding.jdbc.config.masterslave.slave-data-source-names=slave0
# 開啓SQL顯示,默認值: false,注意:僅配置讀寫分離時不會打印日誌
sharding.jdbc.config.props.sql.show=true
spring.main.allow-bean-definition-overriding=true
複製代碼

主要改動application.properties配置 其餘地方不作改動

3.5 測試讀寫分

打開瀏覽器訪問: http://localhost:8080/select 查詢用戶集合

控制檯打印:

能夠查詢看到走的從數據庫

打開瀏覽器訪問: http://localhost:8080/insert?id=1&name=lhd&age=12 插入一條數據 控制檯打印:

能夠看到插入數據走的主數據庫

主庫負責寫 從庫負責讀
這樣讀寫分離就這樣作好了

項目地址: github.com/LiHaodong88…

相關文章
相關標籤/搜索