小公司里用SpringBoot做MySQL分庫分表,踩了一些坑!
往期熱門文章:
1、沒有幾十年功力,寫不出這一行“看似無用”的代碼!! 2、為什么 Spring和IDEA 都不推薦使用 @Autowired 注解 3、從阿里跳槽來的工程師,寫個(gè)Controller都這么優(yōu)雅! 4、try catch真的會(huì)影響性能?居然被騙了好幾年... 5、學(xué)會(huì)這10種定時(shí)任務(wù),我有點(diǎn)飄了
1、MySQL主從復(fù)制
讀和寫所有壓力都由一臺(tái)數(shù)據(jù)庫承擔(dān), 壓力大 數(shù)據(jù)庫服務(wù)器磁盤損壞則 數(shù)據(jù)丟失 ,單點(diǎn)故障

1.1、介紹
二進(jìn)制日志:
MySQL復(fù)制過程分成三步:
MySQL master 將數(shù)據(jù)變更寫入二進(jìn)制日志( binary log ) slave將master的binary log拷貝到它的中繼日志( relay log ) slave重做中繼日志中的事件,將數(shù)據(jù)變更反映它自己的數(shù)據(jù)

1.2、主從庫搭建
1.2.1、主庫配置
1、修改Mysql數(shù)據(jù)庫的配置文件 vim /etc/my.cnf
在打開的文件中加入下面兩行,其中的server-id不一定是100,確保唯一即可
log-bin=mysql-bin #[必須]啟用二進(jìn)制日志
server-id=100 #[必須]服務(wù)器唯一ID

2、重啟Mysql服務(wù)
net stop mysql;net start mysql;
systemctl restart mysqld
service mysqld restart
3、創(chuàng)建數(shù)據(jù)同步的用戶并授權(quán)
GRANT REPLICATION SLAVE ON *.* to '用戶名'@'開放的地址' identified by '密碼';
eg: GRANT REPLICATION SLAVE ON *.* to 'masterDb'@'%' identified by 'Master@123456';
記得刷一下權(quán)限
FLUSH PRIVILEGES;
4、查看master同步狀態(tài)
show master status;

1.2.2、從庫配置
1、 修改Mysql數(shù)據(jù)庫的配置文件 vim /etc/my.cnf

2、重啟Mysql服務(wù)
net stop mysql;net start mysql;
systemctl restart mysqld
service mysqld restart
3、設(shè)置主庫地址及同步位置
設(shè)置主庫地址和同步位置
change master to master_host='192.168.150.100',master_user='masterDb',master_password='Master@123456',master_log_file='mysql-bin.000010',master_log_pos=68479;
記得記得開啟從庫配置
start slave;
master_host: 主庫的 IP地址 master_user: 訪問主庫進(jìn)行主從復(fù)制的 用戶名 ( 上面在主庫創(chuàng)建的 ) master_password: 訪問主庫進(jìn)行主從復(fù)制的用戶名對(duì)應(yīng)的 密碼 master_log_file: 從哪個(gè) 日志文件 開始同步 ( 即1.2.1中第4步獲取的 File ) master_log_pos: 從指定日志文件的哪個(gè) 位置 開始同步 ( 即1.2.1中第4步獲取的 Position )
4、查看從數(shù)據(jù)庫的狀態(tài)
show slave status\G;

1.3、坑位介紹
1.3.1、UUID報(bào)錯(cuò)
vim /var/lib/mysql/auto.cnf
1.3.2、server_id報(bào)錯(cuò)
1.3.3、同步異常解決
MASTER_LOG_POS
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE;
SHOW SLAVE STATUS\G;
USE dbname 。操作不規(guī)范,親人兩行淚……
2、項(xiàng)目中實(shí)現(xiàn)
2.1、ShardingJDBC
適用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。 支持任何第三方的數(shù)據(jù)庫連接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。 支持任意實(shí)現(xiàn)JDBC規(guī)范的數(shù)據(jù)庫。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92標(biāo)準(zhǔn)的數(shù)據(jù)庫。
2.2、依賴導(dǎo)入
<!--sharding-jdbc-->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
2.3、配置文件
spring:
shardingsphere:
datasource:
names:
master,slave
# 主數(shù)據(jù)源
master:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.150.100:3306/db_test?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
# 從數(shù)據(jù)源
slave:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.150.101:3306/db_test?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
masterslave:
# 讀寫分離配置,設(shè)置負(fù)載均衡的模式為輪詢
load-balance-algorithm-type: round_robin
# 最終的數(shù)據(jù)源名稱
name: dataSource
# 主庫數(shù)據(jù)源名稱
master-data-source-name: master
# 從庫數(shù)據(jù)源名稱列表,多個(gè)逗號(hào)分隔
slave-data-source-names: slave
props:
sql:
show: true #開啟SQL顯示,默認(rèn)false
# 覆蓋注冊(cè)bean,后面創(chuàng)建數(shù)據(jù)源會(huì)覆蓋前面創(chuàng)建的數(shù)據(jù)源
main:
allow-bean-definition-overriding: true
2.4、測(cè)試跑路
更新操作(寫操作)

查詢操作(讀操作)

往期熱門文章:
1、國(guó)產(chǎn)開發(fā)工具的天花板,用來擼項(xiàng)目真香! 2、這個(gè) MySQL bug 99% 的人會(huì)踩坑! 3、公司產(chǎn)品太多了,怎么實(shí)現(xiàn)一次登錄產(chǎn)品互通? 4、Redis 官方可視化工具,高顏值,功能太強(qiáng)大! 5、用了BigDecimal就不會(huì)資損?了解下BigDecimal這五個(gè)坑 6、一個(gè)依賴搞定 Spring Boot 反爬蟲,防止接口盜刷! 7、千萬不要把 Request 傳遞到異步線程里面!有坑! 8、不卷了!入職字節(jié)一周就果斷跑了。 9、SpringBoot+ShardingSphereJDBC實(shí)現(xiàn)讀寫分離! 10、不好意思, Maven 該換了!
評(píng)論
圖片
表情
