Sharding-JDBC分库分表之SpringBoot主从配置
创始人
2025-01-15 20:08:14
0

Sharding-JDBC系列

1、Sharding-JDBC分库分表的基本使用

2、Sharding-JDBC分库分表之SpringBoot分片策略

3、Sharding-JDBC分库分表之SpringBoot主从配置

前言

在开发中,如果对数据库的读和写都在一个数据服务器中操作,面对日益增加的访问量,无论是安全性、高可用性,还是并发量都不能满足实际需求。

而大多数的系统对数据库的操作都是读多写少,此时可以将数据库拆分为主库和从库。主库主要负责处理事务性的增删改操作,从库负责处理查询操作,从而提升查询的性能。对于从库,可以使用主从复制的方式同步数据。

在项目中,使用读写分离提升数据库的并发负载能力。Sharding-JDBC提供一主多从的读写分离配置,可独立使用,也可配合分库分表使用。Sharding-JDBC读写分离是通过分析SQL语义,将读操作和写操作分别路由到主库和从库,提供了透明化的读写分离。

在同一个线程且同一个数据库连接内,如有写入操作,后面的读操作均从主库读取,用于保证数据一致性。

环境准备

在Window中安装Mysql8,配置主从Mysql。

2.1 my.ini配置

2.1.1 主Mysql的my.ini配置

# my.ini [mysqld] #skip-grant-tables   # 设置3307端口 port=3307 # 设置mysql的安装目录 basedir=D:\\database\\master-slave\\mysql-8.0.33-winx64 # 设置mysql数据库的数据的存放目录 datadir=D:\\database\\master-slave\\mysql-8.0.33-winx64\\data\\ # 允许最大连接数 max_connections=200 # 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统 max_connect_errors=10 # 服务端使用的字符集默认为UTF8 character-set-server=utf8mb4 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB # 默认使用“mysql_native_password”插件认证 authentication_policy=mysql_native_password  #开启日志 log_bin=mysql-bin  #设置服务id,主从不能一样 server_id=2  #设置需要同步的数据库 binlog_do_db=order_db  #屏蔽系统库同步 binlog_ignore_db=mysql,information_schema,performance_schema  sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES  #不区分大小写 lower_case_table_names=1  [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8mb4 [client] # 设置mysql客户端连接服务端时默认使用的端口 port=3306 default-character-set=utf8mb4

2.1.2 从Mysql的my.ini配置

# my.ini [mysqld] #skip-grant-tables   # 设置3308端口 port=3308 # 设置mysql的安装目录 basedir=D:\\database\\master-slave\\mysql-8.0.33-winx64-slave # 设置mysql数据库的数据的存放目录 datadir=D:\\database\\master-slave\\mysql-8.0.33-winx64-slave\\data\\ # 允许最大连接数 max_connections=200 # 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统 max_connect_errors=10 # 服务端使用的字符集默认为UTF8 character-set-server=utf8mb4 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB # 默认使用“mysql_native_password”插件认证 authentication_policy=mysql_native_password  #开启日志 log_bin=mysql-bin  #设置服务id,主从不能一样 server_id=3  #设置需要同步的数据库 binlog_do_db=order_db  #屏蔽系统库同步 binlog_ignore_db=mysql,information_schema,performance_schema  sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES  #不区分大小写 lower_case_table_names=1  [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8mb4 [client] # 设置mysql客户端连接服务端时默认使用的端口 port=3306 default-character-set=utf8mb4

2.2 安装

1)安装:mysqld install mysql_slave --defaults-file="D:\database\master-slave\mysql-8.0.33-winx64-slave\my.ini"

2)初始化:mysqld --initialize --console

通过该命令,会打印初始化的日志信息,在日志中,包含mysql的root账号的默认密码。如:

 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: -1xsq4zpD3+h

3)启动:net start mysql_slave

4)关闭:net stop mysql_slave

2.3 主从复制配置

1)主库配置

# 创建test用户,密码为123456 create user 'test'@'127.0.0.1' identified by '123456'  # 给test用户授权,用于从库操作主库 grant replication slave on *.* to 'test'@'127.0.0.1'  # 刷新权限 flush PRIVILEGES  # 查看主库的状态 show master status

通过show master status命名,查看主库状态信息,记录File和Position的信息。

2)从库配置

# 查看从库状态 # mysql8之前 # show slave status  show replica status  # 与主库连接 # mysql 8之前 #change master to master_host='127.0.0.1',master_post=3307, master_user='test', master_password='123456', master_log_file='mysql-bin.000002', master_log_pos=3268  # mysql8 改为 CHANGE REPLICATION SOURCE TO   SOURCE_HOST='127.0.0.1', 	SOURCE_PORT=3307,   SOURCE_USER='test',   SOURCE_PASSWORD='123456', 	SOURCE_LOG_FILE='mysql-bin.000002', 	SOURCE_LOG_POS=3268 	 # 开启复制 start replica

