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

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_schemasql_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_schemasql_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 statusshow 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 TOSOURCE_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.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3307/order_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=falseusername: rootpassword: 123456slave1: # 从库type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3308/order_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=falseusername: rootpassword: 123456sharding:# 主从库逻辑数据源定义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_2key-generator: # 指定主键生成策略column: order_idtype: SNOWFLAKEtable-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博客

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

结尾

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3225807.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

无法找到模块“@wangeditor/editor-for-vue”的声明文件

vue3项目中使用wangeditor/editor遇到的问题 开发环境不管红线报错正常使用 打包的时候就会报错了 1.安装依赖 pnpm install --save wangeditor/editor wangeditor/editor-for-vuenext 2.遇到的问题 3.解决方法 在src目录下面创建 wangeditor-types.d.ts 文件 代码如下 de…

【ai_agent】从零写一个agent框架(五)基于egui制作一个agent/workflow在线编辑器

前言 上篇我们实现了基础节点,并暴露出grpc服务,但是手动编辑文本制作一个workflow实在强人所难。 所以本文我们做个webui自动生成workflow。 开搞之前先看看别人怎么做的。 Dify 的ui 效果如下图示: 支持多种功能节点 但只能打开一个节…

【线性表,线性表中的顺序表和链表】

目录 1、线性表的定义和基本操作1.1、线性表的定义1.2、线性表的基本操作 2、顺序表和链表的比较2.1、顺序表2.1.1、顺序表的定义和特点2.1.2、顺序表的实现(1)顺序表的静态分配:(2)顺序表的动态分配 2.1.3、顺序表的基…

基于正点原子的FreeRTOS笔记——队列

一、什么是队列 队列是任务到任务、任务到中断、中断到任务数据交流的一种机制。 在队列中可以存储数量有限、大小固定的数据。队列中的每一个数据叫做“队列项目”,队列能够存储“队列项目”的最大数量称为队列的长度。 在创建队列时要指定队列长度以及队列项目…

蹭一个围棋亚军!不要和低维的人说话——早读(逆天打工人爬取热门微信文章解读)

熬夜后需要补什么呢? 引言Python 代码第一篇 洞见 不要和低维的人说话(深度好文)第二篇 冲冲冲结尾 引言 昨晚真的是熬夜又想不出东西 真的头大 最近下围棋 这个棋感很好呀 我是K级选手 目前是8级 套几个buff 纯自学 为什么决定学围棋呢? 是…

翰德恩咨询赋能材料行业上市公司,共筑IPD管理体系新篇章

赋能背景概览 坐落于江苏的某材料行业领军企业,作为国内无机陶瓷膜元件及成套设备领域的佼佼者,以其庞大的生产规模、丰富的产品系列及卓越的研发实力,屹立行业之巅二十余年。公司不仅在新材料研发、技术创新、工艺设计、设备制造及整体解决…

swift与Internvl下的多模态大模型分布式微调指南(附代码和数据)

大模型相关目录 大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步,扬帆起航。 基于Dify的智能分类方案:大模型结合KNN算法(附代码&#xff…

InavFlight飞控固件学习-1《开发环境搭建》

目录 文章目录 目录摘要1.官网2.形成Linux开发环境工具2.1 简介2.2 相关工具2.2.1 Ubuntu / Debian系统配置命令2.2.2 Fedora系统配置命令2.2.3 Fedora系统配置命令 2.3 克隆存储库2.4 构建工具2.5 使用cmake2.6 构建固件2.7 清除2.8 cmake 缓存维护2.9 编译通过ninja2.10 更新…

小程序跳企业微信教程

来别急,我说几个点,你先记着, 必须真机才能测必须要企业微信里头去配置下关联到对应的小程序(文章底部有图)要同一个公司主体! 说说几个报错, 一、代码其实就这么一个,你别在微信…

virtuoso:layout如何做flat修drc

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 有些drc在virtuoso layout中修更节省时间,比如遇到一些via array需要做删改时,发现工具把via array做成了一个cell,如图。 去改cell可能会影…

高考志愿怎么选专业,哪些是热门专业?

选专业看上去非常简单,但是真正做起来的时候确实不容易,因为对于很多结束高考的学生来说,选专业就意味着他们选择自己的未来,这可是直接关系到未来的学习和职业发展,关系到将来的就业方向,再加上现在的社会…

逆向案例十一——华强北登录逆向

网址:aHR0cHM6Ly9wYXNzcG9ydC5ocWV3LmNvbS9sb2dpbg 登陆页面: 打开开发者工具会出现debugger调试: 直接使用一律不再此处暂停即可。点击登录,找到登录包。 发现有三个参数进行了加密,分别是Password,UserName和Devic…

如何修复 wxpython 事件调用?

1、问题背景 在使用 wxpython 开发 GUI 时,遇到了一个问题。当鼠标悬停在 BitmapButton 上时,会同时调用两个事件: self.Bind(wx.EVT_LEAVE_WINDOW, self.onPanelMouseLeave)self.Bind(wx.EVT_ENTER_WINDOW, self.onPanelMouseOver) 这导致…

解决U盘识别不了的一个小思路

我的U盘在自己在其他地方能正常使用,但是到了自己电脑突然就用不了了,其他设备也同样在自己电脑可以正常读写。 看了经验贴,大多是在设备管理器设置启动,但我的U盘明显不是这个问题。后面我看到一个贴子上的一个评论,想…

MQ四兄弟:如何保证消息顺序性

在当今的分布式系统架构中,消息队列(MQ)是不可或缺的组成部分。它们在确保系统组件之间高效通信方面发挥着关键作用。特别是在金融交易、物流跟踪等对消息处理顺序有严格要求的场景中,消息队列的顺序性保证显得更为重要。接下来&a…

本地电脑连接FTP服务器,显示无权限连接?

问题: 打开文档,在这一栏输入ftp服务器地址,按下回车,弹出无权限提示。 解决方案: 1、系统设置——网络和Internet——网络和共享中心 2、Internet选项 3、高级——取消“使用被动FTP”的勾选

@RequestBody注解的使用及源码解析

前言 RequestBody 注解是我们进行JavaEE开发,最常见的几个注解之一,这篇博文我们以案例和源码相结合,帮助大家更好的了解 RequestBody 注解 使用案例 1.自定义实体类 Data NoArgsConstructor AllArgsConstructor public class User {priv…

如何判断一个js对象为数组类型

如何判断一个js对象为数组类型? 能想到的最常见的intanceof是吗?开始是这么认为,但是不是哈,看下面的解释,也没有太明白,暂且记住吧 综上,判断js对象为数组的两种方式 Array.isArray([]) // trueObject.prototype.toString.call([]) ‘[object Array]’ //true

Oracle基础以及一些‘方言’(一)

1、什么是Oracle ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。 ORACLE 通常应用于大型系统的数据库产品。 ORACLE 数据库是目前世界…