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效率。