自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

分庫分表設(shè)計及常見問題

數(shù)據(jù)庫 其他數(shù)據(jù)庫
分庫分表(Sharding)是一種將單一數(shù)據(jù)庫拆分為多個數(shù)據(jù)庫實例,以及將單一大表拆分為多個小表的技術(shù)策略。其目的是解決單一數(shù)據(jù)庫在數(shù)據(jù)量、并發(fā)訪問、性能等方面的瓶頸,提升系統(tǒng)的整體性能和可靠性。

背景介紹

隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,數(shù)據(jù)量呈爆炸性增長。大數(shù)據(jù)量的業(yè)務(wù)場景中,數(shù)據(jù)庫成為系統(tǒng)性能瓶頸的一個主要因素。當(dāng)單個數(shù)據(jù)庫包含了太多數(shù)據(jù)或過高的訪問量時,會出現(xiàn)查詢緩慢、響應(yīng)時間長等問題,嚴(yán)重影響用戶體驗。為了解決這一問題,分庫分表技術(shù)應(yīng)運(yùn)而生。通過將數(shù)據(jù)分散到多個數(shù)據(jù)庫或表中,從而有效提升系統(tǒng)的處理能力和穩(wěn)定性。

場景分析

例如:在交易系統(tǒng)核心數(shù)據(jù)庫設(shè)計大致包括:

產(chǎn)品數(shù)據(jù)庫(Product/Asset Database):存儲系統(tǒng)可交易的產(chǎn)品或資產(chǎn)的詳細(xì)信息,比如在股票交易系統(tǒng)中,這里會包含股票代碼、股票名稱、當(dāng)前價格等信息。

訂單數(shù)據(jù)庫(Order Database):存儲用戶提交的訂單信息,包括訂單ID、訂單狀態(tài)(如待處理、完成、取消)、訂單創(chuàng)建時間等。

用戶數(shù)據(jù)庫(User Database):存儲用戶的基本信息,如用戶ID、用戶名、密碼(通常進(jìn)行加密存儲)、聯(lián)系信息等,以及用戶的權(quán)限和角色定義。

交易數(shù)據(jù)庫(Transaction Database):記錄所有交易的詳細(xì)信息,如交易ID、交易類型(買入、賣出等)、交易金額、交易時間、交易雙方等。這個數(shù)據(jù)庫是交易系統(tǒng)的核心,需要高效且可靠。

配置數(shù)據(jù)庫(Configuration Database):存儲系統(tǒng)配置信息,如交易規(guī)則、費(fèi)用設(shè)置、系統(tǒng)參數(shù)等。

歷史數(shù)據(jù)庫(Historical Data Database):保存交易、訂單和價格的歷史記錄。這對于數(shù)據(jù)分析、報告生成及監(jiān)控非常重要。

賬戶數(shù)據(jù)庫(Account Database):存儲用戶的賬戶信息,包括賬戶余額、賬戶類型、賬戶狀態(tài)等。在交易系統(tǒng)中,賬戶信息是核心數(shù)據(jù)之一。

安全和審計數(shù)據(jù)庫(Security and Audit Database):用于記錄安全相關(guān)的事件,如登錄嘗試、權(quán)限變更等,以及審計記錄,確保系統(tǒng)的安全性和可追蹤性。

......

從上邊的分析看,對應(yīng)數(shù)據(jù)庫表大致歸納為以下幾種類型:

  1. 配置表:產(chǎn)品規(guī)格、數(shù)據(jù)字典、系統(tǒng)參數(shù)、費(fèi)用項等
  2. 流水表:訂單數(shù)據(jù)、交易流水等
  3. 日志表:應(yīng)用日志、用戶操作日志、異常日志、訪問日志等
  4. 用戶表:用戶注冊、用戶登錄等

......

思考

??一般哪些表可能存在數(shù)據(jù)激增、性能問題?日志表、流水表、用戶表等都可能。而系統(tǒng)配置則可能相對較少。

分庫分表

什么是分庫分表?

??分庫分表是一種數(shù)據(jù)庫架構(gòu)優(yōu)化技術(shù),說白了就是一種分治思想。通過分庫分表將數(shù)據(jù)分散到多個數(shù)據(jù)庫或表中,來提高系統(tǒng)的性能和穩(wěn)定性。分庫分表可以分為以下幾種策略:水平分庫、水平分表、垂直分庫、垂直分表。

以訂單庫 db_order 和 訂單表 tb_order 為例(db為庫,tb為表):

