Apache——ShardingSphere(分布式数据库中间件、分库分表利器)

ShardingSphere官网:https://shardingsphere.apache.org/

什么是ShardingSphere?

官网说明:

Apache ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(规划中)这3款相互独立,却又能够混合部署配合使用的产品组成。它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、云原生等各种多样化的应用场景。

ShardingSphere定位为关系型数据库中间件,旨在充分合理地在分布式的场景下里用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库,它通过关注不变,进而抓住事物本质。关系型数据库当今依然占有巨大市场,是各个公司核心业务的基石,未来也难于撼动,我们目前阶段更加关注在原有基础上的增量,而非颠覆。

ShardingSphere已经在2020年4月16日成为Apache顶级项目(Apache官网发布从4.0.0版本开始)。

 小结:

   1. 是一套开源的分布式数据库中间件解决方案

   2. 有三个产品Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(TODO)组成

   3. 定位为一个关系型数据库中间件,合理在分布式环境下使用关系型数据库

 Sharding-JDBC

定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

  • 适用于任何基于JDBC的ORM框架,如:JPA,Hibernate,Mybatis,Spring JDBC Template或直接使用JDBC。
  • 支持任何第三方的数据库连接池,如:DBCP,C3P0,Druid,HikariCP等。
  • 支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92便准的数据库。

 Sharding-Proxy

定位为透明化的数据库代理端,提供封装数据库二进制协议的服务端版本,用于完成对异构语言的支持。目前先提供MySQL/PostgreSQL版本,它可以使用任何兼容MySQL/PostgreSQL协议的访问客户端(如:MySQL Command Client、MySQL Workbench、Navlcat等)操作数据,对DBA更加友好。

  • 向应用程序完全透明,可直接当做MySQL/PostgreSQL使用。
  • 适用于任何兼容MySQL/PostgreSQL协议的客户端。

 什么是分库分表?

背景:

随着时间和业务的发展,数据库中表数据将越来越多,此时对我们数据库进行CURD操作,就会有性能问题。

怎么解决?

方案1:从硬件上解决,例如:加存储,加内存等 (治标不治本)

方案2:分库分表

原始数据库结构简图:

 说明:

       原始库设计一般为 一个数据库中多个不同的表。

 分库分表后数据库简图:

 说明:

      分库分表,将原始设计的数据库拆分为多个数据库,例如:商品数据库、商家数据库等,将原始数据库中的大表拆分为多个表,例如,商品数据库下存放商品表1、商品表2、商品表...,每个表中限制最大存储量,例如20w条。

      当然,以上只是示例,真实分库分表要根据需求来做。

如何分库分表?

一、垂直切分

1. 垂直分表

   例如当前有一个商品表:

商品名称 varchar
商品封面 varchar
商品价格 int
商品描述 varchar
商品其他描述 varchar

   垂直分表后表为商品基本信息表和商品描述信息表:

   商品基础信息表:

商品名称 varchar
商品封面 varchar
商品价格 int

 

   商品描述信息表:

商品描述 varchar
商品其他描述 varchar

   说明:

         操作数据库中有某张表,将该表的一部分字段拿出分为一张表,其他字段分为一张表。(按需分配)将其按照字段分为多     个表,数据条数是一致的。

         此时,垂直分表后表仍在一个数据库中,由于表的数量增加了,所以增加了当前数据库的IO,这时我们就需要垂直分库操      作了!

2. 垂直分库

          在垂直分表中咱们把商品表进行了划分,那现在数据库中假设还有一个订单表,将商品表和订单表划分到商品数据库和订      单数据库,在部署时将两个库划分在两个服务器,这样就减轻了我们每个数据库的IO操作,进而提升CURD操作的效率。

          简而言之就是 把单一数据库按照业务需求进行划分,分为专库专表的形式!

二、水平切分

          思考:在以上咱们采用了垂直分表分库操作,但依旧有个问题,随时间和业务增加每个表中的数据依旧会很大,怎么办?      难道继续增加服务器,垂直分库分表到不同服务器?垂直分一次行,二次也还行,难道最终一个字段一个表,一个库?当然很        不现实。

          此时,就可以采用水平分库分表操作。

1. 水平分库 

          将商品数据库划分为商品数据库A商品数据库B,判断商品ID为奇数的存入A库,为偶数的存入B库。这样就使假设原本        单库10w条数据的数据库分为了两个数据量5w条的数据库,减少了单库的数据量,提高CURD操作效率。

2. 水平分表

           以上经过垂直分库分表,水平分库后,仍会造成单表数据量过大的问题,难道再进行水平分库为A.B.C.D.E.F...?如果再        进行水平分库,又将增加服务器,不仅提高了硬件成本,运维起来也很不方便。

           这时,可采用水平分表操作,在垂直分库分表以及水平分库的基础上,将每个服务器上的商品数据库A,B中商品基础信息表和商品描述表水平切分,例如可根据商品ID奇偶来分为商品基础信息表1,2....商品描述信息表1,2...

           这样,就可在不增加服务器的条件下将巨大数据量的单表分为多个数据量一般的表,提高CURD效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章