Sharding-JDBC

分库分表的方案

戏子无情 提交于 2021-02-18 17:49:56
大数据量系统开发中,由于数据量很大,经常遇到数据存储在集群上的需求,这时候就需要在不同的方案中进行权衡选择了。 一种选择是利用现成的中间件,比如ES,HBASE,mongdb等,这些中间件自带集群扩展功能,业务代码无需关注水平扩展。 还有一种是关系数据库+分库分表路由的方式,典型的是shardingJDBC+多台mysql,通过shardingJDBC来进行路由到哪台mysql的方式完成。 第二种方式用起来比较费事,需要手工配置路由规则,因此最好的方式还是核心交易数据用这种方式,非核心数据还是用ES这种集群中间件来做,简化代码开发。 来源: oschina 链接: https://my.oschina.net/u/778683/blog/4955261

一文快速入门分库分表(必修课)

北城以北 提交于 2021-02-12 02:03:00
之前 有不少刚入坑 Java 的粉丝留言,想系统的学习一下分库分表相关技术,可我一直没下定决心搞,眼下赶上公司项目在使用 sharing-jdbc 对现有 MySQL 架构做分库分表的改造,所以借此机会出一系分库分表落地实践的文章,也算是自己对架构学习的一个总结。 我在网上陆陆续续的也看了一些有关于分库分表的文章,可发现网上同质化的资料有点多,而且知识点又都比较零碎,还没有详细的实战案例。为了更深入的学习下,我在某些平台买了点付费课程,看了几节课发现有点经验的人看还可以,但对于新手入门来说,其实学习难度还是蛮大的。 为了让新手也能看得懂,有些知识点我可能会用更多的篇幅加以描述,希望大家不要嫌我啰嗦,等这分库分表系列文章完结后,我会把它做成 PDF 文档开源出去,能帮一个算一个吧!如果发现文中有哪些错误或不严谨之处,欢迎大家交流指正。 具体实践分库分表之前在啰嗦几句,回头复习下分库分表的基础概念。 什么是分库分表 其实 分库 和 分表 是两个概念,只不过通常分库与分表的操作会同时进行,以至于我们习惯性的将它们合在一起叫做分库分表。 分库分表是为了解决由于库、表数据量过大,而导致数据库性能持续下降的问题。按照一定的规则,将原本数据量大的数据库拆分成多个单独的数据库,将原本数据量大的表拆分成若干个数据表,使得单一的库、表性能达到最优的效果(响应速度快),以此提升整体数据库性能。

sharding-jdbc

二次信任 提交于 2021-02-08 15:54:34
sharding-jdbc sharding-jdbc 是一个开源的适用于微服务的分布式数据访问基础类库,它始终以云原生的基础开发套件为目标。 sharding-jdbc定位为轻量级java框架,使用客户端直连数据库,以jar包的形式提供服务,未使用中间层,无需额外部署,并无其他依赖,,可以理解为增强版的JDBC驱动 sharding-jdbc完整的实现了分库分表/读写分离/分布式主键功能,并实现了柔性事务. 分库分表 sql解析功能完善,支持聚合,分组,排序,limit等查询,并且支持级联表和笛卡尔积的表查询 支持内/外连接查询 分片策略灵活,可支持=,between,in等多维度分片,以及自定义分片策略 基于hint的强制分库分表路由 读写分离 一主多从的读写分离配置,可配合分库分表使用 基于hint的强制分库分表路由 柔性事务 最大努力送大型事务 TCC型事务(TBD) 分布式主键 统一的分布式基于时间序列id生成器 兼容性 可适用于java的ORM框架 可基于第三方数据库连接池 灵活多样配置 java springBoot 分布式治理能力 sharding-jdbc都有哪些包? sharding-jdbc-config-parent 配置相关源码 sharding-jdbc-core 核心源码 sharding-jdbc-doc 文档 sharding-jdbc

springboot

ⅰ亾dé卋堺 提交于 2021-01-12 20:36:56
1)使用场景 对于Mysql主从复制实现读写分离来说,可以解决读的扩展性问题。但是写的话,面对庞大的数据量还是集中在Master上,并且Master挂载的slave不可能无限制多,因为slave依赖于Master的能力和负载的限制。因此需要对Master进行扩展来实现海量数据的需要。 2)分表 对于访问极为频繁,数据量又极大的表来说,最直接做的就是减少数据量的总条数,以便减少数据查询所需要的时间,可以对大数据表进行分表。 分表策略:用id来进行分表是最为常见的策略,因为大部分查询都要带上id,又不影响查询又能使得数据均衡的分布在各个表中。假设有一个订单表有1000w条数据,将该表分成16个表,将id%16进行存储,如果id不是数字可以先hash取值。拆分的记录根据取余的值进行存储,App应用根据取余的值进行表的访问。 3)分库 分表能解决数据量过大造成的查询效率低下的问题,但是无法有效提示数据的并发访问能力。将数据库拆分,提高数据库的写入能力就是所谓的分库。 与分表类似,分库策略可以通过对某一个字段如id进行取余操作,来对数据访问进行路由。如id=19,分成3个库,19%3=1,这时候就路由到第一个库。 4)sharding-jdbc 实现分库分表 sharding-jdbc 最先是当当网开源代码,后来被Apache集成。 sharding-jdbc能帮我们实现什么: 1

