shardingsphere-proxy5.5.3分库分表+mysql9.7.1主从库读写分离

1、准备安装包,shardingsphere-proxy下载地址:https://shardingsphere.apache.org/document/current/en/downloads/
mysql9.7.1下载地址: https://dev.mysql.com/downloads/mysql/5.7.html ,
选个自己喜欢版本就行最新的都可以,我这里用9.7.1做示范。
注意选择压缩包不要用安装包,因为要做多个实例。

2、搭建mysql主从库主库写从库读,我这里只演示一个从。
2.1.1、配置主库
下载好的压缩包里面是没有my.ini文件的需要自己在根目录手动添加。(注意下载的安装包放在一个盘符下,文件名和路径中不能有空格)

image

文件里面添加端口,文件路径,serverid和logbin等信息
参考:

[mysqld]
port=3308
basedir=D:/mysql-9.7.1-winx64
datadir=D:/mysql-9.7.1-winx64/data
socket=D:/mysql-9.7.1-winx64/mysql.sock
pid-file=D:/mysql-9.7.1-winx64/mysql.pid
log-error=D:/mysql-9.7.1-winx64/data/error.log

server-id=1
log-bin=mysql-bin
binlog_format=ROW
binlog_expire_logs_seconds=604800

[mysql]
default-character-set=utf8mb4

2.1.2、以管理员身份打开cmd初始化主库:

cd /d D:\mysql-9.7.1-winx64\bin
mysqld --initialize --console --defaults-file=D:\mysql-9.7.1-winx64\my.ini

记下控制台输出的 root@localhost 临时密码。

2.1.3、注册主库服务:

mysqld --install MySQL-Master --defaults-file=D:\mysql-9.7.1-winx64\my.ini

启动服务:

net start MySQL-Master

2.1.4、启动成功后,用navicat客户端连接服务,修改root密码。

2.1.5、创建复制账号:

CREATE USER 'repl'@'127.0.0.1' IDENTIFIED BY 'Repl@123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'127.0.0.1';
flush privileges;

查看主库位点:

SHOW BINARY LOG STATUS;

记录下返回的file和position,配置从库的时候用这个或者用自动的都行。

2.2.1、配置从库
把安装包复制一份,改下名字,我这里加的是slave
image

2.2.2、跟主库一样手动添加一个my.ini文件,改下端口号,文件路径,serverid,这里的serverid要跟主库的不一样,所有的实例,serverid都不能相同。
参考:

[mysqld]
port=3309
basedir=D:\mysql-9.7.1-winx64-slave
datadir=D:\mysql-9.7.1-winx64-slave\data
socket=D:\mysql-9.7.1-winx64-slave\mysql.sock
pid-file=D:\mysql-9.7.1-winx64-slave\mysql.pid
log-error=D:\mysql-9.7.1-winx64-slave\data\error.log

server-id=2
relay-log=relay-bin
log-bin=mysql-bin
binlog_format=ROW
binlog_expire_logs_seconds=604800

[mysql]
default-character-set=utf8mb4

2.2.3、初始化从库,如果这里data文件有冲突的话需要指定下data文件路径

mysqld --initialize --console --datadir=D:\mysql-9.7.1-winx64-slave\data

同样记录下从库临时密码。

2.2.4、注册从库服务:

mysqld --install MySQL-Slave --defaults-file=D:\mysql-9.7.1-winx64-slave\my.ini

启动服务:

net start MySQL-Slave

2.2.5、登录客户端修改密码。这里跟主库密码一致即可,后期数据同步的时候会把密码也同步的一致,如果想不一致需要配置(replicate-ignore-db=mysql 忽略主库密码)

2.2.6、建立主从复制,在从库执行:
这里file和pos就填上面记录的数据

CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='127.0.0.1',
  SOURCE_PORT=3308,
  SOURCE_USER='repl',
  SOURCE_PASSWORD='Repl@123',
  SOURCE_LOG_FILE='mysql-bin.000001',
  SOURCE_LOG_POS=157,
  SOURCE_AUTO_POSITION=0;
