ShardingSphere水平分表——开发经验(2)

1. 什么场景下分表?

数据量过大或者数据库表对应的磁盘文件过大。
Q:多少数据分表?

A:网上有人说1kw,2kw?不准确。
1、一般看字段的数量,有没有包含text类型的字段。我们的主表里面是不允许有text的大字段的。
2、一般看业务增长量,如果业务还在每天很高的数量增长就需要进行分表。

[!abstract] Note

  1. 一般如果数据中有text类型字段的时候就适合,采用垂直分表的方式
  2. 如果数据量过大的时候,单个数据库承受不住压力可以采用水平分表
2. 什么情况下分库?

连接不够用。

MySQL Server 假设支持 4000 个数据库连接。一个服务连接池最大 10 个,假设有 40 个节点。已经占用了 400 个数据库连接。
类似于这种服务,有10个,那你这个 MySQL Server 连接就不够了。

[!abstract] Note
连接不够可以进行读写分离,不涉及业务的拆分,只需要进行主从同步,配置多数据源就可以。大多数是读写分离就够了。

3. 又分库又分表?

高并发写入或查询场景。
数据量巨大场景。

3、数据库分库分表框架 ShardingSphere

Sharding-JDBC。

4、分片键

用于将数据库(表)水平拆分的数据库字段。

分库分表中的分片键(Sharding Key)是一个关键决策,它直接影响了分库分表的性能和可扩展性。以下是一些选择分片键的关键因素:

  1. 访问频率:选择分片键应考虑数据的访问频率。将经常访问的数据放在同一个分片上,可以提高查询性能和降低跨分片查询的开销。
  2. 数据均匀性:分片键应该保证数据的均匀分布在各个分片上,避免出现热点数据集中在某个分片上的情况。
  3. 数据不可变:一旦选择了分片键,它应该是不可变的,不能随着业务的变化而频繁修改。
    用户名和用户ID选哪个作为分片键?
  • 用户名。用户名可以登录。

分表之后如果查询不带分片建,就会向所有的表中查询

5、引入 ShardingSphere-JDBC到项目

1. 引入依赖
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core</artifactId>
    <version>5.3.2</version>
</dependency>
2. 定义分片规则

替换

spring:
  datasource:
  	# ShardingSphere 对 Driver 自定义,实现分库分表等隐藏逻辑
    driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
    # ShardingSphere 配置文件路径
    url: jdbc:shardingsphere:classpath:shardingsphere-config.yaml

shardingsphere-config.yaml

# 数据源集合
dataSources:
  ds_0:
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    jdbcUrl: jdbc:mysql://127.0.0.1:3306/link?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai
    username: root
    password: 123456

rules:
  - !SHARDING
    tables:
      sys_user:
        # 真实数据节点,比如数据库源以及数据库在数据库中真实存在的
        actualDataNodes: ds_0.sys_user_${0..15}
        # 分表策略
        tableStrategy:
          # 用于单分片键的标准分片场景
          standard:
            # 分片键
            shardingColumn: username
            # 分片算法,对应 rules[0].shardingAlgorithms
            shardingAlgorithmName: user_table_hash_mod
    # 分片算法
    shardingAlgorithms:
      # 数据表分片算法
      user_table_hash_mod:
        # 根据分片键 Hash 分片
        type: HASH_MOD
        # 分片数量
        props:
          sharding-count: 16
# 展现逻辑 SQL & 真实 SQL
props:
  sql-show: true

6、ShardingSphere 数据分片核心概念

1. 逻辑表

相同结构的水平拆分数据库(表)的逻辑名称,是 SQL 中表的逻辑标识。

2. 真实表

在水平拆分的数据库中真实存在的物理表。

[!abstract] Note
逻辑表和逻辑sql:在代码层面执行,逻辑表的字段对应的就是我们mybatisplus的配置
真实表和真实sql:经过分片算法计算之后的sql
根据分片键 Hash 分片 type: HASH_MOD。根据hash算法取模后进行分片策略。

1.7、用户信息加密存储

加密配置:shardingsphere-config.yaml

# 配置数据源,底层被 ShardingSphere 进行了代理
dataSources:
  ds_0:
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    jdbcUrl: jdbc:mysql://127.0.0.1:3306/link?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai
    username: root
    password: root