php面试专题---MySQL分区

核能气质少年 提交于 2020-12-29 11:23:07
php面试专题---MySQL分区 一、总结 一句话总结: mysql的分区操作还比较简单,好处是也不用自己动手建表进行分区,和水平分表有点像 1、mysql分区简介? 一个表或索引-->N个物理分区对象:分区是根据一定的规则,数据库把一个表分解成多个更小的、更容易管理的部分。就访问数据库应用而言,逻辑上就只有一个表或者一个索引,但实际上这个表可能有N个物理分区对象组成,每个分区都是一个独立的对象,可以独立处理,可以作为表的一部分进行处理。 分区不影响程序员编程:分区对应用来说是完全透明的,不影响应用的业务逻辑。 2、mysql分区注意? 主键/唯一键:无论哪种分区,要么你分区表上没有主键/唯一键,要么分区表的主键/唯一键都必须包含分区键,也就是说不能使用主键/唯一键字段之外的其它字段分区。 3、MySQL可以对索引进行分区么? 可以:MySQL分区即可以对数据进行分区也可以对索引进行分区。 4、mysql分区类型? range分区(常用):基于一个给定的连续区间范围(区间要求连续并且不能重叠),把数据分配到不同的分区 list分区:类似于range分区,区别在于list分区是居于枚举出的值列表分区,range是基于给定的连续区间范围分区 hash分区:基于给定的分区个数,把数据分配到不同的分区 key分区:类似于hash分区 5、mysql分区优势? 更多数据

MySQL:互联网公司常用分库分表方案汇总

你。 提交于 2020-12-19 03:05:26
作者 : 尜尜人物 cnblogs.com/littlecharacter/p/9342129.html 本文目录 一、数据库瓶颈 IO瓶颈 CPU瓶颈 二、分库分表 水平分库 水平分表 垂直分库 垂直分表 三、分库分表工具 四、分库分表步骤 五、分库分表问题 非partition key的查询问题 非partition key跨库跨表分页查询问题 扩容问题 六、分库分表总结 七、分库分表示例 一、数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是,可用数据库连接少甚至无连接可用。接下来就可以想象了吧(并发量、吞吐量、崩溃)。 1、IO瓶颈 第一种:磁盘读IO瓶颈,热点数据太多,数据库缓存放不下,每次查询时会产生大量的IO,降低查询速度 -> 分库和垂直分表。 第二种:网络IO瓶颈,请求的数据太多,网络带宽不够 -> 分库。 2、CPU瓶颈 第一种:SQL问题,如SQL中包含 join ,group by,order by,非索引字段条件查询等,增加CPU运算的操作 -> SQL优化,建立合适的索引,在业务Service层进行业务计算。 第二种:单表数据量太大,查询时扫描的行太多,SQL效率低,CPU率先出现瓶颈 -> 水平分表。 二、分库分表 1、水平分库 概念: 以字段为依据

vivo 全球商城:架构演进之路

房东的猫 提交于 2020-12-15 08:35:13
本文讲述 vivo 官方商城从单体应用到具备综合能力电商平台的演进,系统架构往服务化、中台化的变迁历程。 一、前言 vivo官方商城,是vivo官方的线上电商平台,主营vivo手机及专属配件。经过几年发展,已经完成了从单体应用到具备综合能力电商平台的演进,整体系统架构也逐步往服务化、中台化变迁。我们在这条系统架构升级的道路中,实践出了一些系统架构经验。 通过本篇文章,可以让对电商感兴趣的小伙伴们,更为全面地了解最基础的电商业务模式,了解电商体系具备的技术和架构,了解系统在不同时期的架构演进。 二、架构变迁史 “冰冻三尺,非一日之寒”。任何一个电商系统的架构升级,都不是一蹴而就的,都需要一个稳步发展的过程,不同阶段业务发展的形态和体量决定着系统架构。下面从一张图开始,给大家描述下商城近几年架构变迁的历史。 (图1.1 vivo官方商城架构变迁历程) 2015年之前,vivo官方商城是外包项目,采用了市面上比较成熟的 ECStore (企业级开源网上电商系统)电商产品作为系统基础,主语言是PHP。 项目版本就是在此基础上进行二次开发迭代。 和大多数电商平台早期的发展一样,满足快速部署、快速上线。 同时弊端也很明显: 性能很差,根本无法支撑稍大一点的运营活动。当有新品、大促活动,系统负载高,业务基本处于不可用状态,无法满足运营活动需求。 需求沟通效率,研发效率低下,外包研发、产品异地办公

