網(wǎng)站常用圖標(biāo)素材百度網(wǎng)站鏈接提交入口
1. 什么是分庫(kù)分表?
分庫(kù)分表是一種數(shù)據(jù)庫(kù)擴(kuò)展技術(shù),通過(guò)將數(shù)據(jù)拆分到多個(gè)數(shù)據(jù)庫(kù)(分庫(kù))或多個(gè)表(分表)中來(lái)解決單一數(shù)據(jù)庫(kù)或表帶來(lái)的性能瓶頸。分庫(kù)分表可以有效提升系統(tǒng)的可擴(kuò)展性、性能和高并發(fā)處理能力,避免單一數(shù)據(jù)庫(kù)或表的負(fù)載過(guò)重。
1.1 什么是分庫(kù)?
分庫(kù)指的是將數(shù)據(jù)分散到多個(gè)數(shù)據(jù)庫(kù)實(shí)例中,以減輕單一數(shù)據(jù)庫(kù)的負(fù)載。分庫(kù)可以有兩種方式:垂直分庫(kù)和水平分庫(kù)。
-
垂直分庫(kù):
- 垂直分庫(kù)是指根據(jù)業(yè)務(wù)模塊的不同,將不同模塊的數(shù)據(jù)存儲(chǔ)到不同的數(shù)據(jù)庫(kù)中。例如,將用戶(hù)數(shù)據(jù)存儲(chǔ)在
user_db
中,將訂單數(shù)據(jù)存儲(chǔ)在order_db
中,將商品數(shù)據(jù)存儲(chǔ)在product_db
中。每個(gè)數(shù)據(jù)庫(kù)只負(fù)責(zé)一部分業(yè)務(wù)數(shù)據(jù)。 - 適用場(chǎng)景: 適用于系統(tǒng)中各個(gè)模塊的數(shù)據(jù)量差異很大,或者需要對(duì)不同模塊進(jìn)行獨(dú)立管理的場(chǎng)景。
- 垂直分庫(kù)是指根據(jù)業(yè)務(wù)模塊的不同,將不同模塊的數(shù)據(jù)存儲(chǔ)到不同的數(shù)據(jù)庫(kù)中。例如,將用戶(hù)數(shù)據(jù)存儲(chǔ)在
-
水平分庫(kù):
- 水平分庫(kù)是指將同一業(yè)務(wù)的不同數(shù)據(jù)根據(jù)某些規(guī)則(如時(shí)間、地域等)拆分到多個(gè)數(shù)據(jù)庫(kù)中。例如,按照地區(qū)劃分,將美國(guó)的用戶(hù)數(shù)據(jù)存儲(chǔ)在
db_us
中,將歐洲的用戶(hù)數(shù)據(jù)存儲(chǔ)在db_eu
中,或者按照時(shí)間將數(shù)據(jù)按年、月劃分到不同的數(shù)據(jù)庫(kù)中。 - 適用場(chǎng)景: 適用于數(shù)據(jù)量巨大,且需要根據(jù)某些標(biāo)準(zhǔn)進(jìn)行數(shù)據(jù)拆分的場(chǎng)景。
- 水平分庫(kù)是指將同一業(yè)務(wù)的不同數(shù)據(jù)根據(jù)某些規(guī)則(如時(shí)間、地域等)拆分到多個(gè)數(shù)據(jù)庫(kù)中。例如,按照地區(qū)劃分,將美國(guó)的用戶(hù)數(shù)據(jù)存儲(chǔ)在
1.2 什么是分表?
分表是指將同一張表中的數(shù)據(jù)拆分到多個(gè)表中,以避免單個(gè)表過(guò)大而導(dǎo)致性能問(wèn)題。分表也有兩種方式:垂直分表和水平分表。
-
垂直分表:
- 垂直分表是指將一張表中的不同列分拆到多個(gè)表中。通常是將表中的列根據(jù)功能或訪問(wèn)頻率進(jìn)行劃分。例如,將一個(gè)包含用戶(hù)詳細(xì)信息的表,按照訪問(wèn)頻率將常用字段(如用戶(hù)名、密碼等)拆分成
user_basic
表,而將不常用的字段(如用戶(hù)畫(huà)像、日志等)拆分成user_extra
表。 - 適用場(chǎng)景: 適用于表中包含大量列,但并非所有列都會(huì)頻繁訪問(wèn)的場(chǎng)景。
- 垂直分表是指將一張表中的不同列分拆到多個(gè)表中。通常是將表中的列根據(jù)功能或訪問(wèn)頻率進(jìn)行劃分。例如,將一個(gè)包含用戶(hù)詳細(xì)信息的表,按照訪問(wèn)頻率將常用字段(如用戶(hù)名、密碼等)拆分成
-
水平分表:
- 水平分表是指將表中的數(shù)據(jù)按照某些規(guī)則(如ID范圍、時(shí)間等)拆分到多個(gè)表中。例如,用戶(hù)表的數(shù)據(jù)根據(jù)用戶(hù)ID范圍分拆成多個(gè)表,如
user_1
,user_2
,user_3
等,或者按時(shí)間拆分成user_2023
,user_2024
等。 - 適用場(chǎng)景: 適用于數(shù)據(jù)量過(guò)大,導(dǎo)致單表查詢(xún)性能低下的情況。
- 水平分表是指將表中的數(shù)據(jù)按照某些規(guī)則(如ID范圍、時(shí)間等)拆分到多個(gè)表中。例如,用戶(hù)表的數(shù)據(jù)根據(jù)用戶(hù)ID范圍分拆成多個(gè)表,如
2. 分庫(kù)分表場(chǎng)景
2.1 什么場(chǎng)景分表?
分表適用于以下場(chǎng)景:
- 單表數(shù)據(jù)量過(guò)大: 當(dāng)某個(gè)表的記錄數(shù)達(dá)到千萬(wàn)級(jí),查詢(xún)時(shí)可能會(huì)非常緩慢,尤其是涉及全表掃描的操作,分表可以有效提高查詢(xún)效率。
- 高并發(fā)讀寫(xiě): 單表無(wú)法承載高并發(fā)的查詢(xún)和寫(xiě)入請(qǐng)求時(shí),可以通過(guò)水平分表將壓力分散到多個(gè)表上。
- 單表的數(shù)據(jù)結(jié)構(gòu)復(fù)雜,且訪問(wèn)頻繁的列較少: 在這種情況下,垂直分表可以將高頻訪問(wèn)的列提取到單獨(dú)的表中,提高性能。
2.2 什么場(chǎng)景分庫(kù)?
分庫(kù)適用于以下場(chǎng)景:
- 數(shù)據(jù)庫(kù)連接數(shù)不足: 單個(gè)數(shù)據(jù)庫(kù)的連接數(shù)上限(如 MySQL 默認(rèn)為 4000 個(gè)連接)無(wú)法滿(mǎn)足高并發(fā)的請(qǐng)求時(shí),可以通過(guò)分庫(kù)將連接請(qǐng)求分散到多個(gè)數(shù)據(jù)庫(kù)實(shí)例上。
- 數(shù)據(jù)庫(kù)資源瓶頸: 當(dāng)單個(gè)數(shù)據(jù)庫(kù)的 CPU、內(nèi)存、磁盤(pán)等資源無(wú)法滿(mǎn)足需求時(shí),分庫(kù)可以將數(shù)據(jù)分布到多個(gè)數(shù)據(jù)庫(kù)實(shí)例上,從而避免單點(diǎn)故障和資源瓶頸。
- 高并發(fā)讀寫(xiě): 當(dāng)需要處理大量并發(fā)請(qǐng)求時(shí),單個(gè)數(shù)據(jù)庫(kù)無(wú)法支撐,需要通過(guò)分庫(kù)將請(qǐng)求分散到多個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)上。
2.3 什么場(chǎng)景分庫(kù)分表?
分庫(kù)分表適用于以下場(chǎng)景:
- 數(shù)據(jù)量巨大且訪問(wèn)量大: 當(dāng)數(shù)據(jù)量達(dá)到數(shù)千萬(wàn)甚至更大,且訪問(wèn)量高時(shí),單庫(kù)單表無(wú)法滿(mǎn)足存儲(chǔ)、查詢(xún)和寫(xiě)入需求。此時(shí),分庫(kù)分表能有效地提高查詢(xún)性能和擴(kuò)展系統(tǒng)能力。
- 高并發(fā)寫(xiě)入和查詢(xún): 在高并發(fā)的業(yè)務(wù)場(chǎng)景中,單庫(kù)單表的性能瓶頸可能導(dǎo)致系統(tǒng)無(wú)法處理所有請(qǐng)求。分庫(kù)分表能夠?qū)?shù)據(jù)分布在不同的物理節(jié)點(diǎn)上,提高系統(tǒng)的并發(fā)處理能力。
- 資源瓶頸和高可用性需求: 當(dāng)數(shù)據(jù)庫(kù)實(shí)例的資源有限,且為了保證高可用性,必須將數(shù)據(jù)分散到多個(gè)數(shù)據(jù)庫(kù)和表中,避免單點(diǎn)故障和資源耗盡。
3. 什么是 ShardingSphere?
ShardingSphere 是一個(gè)開(kāi)源的分布式數(shù)據(jù)庫(kù)中間件,提供數(shù)據(jù)庫(kù)分片、分庫(kù)分表、數(shù)據(jù)路由、分布式事務(wù)、數(shù)據(jù)脫敏等功能。它可以在不修改應(yīng)用代碼的情況下,為應(yīng)用提供透明的分庫(kù)分表支持,簡(jiǎn)化了分布式數(shù)據(jù)庫(kù)的管理和維護(hù)。
ShardingSphere 的主要特點(diǎn)包括:
- 數(shù)據(jù)分片: 支持靈活的分庫(kù)分表策略,可以根據(jù)用戶(hù)需求定制分片規(guī)則。
- 分布式事務(wù): 提供跨庫(kù)跨表的分布式事務(wù)管理,確保數(shù)據(jù)一致性。
- 讀寫(xiě)分離: 提供讀寫(xiě)分離功能,將讀請(qǐng)求路由到從庫(kù),提高系統(tǒng)性能。
- 彈性擴(kuò)展: 支持動(dòng)態(tài)添加新的數(shù)據(jù)源,幫助系統(tǒng)應(yīng)對(duì)數(shù)據(jù)增長(zhǎng)帶來(lái)的壓力。
4. 數(shù)據(jù)分片核心概念
4.1 表
- 邏輯表: 應(yīng)用層面上的虛擬表,實(shí)際數(shù)據(jù)存儲(chǔ)在多個(gè)物理表中。
- 真實(shí)表: 存儲(chǔ)在數(shù)據(jù)庫(kù)中的實(shí)際表,數(shù)據(jù)按分片規(guī)則分布在不同的物理表中。
- 綁定表: 多個(gè)表之間具有外鍵關(guān)系或邏輯關(guān)聯(lián),需要綁定在一起進(jìn)行分片操作。
- 廣播表: 一些小型表(如配置表、字典表等)將數(shù)據(jù)廣播到所有數(shù)據(jù)庫(kù)節(jié)點(diǎn)中,不進(jìn)行分片。
- 單表: 不需要分片的表,數(shù)據(jù)存儲(chǔ)在單個(gè)表中。
4.2 數(shù)據(jù)節(jié)點(diǎn)
- 均勻分布: 數(shù)據(jù)均勻地分布到多個(gè)數(shù)據(jù)節(jié)點(diǎn)中。
- 自定義分布: 開(kāi)發(fā)者可以定義特定的分布規(guī)則,決定數(shù)據(jù)如何在不同的數(shù)據(jù)節(jié)點(diǎn)上分布。
4.3 分片
- 分片鍵: 決定數(shù)據(jù)如何分配到不同分片的字段,通常選擇具有唯一性、分布均勻的數(shù)據(jù)字段作為分片鍵。
- 分片算法: 根據(jù)分片鍵和預(yù)定義的算法將數(shù)據(jù)分配到不同的分片上,常見(jiàn)的算法有哈希分片、范圍分片等。
- 自動(dòng)化分片算法: 系統(tǒng)自動(dòng)根據(jù)配置的分片規(guī)則選擇合適的分片算法。
- 自定義分片算法: 開(kāi)發(fā)者可以定義自己的分片算法,以滿(mǎn)足特定的業(yè)務(wù)需求。
- 分片策略: 定義了數(shù)據(jù)如何進(jìn)行分片,包括按ID、時(shí)間、范圍等不同策略進(jìn)行數(shù)據(jù)劃分。
- 強(qiáng)制分片路由: 強(qiáng)制要求某些操作使用特定的分片策略進(jìn)行路由,通常用于特定業(yè)務(wù)需求。
4.4 行表達(dá)式
行表達(dá)式是指描述分片規(guī)則的表達(dá)式,幫助系統(tǒng)決定某一行數(shù)據(jù)應(yīng)該放入哪個(gè)分片。
4.5 分布式主鍵
分布式主鍵確保在多個(gè)數(shù)據(jù)庫(kù)和表中生成全局唯一的主鍵,避免出現(xiàn)主鍵沖突,通常通過(guò)全局唯一ID生成策略來(lái)實(shí)現(xiàn)。