水平分庫:根據(jù)某些規(guī)則(例如訂單ID的范圍)將db_order數(shù)據(jù)庫分成多個數(shù)據(jù)庫(分片),如db_order_1, db_order_2, db_order_3等。每個數(shù)據(jù)庫的表結(jié)構(gòu)相同,但存儲的訂單數(shù)據(jù)不同。

圖片圖片

水平分表:根據(jù)訂單的創(chuàng)建時間,將tb_order分成tb_order_2022, tb_order_2023, tb_order_2024等多個表,每個表存儲各自時間段的訂單數(shù)據(jù)。表結(jié)構(gòu)保持一致,但每個表只存儲一部分?jǐn)?shù)據(jù)。

圖片圖片

垂直分庫:根據(jù)業(yè)務(wù)功能將數(shù)據(jù)垂直分割到不同的數(shù)據(jù)庫中。例如,將訂單相關(guān)的表保留在db_order中,將用戶相關(guān)的表遷移到新的數(shù)據(jù)庫db_user中,商品相關(guān)的表遷移到db_product中。

垂直分表:若tb_order表中的字段非常多,包含了訂單的基本信息、訂單屬性信息、訂單資費(fèi)信息等多個方面。此時,可以將tb_order表垂直拆分為多個表,如tb_order_base存儲訂單的基本信息,tb_order_chars存儲訂單屬性信息、tb_order_charges存儲訂單資費(fèi)信息。

小結(jié)

有了以上這些了解,基本對分庫分表概念有了大致了解。對于分庫一般按照業(yè)務(wù)功能領(lǐng)域劃分,這里我們主要重點介紹分表。

分庫分表常見問題

什么情況下需要分表?

參考規(guī)則

根據(jù)《阿里巴巴Java開發(fā)手冊》,給出如下建議:

圖片圖片

工程經(jīng)驗

事實上,通常在實戰(zhàn)中,一般按經(jīng)驗數(shù)據(jù)達(dá)到千萬級,就需要分庫分表。原因如下:

我們知道:InnoDB管理磁盤的最小單元:頁,頁大小16KB.

mysql> show global status like '%Innodb_page_size%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| Innodb_page_size | 16384 |
+------------------+-------+
1 row in set (0.00 sec)

??在日常開發(fā)中,對于數(shù)據(jù)庫性能優(yōu)化,我們首先想到的是索引優(yōu)化。索引的底層數(shù)據(jù)結(jié)構(gòu)是B+樹。其組織結(jié)構(gòu)如圖所示:

圖片圖片

樹高為3的B+樹數(shù)據(jù)存儲計算規(guī)則:

根節(jié)點計算:

假設(shè)數(shù)據(jù)類型是bigint,大小為8b。數(shù)據(jù)本身也需要一小塊空間,用來存儲下一層索引數(shù)據(jù)頁的地址,大小為6b, 那么根節(jié)點是可以存儲16*1024/(8+6) = 1170 個數(shù)據(jù)。

其它層節(jié)點計算:

第二層:因為每個節(jié)點數(shù)據(jù)結(jié)構(gòu)和跟節(jié)點一樣,而且在跟節(jié)點每個元素都會延伸出來一個節(jié)點,所以第二層的數(shù)據(jù)量是1170*1170=1368900

第三層:因為innodb的葉子節(jié)點,是直接包含整條mysql數(shù)據(jù)的,假設(shè)每條數(shù)據(jù)以1kb計算,那么第三層每個節(jié)點為16kb,那么每個節(jié)點是可以放16個數(shù)據(jù)的,所以最終mysql可以存儲的總數(shù)據(jù)為

1170 * 1170 * 16 = 21902400 (千萬級)

其實計算結(jié)果與我們平時的工作經(jīng)驗也是相符的,一般mysql一張表的數(shù)據(jù)超過了千萬也是得進(jìn)行分表操作了。

參考文章:

MySQL一張表到底能存多少數(shù)據(jù)?[1]

如何選擇分片鍵?

例如,本節(jié)我們以訂單表的分表為例,一般訂單表中含有訂單編號:order_id, 用戶編號:user_id, 訂單創(chuàng)建時間:order_date等。

對于訂單表,通常我們可以考慮以下分片鍵選項:

訂單編號

優(yōu)點:訂單編號通常是唯一的,可以確保每個訂單都分散到不同的分片上。這對于保證數(shù)據(jù)均勻分布和避免熱點數(shù)據(jù)非常有幫助。

用戶編號

優(yōu)點:用戶編號通常也是唯一的,并且如果用戶的訂單量分布均勻,那么使用用戶編號作為分片鍵可以確保每個用戶的訂單都在同一個分片上,這對于查詢某個用戶的所有訂單非常高效。