分库分表方案

元气小坏坏 提交于 2020-11-27 02:29:28
阅读文本大概需要3分钟。 一、数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。 在业务Service来看就是,可用数据库连接少甚至无连接可用。 接下来就可以想象了吧(并发量、吞吐量、崩溃)。 1、IO瓶颈 第一种: 磁盘读IO瓶颈,热点数据太多,数据库缓存放不下,每次查询时会产生大量的IO,降低查询速度 -> 分库和垂直分表 。 第二种: 网络IO瓶颈,请求的数据太多,网络带宽不够 -> 分库 。 2、CPU瓶颈 第一种: SQL问题,如SQL中包含join,group by,order by,非索引字段条件查询等,增加CPU运算的操作 -> SQL优化,建立合适的索引,在业务Service层进行业务计算。 第二种: 单表数据量太大,查询时扫描的行太多,SQL效率低,CPU率先出现瓶颈 -> 水平分表 。 二、分库分表 1、水平分库 1.概念: 以 字段 为依据,按照一定策略(hash、range等),将一个 库 中的数据拆分到多个 库 中。 2.结果: 每个 库 的 结构 都一样; 每个 库 的 数据 都不一样,没有交集; 所有 库 的 并集 是全量数据; 3.场景: 系统绝对并发量上来了,分表难以根本上解决问题,并且还没有明显的业务归属来垂直分库。 4.分析: 库多了

常用分库分表方案汇总

此生再无相见时 提交于 2020-11-26 03:36:48
来源:rrd.me/g9zP3 一、数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是,可用数据库连接少甚至无连接可用。接下来就可以想象了吧(并发量、吞吐量、崩溃)。 1、IO瓶颈 第一种:磁盘读IO瓶颈,热点数据太多,数据库缓存放不下,每次查询时会产生大量的IO,降低查询速度 -> 分库和垂直分表。 第二种:网络IO瓶颈,请求的数据太多,网络带宽不够 -> 分库。 2、CPU瓶颈 第一种:SQL问题,如SQL中包含 join ,group by,order by,非索引字段条件查询等,增加CPU运算的操作 -> SQL优化,建立合适的索引,在业务Service层进行业务计算。 第二种:单表数据量太大,查询时扫描的行太多,SQL效率低,CPU率先出现瓶颈 -> 水平分表。 二、分库分表 1、水平分库 概念: 以字段为依据,按照一定策略(hash、range等),将一个库中的数据拆分到多个库中。 结果: 每个库的结构都一样; 每个库的数据都不一样,没有交集; 所有库的并集是全量数据; 场景: 系统绝对并发量上来了,分表难以根本上解决问题,并且还没有明显的业务归属来垂直分库。 分析: 库多了,io和cpu的压力自然可以成倍缓解。 2、水平分表 概念: 以字段为依据,按照一定策略

Sharding-Jdbc实现分表分库

99封情书 提交于 2020-11-06 04:39:05
Sharding-Jdbc分表分库 LogicTable 数据分片的逻辑表,对于水平拆分的数据库(表),同一类表的总称。 订单信息表拆分为2张表,分别是t_order_0、t_order_1,他们的逻辑表名为t_order。 ActualTable 在分片的数据库中真实存在的物理表。即上个示例中的t_order_0、t_order_1。 DataNode 数据分片的最小单元。由数据源名称和数据表组成,例:test_msg0.t_order_0。配置时默认各个分片数据库的表结构均相同,直接配置逻辑表和真实表对应关系即可。 ShardingColumn 分片字段。用于将数据库(表)水平拆分的关键字段。SQL中如果无分片字段,将执行全路由,性能较差。Sharding-JDBC支持多分片字段。 ShardingAlgorithm 分片算法。Sharding-JDBC通过分片算法将数据分片,支持通过等号、BETWEEN和IN分片。分片算法目前需要业务方开发者自行实现,可实现的灵活度非常高。未来Sharding-JDBC也将会实现常用分片算法,如range,hash和tag等。 在单个库里,有一张表拆分成n多个小表 比如 t_order拆分成 t_order0 t_order_1 insert操作时候,会根据id取模分表的总数 获取具体存放的位置 分表后 表名成t_order_0 和 t