如果要自动就用
CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='127.0.0.1',
  SOURCE_PORT=3308,
  SOURCE_USER='repl',
  SOURCE_PASSWORD='Repl@123',
  SOURCE_AUTO_POSITION=1;

2.2.7、启动复制:

START REPLICA;

最后建个表验证下是否能够同步

3、使用shardingsphere-proxy分库分表:
3.1、下好连接mysql的java包mysql-connector-java-8.0.11.jar放到lib文件中,删除seat,hive相关的包。
3.2、yaml配置文件参考:
database-sharding.yaml:

databaseName: ebusinesss

dataSources:
 write_ds:
   url: jdbc:mysql://localhost:3308/ebusinesss_ydt?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
   username: root
   password: master@123
   connectionTimeoutMilliseconds: 30000
   idleTimeoutMilliseconds: 60000
   maxLifetimeMilliseconds: 1800000
   maxPoolSize: 50
   minPoolSize: 1
 read_ds:
   url: jdbc:mysql://localhost:3309/ebusinesss_ydt?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
   username: root
   password: master@123
   connectionTimeoutMilliseconds: 30000
   idleTimeoutMilliseconds: 60000
   maxLifetimeMilliseconds: 1800000
   maxPoolSize: 50
   minPoolSize: 1
 write_ds_0:
   url: jdbc:mysql://localhost:3308/ebusinesss_ydt_0?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
   username: root
   password: master@123
   connectionTimeoutMilliseconds: 30000
   idleTimeoutMilliseconds: 60000
   maxLifetimeMilliseconds: 1800000
   maxPoolSize: 50
   minPoolSize: 1
 read_ds_0:
   url: jdbc:mysql://localhost:3309/ebusinesss_ydt_0?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
   username: root
   password: master@123
   connectionTimeoutMilliseconds: 30000
   idleTimeoutMilliseconds: 60000
   maxLifetimeMilliseconds: 1800000
   maxPoolSize: 50
   minPoolSize: 1

rules:
- !READWRITE_SPLITTING 
  dataSourceGroups:
    pr_ds_0:
      writeDataSourceName: write_ds
      readDataSourceNames: 
        - read_ds
      loadBalancerName: round_robin
    pr_ds_1:
      writeDataSourceName: write_ds_0
      readDataSourceNames: 
        - read_ds_0
      loadBalancerName: round_robin
  loadBalancers:
    round_robin:
      type: ROUND_ROBIN



- !SHARDING
  tables:
    product1:
      actualDataNodes: pr_ds_${0..1}.product_${0..1}
      databaseStrategy:           #分库
        standard:
          shardingColumn: UserId
          shardingAlgorithmName: database_inline
      tableStrategy:              #分表
        standard:
          shardingColumn: ProductId
          shardingAlgorithmName: product_inline
  shardingAlgorithms:
    database_inline:
      type: INLINE
      props:
        algorithm-expression: pr_ds_${UserId % 2}
    product_inline:
      type: INLINE
      props:
        algorithm-expression: product_${ProductId % 2}

- !SINGLE
  tables:
    - "pr_ds.*"

global.yaml:

transaction:
 defaultType: LOCAL
props:
  sql-show: true #开启日志

主库中建好库和表,ebusinesss_ydt和ebusinesss_ydt_0数据库,每个库里创建对应的product_0,product_1的表,添加字段Id,ProductId,UserId.
shardingsphere不会自动创建库和表,需要手动创建。

3.3、启动shardingsphere-proxy,进入bin目录,cmd:start.bat

3.4、进入navicat连接3307-shardingsphere-proxy端口,会自动映射逻辑库和表,在3307中添加两条数据:

1应该进入ebusinesss_ydt_0下的product_1,2应该进入ebusinesss_ydt下的product_0
image

image

ebusinesss_ydt的product_1是没有数据的
image

ebusinesss_ydt_0的product_0也是没有数据的
image

查看3309
image

image

image

image

最后查看下读写是否分离了
image

image

读的read_ds_0,也就是3309的ebusinesss_ydt_0

posted @ 2026-10-16 09:34  jechsky1  阅读(8)  评论(0)    收藏  举报