以上的SOURCE_LOG_FILESOURCE_LOG_POS是通过上面show master status中显示的File和Position的值。

Sharding-JDBC主从实现

3.1 规则配置

# 主从复制 server:   port: 8080  #sharding-jdbc分片规则配置 spring:   shardingsphere:     datasource:       names: order1,slave1 #数据源名称,有几个数据源就写几个名字       order1:  # 主库         type: com.alibaba.druid.pool.DruidDataSource         driver-class-name: com.mysql.cj.jdbc.Driver         url: jdbc:mysql://localhost:3307/order_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false         username: root         password: 123456       slave1: # 从库         type: com.alibaba.druid.pool.DruidDataSource         driver-class-name: com.mysql.cj.jdbc.Driver         url: jdbc:mysql://localhost:3308/order_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false         username: root         password: 123456     sharding:       # 主从库逻辑数据源定义       master-slave-rules:         order_ms: # 逻辑库           master-data-source-name: order1  # 主库           slave-data-source-names: slave1  # 从库,可配置多个       #分表策略       #按照id分表,id使用雪花算保证全局唯一,具体算法:tb_order是表前缀,拼接上:$->{id % 2}  的值。order_ms为逻辑库的名称       tables:         tb_order: #逻辑表           actual-data-nodes: order_ms.tb_order_$->{1..2}  #order1:数据源名称;两个tb_order表,分别为tb_order_1和tb_order_2           key-generator: # 指定主键生成策略             column: order_id             type: SNOWFLAKE           table-strategy:             inline:               sharding-column: order_id   #分片键。对id进行分表               algorithm-expression: tb_order_$->{order_id % 2 + 1}  #分片算法     props:       sql:         show: true  # 是否打印sql

1)配置主从数据库;

2)通过master-slave-rules,配置逻辑库名称,并指定主库和从库;

3)根据项目需要确定是否配置分表策略,以上配置为按order_id分表,等被2整除的存放在tb_order_1,不能整除的存放在tb_order_2;

3.2 实现代码

Sharding-JDBC提供了透明化的读写分离,无需重写代码。

3.3 结果验证

数据插入时,插入到主库。

查询时,从从库中查找。

查询返回的数据:

在从库中返回刚插入的数据。

 以上的示例的完整代码可以结合

Sharding-JDBC分库分表的基本使用-CSDN博客

博文中的示例,是在此基础上修改了配置文件。

结尾

以上为本篇分享的全部内容。

关于本篇内容你有什么自己的想法或独到见解,欢迎在评论区一起交流探讨下吧。

相关内容

热门资讯

必看攻略(德州wpk德州)软件... 必看攻略(德州wpk德州)软件透明挂(辅助挂)透明辅助挂软件(2022已更新)(哔哩哔哩);1、完成...
第六辅助挂(大厅wpk)软件透... 第六辅助挂(大厅wpk)软件透明挂(透视)外挂辅助器软件(2024已更新)(哔哩哔哩);致您一封信;...
8分钟了解花花生活圈app脚本... 您好,花花生活圈app脚本这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】很多玩...
发现一款(微扑克)软件透明挂(... 发现一款(微扑克)软件透明挂(透视)外挂辅助器透视挂(2022已更新)(哔哩哔哩)是一款可以让一直输...
最新通报(竞技德州联盟扑克)软... 最新通报(竞技德州联盟扑克)软件透明挂(辅助挂)透明辅助挂脚本(2021已更新)(哔哩哔哩);竞技德...
揭秘真相骨牌透视外挂!太难了原... 相信很多朋友都在电脑上玩过骨牌透视外挂吧,但是很多朋友都在抱怨用电脑玩起来不方便。为此小编给大家带来...
热点推荐(Wepoke脚本)软... 热点推荐(Wepoke脚本)软件透明挂(透视)外挂辅助器神器(2025已更新)(哔哩哔哩);Wepo...
几个辅助挂闲来十三水有外挂的!... 几个辅助挂闲来十三水有外挂的!太难了原来是有挂(2020已更新)(有挂推荐);1、不需要AI权限,帮...
辅助挂讲解嘉兴黑桃a外挂!太过... 辅助挂讲解嘉兴黑桃a外挂!太过分了其实确实是真的有挂(2023已更新)(有挂总结);1、点击下载安装...
实测辅助挂掌酷十三张系统规律!... 您好,掌酷十三张系统规律这款游戏可以开挂的,确实是有挂的,需要了解加微【757446909】很多玩家...