rules:
# 数据加密存储规则
  - !ENCRYPT
    # 需要加密的表集合
    tables:
      # 用户表
      t_user:
        # 用户表中哪些字段需要进行加密
        columns:
          # 手机号字段,逻辑字段,不一定是在数据库中真实存在
          phone:
            # 手机号字段存储的密文字段,这个是数据库中真实存在的字段
            cipherColumn: phone
            # 身份证字段加密算法
            encryptorName: common_encryptor
          mail:
            cipherColumn: mail
            encryptorName: common_encryptor
        # 是否按照密文字段查询
        queryWithCipherColumn: true
    # 加密算法
    encryptors:
      # 自定义加密算法名称
      common_encryptor:
        # 加密算法类型
        type: AES
        props:
          # AES 加密密钥
          aes-key-value: d6oadClrrb9A3GWo
props:
  sql-show: true

image.png

[!abstract] Note
如果是业务中已经有了phone这些需要加密的字段,后续如果想要添加密文字段的时候新添加一个字段就行。然后把queryWithCipherColumn: false,按照明文查询,后续数据清洗为密文之后再改为true。

例如此处:
image.png|500

[!abstract] Note
第一个phone对应的就是逻辑表的字段,第二个phone对应的是真实表的字段。
如果在企业中需要进行无缝的转换,可以改此处配置

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言数据结构之归并排序

疏雨池塘见 微风襟袖知 目录 归并排序的介绍 基本思想 时间复杂度分析 ⭐归并排序步骤 空间复杂度分析 代码展示 ✨归并排序的非递归 代码展示 总结&#x1f525; 归并排序的介绍 归并排序&#xff0c;是创建在归并操作上的一种有效的排序算法。算法是采用分治法&#xff…

项目1-加法计算器

1.创建项目 2.导入前端代码 2.1 static包内 2.2 测试前端代码是否有误 显示成功说明无误 2.3 定义用户接口 请求路径&#xff1a;calc/sum 请求方式&#xff1a;GET/POST 接口描述&#xff1a;计算两个整数相加 请求参数: 参数名类型是否必须备注num1Integer是参与计算的第…

瑞萨杯(一)

基础信息 RA6M5&#xff1a;ARM V8架构&#xff0c;24MHz外置晶振&#xff0c;200MHz主频 SCI&#xff08;Serial Communications Interface&#xff09;&#xff0c;意为串行通信接口 参考链接&#xff1a; 【瑞萨RA系列FSP库开发】RASCKeil的环境搭建_瑞萨ra mdk-CSDN博客…

主干网络篇 | YOLOv8改进之在主干网络中引入密集连接卷积网络DenseNet

前言:Hello大家好,我是小哥谈。DenseNet(密集连接卷积网络)是一种深度学习神经网络架构,它在2017年由Gao Huang等人提出。DenseNet的核心思想是通过密集连接(dense connection)来促进信息的流动和共享。在传统的卷积神经网络中,每个层的输入只来自于前一层的输出。而在…