缺點:如果用戶的訂單量差異很大,那么某些分片可能會存儲大量的訂單數(shù)據(jù),而其他分片可能只有少量的數(shù)據(jù)。這會導(dǎo)致數(shù)據(jù)分布不均勻,進(jìn)而影響查詢性能。

訂單創(chuàng)建時間

優(yōu)點:適用于:按時間范圍查詢訂單的場景。

缺點:可能出現(xiàn)熱點數(shù)據(jù)傾斜問題(即在某個時段產(chǎn)生訂單峰值)

如何選擇數(shù)據(jù)庫主鍵策略?

在選擇主鍵策略時,需要注意以下幾點:

  • 唯一性:確保主鍵在全局唯一,避免數(shù)據(jù)沖突。
  • 性能:選擇適合的主鍵類型和生成策略,以提高數(shù)據(jù)插入、查詢和索引的性能。
  • 擴(kuò)展性:能夠適應(yīng)數(shù)據(jù)量和并發(fā)量增長。
  • 兼容性:選擇的主鍵策略要與使用的數(shù)據(jù)庫兼容。

??在 MySQL 中進(jìn)行分庫分表時,自增主鍵策略確實需要特別處理,因為傳統(tǒng)的自增主鍵策略在分布式環(huán)境下會導(dǎo)致主鍵沖突。每個數(shù)據(jù)庫實例或分片都會從相同的起始點開始自增,這會導(dǎo)致在不同的分片上生成相同的 ID,進(jìn)而引發(fā)數(shù)據(jù)沖突。

幾種常見的主鍵策略方案:

  1. UUID:

UUID 是一個 128 位的值,具有全局唯一性,可以很好地解決分布式環(huán)境下的主鍵沖突問題。但是,UUID 字符串較長,存儲和索引效率較低,而且是無序的,可能會影響查詢性能。

  1. Snowflake 算法: 雪花算法(SnowFlake)是一種分布式ID生成算法,由Twitter開源。其核心思想是使用64位long型數(shù)字作為全局唯一的ID,通過時間戳、工作機(jī)器ID和序列號等部分來確保ID的全局唯一性。

圖片圖片

結(jié)構(gòu)說明:

1位:未使用(因為二進(jìn)制中最高位是符號位,正數(shù)是0,負(fù)數(shù)是1,一般生成的ID都是正數(shù),所以這一位固定為0)。

41位:時間戳(毫秒級),用來記錄時間截的差值(當(dāng)前時間截 - 開始時間截)。

10位:工作機(jī)器ID,包括5位datacenterId(數(shù)據(jù)中心ID)和5位workerId(工作機(jī)器ID),用來表示工作機(jī)器的ID。

12位:序列號,用來記錄同一毫秒內(nèi)產(chǎn)生的不同ID,12位可以表示的最大整數(shù)為4095,用來表示同一機(jī)器同一時間截(毫秒)內(nèi)產(chǎn)生的4095個ID序號。

??通過這種結(jié)構(gòu),雪花算法可以保證生成的ID按時間遞增,并且整個分布式系統(tǒng)中不會有重復(fù)的ID。

分布式自增 ID 生成器: 使用像 Twitter 的 Snowflake、阿里巴巴的 Druid 等分布式 ID 生成器來生成全局唯一的自增 ID。這些生成器通過特定的算法和機(jī)制保證在不同實例間生成的 ID 是全局唯一的。

自增主鍵 + 分片策略: 仍然使用自增主鍵,但是結(jié)合分片策略,確保每個分片上的主鍵值是唯一的。例如,可以預(yù)先為每個分片分配一個 ID 范圍,確保在這個范圍內(nèi)的 ID 是唯一的。這種方法需要維護(hù)分片的 ID 范圍,并在必要時進(jìn)行調(diào)整。

使用數(shù)據(jù)庫的自增 ID 特性: 某些數(shù)據(jù)庫支持在分表時自動處理自增 ID,避免沖突。例如,MySQL 8.0 引入了 AUTO_INCREMENT_INCREMENT 和 AUTO_INCREMENT_OFFSET 這兩個系統(tǒng)變量,用于在復(fù)制或分片環(huán)境中調(diào)整自增 ID 的步長和起始值,從而避免沖突。

總之,在分庫分表時,自增主鍵策略需要進(jìn)行特殊處理,以確保全局唯一性,并根據(jù)實際情況選擇合適的方案。

如何選擇分表策略?

選擇分庫分表的策略時,確實需要根據(jù)具體的業(yè)務(wù)場景和數(shù)據(jù)特性來決定。例如訂單表,以訂單ID (order_id) 作為分表鍵。

