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.HikariDataSourcedriverClassName: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://127.0.0.1:3306/link?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456rules:- !SHARDINGtables:sys_user:# 真实数据节点,比如数据库源以及数据库在数据库中真实存在的actualDataNodes: ds_0.sys_user_${0..15}# 分表策略tableStrategy:# 用于单分片键的标准分片场景standard:# 分片键shardingColumn: username# 分片算法,对应 rules[0].shardingAlgorithmsshardingAlgorithmName: 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.HikariDataSourcedriverClassName: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://127.0.0.1:3306/link?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghaiusername: rootpassword: rootrules:
# 数据加密存储规则- !ENCRYPT# 需要加密的表集合tables:# 用户表t_user:# 用户表中哪些字段需要进行加密columns:# 手机号字段,逻辑字段,不一定是在数据库中真实存在phone:# 手机号字段存储的密文字段,这个是数据库中真实存在的字段cipherColumn: phone# 身份证字段加密算法encryptorName: common_encryptormail:cipherColumn: mailencryptorName: common_encryptor# 是否按照密文字段查询queryWithCipherColumn: true# 加密算法encryptors:# 自定义加密算法名称common_encryptor:# 加密算法类型type: AESprops:# 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.hqwc.cn/news/564345.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【索引失效】MySQL索引失效场景

1、对索引使用左或者左右模糊匹配 当我们使用左或者左右模糊匹配的时候&#xff0c;也就是 like %xx 或者 like %xx% 这两种方式都会造成索引失效。 比如下面的 like 语句&#xff0c;查询 name 后缀为「林」的用户&#xff0c;执行计划中的 typeALL 就代表了全表扫描&#xff…

(一)基于IDEA的JAVA基础7

关系运算符 运算符 含义 范例 结果 等于 12 false &#xff01; 不等于 1&#xff01;2 true > 大于 1>2 false < 小于 …

Vue 计算属性和watch监听

1.1.计算属性 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!-- 引入vue.js --><script src"node_modules/vue/dist/vue.js"></script> </h…

raise PyAutoGUIException! ! !

在了解pyautogui时&#xff0c;你是否遇到过这样的情况&#xff1a; y pyautogui.locateOnScreen(kk.png) print(y) 在信心满满下输入完成后选择直接运行&#xff0c;结果却是抛出异常的尴尬。 raise PyAutoGUIException( pyautogui.PyAutoGUIException: PyAutoGUI was unable…

Django之Celery篇(一)

一、介绍 Celery是由Python开发、简单、灵活、可靠的分布式任务队列,是一个处理异步任务的框架,其本质是生产者消费者模型,生产者发送任务到消息队列,消费者负责处理任务。 Celery侧重于实时操作,但对调度支持也很好,其每天可以处理数以百万计的任务。特点: 简单:熟悉…

Python文件读写操作

文件操作注意点 注意点&#xff1a; 1. for line in file --> 会将偏移量移到末尾 2. buffering1 --> 缓冲区中遇到换行就刷新&#xff0c;即向磁盘中写入 3. 读操作结束后&#xff0c;文本偏移量就会移动到读操作结束位置 """编写一个程序,循环不停的写入…

AtCoder ABC346 A-E题解

比赛链接:ABC346 Problem A: 签到题。 #include <bits/stdc.h> using namespace std; const int maxn105; int A[105],B[105]; int main(){int N;cin>>N;for(int i1;i<N;i)cin>>A[i];for(int i1;i<N;i){B[i]A[i1]*A[i];cout<<B[i]<<end…

GeoAI

GeoAI 是人工智能 (AI) 与空间数据、科学和地理空间技术的集成&#xff0c;以增进对空间问题的理解和解决。GeoAI 包括应用传统人工智能技术&#xff0c;通过从结构化和非结构化数据中提取、分类和检测信息来生成空间数据。GeoAI 也是空间显式人工智能技术的使用&#xff0c;旨…

JMeter并发工具的使用

视频地址&#xff1a;Jmeter安装教程01_Jmeter之安装以及环境变量配置_哔哩哔哩_bilibili 一、JMeter是什么 JMeter是一款免安装包&#xff0c;官网下载好后直接解压缩并配置好环境变量就可以使用。 环境变量配置可参考&#xff1a;https://www.cnblogs.com/liulinghua90/p/…

C++一维数组练习oj(3)

为什么C的一维数组练习要出要做那么多的题目&#xff1f;因为我们是竞赛学生&#xff01;想要将每个知识点灵活运用的话就必须刷大量的题目来锻炼思维。 我使用的是jsswoj.com这个刷题网站&#xff0c;当然要钱... C一维数组练习oj(2)-CSDN博客这是上一次的题目讲解 这道题有…

AtCoder Beginner Contest 346 A - D

A - Adjacent Product 大意 给定一些数&#xff0c;输出它们两两之间的乘积 思路 直接模拟即可。 代码 #include <iostream> #include <vector> using namespace std; int main(){int n;cin>>n;vector<int> a(n);for(auto &x: a) cin >&g…

javase day11笔记

第十一天课堂笔记 构造代码块 { } 给 所有对象 共性特点 进行初始化操作 创建对象时在堆区对象中存放实例变量,同时执行构造代码块 执行顺序:静态代码块—>非静态代码块—>构造方法 继承★★★ 将多个类中相同的实例变量和实例方法 , 单独存放到一个类中,成为父类…