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

news2024/10/1 20:15:37

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博客

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

结尾

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

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

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

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

相关文章

在Windows中使用开源高性能编辑器Zed(持续更新)

简介 “Zed is a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter. It’s also open source.” “Zed是一款高性能的支持多人协作的代码编辑器,由Atom和Tree-sitter的创建者开发。它也是开源的。” Zed主打“高性能”&…

4. kvm存储虚拟化

kvm存储虚拟化 一、命令行工具管理虚拟磁盘1、查看虚拟磁盘2、添加磁盘3、删除磁盘 二、qcow2格式的磁盘文件1、创建磁盘文件2、差量镜像/快速创建虚机2.1 创建差量镜像2.2 准备配置文件2.3 创建虚拟机2.4 批量部署虚拟机 三、存储池 storage pool1、类型2、在线迁移2.1 规划后…

CentOS6用文件配置IP模板

CentOS6用文件配置IP模板 到 CentOS6.9 , 默认还不能用 systemctl , 能用 service chkconfig sshd on 对应 systemctl enable sshd 启用,开机启动该服务 ### chkconfig sshd on 对应 systemctl enable sshd 启用,开机启动该服务 sudo chkconfig sshd onservice sshd start …

LLM应用构建前的非结构化数据处理(三)文档表格的提取

1.学习内容 本节次学习内容来自于吴恩达老师的Preprocessing Unstructured Data for LLM Applications课程,因涉及到非结构化数据的相关处理,遂做学习整理。 本节主要学习pdf中的表格数据处理 2.环境准备 和之前一样,可以参考LLM应用构建前…

墨西哥:海外新闻稿媒体分发-海外pr发稿干货分享-大舍传媒

大舍传媒:海外新闻稿媒体分发平台 墨西哥观查者 (mexicoviewer) 墨西哥观查者是墨西哥一家知名的新闻媒体平台,该平台专注于报道墨西哥国内外的时事新闻、政治、经济、文化等多个领域的内容。其更新速度快,报道对象广泛,深受墨西…

WindowsMac共享文件夹设置

共享文件夹设置 共享文件夹设置Windows系统设置步骤一:设置共享文件夹步骤二: 访问共享文件夹 Mac系统中设置共享文件夹步骤一:设置共享文件夹步骤二:访问共享文件夹 小贴士结论 共享文件夹设置 有时需要在多台电脑之间共享文件夹&#xff0…

14-58 剑和诗人32 - 使用矢量数据库增强 LLM 应用程序

GPT-4、Bloom、LaMDA 等大型语言模型 (LLM) 在生成类似人类的文本方面表现出了令人印象深刻的能力。然而,它们在事实准确性和推理能力等方面仍然面临限制。这是因为,虽然它们的基础是从大量文本数据中提取统计模式,但它们缺乏结构化的知识源来为其输出提供依据。 最近,我们…

生产者消费者模型和线程同步问题

文章目录 线程同步概念生产者消费者模型条件变量使用条件变量唤醒条件变量 阻塞队列 线程同步概念 互斥能保证安全,但是仅有安全不够,同步可以更高效的使用资源 生产者消费者模型 下面就基于生产者消费者来深入线程同步等概念: 如何理解生产消费者模型: 以函数调用为例: 两…

VBA实现Excel数据排序功能

前言 本节会介绍使用VBA如何实现Excel工作表中数据的排序功能。 本节会通过下表数据内容为例进行实操: 1. Sort 单列排序 语法:Sort key1,Order1 说明: Key1:表示需要按照哪列进行排序 Order1:用来指定是升序xlAsce…

AI提示词:AI辅导「数学作业」

辅导孩子作业对许多家长来说可能是一件头疼的事,但这部分工作可以在一定程度上交给AI来完成。 打开ChatGPT4,输入以下内容: # Role 数学辅导专家## Profile - author: 姜小尘 - version: 02 - LLM: Kimi - language: 中文 - description: 专门为小学生…

53-4 内网代理6 - frp搭建三层代理

前提:53-3 内网代理5 - frp搭建二级代理-CSDN博客 三级网络代理 在办公区入侵后,发现需要进一步渗透核心区网络(192.168.60.0/24),并登录域控制器的远程桌面。使用FRP在EDMZ区、办公区与核心区之间建立三级网络的SOCKS5代理,以便访问核心区的域控制器。 VPS上的FRP服…

力扣hot100 -- 动态规划(上)

目录 ❄技巧 🌼爬楼梯 🍔杨辉三角 🌊打家劫舍 🐎完全平方数 🌼零钱兑换 🌼单词拆分 ❄技巧 动态规划dp-CSDN博客 👆花 5 分钟快速刷一遍 花 10 分钟浏览一下 线性DP 背包DP&#x1f447…

算法金 | 12 个最佳 Python 代码片段,帮我完成工作自动化,香~

​大侠幸会幸会,我是日更万日 算法金;0 基础跨行转算法,国内外多个算法比赛 Top;放弃 BAT Offer,成功上岸 AI 研究院 Leader; Python是一种多功能的编程语言,它提供了各种功能和库来有效地自动化…

STM32F103RB多通道ADC转换功能实现(DMA)

目录 概述 1 硬件 1.1 硬件实物介绍 1.2 nucleo-f103rb 1.3 软件版本 2 软件实现 2.1 STM32Cube配置参数 2.2 项目代码 3 功能代码实现 3.1 ADC功能函数 3.2 函数调用 4 测试 4.1 DMA配置data width:byte 4.2 DMA配置data width:Half wor…

Qt常用基础控件总结—输入部件(QComboBox类和QLineEdit)

输入部件 下拉列表控件QComboBox 类 QComboBox 类是 QWidget 类的直接子类,该类实现了一个下拉列表(组合框)。 QComboBox 类中的属性函数 1)count:const int 访问函数:int count() const; 获取组合框中的项目数量,默认情况下,对于空组合框或未设置当前项目的组合框,…

Java版Flink使用指南——合流

大纲 新建工程无界流奇数Long型无界流偶数Long型无界流奇数String型无界流 合流UnionConnect 测试工程代码 在《Java版Flink使用指南——分流导出》中,我们通过addSink进行了输出分流。本文我们将介绍几种通过多个无界流输入合并成一个流来进行处理的方案。 新建工…

ArcGIS实战—等高线绘制

今天分享一个使用ArcGIS Pro制作等高线地图的教程,等高线是用来表达地形最常见的形式之一。那么如何制作一个效果比较好的等高线地形图呢?让我们开始今天的教程。 1 DEM数据 第一步:获取DEM地形数据,网址(https://dwt…

贴脸细看Mixtral 8x7B- 稀疏混合专家模型(MoE)的创新与推动

贴脸细看Mixtral 8x7B- 稀疏混合专家模型(MoE)的创新与推动 原创 一路到底孟子敬 上堵吟 2024年01月15日 20:05 美国 I. 引言 A. Mixtral 8x7B的背景和目的 • 背景:随着大型语言模型在自然语言处理(NLP)领域的广泛…

本地 HTTP 文件服务器的简单搭建 (deno/std)

首发日期 2024-06-30, 以下为原文内容: 在本地局域网搭建一个文件服务器, 有很多种方式. 本文介绍的是窝觉得比较简单的一种. 文件直接存储在 btrfs 文件系统之中, 底层使用 LVM 管理磁盘, 方便扩容. 使用 btrfs RAID 1 进行镜像备份 (一个文件在 2 块硬盘分别存储一份), 防止…

es是如何处理索引数据的变动的?

1 概述 es是如何处理索引数据的变动的? 或者说索引数据变动时,es会执行哪些操作? refresh、fsync、merge 和 flush 操作有何作用? es是如何确保即使es发生宕机数据也不丢失的? 在回答上述问题前,可以先…