採⽤用Sharding-JDBC實現表分庫分表+讀寫分離

1.軟件環境

  • docker-CentOS7系統

  • 數據庫mysql5.7.30

  • 各服務器IP和各功能:

IP 數據庫關係說明 作用 navcat連接名稱
172.18.0.12 master1主庫 負責分片數據的存儲 vx-localhost-master1
172.18.0.13 master1的從庫slave13 負責分片數據的讀取 vx-localhost-slave13
172.18.0.14 master1的從庫slave14 負責分片數據的讀取 vx-localhost-slave14
172.18.0.22 master2主庫 負責分片數據的存儲 vx-localhost-master2
172.18.0.23 master2的從庫slave23 負責分片數據的讀取 vx-localhost-slave23
172.18.0.24 master2的從庫slave24 負責分片數據的讀取 vx-localhost-slave24

2.數據庫設置:

mysql主從模式部署參考博文:https://blog.csdn.net/aofavx/article/details/106783795

1.使用docker從之前配置好的數據庫主從鏡像啓動容器,並設置各容器ip和開放端口。
 docker run -d --privileged=true --name mysql-vx-master1 --network mysql --ip 172.18.0.12 -p 8022:22 -p 8021:21 -p 3312:3306 mysql-vx-master /usr/sbin/init
 docker run -d --privileged=true --name mysql-vx-slave11 --network mysql --ip 172.18.0.13 -p 8322:22 -p 8321:21 -p 3313:3306 mysql-vx-slave /usr/sbin/init
 docker run -d --privileged=true --name mysql-vx-slave12 --network mysql --ip 172.18.0.14 -p 8422:22 -p 8421:21 -p 3314:3306 mysql-vx-slave /usr/sbin/init
 

 docker run -d --privileged=true --name mysql-vx-master2 --network mysql --ip 172.18.0.22 -p 8122:22 -p 8121:21 -p 3322:3306 mysql-vx-master /usr/sbin/init
 docker run -d --privileged=true --name mysql-vx-slave23 --network mysql --ip 172.18.0.23 -p 8522:22 -p 8521:21 -p 3323:3306 mysql-vx-slave /usr/sbin/init
 docker run -d --privileged=true --name mysql-vx-slave24 --network mysql --ip 172.18.0.24 -p 8622:22 -p 8621:21 -p 3324:3306 mysql-vx-slave /usr/sbin/init
2.設置從數據庫的同步主庫配置
  • 從數據庫172.18.0.13,172.18.0.14設置
mysql> change master to master_host='172.18.0.12',master_port=3306,master_user='root',master_password='root',master_log_file='mysql-bin.000001',master_log_pos=154;
  • 從數據庫172.18.0.23,172.18.0.34設置
change master to master_host='172.18.0.22',master_port=3306,master_user='root',master_password='root',master_log_file='mysql-bin.000029',master_log_pos=154;

3.主從數據庫讀寫程序代碼和配置

  • ​ 數據庫表結構

    CREATE TABLE `c_order`(
    `id` bigint(20) NOT NULL AUTO_INCREMENT,
    `is_del` bit(1) NOT NULL DEFAULT 0 COMMENT '是否被刪除',
    `user_id` int(11) NOT NULL COMMENT '⽤用戶id',
    `company_id` int(11) NOT NULL COMMENT '公司id',
    `publish_user_id` int(11) NOT NULL COMMENT 'B端⽤用戶id',
    `position_id` int(11) NOT NULL COMMENT '職位ID',
    `resume_type` int(2) NOT NULL DEFAULT 0 COMMENT '簡歷類型:0附件 1在線',
    `status` varchar(256) NOT NULL COMMENT '投遞狀態 投遞狀態WAIT-待處理理 AUTO_FILTER-⾃自動過濾 PREPARE_CONTACT-待溝通 REFUSE-拒絕ARRANGE_INTERVIEW-通知⾯面試',
    `create_time` datetime NOT NULL COMMENT '創建時間',
    `update_time` datetime NOT NULL COMMENT '處理理時間',
    PRIMARY KEY (`id`),
    KEY `index_userId_positionId` (`user_id`, `position_id`),
    KEY `idx_userId_operateTime` (`user_id`, `update_time`)
    ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
    
  • ​ 實體類

在這裏插入圖片描述

  • ​ Repository類
    在這裏插入圖片描述在這裏插入圖片描述

  • 測試類
    在這裏插入圖片描述

  • application.yml配置文件

    使用spring.shardingsphere.sharding.tables.表名.database-strategy.inline.sharding-column指定按哪個字段 進行分片

    使用spring.shardingsphere.sharding.tables.表名.database-strategy.inline.algorithm-expression指定每個值被分配都哪個庫。

    使用spring.shardingsphere.sharding.master-slave-rules設置各個主庫和從庫的讀寫分離配置。
    在這裏插入圖片描述
    在這裏插入圖片描述

4.測試結果

  • 添加數據

    每條insert語句都根據user_id規則被分配到對應主庫執行。
    在這裏插入圖片描述
    在這裏插入圖片描述在這裏插入圖片描述
    ​ 可以看到user_id爲偶數的被分配到了master1,爲奇數的被分配到了master2.

  • 查詢數據
    在這裏插入圖片描述
    分別查詢了從庫slave11和slave23得到了總的記錄數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章