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