C语言之strsep用法实例(八十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【Python音视频技术】Python音视频技术系列文章2---视频提取音频转换文字

接上一篇文章 【Python音视频技术】玩AI视频创作引发写Python音视频技术系列文章1---视频添加字幕 之前我想在视频中提取音频转换文字&#xff0c; 当时是用 PC剪映专业版搞定的&#xff0c; 详情见 【AI应用】模仿爆款视频二次创作短视频操作步骤 。 这里我准备用pytho…

铁道障碍物检测6种YOLOV8

铁道障碍物检测6种&#xff0c;采用YOLOV8训练&#xff0c;得到PT模型&#xff0c;然后转换成ONNX模型&#xff0c;OPENCV调用 铁道障碍物检测6种YOLOV8

android Fragment 生命周期 方法调用顺序

文章目录 Introlog 及结论代码 Intro 界面设计&#xff1a;点击左侧按钮&#xff0c;会将右侧 青色的RightFragment 替换成 黄色的AnotherRightFragment&#xff0c;而这两个 Fragment 的生命周期方法都会打印日志。 所以只要看执行结果中的日志&#xff0c;就可以知道 Fragme…

Linux 系统 快速卸载docker

(卸载前一定要做好相关数据的备份) 卸载&#xff1a; 第一种卸载方法 1、查询docker安装过的包&#xff1a; yum list installed | grep docker 2、删除安装包&#xff1a; yum remove docker-ce.x86_64 ddocker-ce-cli.x86_64 -y 3、删除镜像/容器等 rm -rf /var/lib/dock…

IT运维服务规范标准与实施细则

一、 总则 本部分规定了 IT 运维服务支撑系统的应用需求&#xff0c;包括 IT 运维服务模型与模式、 IT 运维服务管理体系、以及 IT 运维服务和管理能力评估与提升途径。 二、 参考标准 下列文件中的条款通过本部分的引用而成为本部分的条款。凡是注日期的引用文件&#xff0c…

基于QT的实现的人脸识别、人脸标记、人脸比对

该项目使用的人脸模型框架采用的是seetaface开源版本&#xff0c;经过测试发现效果还算可以。 人脸识别的效果图如下: 人脸比对的效果图如下&#xff1a; 鉴于测试识别的精度特意找了不同两人相似的人脸进行比对&#xff0c;效果如下图&#xff1a; 由于该模型采用的阈值是0.6…

前端框架前置课(1)---AJAX阶段

1. AJAX入门 1.1 AJAX概念和axios使用 1.1.1 什么是AJAX? 1.1.2 怎么用AJAX? 引入axios.js 获取省份列表数据 1.2 认识URL 1.3 URL查询参数 1.4 常用请求方和数据提交 1.5 HTTP协议-报文 1.5.1 HTTP响应状态码 1.5.1.1 状态码&#xff1a;1XX&#xff08;信息&#xff09…

vulhub中Apache Shiro 认证绕过漏洞复现(CVE-2020-1957)

Apache Shiro是一款开源安全框架&#xff0c;提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用&#xff0c;同时也能提供健壮的安全性。 在Apache Shiro 1.5.2以前的版本中&#xff0c;在使用Spring动态控制器时&#xff0c;攻击者通过构造..;这样的跳转&#xff0…

Oracle等待事件-db file parallel read

前面两篇聊了Oracle等待事件-db file scattered read和Oracle等待事件-db file sequential read 相比于前两者等待事件只有读,但是到db file parallel 就有db file parallel read 和 db file parallel write db file parallel read是指当进程并行发出多个 I/O 请求以将数据…

Linux虚拟机的安装部署--尚硅谷笔记

part1 VMware的使用 学习目标 1 熟悉VMware软件的使用 2 可以熟练为虚拟计算机安装Linux操作系统 3 能独立解决安装过程中的常见问题 第一节 VMware的作用 VMware软件的作用 ![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传] 第一步&#xff0c;在W…

DFS基础——迷宫

迷宫 配套视频讲解 关于dfs和bfs的区别讲解。 对于上图&#xff0c;假设我们要找从1到5的最短路&#xff0c;那么我们用dfs去找&#xff0c;并且按照编号从大到小的顺序去找&#xff0c;首先找到的路径如下&#xff0c; 从节点1出发&#xff0c;我们发现节点2可以走&#xff…

面试算法-88-反转链表

题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 解 class Solution {public ListNode reverseList(ListNode head) {if(head null || hea…

opencv-批量调整图片的曝光率

#--coding:utf-8-- import cv2 import numpy as np import osdef gamma_trans(img,gamma):#gamma函数处理gamma_table[np.power(x/255.0,gamma)*255.0 for x in range(256)]#建立映射表gamma_tablenp.round(np.array(gamma_table)).astype(np.uint8)#颜色值为整数return cv2.LU…

2024年最新阿里云服务器价格表(配置价格+带宽价格+磁盘)

2024年腾讯云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新的云服务器优惠券…

WindowsServer2008 安装

一、镜像包 链接&#xff1a;https://pan.baidu.com/s/1t4ju_NN2Od4_1HXeWimaPw?pwd58uq 提取码&#xff1a;58uq 二、安装步骤 第一步&#xff1a;点击创建新的虚拟机 第二步&#xff1a;点击下一步 &#xff08; 可以选典型&#xff0c;也可以选择自定义&#xff09; 第…
最新文章