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得到了總的記錄數據。