基于范圍的策略

適用場景:當(dāng)訂單ID有明確的增長趨勢,例如連續(xù)的自增ID,并且你知道未來可能的訂單數(shù)量時,范圍分表是一個好選擇。

策略實現(xiàn):可以將訂單ID按照范圍劃分到不同的表中。例如,訂單ID【1-1000萬】 在表tb_order_01,【1000萬-2000萬】在表tb_order_02,以此類推。

圖片圖片

優(yōu)點:

  • 查詢效率較高,尤其是范圍查詢。
  • 數(shù)據(jù)遷移和維護(hù)相對簡單。

缺點:

  • 訂單ID的分布必須均勻.
  • 如果訂單ID不是連續(xù)或可預(yù)測的,這種策略可能不適用。

基于哈希的策略

適用場景:當(dāng)訂單ID沒有明確的增長趨勢,哈希分表是一個好選擇。

策略實現(xiàn):使用哈希函數(shù)對訂單ID進(jìn)行哈希運(yùn)算,然后根據(jù)哈希值的結(jié)果決定存儲在哪個表中。

table_index = hash(order_id) % tables_num

優(yōu)點:

  • 負(fù)載均衡,每個表的數(shù)據(jù)分布相對均勻。

缺點:

  • 不利于二次擴(kuò)容。

映射表策略

適用場景:當(dāng)訂單ID的分布不均,或者需要靈活控制數(shù)據(jù)分布時,映射表分表可能是一個好選擇。

策略實現(xiàn):使用一個映射表來記錄每個訂單ID應(yīng)該存儲在哪個表中。這個映射表可以是內(nèi)存中的數(shù)據(jù)結(jié)構(gòu),也可以是數(shù)據(jù)庫中的一個表。

優(yōu)點:

  • 靈活,可以根據(jù)需要調(diào)整數(shù)據(jù)分布。

缺點:

  • 查詢時需要先查詢映射表,可能影響性能。

一致性哈希策略

適用場景:當(dāng)系統(tǒng)需要高可用性,并且希望在添加或刪除節(jié)點時盡量減少數(shù)據(jù)遷移時,一致性哈??赡苁且粋€好選擇。

策略實現(xiàn):使用一致性哈希算法將訂單ID映射到哈希環(huán)上,然后根據(jù)哈希環(huán)上的節(jié)點(或表)來存儲數(shù)據(jù)。

一致性哈希算法的核心思想是將哈希值空間表示為一個閉合的圓環(huán)(哈希環(huán)),每個節(jié)點負(fù)責(zé)維護(hù)圓環(huán)上一段連續(xù)的哈希值范圍。

圖片圖片

在分庫分表的場景中,可以將每個數(shù)據(jù)庫或表看作是一個節(jié)點,將這些節(jié)點均勻地分布在哈希環(huán)上。當(dāng)插入或查詢數(shù)據(jù)時,根據(jù)數(shù)據(jù)的哈希值將其映射到哈希環(huán)上,然后順時針查找最近的節(jié)點(即負(fù)責(zé)該哈希值范圍的數(shù)據(jù)庫或表),將數(shù)據(jù)插入或查詢該節(jié)點。

優(yōu)點:

  • 支持節(jié)點的動態(tài)擴(kuò)容。

缺點:

  • 當(dāng)節(jié)點數(shù)量變化較大時,可能需要重新計算所有數(shù)據(jù)的哈希值并進(jìn)行遷移,增加系統(tǒng)的開銷
  • 范圍查詢和順序查詢可能不如范圍分表和哈希分表高效。

非分片鍵字段如何查詢?

曾幾何時,面試過程中遇到過這樣一個問題:假設(shè)有一個用戶表,你用ID做的分片鍵,那么有一個類似于name這樣的字段如何查詢?

這里提供幾種常見的思路:

1.全局索引

??全局索引是一個跨所有分片的索引,它包含了非分片鍵字段和對應(yīng)的分片鍵信息。查詢時,先通過全局索引找到相關(guān)的分片鍵,然后在相應(yīng)的分片中查詢詳細(xì)數(shù)據(jù)。

適用場景:適用于查詢頻率高、數(shù)據(jù)量大的非分片鍵字段。

優(yōu)點:查詢效率高,可以快速定位到數(shù)據(jù)所在的分片。

缺點:全局索引維護(hù)成本較高,需要定期更新以保持與分片數(shù)據(jù)的一致性。

2. 數(shù)據(jù)冗余

在每個分片中存儲部分非分片鍵字段的數(shù)據(jù)。這樣,即使不直接查詢分片鍵,也可以在分片內(nèi)快速找到相關(guān)數(shù)據(jù)。

適用場景:適用于查詢性能要求極高,且可以接受一定數(shù)據(jù)冗余的場景。

優(yōu)點:查詢性能高,無需跨分片查詢。

缺點:數(shù)據(jù)冗余增加了存儲成本和維護(hù)復(fù)雜性。

3. 應(yīng)用層處理

在應(yīng)用層實現(xiàn)復(fù)雜的查詢邏輯,將多個分片中的查詢結(jié)果匯總后進(jìn)行處理。

適用場景:適用于查詢頻率不高,或者可以接受一定延遲的場景。

優(yōu)點:靈活性高,可以根據(jù)業(yè)務(wù)需求定制查詢邏輯。

缺點:查詢性能可能受到網(wǎng)絡(luò)延遲和分片數(shù)量的影響。

4. 使用Elasticsearch(ES)

將非分片鍵字段的數(shù)據(jù)同步到Elasticsearch中,利用Elasticsearch強(qiáng)大的搜索和查詢能力進(jìn)行查詢。

適用場景:適用于非結(jié)構(gòu)化數(shù)據(jù)、全文搜索、復(fù)雜查詢等場景。

優(yōu)點:支持復(fù)雜的查詢操作,如全文搜索、模糊匹配等;查詢性能高,支持分布式部署。

缺點:需要維護(hù)Elasticsearch集群,增加了系統(tǒng)的復(fù)雜性;數(shù)據(jù)同步可能引入一定的延遲。

5. 數(shù)據(jù)庫中間件

使用數(shù)據(jù)庫中間件(如ShardingSphere、MyCAT等)來管理分庫分表,中間件可以自動處理非分片鍵字段的查詢,將請求路由到正確的分片。

適用場景:適用于希望減少應(yīng)用層復(fù)雜性的場景。

優(yōu)點:簡化了應(yīng)用層的查詢邏輯,減少了開發(fā)和維護(hù)的工作量。

缺點:需要配置和維護(hù)數(shù)據(jù)庫中間件。

總結(jié)

在實際應(yīng)用中,可能需要根據(jù)實際情況結(jié)合多種策略來滿足不同的查詢需求。同時,隨著業(yè)務(wù)的發(fā)展和數(shù)據(jù)量的增長,可能需要不斷調(diào)整和優(yōu)化分庫分表策略。

如何解決熱點數(shù)據(jù)傾斜問題?

熱點數(shù)據(jù)傾斜通常發(fā)生在某些特定的數(shù)據(jù)項(例如,用戶激增、促銷訂單峰值等)等,導(dǎo)致這些數(shù)據(jù)的查詢和更新操作集中在些某特定的數(shù)據(jù)庫或表上,從而造成性能瓶頸。

解決方案:采用Range分庫+Hash分表

圖片圖片

如何解決跨庫關(guān)聯(lián)查詢?

分庫分表后,數(shù)據(jù)被分散到了不同的數(shù)據(jù)庫或表中??鐜礻P(guān)聯(lián)查詢成為新的問題。為了解決這個問題,可以采取以下幾種策略:

  1. 字段冗余: 對于經(jīng)常需要進(jìn)行關(guān)聯(lián)查詢的字段,可以考慮將這些字段冗余到每個相關(guān)的表中。這樣,在進(jìn)行查詢時就不需要跨庫關(guān)聯(lián),可以直接在單個表內(nèi)完成查詢。例如,如果經(jīng)常需要查詢合同和客戶的關(guān)聯(lián)信息,可以在合同表中冗余一些客戶的基礎(chǔ)字段,這樣查詢時就不需要跨庫關(guān)聯(lián)客戶表。
  2. 數(shù)據(jù)同步: 如果某個系統(tǒng)經(jīng)常需要查詢另一個系統(tǒng)的數(shù)據(jù),可以在當(dāng)前系統(tǒng)中創(chuàng)建一張對應(yīng)的表,并通過ETL或其他數(shù)據(jù)同步工具定時同步所需的數(shù)據(jù)。這樣,查詢時就可以直接在本地表中完成,避免了跨庫關(guān)聯(lián)查詢。
  3. 全局表(廣播表): 對于某些基礎(chǔ)數(shù)據(jù),如行名行號信息等,如果它們被多個業(yè)務(wù)系統(tǒng)頻繁使用,可以考慮在所有的數(shù)據(jù)庫中都存儲這些基礎(chǔ)數(shù)據(jù)。這樣,無論哪個系統(tǒng)需要這些數(shù)據(jù),都不需要進(jìn)行跨庫關(guān)聯(lián)查詢。
  4. ER表(綁定表): 對于存在邏輯主外鍵關(guān)系的表,如訂單表和訂單明細(xì)表,可以考慮將它們的數(shù)據(jù)物理上存儲在一起,形成一個綁定表。這樣,查詢時就可以在一個表中完成主表和明細(xì)表的關(guān)聯(lián)查詢,避免了跨庫關(guān)聯(lián)。
  5. 使用分布式中間件: 分布式中間件如Sharding-JDBC、MyCAT等,可以將多個物理數(shù)據(jù)庫視為一個邏輯數(shù)據(jù)庫。這些中間件能夠處理復(fù)雜的聯(lián)合查詢、排序、聚合等SQL操作,并根據(jù)分片規(guī)則指導(dǎo)SQL語句的執(zhí)行。它們能夠解決分庫分表后的通過程序聚合匯總結(jié)果,解決跨庫關(guān)聯(lián)查詢問題。
  6. 應(yīng)用層數(shù)據(jù)聚合: 在應(yīng)用層,可以編寫邏輯來聚合來自不同數(shù)據(jù)庫或表的數(shù)據(jù)。這通常涉及發(fā)起多個數(shù)據(jù)庫查詢,然后在應(yīng)用層將結(jié)果集合并成所需的結(jié)構(gòu)。

需要注意的是,雖然上述方法可以解決跨庫關(guān)聯(lián)查詢的問題,但它們也會帶來一些額外的復(fù)雜性。在設(shè)計分庫分表方案時,需要綜合考慮業(yè)務(wù)需求、數(shù)據(jù)量、查詢頻率等因素,選擇合適的策略來平衡性能和可維護(hù)性。同時,隨著業(yè)務(wù)的發(fā)展和數(shù)據(jù)量的增長,可能需要對分庫分表方案進(jìn)行調(diào)整和優(yōu)化。

如何解決分庫分表后排序、分頁問題?

分庫分表后,排序和分頁問題變得相對復(fù)雜,因為數(shù)據(jù)不再集中在一個單一的數(shù)據(jù)庫或表中。解決這些問題需要綜合考慮多種因素,包括數(shù)據(jù)量、查詢頻率、業(yè)務(wù)需求等。以下是一些解決分庫分表后排序和分頁問題的策略:

排序問題

  1. 全局排序字段: 在分庫分表時,可以引入一個全局排序字段,所有分片都基于這個字段進(jìn)行排序。這樣,即使數(shù)據(jù)分布在不同的分片中,也可以保證整體排序的一致性。
  2. 數(shù)據(jù)同步與合并: 在查詢時,從各個分片中分別獲取數(shù)據(jù),然后在應(yīng)用層將這些數(shù)據(jù)按照排序規(guī)則進(jìn)行合并。這種方式需要處理大量的數(shù)據(jù)傳輸和合并邏輯,可能對性能有一定影響。
  3. 中間件支持: 使用支持分庫分表的中間件,如ShardingSphere、MyCAT等。這些中間件通常提供了強(qiáng)大的排序功能,能夠處理分庫分表后的排序問題。
  4. 預(yù)算與緩存: 對于某些固定的排序需求,可以預(yù)先計算排序結(jié)果并緩存起來,減少實時計算的壓力。

分頁問題

  1. 分頁參數(shù)調(diào)整: 在分庫分表的情況下,傳統(tǒng)的LIMIT OFFSET分頁方式可能不再適用??梢钥紤]調(diào)整分頁參數(shù),比如使用基于游標(biāo)(cursor)的分頁方式,或者基于時間戳、ID等排序字段的范圍查詢來實現(xiàn)分頁。
  2. 數(shù)據(jù)聚合: 類似于排序問題的解決方式,從各個分片中分別獲取數(shù)據(jù),然后在應(yīng)用層進(jìn)行數(shù)據(jù)聚合,實現(xiàn)分頁功能。
  3. 中間件支持: 使用支持分庫分表的中間件,這些中間件通常也提供了分頁功能的支持,能夠簡化分頁查詢的處理。
  4. 限制分頁: 對于深度分頁的需求,可以考慮限制分頁的深度,避免查詢大量的數(shù)據(jù)。例如,只支持查詢前100頁的數(shù)據(jù)。
  5. 預(yù)加載與緩存: 對于經(jīng)常訪問的分頁數(shù)據(jù),可以考慮預(yù)加載并緩存起來,減少實時查詢的開銷。

分庫分表如何擴(kuò)容?

??當(dāng)數(shù)據(jù)量逐漸增加,需要進(jìn)行分庫分表的擴(kuò)容時,可以從以下幾個方面來考慮和制定策略:

1. 數(shù)據(jù)增長評估

??首先,要對數(shù)據(jù)的增長趨勢進(jìn)行準(zhǔn)確的評估。通過分析歷史數(shù)據(jù)、業(yè)務(wù)發(fā)展趨勢以及用戶增長情況,可以預(yù)測未來的數(shù)據(jù)量增長情況。一般預(yù)估未來3~5年的數(shù)據(jù)增長。

2. 選擇合適的分片鍵

??選擇一個合適的分片鍵是分庫分表的關(guān)鍵。分片鍵應(yīng)該能夠均勻分布數(shù)據(jù),避免某些數(shù)據(jù)庫或表過載。同時,分片鍵的選擇也要考慮到查詢性能和數(shù)據(jù)一致性等因素。

3. 實施擴(kuò)容

??基于數(shù)據(jù)增長趨勢和分片鍵的選擇,制定詳細(xì)的擴(kuò)容計劃。這包括確定擴(kuò)容的時間點、擴(kuò)容的目標(biāo)規(guī)模、數(shù)據(jù)遷移和重新分配的策略等。確保擴(kuò)容過程能夠順利進(jìn)行,盡可能減少對業(yè)務(wù)的影響。

4. 數(shù)據(jù)遷移與重新分配

??在擴(kuò)容過程中,需要進(jìn)行數(shù)據(jù)遷移和重新分配。這通常涉及到將現(xiàn)有數(shù)據(jù)從舊的數(shù)據(jù)庫或表遷移到新的數(shù)據(jù)庫或表中??梢允褂脭?shù)據(jù)遷移工具或自動化腳本來完成這個過程,確保數(shù)據(jù)的完整性和一致性。

5. 負(fù)載均衡

??在擴(kuò)容后,需要確保數(shù)據(jù)在新舊數(shù)據(jù)庫或表之間均勻分布,以實現(xiàn)負(fù)載均衡??梢允褂秘?fù)載均衡器或支持分庫分表的中間件來動態(tài)分配請求,確保系統(tǒng)的性能和穩(wěn)定性。

6. 監(jiān)控與調(diào)優(yōu)

在擴(kuò)容過程中和擴(kuò)容后,需要對系統(tǒng)進(jìn)行持續(xù)的監(jiān)控和調(diào)優(yōu)。通過監(jiān)控數(shù)據(jù)庫或表的負(fù)載情況、查詢性能等指標(biāo),及時發(fā)現(xiàn)并解決性能瓶頸和故障。同時,根據(jù)實際需求進(jìn)行調(diào)優(yōu),如調(diào)整索引、優(yōu)化查詢語句等,以提升系統(tǒng)的整體性能。

分庫分表中間件技術(shù)對比

業(yè)界常用的分庫分表中間有:Sharding和MyCat

  1. ShardingSphere

??ShardingSphere是一套開源的分布式數(shù)據(jù)庫中間件解決方案組成的生態(tài)圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(計劃中)這3款相互獨立的產(chǎn)品組成。ShardingSphere提供數(shù)據(jù)分片、讀寫分離、多數(shù)據(jù)源集成等功能。其中,Sharding-JDBC是一個輕量級的Java框架,以jar包形式提供服務(wù),無需額外部署和依賴,適用于Java應(yīng)用。Sharding-Proxy則是一個獨立的數(shù)據(jù)庫代理,支持MySQL和PostgreSQL協(xié)議,可以實現(xiàn)透明的數(shù)據(jù)庫操作。

優(yōu)點:

  • 功能豐富,支持?jǐn)?shù)據(jù)分片、讀寫分離、廣播表、分布式事務(wù)等。
  • 社區(qū)活躍,文檔完善,有較多的成功案例。
  • 支持多種數(shù)據(jù)庫和SQL方言,具有較好的兼容性。

缺點:

  • 對于非Java應(yīng)用可能需要額外的適配工作。
  • 在處理復(fù)雜SQL時可能存在一定的性能損耗。
  1. Mycat

??Mycat是一個開源的、跨平臺的、基于MySQL協(xié)議的數(shù)據(jù)庫中間件,支持SQL分析、SQL解析、SQL路由、SQL改寫、SQL執(zhí)行和結(jié)果歸并等功能。Mycat可以實現(xiàn)透明的讀寫分離、自動故障切換、負(fù)載均衡等特性,同時支持多租戶模式和全局序列號等功能。

優(yōu)點:

  • 支持MySQL協(xié)議,對于使用MySQL的應(yīng)用無需修改代碼即可接入。
  • 支持多種路由策略,可以滿足不同的業(yè)務(wù)需求。
  • 提供豐富的監(jiān)控和管理功能,方便運(yùn)維和管理。

