Spring Boot + Sharding-JDBC 讀寫分離


本文使用 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

參考:

  1. CentOS7 yum方式安裝MySQL5.7
  2. Sharding-JDBC教程:Mysql數據庫主從搭建
  3. Sharding-JDBC教程:Spring Boot整合Sharding-JDBC實現讀寫分離


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM