Sharding JDBC 学习了解 - 总览和概念

第一部分:概述

  • ShardingSphere是一个由一套分布式数据库中间件解决方案组成的开源生态圈,包括Sharding-JDBC、Sharding-Proxy和Sharding-Proxy 3个独立产品。
  • 它们都提供了数据分片、分布式事务、数据库编排等功能,适用于Java同构、异构语言、云原生等多种场景。
  • ShardingSphere将自己定义为一个中间件,而不是一种全新的数据库。 关系数据库作为众多企业的基石,仍然占据着巨大的市场份额。因此,现阶段我们更愿意关注它的增量,而不是彻底的颠覆。

1.1 Sharding-JDBC

Sharding-JDBC将自己定义为一个轻量级的Java框架,在Java JDBC层提供额外的服务。客户端直接连接数据库,以jar的形式提供服务,不需要额外的部署和依赖。 它可以被认为是一个增强的 JDBC 驱动程序,它完全兼容 JDBC和各种 ORM 框架。

  • 适用于任何基于 JDBC 的 ORM 框架,如 JPA、Hibernate、Mybatis、Spring JDBC Template 或直接使用 JDBC。
  • 支持任何第三方数据库连接池,如DBCP、C3P0、BoneCP、Druid、HikariCP。
  • 支持任何类型的 JDBC 标准数据库:MySQL、Oracle、SQLServer、PostgreSQL 以及任何遵循 SQL92 的数据库。

特征(1) 数据库分片&表分片(2) 读写分离(3) 分片策略定制(4) 无中心分布式主键


1.2 Sharding-Proxy

Sharding-Proxy将自己定义为透明的数据库代理,提供封装数据库二进制协议以支持异构语言的数据库服务器。 对DBA来说更加友好,现在提供的MySQL版本可以使用任何兼容MySQL协议的终端(例如MySQL Command Client、MySQL Workbench等)来操作数据。

  • 对应用程序完全透明,可以直接像MySQL一样使用。
  • 适用于任何兼容MySQL、PostgreSQL协议的终端。

1.3 Sharding-Sidecar(TODO)

目前(2023年12月22日)还没没有完成。

Sharding-Sidecar(TODO)将自己定义为 Kubernetes 环境的云原生数据库代理,以 sidecar 的形式负责所有对数据库的访问。 它提供了一个与数据库交互的网格层,我们称之为Database Mesh。

Database Mesh强调如何将分布式数据库访问应用程序与数据库连接起来。 以交互为中心,有效地组织了杂乱的应用程序与数据库之间的交互。 使用Database Mesh访问数据库的应用程序和数据库将形成一个大的网格系统,只需将它们相应地放置到正确的位置即可。 它们都受网格层的控制。


对比

Sharding-JDBCSharding-ProxySharding-Sidecar
数据库任何MySQLMySQL
连接计数成本高的低的高的
支持的语言仅限 Java任何任何
表现低损耗相对较高的损耗低损耗
去中心化是的
静态条目是的

特点总结:

  • Sharding-JDBC采用去中心化架构,适用于Java开发的高性能轻量级OLTP应用;
  • Sharding-Proxy提供静态入口和全语言支持,适用于OLAP应用和分片数据库管理和操作场景。
  • ShardingSphere是一个由多个端点共同组成的生态圈。
  • 通过Sharding-JDBC和Sharding-Proxy的混合使用以及同一注册中心统一的分片策略,ShardingSphere可以构建适用于各种场景的应用系统。 架构师可以更自由地将系统架构调整为最适合当前业务的架构。


第二部分:快速入门

2.1 Sharding-JDBC

主要包括以下三步:

  1. 导入maven依赖
  2. 分片规则配置
  3. 创建数据源

Step 1 导入maven依赖

<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-core</artifactId><version>${latest.release.version}</version>
</dependency>

Step 2 分片规则配置
Sharding-JDBC 可以通过四种方式进行配置:Java、YAML、Spring namespace 和 Spring boot starter。
开发者可以根据不同的情况选择合适的方法。

Step 3 创建数据源
使用ShardingDataSourceFactory和规则配置对象创建ShardingDataSource,ShardingDataSource是由标准JDBC接口DataSource实现的。然后,用户可以使用原生的JDBC或JPA、MyBatis等ORM框架进行开发。

DataSource dataSource = ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, props);

2.2 Sharding-Proxy

Todo


2.3 Sharding-Scaling(Alpha)

Todo



核心概念和特征

背景

传统的将所有数据存储在一个集中节点的解决方案在性能、可用​​性和运营成本三个方面已经很难满足海量互联网数据场景的需求。

  • 在性能上,关系型数据库大多采用B+树索引。当数据量超过阈值时,更深的索引会增加磁盘IO访问次数,从而削弱查询性能。同时,高并发请求也使得中心化数据库成为系统的最大限制。
  • 在可用性方面,可以通过无状态服务以相对较低的成本、任意程度的扩容,最终将所有的压力都落在数据库身上。但单一数据节点或者简单的主从结构已经越来越难以承受这些压力。因此,数据库的可用性就成为整个系统的关键。
  • 从运营成本方面来看,当数据库实例中的数据达到阈值以上时,DBA的运营压力也会增加。随着数据量的增加,数据备份和数据恢复的时间成本将更加不可控。一般来说,单库情况下的数据在1TB以内是一个比较合理的范围。

在传统关系数据库无法满足互联网需求的情况下,越来越多的尝试将数据存储在原生分布式NoSQL中。但其与SQL的不兼容以及生态系统的不完善,使其无法在竞争中击败关系数据库,因此关系数据库仍然占据着不可动摇的地位。

分片是指 将一个数据库中的数据按照一定的标准切分到多个表和数据库中,从而提高性能和可用性。 两种方法都可以有效避免由于数据超过可承受阈值而导致的查询限制。更重要的是,数据库分片还可以有效分散TPS。分表虽然不能缓解数据库压力,但可以提供将分布式事务转移到本地事务的可能性,因为一旦涉及到跨库升级,分布式事务有时会变得相当棘手。采用多主从分片方式,可以有效避免数据集中于一个节点,提高架构可用性。

  • 通过分库分表进行数据拆分是应对高TPS、海量数据系统的有效方法,可以使数据量保持在阈值以下,疏散流量。

分片方式可以分为垂直分片水平分片


垂直分片

按照业务分片的方式,称为垂直分片,或者说纵向分片,其核心理念是数据库的专用化。在分片之前,数据库由很多表组成,对应不同的业务。但分片后,**表按照业务分到不同的数据库,压力也分到不同的数据库。**下图给出了根据业务需求,通过垂直分片将用户表和订单表分配到不同数据库的解决方案。

垂直分片需要不时调整架构和设计。总体来说还不够快,无法应对互联网业务快速变化的需求,无法真正解决单节点问题。它可以缓解高数据量和并发量带来的问题,但不能完全解决。垂直分片后,如果表中的数据量仍然超过单节点阈值,则应进一步进行水平分片处理。
在这里插入图片描述

水平分片

水平分片也称为横向分片。与垂直分片按照业务逻辑进行分类的方法相比,水平分片通过一定的字段,按照一定的规则将数据分类到多个数据库或表中,每个分片只包含部分数据。

例如,根据主键分片,偶数主键放入0数据库(或表),奇数主键放入1数据库(或表)。

理论上,水平分片克服了单机数据处理量的限制,并且可以相对自由地扩展,因此可以作为分库分表的标准解决方案。

挑战和目标

分片虽然解决了性能、可用​​性、单节点备份恢复等问题,但其分布式架构在获取利润方面也带来了一些新的问题。

  • 一个问题是,面对如此分散的数据库和表格,应用开发工程师和数据库管理员的操作变得异常费力。他们应该确切地知道要从哪个数据库表获取数据。
  • 另一个挑战是,在单节点数据库中正确运行的SQL在分片数据库中可能并不正确。分片后表名改变,或者分页、order by、聚合group by等操作导致的误操作就是这样的例子。
  • 跨数据库事务也是分布式数据库需要处理的一件棘手的事情。合理使用分表还可以在单​​表数据量减少时充分利用本地事务。 通过明智地使用同一个数据库中的不同表,可以避免分布式事务带来的麻烦。当跨库事务无法避免时,部分业务仍然需要保持事务一致。

互联网巨头并没有大量采用基于XA的分布式事务,因为他们无法保证其在高并发情况下的性能。它们通常用最终一致的软状态替换强一致的事务。

ShardingSphere数据分片模块的主要设计目标是尽量减少分片的影响,让用户像使用一个数据库一样使用水平分片数据库组。

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

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

相关文章

docker学习(十一、Redis集群存储数据方式)

文章目录 一、集群数据存储1.单机连接集群问题2.集群方式连接redis存储数据 二、 查看集群信息 docker搭建Redis集群相关知识&#xff1a; docker学习&#xff08;九、分布式存储亿级数据知识&#xff09; docker学习&#xff08;十、搭建redis集群&#xff0c;三主三从&#x…

UE5 Landscape 制作GIS卫星图地形

1. 总体想法&#xff1a; 制作GIS地形&#xff0c;使用Landscaping MapBox是一个好方法&#xff0c;但是区域过大&#xff0c;会占用很多内存 https://blog.csdn.net/qq_17523181/article/details/135029614 如果采用QGis&#xff0c;导出卫星图&#xff0c;在UE5里拼合出地形…

docker 部署kafka

随笔记录 目录 1. 安装zookeeper 2. 安装Kafka 2.1 拉取kafka image 2.2 查询本地docker images 2.3 查看本地 容器&#xff08;docker container&#xff09; 2.3.1 查看本地已启动的 docker container 2.3.2 查看所有容器的列表&#xff0c;包括已停止的容器。 2.4 …

基于ssm二手车交易平台的设计论文

摘 要 进入21世纪网络和计算机得到了飞速发展&#xff0c;并和生活进行了紧密的结合。目前&#xff0c;网络的运行速度以达到了千兆&#xff0c;覆盖范围更是深入到生活中的角角落落。这就促使二手交易网站的发展。二手交易网站可以实现远程购物&#xff0c;远程选择喜欢的商品…

【数学建模美赛F奖速成系列】论文写作技巧+优秀论文讲评

目录 写在前面推荐课程历年优秀美赛论文 写在前面 由于美赛参赛规则是要求提交英文摘要和论文&#xff0c;作为评奖的唯一依据&#xff0c;这就要求参赛学生既要具有较好的数学建模能力&#xff0c;同时也需要具备较高的英语写作水平&#xff0c;并熟练掌握英语论文的写作技巧…

考研数学二内容总结

目录 高等数学 一、函数、极限、连续 考试内容 &#x1f3c1;总结&#xff1a; 考试要求 &#x1f3c1;1&#xff0e;理解函数的概念&#xff0c;掌握函数的表示法&#xff0c;会建立应用问题的函数关系&#xff0e; 2&#xff0e;了解函数的有界性、单调性、周期性和奇…

程序员自由创业周记#20:需求从何而来

程序员自由创业周记#20&#xff1a;需求从何而来 之前看过我周记的朋友应该了解我从7月份开始独立创业以来&#xff0c;主要做了两个产品&#xff0c;一个是加一&#xff0c;一个是Island Widgets - 灵动岛锁屏小组件 &#xff0c;上班的时候工作内容是上级主管分配&#xff0c…

C++基础语法总结

C使用 C的源文件扩展名是&#xff1a;cppC程序的入口是main函数C完全兼容c语言的语法 1、cin、cout C中常使用cin、cout进行控制台的输入和输出 #include <iostream> using namespace std;int main() {cout << "hello world !!!" << endl;retu…

Jenkins自动化构建打包,部署

1.环境准备 上传jdk&#xff0c;maven和tomcat的包&#xff0c;解压到/usr/local下并配置环境变量。 配置jdk [rootserver04 ~]# vim /etc/profile.d/java.sh JAVA_HOME/usr/local/java export PATH$JAVA_HOME/bin:$PATH##加载环境变量 [rootserver04 ~]# source /etc/profi…

DRF从入门到精通二(Request源码分析、DRF之序列化、反序列化、反序列化校验、序列化器常用字段及参数、source、定制字段、保存数据)

文章目录 一、Request对象源码分析区分原生request和新生request新的request还能像原来的reqeust一样使用吗源码片段分析总结&#xff1a; 二、DRF之序列化组件序列化介绍序列化步骤序列化组件的基本使用反序列化基本使用反序列化的新增反序列化的新增删除单条 反序列化的校验序…

Ubuntu 常用命令之 df 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 在Ubuntu系统下&#xff0c;df命令是用来查看文件系统的磁盘空间占用情况的。df是disk free的缩写&#xff0c;这个命令可以获取硬盘被占用了多少空间&#xff0c;还有多少空间是可用的&#xff0c;硬盘的挂载点等信息。 df命令的…

静态HTTP:为什么它如此重要

静态HTTP是互联网上使用最广泛的数据传输协议之一&#xff0c;它在Web应用程序中扮演着至关重要的角色。本文将探讨静态HTTP的重要性及其在Web开发中的应用。 一、静态HTTP的定义和优势 静态HTTP是指服务器上预先生成好的静态文件&#xff0c;这些文件包含HTML、CSS、JavaScr…