面試官:聊聊你對分庫分表的理解?
在 MySQL 集群架構中有兩種主流的集群實現,一種是讀寫分離,而另外一種則是數據分片。所謂的數據分片其實就是今天要聊的分庫分表技術。
分庫分表技術不但是日常工作中用于解決數據庫中的數據量會急劇增長,解決單庫單表性能瓶頸的一種方案,更是面試中的高頻知識點。
在阿里巴巴的《Java 開發手冊》中規定:當單表的數據超過 500 萬,或單表的大小超過 2GB 時,就要考慮分庫分表了。那么什么是分庫分表呢?
1.分庫分表
首先來說,“分庫分表”不是一個技術,而是兩個技術實現,它分為:
- 分庫
- 垂直分庫
- 水平分庫
- 分表
- 垂直分表
- 水平分表
(1)垂直分庫
垂直分庫是按照業務將不同的表拆分到不同的數據庫中。例如,在一個電商數據庫中的用戶表和訂單表分別存放到不同的數據庫中,如下圖所示:
(2)水平分庫
水平分庫是將數據按照一定的規則(如用戶 ID 取模、哈希等)分布到不同的數據庫中。比如,根據用戶 ID 對 10 取模,將用戶數據分布到 10 個不同的數據庫中,每個數據庫都保存著完整的數據表結構,如下圖所示:
(3)垂直分表
垂直分表是將一張表按照列的相關性拆分成多張表。例如,將一個包含大量字段的用戶表,拆分為用戶基本信息表和用戶擴展信息表,如下圖所示:
(4)水平分表
水平分表是將一張表的數據按照行進行拆分。例如按照用戶 ID 的范圍或者哈希值將數據拆分到不同的表中。
如果搞不清楚什么是垂直分表和什么是水平分表?可以參考一下這幅圖思考一下:
2.技術實現
分庫分表的主流實現技術有以下兩種:
- MyCat
- Apache Sharding Sphere
Sharding Sphere 相比于 MyCat 來說,它的優勢是:
- 功能更多:除了讀寫分離和分庫分表之外,還提供了數據加密、流量質量、數據遷移等功能。
- 社區更活躍度和生態更好:Sharding Sphere 擁有活躍的社區和豐富的文檔,生態系統較為完善,有更多的用戶和開發者參與。
- 靈活性和擴展性:Sharding Sphere 靈活性更高,擴展性也更好,它可以方便地與其他技術集成,這方便 MyCat 支持的比較有限。
3.Sharding Sphere
Sharding Sphere 最早是當當網的內部框架,后面捐獻給了 Apache,目前也是分庫分表的主流技術實現方案,在 Sharding Sphere 中有兩種分庫分表的技術實現:
- Sharding Sphere JDBC:定位為輕量級 Java 框架,在 Java 的 JDBC 層提供的額外服務。它使用客戶端直連數據庫,以 jar 包形式提供服務,無需額外部署和依賴,可理解為增強版的 JDBC 驅動,完全兼容 JDBC 和各種 ORM 框架。
- Sharding Sphere Proxy:定位為透明化的數據庫代理端,通過實現數據庫二進制協議,對異構語言提供支持。 目前提供 MySQL 和 PostgreSQL 協議,透明化數據庫操作,對 DBA 更加友好。
它們的區別如下:
ShardingSphere-JDBC | ShardingSphere-Proxy | |
支持數據庫 | 任意 | MySQL/PostgreSQL |
連接消耗數 | 高 | 低 |
支持語言 | 僅 Java | 任意 |
性能 | 損耗低 | 損耗略高 |
無中心化 | 是 | 否 |