本文使用 Sharding-JDBC 實現讀寫分離,基於 CentOS 7 + MySQL 5.7
一、MySQL 安裝及配置
1.1 安裝
依次執行命令:
sudo wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
sudo yum -y install mysql57-community-release-el7-10.noarch.rpm
sudo yum -y install mysql-community-server
sudo yum -y remove mysql57-community-release-el7-10.noarch
啟動:
sudo systemctl start mysqld
1.2 修改密碼
查看默認密碼:
grep "password" /var/log/mysqld.log
進入數據庫:
mysql -uroot -p
修改密碼:
alter user 'root'@'localhost' identified by 'NEW PASSWORD';
遠程訪問:
use mysql;
grant all privileges on *.* TO 'root'@'%' identified by 'PASSWORD';
flush privileges;
1.3 主從配置
本文一主 (192.168.30.101) 兩從 (192.168.30.102, 192.168.30.103)
1.3.1 主庫
sudo vim /etc/my.cnf
# server-id 給數據庫服務的唯一標識
server-id=101
# log-bin 設置此參數表示啟用 binlog 功能,並指定路徑名稱
log-bin=/var/lib/mysql/mysql-bin
sync_binlog=0
# 設置日志過期天數
# binlog-ignore-db 表示同步時忽略的數據庫
# binlog-do-db 表示需要同步的數據庫
expire_logs_days=7
binlog-do-db=test
binlog-ignore-db=information_schema
binlog-ignore-db=sys
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
重啟數據庫,執行 SQL:
grant replication slave on *.* to 'root'@'192.168.30.102' identified by 'YOUR PASSWORD';
flush privileges;
grant replication slave on *.* to 'root'@'192.168.30.103' identified by 'YOUR PASSWORD';
flush privileges;
重啟數據庫,執行 SQL:
show master status;
記錄下 File 和 Position
1.3.2 從庫配置
以 192.168.30.102 為例:
log-bin=mysql-bin
server-id=102
binlog-ignore-db=information_schema
binlog-ignore-db=sys
binlog-ignore-db=mysql
replicate-do-db=test
replicate-ignore-db=mysql
log-slave-updates
slave-skip-errors=all
slave-net-timeout=60
重啟數據庫,執行 SQL:
stop slave;
change master to master_host='192.168.30.101',master_user='root',master_password='YOUR PASSWORD',master_log_file='mysql-bin.000002', master_log_pos=154;
start slave;
其中 master_log_file 和 master_log_pos 分別為上步記錄主庫的 File 和 Position
二、使用
2.1 pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.18</version>
</dependency>
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
2.2. application.yml
spring:
main:
allow-bean-definition-overriding: true
mybatis:
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath:mapping/*.xml
sharding:
jdbc:
datasource:
names: db-master-1,db-slave-1,db-slave-2
db-master-1:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.30.101:3306/test
username: root
password: root
maxPoolSize: 20
db-slave-1:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.30.102:3306/test
username: root
password: root
maxPoolSize: 20
db-slave-2:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.30.103:3306/test
username: root
password: root
maxPoolSize: 20
config:
masterslave:
load-balance-algorithm-type: round_robin # random 隨機, round_robin 輪詢
name: db1s2
master-data-source-name: db-master-1
slave-data-source-names: db-slave-1,db-slave-2
props:
sql:
show: true
完整代碼:GitHub
參考: