ShardingSphere初探(二)

ShardingSphere初探(二)

广播表

广播表是指在分布式数据库系统中,每个数据节点上都拥有其完整副本的表。无论查询操作在哪个节点上执行,广播表的数据在所有节点上都是一致的。

演示
  • 表创建,分别在库1和库2创建t_dict表
CREATE TABLE `t_dict` (`dict_id` bigint(20) NOT NULL,`ustatus` varchar(255) DEFAULT NULL,`uvalue` varchar(255) DEFAULT NULL,PRIMARY KEY (`dict_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  • 创建DictMapper
public interface DictMapper extends BaseMapper<Dict> {
}
  • 创建entity
@TableName("t_dict")
public class Dict {@TableField("dict_id")private Long dictId;private String ustatus;private String uvalue;getter setter....
}
  • 广播表配置,将t_dict配置成广播表,广播表配置后,不受任何分片影响
spring:shardingsphere:datasource:names: m1,m2m1:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://47.109.94.124:3306/coursedb?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: 123456m2:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://47.109.188.99:3306/coursedb?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: 123456sharding:#配置广播表broadcast-tables: t_dictprops:sql:#开启sp  sql日志show: true
  • 测试
public void addDict(){Dict dict = new Dict();dict.setDictId(1L);dict.setUstatus("1");dict.setUvalue("正常");dictMapper.insert(dict);Dict dict2 = new Dict();dict2.setDictId(2L);dict2.setUstatus("2");dict2.setUvalue("异常");dictMapper.insert(dict2);}

观察日志

2024-06-28 22:57:33.786  INFO 5628 --- [           main] ShardingSphere-SQL                       : Logic SQL: INSERT INTO t_dict  ( dict_id,ustatus,uvalue )  VALUES  ( ?,?,? )
2024-06-28 22:57:33.787  INFO 5628 --- [           main] ShardingSphere-SQL                       : Actual SQL: m1 ::: INSERT INTO t_dict  ( dict_id,ustatus,uvalue )  VALUES  (?, ?, ?) ::: [1, 1, 正常]
2024-06-28 22:57:33.787  INFO 5628 --- [           main] ShardingSphere-SQL                       : Actual SQL: m2 ::: INSERT INTO t_dict  ( dict_id,ustatus,uvalue )  VALUES  (?, ?, ?) ::: [1, 1, 正常]
2024-06-28 22:57:33.860  INFO 5628 --- [           main] ShardingSphere-SQL                       : Logic SQL: INSERT INTO t_dict  ( dict_id,ustatus,uvalue )  VALUES  ( ?,?,? )
2024-06-28 22:57:33.860  INFO 5628 --- [           main] ShardingSphere-SQL                       : Actual SQL: m1 ::: INSERT INTO t_dict  ( dict_id,ustatus,uvalue )  VALUES  (?, ?, ?) ::: [2, 2, 异常]
2024-06-28 22:57:33.860  INFO 5628 --- [           main] ShardingSphere-SQL                       : Actual SQL: m2 ::: INSERT INTO t_dict  ( dict_id,ustatus,uvalue )  VALUES  (?, ?, ?) ::: [2, 2, 异常]

通过实际执行sql可以看到,ShardingSphere在m1,m2库中均执行了插入数据的操作。

绑定表

绑定表是指多个逻辑上存在关联关系的表(如外键关联的表),它们通过相同的分片键和分片规则进行分片,以确保相关联的数据存储在相同的物理节点上。

演示
  • 表创建,分别在库1和库2创建orders_ − > 1..2 和 o r d e r i t e m s _ ->{1..2}和order_items\_ >1..2orderitems_->{1…2}表
CREATE TABLE orders (order_id INT PRIMARY KEY,user_id INT,order_date DATE
);CREATE TABLE order_items (item_id INT PRIMARY KEY,order_id INT,product_id INT,quantity INT
);
  • 创建entity
@TableName("orders")
public class Orders {@TableField("order_id")private Integer orderId;@TableField("user_id")private Integer userId;@TableField("order_date")private Date orderDate;...getter setter
}
@TableName("order_items")
public class OrderItems {@TableField("item_id")private Integer itemId;@TableField("order_id")private Integer orderId;@TableField("product_id")private Integer productId;private Integer quantity;...getter setter
}
  • 创建对应的mapper
public interface OrderItemsMapper extends BaseMapper<OrderItems> {}
public interface OrdersMapper extends BaseMapper<Orders> {
}
  • yaml配置
spring:shardingsphere:datasource:names: m1,m2m1:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://47.109.94.124:3306/coursedb?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: 123456m2:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://47.109.188.99:3306/coursedb?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: 123456sharding:tables:orders:actual-data-nodes: m$->{1..2}.orders_$->{1..2}database-strategy:inline:sharding-column: order_idalgorithm-expression: m$->{order_id % 2 + 1}table-strategy:inline:sharding-column: order_idalgorithm-expression: orders_$->{order_id % 2 + 1}order_items:actual-data-nodes: m$->{1..2}.order_items_$->{1..2}database-strategy:inline:sharding-column: order_idalgorithm-expression: m$->{order_id % 2 + 1}table-strategy:inline:sharding-column: order_idalgorithm-expression: order_items_$->{order_id % 2 + 1}props:sql:#开启sp  sql日志show: true
  • 插入数据
public void addOrders(){for (int i = 0; i <10; i++) {Orders orders = new Orders();orders.setOrderDate(new Date());orders.setUserId(i + 1);orders.setOrderId(i + 1);ordersMapper.insert(orders);Integer orderId = orders.getOrderId();OrderItems orderItems = new OrderItems();orderItems.setItemId(i + 1);orderItems.setOrderId(orderId);orderItems.setQuantity(1);orderItems.setProductId(i);orderItemsMapper.insert(orderItems);}}

m1->orders_1的数据如下

order_iduser_idorder_date
222024-06-28
442024-06-28
662024-06-28
882024-06-28
10102024-06-28

m1->orders_2为空

m1->order_items_1的数据如下

item_idorder_idproduct_idquantity
2211
4431
6651
8871
101091

m1->order_items_2的数据为空

可以看到,由于是相同的分片键,而且分片算法一样,所以基于order_id的情况,分片数据落到同一种上去了,既orders_1的数据在 order_items_1中

同理,m2库中也一样,orders_2的数据在order_items_2中,这里不做数据展示

非绑定演示
  • 执行以下sql会出现什么结果呢
SELECT o.order_id, o.user_id, oi.product_id, oi.quantity FROM orders o JOIN order_items oi ON o.order_id = oi.order_id
2024-06-29 00:36:59.544  INFO 15972 --- [           main] ShardingSphere-SQL                       : Actual SQL: m1 ::: SELECT o.order_id, o.user_id, oi.product_id, oi.quantity FROM orders_2 o JOIN order_items_1 oi ON o.order_id = oi.order_id
2024-06-29 00:36:59.544  INFO 15972 --- [           main] ShardingSphere-SQL                       : Actual SQL: m1 ::: SELECT o.order_id, o.user_id, oi.product_id, oi.quantity FROM orders_2 o JOIN order_items_2 oi ON o.order_id = oi.order_id
2024-06-29 00:36:59.544  INFO 15972 --- [           main] ShardingSphere-SQL                       : Actual SQL: m1 ::: SELECT o.order_id, o.user_id, oi.product_id, oi.quantity FROM orders_1 o JOIN order_items_1 oi ON o.order_id = oi.order_id
2024-06-29 00:36:59.544  INFO 15972 --- [           main] ShardingSphere-SQL                       : Actual SQL: m1 ::: SELECT o.order_id, o.user_id, oi.product_id, oi.quantity FROM orders_1 o JOIN order_items_2 oi ON o.order_id = oi.order_id
2024-06-29 00:36:59.544  INFO 15972 --- [           main] ShardingSphere-SQL                       : Actual SQL: m2 ::: SELECT o.order_id, o.user_id, oi.product_id, oi.quantity FROM orders_2 o JOIN order_items_1 oi ON o.order_id = oi.order_id
2024-06-29 00:36:59.544  INFO 15972 --- [           main] ShardingSphere-SQL                       : Actual SQL: m2 ::: SELECT o.order_id, o.user_id, oi.product_id, oi.quantity FROM orders_2 o JOIN order_items_2 oi ON o.order_id = oi.order_id
2024-06-29 00:36:59.544  INFO 15972 --- [           main] ShardingSphere-SQL                       : Actual SQL: m2 ::: SELECT o.order_id, o.user_id, oi.product_id, oi.quantity FROM orders_1 o JOIN order_items_1 oi ON o.order_id = oi.order_id
2024-06-29 00:36:59.544  INFO 15972 --- [           main] ShardingSphere-SQL                       : Actual SQL: m2 ::: SELECT o.order_id, o.user_id, oi.product_id, oi.quantity FROM orders_1 o JOIN order_items_2 oi ON o.order_id = oi.order_id

通过日志可以看到,sharding在两个表未进行绑定的时候,会默认m1中orders_1和order_items2进行关联查询,最后再聚合。

可是由于我们的分片键是通过order_id进行同样分片算法的,我们知道。orders_1中的order_items数据一定在order_items_2中。

这样浪费了查询次数,也可以发生笛卡尔积现象

通过在yaml中增加绑定表配置

spring:sharding:binding-tables:- orders,order_items

将orders和order_items进行绑定。

  • 再次执行,观察具体sql执行情况
2024-06-29 00:48:38.665  INFO 5700 --- [           main] ShardingSphere-SQL                       : Actual SQL: m1 ::: SELECT o.order_id, o.user_id, oi.product_id, oi.quantity FROM orders_1 o JOIN order_items_1 oi ON o.order_id = oi.order_id
2024-06-29 00:48:38.665  INFO 5700 --- [           main] ShardingSphere-SQL                       : Actual SQL: m1 ::: SELECT o.order_id, o.user_id, oi.product_id, oi.quantity FROM orders_2 o JOIN order_items_2 oi ON o.order_id = oi.order_id
2024-06-29 00:48:38.665  INFO 5700 --- [           main] ShardingSphere-SQL                       : Actual SQL: m2 ::: SELECT o.order_id, o.user_id, oi.product_id, oi.quantity FROM orders_1 o JOIN order_items_1 oi ON o.order_id = oi.order_id
2024-06-29 00:48:38.665  INFO 5700 --- [           main] ShardingSphere-SQL                       : Actual SQL: m2 ::: SELECT o.order_id, o.user_id, oi.product_id, oi.quantity FROM orders_2 o JOIN order_items_2 oi ON o.order_id = oi.order_id

可以看到,orders_1只会关联order_items_1,orders_2只会关联order_items_2,这样避免了跨节点查询,优化了查询性能。

读写分离

真正的读写分离是mysql主从中的概念,Sharding在应用层面只能做到读在一个库,写在另一个库。数据同步是由mysql主从通过binlog同步。

如何配置

spring:shardingsphere:datasource:names: m1,m2m1:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://47.109.94.124:3306/coursedb?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: 123456m2:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://47.109.188.99:3306/coursedb?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: 123456sharding:tables:orders:actual-data-nodes: ds0.orders_$->{1..2}database-strategy:inline:sharding-column: order_idalgorithm-expression: m$->{order_id % 2 + 1}table-strategy:inline:sharding-column: order_idalgorithm-expression: orders_$->{order_id % 2 + 1}order_items:actual-data-nodes: ds0.order_items_$->{1..2}database-strategy:inline:sharding-column: order_idalgorithm-expression: m$->{order_id % 2 + 1}table-strategy:inline:sharding-column: order_idalgorithm-expression: order_items_$->{order_id % 2 + 1}binding-tables:- orders,order_itemsmaster-slave-rules:#配置主从规则名字ds0:#配置读写分离,主库是m1,从库是m2master-data-source-name: m1#从库可以多个,所以是数组slave-data-source-names:- m2props:sql:#开启sp  sql日志show: true

actual-data-nodes中就不会存在m1,m2数据源了,只会存在配置的主从源ds0

这里配置m1负责写,m2负责读

重新执行

SELECT o.order_id, o.user_id, oi.product_id, oi.quantity FROM orders o JOIN order_items oi ON o.order_id = oi.order_id
2024-06-29 01:01:09.817  INFO 3664 --- [           main] ShardingSphere-SQL                       : Actual SQL: m2 ::: SELECT o.order_id, o.user_id, oi.product_id, oi.quantity FROM orders_1 o JOIN order_items_1 oi ON o.order_id = oi.order_id
2024-06-29 01:01:09.817  INFO 3664 --- [           main] ShardingSphere-SQL                       : Actual SQL: m2 ::: SELECT o.order_id, o.user_id, oi.product_id, oi.quantity FROM orders_2 o JOIN order_items_2 oi ON o.order_id = oi.order_id

可以看到,实际执行sql,不会再去m1库中查询。

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

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

相关文章

使用 mindspore 的常见的 Tensor 的用法

1. 背景&#xff1a; 使用 mindspore 学习神经网络&#xff0c;打卡第二天&#xff1b; 2. 训练的内容&#xff1a; 使用 mindspore 的常见的 Tensor 的用法&#xff1b; 3. 常见的用法小节&#xff1a; Tensor 构造; 初始化; 继承属性(ones_like); 属性 - 同 numpy; 索引…

SOAP vs REST介绍

SOAP&#xff08;简单对象访问协议&#xff09; 定义&#xff1a;SOAP是一种基于XML的通信协议&#xff0c;用于在网络中交换结构化信息&#xff0c;特别是在分布式环境和需要中介&#xff08;如网关或防火墙&#xff09;的环境中。它通过HTTP、SMTP等多种传输协议传输信息&…

示例:WPF中推荐一个Diagram开源流程图控件

一、目的&#xff1a;分享一个自研的开源流程图控件 二、使用方法 1、引用Nuget包&#xff1a; 2、添加节点列表和绘图控件 <DockPanel><ItemsControl DockPanel.Dock"Left"><h:GeometryNodeData Text"节点"/></ItemsControl><…

代码随想三刷贪心篇4

代码随想三刷贪心篇4 452. 用最少数量的箭引爆气球题目代码435. 无重叠区间题目代码763. 划分字母区间题目代码56. 合并区间题目代码452. 用最少数量的箭引爆气球 题目 链接 代码 class Solution {public int findMinArrowShots(int[][] points) {Arrays.

Android Style 使用指南

简介: Android Style 是一种能够统一定义应用程序中视图元素外观和行为的强大工具。通过使用 Style&#xff0c;可以轻松地应用相同的样式属性到多个视图上&#xff0c;提高代码的可维护性和重用性。本文将介绍 Android Style 的基本概念、使用方法以及一些最佳实践&#xff0c…

Mysql的SQL语句实例

一.权限表 1.user表 User表是MySQL中最重要的一个权限表&#xff0c;记录允许连接到服务器的帐号信息&#xff0c;里面的权限是全局级的。 2.db表和host表 db表和host表是MySQL数据中非常重要的权限表。db表中存储了用户对某个数据库的操作权限&#xff0c;决定用户能从哪个…

mysql8.0其他数据库日志

概述 我们在讲解数据库事务时&#xff0c;讲过两种日志:重做日志、回滚日志。 对于线上数据库应用系统&#xff0c;突然遭遇数据库宕机怎么办?在这种情况下&#xff0c;定位宕机的原因就非常关键。可以查看数据库的错误日志。因为日志中记录了数据库运行中的诊断信息&#xff…

基于STM32的智能家用电力管理系统

目录 引言环境准备智能家用电力管理系统基础代码实现&#xff1a;实现智能家用电力管理系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;电力管理与优化问题解决方案与优化收尾与总结 1. 引言 智能家用电力管理系统通…

【漏洞复现】I doc view——任意文件读取

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 I doc view 在线文档预览是一个用于查看、编辑、管理文档的工具…

JS(JavaScript)事件处理(事件绑定)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

心理辅导平台系统

摘 要 中文本论文基于Java Web技术设计与实现了一个心理辅导平台。通过对国内外心理辅导平台发展现状的调研&#xff0c;本文分析了心理辅导平台的背景与意义&#xff0c;并提出了论文研究内容与创新点。在相关技术介绍部分&#xff0c;对Java Web、SpringBoot、B/S架构、MVC模…

element 表格嵌套表单验证指定行

elementui表格嵌套动态表单&#xff0c;单独验证某一行输入项是否符合校验规则&#xff1b; input动态绑定校验 :prop"imgTable. scope.$index .bxName" <el-form :model"formTable" ref"formTable" inline size"small"><…

STM32_实现双线程控制LED交替闪烁(UCOS)

线程定义函数 void OSTaskCreate (OS_TCB *p_tcb,CPU_CHAR *p_name,OS_TASK_PTR p_task,void *p_arg,OS_PRIO prio,CPU_STK *p_stk_base,CPU_STK_SIZE stk_limit,CPU_STK_SIZE stk_size,OS_MSG_QTY q_size,OS_TICK time…

云顶之弈数据网站

摘要&#xff1a;随着云顶之弈游戏的广泛流行&#xff0c;玩家对于游戏数据的查询和最新资讯的获取需求呈现出显著增长的趋势。设计一款云顶之弈数据网站&#xff0c;为玩家提供便捷、高效的数据查询和资讯浏览服务&#xff0c;能满足玩家对于游戏数据的快速查询和实时资讯获取…

C# 如何单纯的优化循环

Parallel.For(0, 10000, i >{// 并行执行的代码块// 例如: Console.WriteLine(i);}); 这种循环比 单纯常用的for 和 foreach 要稍微快一点 但是呢如果循环里面写的是非常简单的业务逻辑 的话 for和foreach 要更胜一筹一点 Parallel 原理就好像我一个人忙不过来可以多找几个…

已解决java.security.acl.LastOwnerException:无法移除最后一个所有者的正确解决方法,亲测有效!!!

已解决java.security.acl.LastOwnerException&#xff1a;无法移除最后一个所有者的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 出现问题的场景 报错原因 解决思路 解决方法 1. 检查当前所有者数量 2. 添加新的所有者 3. 维…

在区块链技术广泛应用的情况下,C 语言如何在区块链的底层开发中发挥更有效的作用,提高性能和安全性?

C语言在区块链底层开发中发挥着重要的作用&#xff0c;可以提高性能和安全性。具体可以从以下几个方面进行优化&#xff1a; 性能优化&#xff1a;C语言是一种高效的编程语言&#xff0c;可以直接访问内存和硬件资源。在区块链底层开发中&#xff0c;使用C语言可以更好地利用底…

ubuntu20.04 docker启动frp服务端

1. docker-compose.yml version: 3.8services:frps:image: snowdreamtech/frps:0.46.0container_name: frpsrestart: alwaysnetwork_mode: hostvolumes:- /root/application/docker/frp/frps.ini:/etc/frp/frps.ini分局实际情况修改挂载目录 2. frps.ini [common] # 监听端口…

【C语言】--数据类型和变量

&#x1f617;个人主页: 起名字真南 &#x1f619;个人专栏:【数据结构初阶】 【C语言】 目录 1 数据类型介绍1.1 字符型1.2 整形1.3 浮点型1.4 布尔型1.5 各种数据类型的长度1.5.1 sizeof 操作符1.5.2 数据类型长度1.5.3 sizeof 中表达式不计算 2 signed 和 unsigned3 数据类型…

1978Springboot在线维修预约服务应用系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot在线维修预约服务应用系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发 &#xff09;&#xff0c;系统具有完整的源代码和…