缺點:

  • 主要針對MySQL數(shù)據(jù)庫,對于其他類型的數(shù)據(jù)庫支持有限。
  • 在處理復(fù)雜SQL時可能存在一定的限制和性能問題。

如何解決分庫分表事務(wù)問題?

??分庫分表后,因為數(shù)據(jù)分布在不同的數(shù)據(jù)庫和表中,需要確保不同數(shù)據(jù)庫實例間的事務(wù)一致性。解決這類分布式事務(wù)問題,可以參考個人的其它歷史文章:

分布式事務(wù)基礎(chǔ)理論

如何選擇分布式事務(wù)解決方案?

一站式分布式事務(wù)Seata方案

總結(jié)

分庫分表技術(shù)總結(jié)

一、分庫分表策略

分庫分表(Sharding)是一種將單一數(shù)據(jù)庫拆分為多個數(shù)據(jù)庫實例,以及將單一大表拆分為多個小表的技術(shù)策略。其目的是解決單一數(shù)據(jù)庫在數(shù)據(jù)量、并發(fā)訪問、性能等方面的瓶頸,提升系統(tǒng)的整體性能和可靠性。

常見的分庫分表策略包括:

  1. 水平拆分(Sharding by Key):根據(jù)某個字段的值將表拆分為多個子表,每個子表只包含部分?jǐn)?shù)據(jù)。這種策略適用于數(shù)據(jù)量巨大、訪問頻繁的表。
  2. 垂直拆分:將表按照列進(jìn)行拆分,將不同列的數(shù)據(jù)分散到不同的表中。這種策略適用于某些列的數(shù)據(jù)量特別大或訪問特別頻繁的情況。
  3. 讀寫分離:將數(shù)據(jù)庫的讀操作和寫操作分離到不同的數(shù)據(jù)庫實例上,以提高系統(tǒng)的并發(fā)處理能力和性能。

二、分庫分表常見問題

  1. 數(shù)據(jù)一致性問題:分庫分表后,數(shù)據(jù)分布在不同的數(shù)據(jù)庫和表中,需要確??鐜炜绫聿僮鞯臄?shù)據(jù)一致性。
  2. 跨庫跨表查詢問題:復(fù)雜的跨庫跨表查詢可能變得困難,需要考慮查詢性能和數(shù)據(jù)整合。
  3. 事務(wù)處理問題:分布式事務(wù)的處理比單一數(shù)據(jù)庫更復(fù)雜,需要確保不同數(shù)據(jù)庫實例間的事務(wù)一致性。
  4. 中間件選擇問題:選擇合適的分庫分表中間件是關(guān)鍵,需要考慮中間件的性能、穩(wěn)定性、兼容性等因素。

此外,對于某些不適用分庫分表的場景,或者希望簡化分布式數(shù)據(jù)庫管理的復(fù)雜性,可以考慮使用TiDB。

參考文章鏈接: https://mp.weixin.qq.com/s/SuJ-XCaVegVunOIf69-9AQ

責(zé)任編輯:武曉燕 來源: 碼易有道
相關(guān)推薦

2025-01-09 11:58:19

2020-12-28 11:08:18

MySQL數(shù)據(jù)庫服務(wù)器

2009-11-09 10:42:53

ibmdwRational

2010-09-07 09:50:35

DIVCSS

2022-12-09 09:21:10

分庫分表算法

2022-11-18 09:39:48

分庫分表

2019-07-31 09:27:23

數(shù)據(jù)庫MySQLSQL

2009-06-14 22:28:14

ibmdwWebSphere

2009-04-13 11:42:29

IBMdWRational

2009-07-29 10:03:24

思科網(wǎng)絡(luò)管理Cisco

2009-06-18 10:24:00

CDMA網(wǎng)絡(luò)優(yōu)化

2010-04-27 18:24:56

Oracle常見問題

2010-04-28 11:09:47

Oracle常見問題

2019-10-08 16:05:19

Redis數(shù)據(jù)庫系統(tǒng)

2020-07-30 17:59:34

分庫分表SQL數(shù)據(jù)庫

2018-11-14 14:18:26

APP網(wǎng)絡(luò)分析

2011-05-06 17:25:58

硒鼓

2019-11-12 09:54:20

分庫分表數(shù)據(jù)

2024-08-22 14:49:49

系統(tǒng)設(shè)計數(shù)據(jù)庫

2010-07-21 09:10:02

Perl常見問題
點贊
收藏

51CTO技術(shù)棧公眾號