精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

數(shù)據(jù)庫分庫分表方案,總結(jié)的非常好!

數(shù)據(jù)庫
關(guān)系型數(shù)據(jù)庫本身比較容易成為系統(tǒng)瓶頸,單機存儲容量、連接數(shù)、處理能力都有限。當單表的數(shù)據(jù)量達到1000W或100G以后,由于查詢維度較多,即使添加從庫、優(yōu)化索引,做很多操作時性能仍下降嚴重。

一、數(shù)據(jù)切分介紹

關(guān)系型數(shù)據(jù)庫本身比較容易成為系統(tǒng)瓶頸,單機存儲容量、連接數(shù)、處理能力都有限。當單表的數(shù)據(jù)量達到1000W或100G以后,由于查詢維度較多,即使添加從庫、優(yōu)化索引,做很多操作時性能仍下降嚴重。此時就要考慮對其進行切分了,切分的目的就在于減少數(shù)據(jù)庫的負擔,縮短查詢時間。

數(shù)據(jù)庫分布式核心內(nèi)容就是數(shù)據(jù)切分(Sharding),以及切分后對數(shù)據(jù)的定位、整合。數(shù)據(jù)切分就是將數(shù)據(jù)分散存儲到多個數(shù)據(jù)庫中,使得單一數(shù)據(jù)庫中的數(shù)據(jù)量變小,通過擴充主機的數(shù)量緩解單一數(shù)據(jù)庫的性能問題,從而達到提升數(shù)據(jù)庫操作性能的目的。數(shù)據(jù)切分根據(jù)其切分類型,可以分為兩種方式:垂直(縱向)切分和水平(橫向)切分。

1、垂直(縱向)切分

垂直切分常見有垂直分庫和垂直分表兩種。

  • 垂直分庫:根據(jù)業(yè)務(wù)耦合性,將關(guān)聯(lián)度低的不同表存儲在不同的數(shù)據(jù)庫。做法與大系統(tǒng)拆分為多個小系統(tǒng)類似,按業(yè)務(wù)分類進行獨立劃分。與"微服務(wù)治理"的做法相似,每個微服務(wù)使用單獨的一個數(shù)據(jù)庫。如圖:

  • 垂直分表:是基于數(shù)據(jù)庫中的"列"進行,某個表字段較多,可以新建一張擴展表,將不經(jīng)常用或字段長度較大的字段拆分出去到擴展表中。在字段很多的情況下(例如一個大表有100多個字段),通過"大表拆小表",更便于開發(fā)與維護,也能避免跨頁問題,MySQL底層是通過數(shù)據(jù)頁存儲的,一條記錄占用空間過大會導致跨頁,造成額外的性能開銷。另外數(shù)據(jù)庫以行為單位將數(shù)據(jù)加載到內(nèi)存中,這樣表中字段長度較短且訪問頻率較高,內(nèi)存能加載更多的數(shù)據(jù),命中率更高,減少了磁盤IO,從而提升了數(shù)據(jù)庫性能。

1)優(yōu)點

  • 解決業(yè)務(wù)系統(tǒng)層面的耦合,業(yè)務(wù)清晰
  • 與微服務(wù)的治理類似,也能對不同業(yè)務(wù)的數(shù)據(jù)進行分級管理、維護、監(jiān)控、擴展等
  • 高并發(fā)場景下,垂直切分一定程度的提升IO、數(shù)據(jù)庫連接數(shù)、單機硬件資源的瓶頸

2)缺點

  • 部分表無法join,只能通過接口聚合方式解決,提升了開發(fā)的復雜度
  • 分布式事務(wù)處理復雜
  • 依然存在單表數(shù)據(jù)量過大的問題(需要水平切分)

2、水平(橫向)切分

當一個應(yīng)用難以再細粒度的垂直切分,或切分后數(shù)據(jù)量行數(shù)巨大,存在單庫讀寫、存儲性能瓶頸,這時候就需要進行水平切分了。

水平切分分為庫內(nèi)分表和分庫分表,是根據(jù)表內(nèi)數(shù)據(jù)內(nèi)在的邏輯關(guān)系,將同一個表按不同的條件分散到多個數(shù)據(jù)庫或多個表中,每個表中只包含一部分數(shù)據(jù),從而使得單個表的數(shù)據(jù)量變小,達到分布式的效果。

庫內(nèi)分表只解決了單一表數(shù)據(jù)量過大的問題,但沒有將表分布到不同機器的庫上,因此對于減輕MySQL數(shù)據(jù)庫的壓力來說,幫助不是很大,大家還是競爭同一個物理機的CPU、內(nèi)存、網(wǎng)絡(luò)IO,最好通過分庫分表來解決:

1)優(yōu)點

  • 不存在單庫數(shù)據(jù)量過大、高并發(fā)的性能瓶頸,提升系統(tǒng)穩(wěn)定性和負載能力
  • 應(yīng)用端改造較小,不需要拆分業(yè)務(wù)模塊

2)缺點

  • 跨分片的事務(wù)一致性難以保證
  • 跨庫的join關(guān)聯(lián)查詢性能較差
  • 數(shù)據(jù)多次擴展難度和維護量極大

水平切分后同一張表會出現(xiàn)在多個數(shù)據(jù)庫/表中,每個庫/表的內(nèi)容不同。幾種典型的數(shù)據(jù)分片規(guī)則為:

1)根據(jù)數(shù)值范圍

按照時間區(qū)間或ID區(qū)間來切分。例如:按日期將不同月甚至是日的數(shù)據(jù)分散到不同的庫中;將userId為1~9999的記錄分到第一個庫,10000~20000的分到第二個庫,以此類推。

某種意義上,某些系統(tǒng)中使用的"冷熱數(shù)據(jù)分離",將一些使用較少的歷史數(shù)據(jù)遷移到其他庫中,業(yè)務(wù)功能上只提供熱點數(shù)據(jù)的查詢,也是類似的實踐。

①優(yōu)點

  • 單表大小可控
  • 天然便于水平擴展,后期如果想對整個分片集群擴容時,只需要添加節(jié)點即可,無需對其他分片的數(shù)據(jù)進行遷移
  • 使用分片字段進行范圍查找時,連續(xù)分片可快速定位分片進行快速查詢,有效避免跨分片查詢的問題

②缺點

  • 熱點數(shù)據(jù)成為性能瓶頸。連續(xù)分片可能存在數(shù)據(jù)熱點,例如按時間字段分片,有些分片存儲最近時間段內(nèi)的數(shù)據(jù),可能會被頻繁的讀寫,而有些分片存儲的歷史數(shù)據(jù),則很少被查詢。


2)根據(jù)數(shù)值取模

一般采用hash取模mod的切分方式,例如:將 Customer 表根據(jù) cusno 字段切分到4個庫中,余數(shù)為0的放到第一個庫,余數(shù)為1的放到第二個庫,以此類推。

這樣同一個用戶的數(shù)據(jù)會分散到同一個庫中,如果查詢條件帶有cusno字段,則可明確定位到相應(yīng)庫去查詢。

①優(yōu)點

  • 數(shù)據(jù)分片相對比較均勻,不容易出現(xiàn)熱點和并發(fā)訪問的瓶頸。

②缺點

  • 后期分片集群擴容時,需要遷移舊的數(shù)據(jù)(使用一致性hash算法能較好的避免這個問題)
  • 容易面臨跨分片查詢的復雜問題。比如上例中,如果頻繁用到的查詢條件中不帶cusno時,將會導致無法定位數(shù)據(jù)庫,從而需要同時向4個庫發(fā)起查詢,再在內(nèi)存中合并數(shù)據(jù),取最小集返回給應(yīng)用,分庫反而成為拖累。

二、分庫分表帶來的問題

分庫分表能有效的緩解單機和單庫帶來的性能瓶頸和壓力,突破網(wǎng)絡(luò)IO、硬件資源、連接數(shù)的瓶頸,同時也帶來了一些問題。下面將描述這些技術(shù)挑戰(zhàn)以及對應(yīng)的解決思路。 

1、事務(wù)一致性問題

1)分布式事務(wù)

當更新內(nèi)容同時分布在不同庫中,不可避免會帶來跨庫事務(wù)問題。跨分片事務(wù)也是分布式事務(wù),沒有簡單的方案,一般可使用"XA協(xié)議"和"兩階段提交"處理。分布式事務(wù)能最大限度保證了數(shù)據(jù)庫操作的原子性。

但在提交事務(wù)時需要協(xié)調(diào)多個節(jié)點,推后了提交事務(wù)的時間點,延長了事務(wù)的執(zhí)行時間,導致事務(wù)在訪問共享資源時發(fā)生沖突或死鎖的概率增高。隨著數(shù)據(jù)庫節(jié)點的增多,這種趨勢會越來越嚴重,從而成為系統(tǒng)在數(shù)據(jù)庫層面上水平擴展的枷鎖。

2)最終一致性

對于那些性能要求很高,但對一致性要求不高的系統(tǒng),往往不苛求系統(tǒng)的實時一致性,只要在允許的時間段內(nèi)達到最終一致性即可,可采用事務(wù)補償?shù)姆绞健?/p>

與事務(wù)在執(zhí)行中發(fā)生錯誤后立即回滾的方式不同,事務(wù)補償是一種事后檢查補救的措施,一些常見的實現(xiàn)方法有:對數(shù)據(jù)進行對賬檢查,基于日志進行對比,定期同標準數(shù)據(jù)來源進行同步等等。事務(wù)補償還要結(jié)合業(yè)務(wù)系統(tǒng)來考慮。

2、跨節(jié)點關(guān)聯(lián)查詢 join 問題

切分之前,系統(tǒng)中很多列表和詳情頁所需的數(shù)據(jù)可以通過sql join來完成。而切分之后,數(shù)據(jù)可能分布在不同的節(jié)點上,此時join帶來的問題就比較麻煩了,考慮到性能,盡量避免使用join查詢。解決這個問題的一些方法:

1)全局表

全局表,也可看做是"數(shù)據(jù)字典表",就是系統(tǒng)中所有模塊都可能依賴的一些表,為了避免跨庫join查詢,可以將這類表在每個數(shù)據(jù)庫中都保存一份。這些數(shù)據(jù)通常很少會進行修改,所以也不擔心一致性的問題。

2)字段冗余

一種典型的反范式設(shè)計,利用空間換時間,為了性能而避免join查詢。例如:訂單表保存userId時候,也將userName冗余保存一份,這樣查詢訂單詳情時就不需要再去查詢"買家user表"了。

但這種方法適用場景也有限,比較適用于依賴字段比較少的情況。而冗余字段的數(shù)據(jù)一致性也較難保證,就像上面訂單表的例子,買家修改了userName后,是否需要在歷史訂單中同步更新呢?這也要結(jié)合實際業(yè)務(wù)場景進行考慮。

3)數(shù)據(jù)組裝

系統(tǒng)層面,分兩次查詢,第一次查詢的結(jié)果集中找出關(guān)聯(lián)數(shù)據(jù)id,然后根據(jù)id發(fā)起第二次請求得到關(guān)聯(lián)數(shù)據(jù)。最后將獲得到的數(shù)據(jù)進行字段拼裝。

4)ER分片

關(guān)系型數(shù)據(jù)庫中,如果可以先確定表之間的關(guān)聯(lián)關(guān)系,并將那些存在關(guān)聯(lián)關(guān)系的表記錄存放在同一個分片上,那么就能較好的避免跨分片join問題。在1:1或1:n的情況下,通常按照主表的ID主鍵切分。如下圖所示:

3、跨節(jié)點分頁、排序、函數(shù)問題

跨節(jié)點多庫進行查詢時,會出現(xiàn)limit分頁、order by排序等問題。分頁需要按照指定字段進行排序,當排序字段就是分片字段時,通過分片規(guī)則就比較容易定位到指定的分片;當排序字段非分片字段時,就變得比較復雜了,需要先在不同的分片節(jié)點中將數(shù)據(jù)進行排序并返回,然后將不同分片返回的結(jié)果集進行匯總和再次排序,最終返回給用戶。如圖所示:

上圖中只是取第一頁的數(shù)據(jù),對性能影響還不是很大。但是如果取得頁數(shù)很大,情況則變得復雜很多,因為各分片節(jié)點中的數(shù)據(jù)可能是隨機的,為了排序的準確性,需要將所有節(jié)點的前N頁數(shù)據(jù)都排序好做合并,最后再進行整體的排序。

這樣的操作是很耗費CPU和內(nèi)存資源的,所以頁數(shù)越大,系統(tǒng)的性能也會越差。在使用Max、Min、Sum、Count之類的函數(shù)進行計算的時候,也需要先在每個分片上執(zhí)行相應(yīng)的函數(shù),然后將各個分片的結(jié)果集進行匯總和再次計算,最終將結(jié)果返回。如圖所示:

4、全局主鍵避重問題

在分庫分表環(huán)境中,由于表中數(shù)據(jù)同時存在不同數(shù)據(jù)庫中,主鍵值平時使用的自增長將無用武之地,某個分區(qū)數(shù)據(jù)庫自生成的ID無法保證全局唯一。因此需要單獨設(shè)計全局主鍵,以避免跨庫主鍵重復問題。有一些常見的主鍵生成策略:

1)UUID

UUID標準形式包含32個16進制數(shù)字,分為5段,形式為8-4-4-4-12的36個字符,例如:550e8400-e29b-41d4-a716-446655440000

UUID是主鍵是最簡單的方案,本地生成,性能高,沒有網(wǎng)絡(luò)耗時。但缺點也很明顯,由于UUID非常長,會占用大量的存儲空間;另外,作為主鍵建立索引和基于索引進行查詢時都會存在性能問題,在InnoDB下,UUID的無序性會引起數(shù)據(jù)位置頻繁變動,導致分頁。

2)結(jié)合數(shù)據(jù)庫維護主鍵ID表

在數(shù)據(jù)庫中建立 sequence 表:

CREATE TABLE `sequence` (  
  `id` bigint(20) unsigned NOT NULL auto_increment,  
  `stub` char(1) NOT NULL default '',  
  PRIMARY KEY  (`id`),  
  UNIQUE KEY `stub` (`stub`)  
) ENGINE=MyISAM;

stub字段設(shè)置為唯一索引,同一stub值在sequence表中只有一條記錄,可以同時為多張表生成全局ID。sequence表的內(nèi)容,如下所示:

+-------------------+------+  
| id                | stub |  
+-------------------+------+  
| 72157623227190423 |    a |  
+-------------------+------+

使用 MyISAM 存儲引擎而不是 InnoDB,以獲取更高的性能。MyISAM使用的是表級別的鎖,對表的讀寫是串行的,所以不用擔心在并發(fā)時兩次讀取同一個ID值。

當需要全局唯一的64位ID時,執(zhí)行:

REPLACE INTO sequence (stub) VALUES ('a');  
SELECT LAST_INSERT_ID();

這兩條語句是Connection級別的,select last_insert_id() 必須與 replace into 在同一數(shù)據(jù)庫連接下才能得到剛剛插入的新ID。

使用replace into代替insert into好處是避免了表行數(shù)過大,不需要另外定期清理。

此方案較為簡單,但缺點也明顯:存在單點問題,強依賴DB,當DB異常時,整個系統(tǒng)都不可用。配置主從可以增加可用性,但當主庫掛了,主從切換時,數(shù)據(jù)一致性在特殊情況下難以保證。另外性能瓶頸限制在單臺MySQL的讀寫性能。

flickr團隊使用的一種主鍵生成策略,與上面的sequence表方案類似,但更好的解決了單點和性能瓶頸的問題。

這一方案的整體思想是:建立2個以上的全局ID生成的服務(wù)器,每個服務(wù)器上只部署一個數(shù)據(jù)庫,每個庫有一張sequence表用于記錄當前全局ID。表中ID增長的步長是庫的數(shù)量,起始值依次錯開,這樣能將ID的生成散列到各個數(shù)據(jù)庫上。如下圖所示:

由兩個數(shù)據(jù)庫服務(wù)器生成ID,設(shè)置不同的auto_increment值。第一臺sequence的起始值為1,每次步長增長2,另一臺的sequence起始值為2,每次步長增長也是2。結(jié)果第一臺生成的ID都是奇數(shù)(1, 3, 5, 7 ...),第二臺生成的ID都是偶數(shù)(2, 4, 6, 8 ...)。

這種方案將生成ID的壓力均勻分布在兩臺機器上。同時提供了系統(tǒng)容錯,第一臺出現(xiàn)了錯誤,可以自動切換到第二臺機器上獲取ID。但有以下幾個缺點:系統(tǒng)添加機器,水平擴展時較復雜;每次獲取ID都要讀寫一次DB,DB的壓力還是很大,只能靠堆機器來提升性能。

可以基于flickr的方案繼續(xù)優(yōu)化,使用批量的方式降低數(shù)據(jù)庫的寫壓力,每次獲取一段區(qū)間的ID號段,用完之后再去數(shù)據(jù)庫獲取,可以大大減輕數(shù)據(jù)庫的壓力。如下圖所示

還是使用兩臺DB保證可用性,數(shù)據(jù)庫中只存儲當前的最大ID。ID生成服務(wù)每次批量拉取6個ID,先將max_id修改為5,當應(yīng)用訪問ID生成服務(wù)時,就不需要訪問數(shù)據(jù)庫,從號段緩存中依次派發(fā)0~5的ID。當這些ID發(fā)完后,再將max_id修改為11,下次就能派發(fā)6~11的ID。于是,數(shù)據(jù)庫的壓力降低為原來的1/6。

3)Snowflake分布式自增ID算法

Twitter的snowflake算法解決了分布式系統(tǒng)生成全局ID的需求,生成64位的Long型數(shù)字,組成部分:

  • 第一位未使用
  • 接下來41位是毫秒級時間,41位的長度可以表示69年的時間
  • 5位datacenterId,5位workerId。10位的長度最多支持部署1024個節(jié)點
  • 最后12位是毫秒內(nèi)的計數(shù),12位的計數(shù)順序號支持每個節(jié)點每毫秒產(chǎn)生4096個ID序列

好處:毫秒數(shù)在高位,生成的ID整體上按時間趨勢遞增;不依賴第三方系統(tǒng),穩(wěn)定性和效率較高,理論上QPS約為409.6w/s(1000*2^12),并且整個分布式系統(tǒng)內(nèi)不會產(chǎn)生ID碰撞;可根據(jù)自身業(yè)務(wù)靈活分配bit位。

不足:強依賴機器時鐘,如果時鐘回撥,則可能導致生成ID重復。

綜上,結(jié)合數(shù)據(jù)庫和snowflake的唯一ID方案,可以參考業(yè)界較為成熟的解法:Leaf——美團點評分布式ID生成系統(tǒng),并考慮到了高可用、容災(zāi)、分布式下時鐘等問題。

5、數(shù)據(jù)遷移、擴容問題

當業(yè)務(wù)高速發(fā)展,面臨性能和存儲的瓶頸時,才會考慮分片設(shè)計,此時就不可避免的需要考慮歷史數(shù)據(jù)遷移的問題。一般做法是先讀出歷史數(shù)據(jù),然后按指定的分片規(guī)則再將數(shù)據(jù)寫入到各個分片節(jié)點中。

此外還需要根據(jù)當前的數(shù)據(jù)量和QPS,以及業(yè)務(wù)發(fā)展的速度,進行容量規(guī)劃,推算出大概需要多少分片(一般建議單個分片上的單表數(shù)據(jù)量不超過1000W)。

如果采用數(shù)值范圍分片,只需要添加節(jié)點就可以進行擴容了,不需要對分片數(shù)據(jù)遷移。如果采用的是數(shù)值取模分片,則考慮后期的擴容問題就相對比較麻煩。

三、什么時候考慮切分

1、能不切分盡量不要切分

并不是所有表都需要進行切分,主要還是看數(shù)據(jù)的增長速度。切分后會在某種程度上提升業(yè)務(wù)的復雜度,數(shù)據(jù)庫除了承載數(shù)據(jù)的存儲和查詢外,協(xié)助業(yè)務(wù)更好的實現(xiàn)需求也是其重要工作之一。

不到萬不得已不用輕易使用分庫分表這個大招,避免"過度設(shè)計"和"過早優(yōu)化"。分庫分表之前,不要為分而分,先盡力去做力所能及的事情,例如:升級硬件、升級網(wǎng)絡(luò)、讀寫分離、索引優(yōu)化等等。當數(shù)據(jù)量達到單表的瓶頸時候,再考慮分庫分表。

2、數(shù)據(jù)量過大,正常運維影響業(yè)務(wù)訪問

這里說的運維,指:

1)對數(shù)據(jù)庫備份,如果單表太大,備份時需要大量的磁盤IO和網(wǎng)絡(luò)IO。例如1T的數(shù)據(jù),網(wǎng)絡(luò)傳輸占50MB時候,需要20000秒才能傳輸完畢,整個過程的風險都是比較高的。

2)對一個很大的表進行DDL修改時,MySQL會鎖住全表,這個時間會很長,這段時間業(yè)務(wù)不能訪問此表,影響很大。如果使用pt-online-schema-change,使用過程中會創(chuàng)建觸發(fā)器和影子表,也需要很長的時間。在此操作過程中,都算為風險時間。將數(shù)據(jù)表拆分,總量減少,有助于降低這個風險。

3)大表會經(jīng)常訪問與更新,就更有可能出現(xiàn)鎖等待。將數(shù)據(jù)切分,用空間換時間,變相降低訪問壓力。

3、隨著業(yè)務(wù)發(fā)展,需要對某些字段垂直拆分

舉個例子,假如項目一開始設(shè)計的用戶表如下:

id                   bigint             #用戶的ID
name                 varchar            #用戶的名字
last_login_time      datetime           #最近登錄時間
personal_info        text               #私人信息
.....                                   #其他信息字段

在項目初始階段,這種設(shè)計是滿足簡單的業(yè)務(wù)需求的,也方便快速迭代開發(fā)。而當業(yè)務(wù)快速發(fā)展時,用戶量從10w激增到10億,用戶非常的活躍,每次登錄會更新 last_login_name 字段,使得 user 表被不斷update,壓力很大。

而其他字段:id, name, personal_info 是不變的或很少更新的,此時在業(yè)務(wù)角度,就要將 last_login_time 拆分出去,新建一個 user_time 表。

personal_info 屬性是更新和查詢頻率較低的,并且text字段占據(jù)了太多的空間。這時候,就要對此垂直拆分出 user_ext 表了。

4、數(shù)據(jù)量快速增長

隨著業(yè)務(wù)的快速發(fā)展,單表中的數(shù)據(jù)量會持續(xù)增長,當性能接近瓶頸時,就需要考慮水平切分,做分庫分表了。此時一定要選擇合適的切分規(guī)則,提前預(yù)估好數(shù)據(jù)容量

5、安全性和可用性

雞蛋不要放在一個籃子里。在業(yè)務(wù)層面上垂直切分,將不相關(guān)的業(yè)務(wù)的數(shù)據(jù)庫分隔,因為每個業(yè)務(wù)的數(shù)據(jù)量、訪問量都不同,不能因為一個業(yè)務(wù)把數(shù)據(jù)庫

搞掛而牽連到其他業(yè)務(wù)。利用水平切分,當一個數(shù)據(jù)庫出現(xiàn)問題時,不會影響到100%的用戶,每個庫只承擔業(yè)務(wù)的一部分數(shù)據(jù),這樣整體的可用性就能提高。

四、案例分析

1、用戶中心業(yè)務(wù)場景

用戶中心是一個非常常見的業(yè)務(wù),主要提供用戶注冊、登錄、查詢/修改等功能,其核心表為:

User(uid, login_name, passwd, sex, age, nickname)


uid為用戶ID,  主鍵
login_name, passwd, sex, age, nickname,  用戶屬性

任何脫離業(yè)務(wù)的架構(gòu)設(shè)計都是耍流氓,在進行分庫分表前,需要對業(yè)務(wù)場景需求進行梳理:

  • 用戶側(cè):前臺訪問,訪問量較大,需要保證高可用和高一致性。主要有兩類需求:
  • 用戶登錄:通過login_name/phone/email查詢用戶信息,1%請求屬于這種類型
  • 用戶信息查詢:登錄之后,通過uid來查詢用戶信息,99%請求屬這種類型
  • 運營側(cè):后臺訪問,支持運營需求,按照年齡、性別、登陸時間、注冊時間等進行分頁的查詢。是內(nèi)部系統(tǒng),訪問量較低,對可用性、一致性的要求不高。

2、水平切分方法

當數(shù)據(jù)量越來越大時,需要對數(shù)據(jù)庫進行水平切分,上文描述的切分方法有"根據(jù)數(shù)值范圍"和"根據(jù)數(shù)值取模"。

1)"根據(jù)數(shù)值范圍":以主鍵uid為劃分依據(jù),按uid的范圍將數(shù)據(jù)水平切分到多個數(shù)據(jù)庫上。例如:user-db1存儲uid范圍為0~1000w的數(shù)據(jù),user-db2存儲uid范圍為1000w~2000wuid數(shù)據(jù)。

  • 優(yōu)點:擴容簡單,如果容量不夠,只要增加新db即可。
  • 不足:請求量不均勻,一般新注冊的用戶活躍度會比較高,所以新的user-db2會比user-db1負載高,導致服務(wù)器利用率不平衡

2)"根據(jù)數(shù)值取模":也是以主鍵uid為劃分依據(jù),按uid取模的值將數(shù)據(jù)水平切分到多個數(shù)據(jù)庫上。例如:user-db1存儲uid取模得1的數(shù)據(jù),user-db2存儲uid取模得0的uid數(shù)據(jù)。

  • 優(yōu)點:數(shù)據(jù)量和請求量分布均均勻
  • 不足:擴容麻煩,當容量不夠時,新增加db,需要rehash。需要考慮對數(shù)據(jù)進行平滑的遷移。

3、非uid的查詢方法

水平切分后,對于按uid查詢的需求能很好的滿足,可以直接路由到具體數(shù)據(jù)庫。而按非uid的查詢,例如login_name,就不知道具體該訪問哪個庫了,此時需要遍歷所有庫,性能會降低很多。

對于用戶側(cè),可以采用"建立非uid屬性到uid的映射關(guān)系"的方案;對于運營側(cè),可以采用"前臺與后臺分離"的方案。

1)建立非uid屬性到uid的映射關(guān)系

①映射關(guān)系

例如:login_name不能直接定位到數(shù)據(jù)庫,可以建立login_name→uid的映射關(guān)系,用索引表或緩存來存儲。當訪問login_name時,先通過映射表查詢出login_name對應(yīng)的uid,再通過uid定位到具體的庫。映射表只有兩列,可以承載很多數(shù)據(jù),當數(shù)據(jù)量過大時,也可以對映射表再做水平切分。這類kv格式的索引結(jié)構(gòu),可以很好的使用cache來優(yōu)化查詢性能,而且映射關(guān)系不會頻繁變更,緩存命中率會很高。

②基因法

分庫基因:假如通過uid分庫,分為8個庫,采用uid%8的方式進行路由,此時是由uid的最后3bit來決定這行User數(shù)據(jù)具體落到哪個庫上,那么這3bit可以看為分庫基因。

上面的映射關(guān)系的方法需要額外存儲映射表,按非uid字段查詢時,還需要多一次數(shù)據(jù)庫或cache的訪問。如果想要消除多余的存儲和查詢,可以通過f函數(shù)取login_name的基因作為uid的分庫基因。生成uid時,參考上文所述的分布式唯一ID生成方案,再加上最后3位bit值=f(login_name)。當查詢login_name時,只需計算f(login_name)%8的值,就可以定位到具體的庫。不過這樣需要提前做好容量規(guī)劃,預(yù)估未來幾年的數(shù)據(jù)量需要分多少庫,要預(yù)留一定bit的分庫基因。

③前臺與后臺分離

對于用戶側(cè),主要需求是以單行查詢?yōu)橹鳎枰ogin_name/phone/email到uid的映射關(guān)系,可以解決這些字段的查詢問題。

而對于運營側(cè),很多批量分頁且條件多樣的查詢,這類查詢計算量大,返回數(shù)據(jù)量大,對數(shù)據(jù)庫的性能消耗較高。此時,如果和用戶側(cè)公用同一批服務(wù)或數(shù)據(jù)庫,可能因為后臺的少量請求,占用大量數(shù)據(jù)庫資源,而導致用戶側(cè)訪問性能降低或超時。

這類業(yè)務(wù)最好采用"前臺與后臺分離"的方案,運營側(cè)后臺業(yè)務(wù)抽取獨立的service和db,解決和前臺業(yè)務(wù)系統(tǒng)的耦合。由于運營側(cè)對可用性、一致性的要求不高,可以不訪問實時庫,而是通過binlog異步同步數(shù)據(jù)到運營庫進行訪問。

在數(shù)據(jù)量很大的情況下,還可以使用ES搜索引擎或Hive來滿足后臺復雜的查詢方式。

五、支持分庫分表中間件

目前分庫分表已經(jīng)有一些較為成熟的開源解決方案:

  • sharding-jdbc(當當)
  • TSharding(蘑菇街)
  • Atlas(奇虎360)
  • Cobar(阿里巴巴)
  • MyCAT(基于Cobar)
  • Oceanus(58同城)
  • Vitess(谷歌)
責任編輯:華軒 來源: 架構(gòu)精進之路
相關(guān)推薦

2022-06-15 07:32:24

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

2024-08-02 15:47:28

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

2019-01-16 14:00:54

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

2018-08-14 18:00:14

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

2021-04-30 20:10:46

類加載Java代碼

2022-12-05 07:51:24

數(shù)據(jù)庫分庫分表讀寫分離

2018-06-01 14:00:00

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

2019-03-06 14:42:01

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

2021-04-01 05:40:53

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

2019-04-28 11:01:05

云安全云計算CASB

2024-12-04 13:02:34

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

2019-01-29 15:25:11

阿里巴巴數(shù)據(jù)庫分庫分表

2020-06-24 09:00:43

分庫分表MySQL

2009-11-09 09:09:42

Windows 7市場銷售

2021-03-04 09:20:20

數(shù)據(jù)Redis 架構(gòu)

2021-03-15 09:27:05

Redis優(yōu)化技術(shù)

2022-06-04 15:28:42

微服務(wù)架構(gòu)編程語言

2009-04-08 08:50:17

Windows 7微軟操作系統(tǒng)

2019-08-16 10:19:01

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

2018-05-29 08:39:26

DBA數(shù)據(jù)庫案例
點贊
收藏

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

精品无码一区二区三区蜜臀| 日本成人黄色| 污污的视频在线免费观看| 久久在线观看| 午夜久久电影网| 国产精品日韩一区二区三区 | 久久精品视频免费| 成人黄色片在线| 国语对白一区二区| 成人在线免费小视频| 精品国产露脸精彩对白| 久久久性生活视频| 岛国大片在线观看| 国产高清不卡一区| 国产精品扒开腿做爽爽爽视频| 亚洲一级生活片| 要久久爱电视剧全集完整观看| 555夜色666亚洲国产免| 久久久久久久激情| 欧洲成人综合网| 亚洲国产精品成人综合 | 日韩av片免费观看| 成人一级福利| 亚洲精品日日夜夜| 亚洲免费在线精品一区| 四虎影院在线播放| 国产精品自在| 中文字幕成人动漫| 久久精品视频亚洲| 久久亚洲精品小早川怜子| 日韩在线播放av| 91av在线免费| 欧美经典一区| 欧美日本一道本在线视频| 日韩欧美亚洲天堂| 日本性爱视频在线观看| 国产精品亲子乱子伦xxxx裸| 欧美色综合久久| 香蕉久久99| 久久久久久久九九九九| 性无码专区无码| 91欧美大片| 亚洲欧美日韩精品久久| 国产精品果冻传媒| 97色婷婷成人综合在线观看| 在线亚洲+欧美+日本专区| 可以在线看的av网站| 日本aa在线| 中文字幕在线不卡国产视频| 色综合视频二区偷拍在线| 青梅竹马是消防员在线| 99久久婷婷国产精品综合| 91精品国产99久久久久久红楼| 伊人网中文字幕| 日本亚洲天堂网| 国产精品扒开腿做爽爽爽的视频| 天天爽夜夜爽人人爽| 国产一区91| 2019中文字幕在线观看| www.日本精品| 国产精品婷婷| 国产成人精品久久久| 日韩熟女一区二区| 日产国产高清一区二区三区| 国产精品老牛影院在线观看| 这里只有精品国产| 精品制服美女丁香| 亚洲一区二区三区香蕉| 精品国产亚洲av麻豆| 国产精品综合一区二区三区| av蓝导航精品导航| 蜜臀久久久久久999| 99视频一区二区三区| 久久精品国产一区二区三区不卡| 日本一区二区三区在线观看视频| 久久奇米777| 色播亚洲视频在线观看| 日本蜜桃在线观看| 亚洲激情自拍视频| 亚洲 自拍 另类小说综合图区| 免费成人在线电影| 欧美亚洲动漫精品| 日韩欧美理论片| 一区二区三区视频免费视频观看网站 | 日本在线视频不卡| 日本视频在线| 亚洲18女电影在线观看| 久久精品午夜福利| 四虎影视国产精品| 精品国产三级电影在线观看| a级大片在线观看| 首页国产精品| 国内免费久久久久久久久久久 | 欧美日高清视频| 香蕉视频1024| 免费一区二区三区视频导航| 中文字幕日韩高清| 久久久精品99| 日韩制服丝袜av| 91日韩久久| 国产视频福利在线| 亚洲精品福利视频网站| aa免费在线观看| 国产视频一区二区在线播放| 日韩精品在线免费| 男女做暖暖视频| 久久av一区| av一区二区三区四区电影| 国产在线观看高清视频| 亚洲一区欧美一区| 欧美性猛交xxx乱久交| 亚洲国产欧美在线观看| 亚洲日韩第一页| 欧美精品入口蜜桃| 免费在线观看成人| 韩国成人av| 黄色av免费在线| 色呦呦一区二区三区| 粗大的内捧猛烈进出视频| 精品国产91乱码一区二区三区四区| 欧美激情视频网址| 91 中文字幕| 久久精品在线观看| 亚洲理论电影在线观看| 成人国产精品久久| 国产亚洲欧美日韩一区二区| 国产精品99精品无码视| 国内精品视频666| 日韩影院一区| 欧美gay视频| 亚洲国产中文字幕久久网| 尤物在线免费视频| 麻豆高清免费国产一区| 日韩av图片| 欧美电影h版| 日韩精品高清在线观看| 精品一级少妇久久久久久久| 激情久久五月天| 亚洲精品国产精品久久| 免费亚洲电影| 日韩精品在线私人| 不卡的免费av| 成人av在线一区二区| 欧美在线观看视频免费| 日韩第一区第二区| 欧美xxxx做受欧美.88| 国产精品乱码一区二区| 国产精品看片你懂得 | 国产精品资源网站| 久久99国产精品一区| 日韩欧美三区| zzjj国产精品一区二区| 91尤物国产福利在线观看| 国产精品色哟哟网站| 性刺激的欧美三级视频| 欧美一区电影| 成人亚洲激情网| a级片国产精品自在拍在线播放| 欧美一区二区三区在线看| 四虎永久免费在线| 懂色av噜噜一区二区三区av| 人妻夜夜添夜夜无码av| 精品国产乱子伦一区二区| 98精品在线视频| 日本福利片在线| 在线看日本不卡| 亚洲视频重口味| 国产不卡在线播放| 欧美日韩二三区| gogogo高清在线观看一区二区| 国产精品成人一区二区| 三区四区电影在线观看| 337p亚洲精品色噜噜| 成人观看免费视频| 91亚洲精华国产精华精华液| 成人午夜视频免费在线观看| 成人一区二区| 国产免费久久av| 日本一本在线免费福利| 国产网站欧美日韩免费精品在线观看 | 99久久99| 成人免费短视频| 日韩在线小视频| 免费av网站在线播放| 91久久国产最好的精华液| 国产免费久久久久| 99在线精品免费| 在线观看免费av网址| 激情综合自拍| 小说区图片区图片区另类灬| 香港久久久电影| 国产99久久精品一区二区 夜夜躁日日躁 | 成人在线观看免费视频| 久久99久国产精品黄毛片入口| 手机亚洲第一页| 欧美男人的天堂一二区| 久久6免费高清热精品| 国产婷婷成人久久av免费高清 | 日本网站免费在线观看| 婷婷激情久久| 91热精品视频| 中文字幕在线中文字幕在线中三区| 中文字幕日韩av| 黄色一级大片在线免费看国产| 在线一区二区视频| 国产亚洲精品久久久久久无几年桃| 久久久久久黄色| 亚洲精品鲁一鲁一区二区三区| 久久久www| 国产成人永久免费视频| 日韩理论电影院| 蜜桃av色综合| 国产精品sss在线观看av| 国产伦精品一区二区三区精品视频| av资源网在线播放| 久久精品视频网站| 精华区一区二区三区| 精品福利一区二区三区 | 黄视频网站在线观看| 蜜臀久久99精品久久久无需会员 | 97成人超碰免| 国产一卡二卡在线| 特级做a爱片免费69| av天堂一区二区三区| 理论在线观看| av成人老司机| 亚洲欧美天堂在线| 日韩高清在线观看| 18禁免费无码无遮挡不卡网站 | 亚洲三级一区| 精品视频免费| 欧美精品123| 精品国内亚洲2022精品成人| av一区二区在线看| 中文字幕一区图| 亚洲已满18点击进入在线看片 | 午夜一级在线看亚洲| 女人被男人躁得好爽免费视频| 99久久.com| 正在播放一区| 97精品97| 伊人狠狠色丁香综合尤物| 俺要去色综合狠狠| 欧美国产一区二区在线| 麻豆成人入口| 久久国产精品99久久久久久丝袜| 九色丨蝌蚪丨成人| 国产视色精品亚洲一区二区| 国产96在线亚洲| 肥熟一91porny丨九色丨| 亚洲高清在线一区| 不卡视频一区二区| 亚洲精品在线a| 成人片在线免费看| 福利在线一区| 久久精品中文字幕一区二区三区| 欧美理论电影在线精品| 噜噜噜噜噜久久久久久91| 欧美影院天天5g天天爽| 欧美动漫一区二区| 成人激情在线| 免费久久久久久| 欧美片第1页综合| 免费视频爱爱太爽了| 亚洲经典在线看| av片中文字幕| 麻豆精品在线视频| 一级 黄 色 片一| 成人av在线网站| 在线观看日本中文字幕| 中文字幕中文字幕在线一区| 一级片一级片一级片| 亚洲国产精品久久久男人的天堂 | 国产7777777| 亚洲男人电影天堂| 日产电影一区二区三区| 色噜噜狠狠色综合欧洲selulu| 自拍偷拍精品视频| 91精品国产91久久久久久最新毛片| www.中文字幕| 亚洲欧美精品一区| 国产黄色在线网站| 午夜精品视频在线| 日韩不卡视频在线观看| 91天堂在线视频| 免费看成人人体视频| 视频一区三区| 亚洲大片av| 网站一区二区三区| 成人一区在线看| 免费看黄色av| 亚洲一区在线免费观看| 精品乱码一区内射人妻无码 | 国产成人拍精品视频午夜网站| 97久久中文字幕 | 日韩国产欧美一区二区| 人人妻人人做人人爽| 日本成人在线视频网站| 四虎成人免费视频| 国产精品久久久久影视| 精品97人妻无码中文永久在线| 中文.日本.精品| 视频一区在线视频| 欧美视频在线一区| 国产mv免费观看入口亚洲| 精品国产无码一区二区| 亚洲欧美中文日韩在线v日本| 尤物视频在线免费观看| 欧美激情欧美狂野欧美精品| 成人一区视频| 久久久久久久久久久久久9999| 91亚洲国产高清| 欧美日韩激情视频在线观看| 国产九九视频一区二区三区| 成人性生交大片免费看无遮挡aⅴ| 亚洲一区二区av电影| 一二三区中文字幕| 亚洲人成绝费网站色www| 男女在线视频| 成人激情视频免费在线| 国产剧情在线观看一区| 水蜜桃色314在线观看| 国产一区二区三区在线看麻豆| 波多野在线播放| 欧美午夜精品久久久久久浪潮 | 久久久久久a亚洲欧洲aⅴ| 亚洲欧美综合国产精品一区| 亚洲一区二区三区四区五区| 久久精品水蜜桃av综合天堂| 国产无遮挡又黄又爽| 日韩午夜三级在线| 日本视频在线免费观看| 国产精品日韩在线观看| 少妇精品久久久| av免费中文字幕| 不卡av免费在线观看| 免费网站观看www在线观| 欧美一卡二卡三卡四卡| 黄色网页在线免费观看| 成人av.网址在线网站| 成人在线免费小视频| 午夜精品在线免费观看| 久久久精品日韩欧美| 午夜婷婷在线观看| 亚洲欧美国产另类| 在线免费看h| 久久久久久久久一区二区| 99视频在线精品国自产拍免费观看| 日本人dh亚洲人ⅹxx| 一区二区三区在线免费视频| 精品人妻伦一区二区三区久久| 欧美成人在线免费视频| 中文无码日韩欧| 国产精品久久久久久久乖乖| 成人手机在线视频| 草久久免费视频| 亚洲欧美综合另类中字| 日本欧美一区| 亚洲精品tv久久久久久久久| 久久精品国产亚洲a| 99久久99久久精品国产| 日韩美女一区二区三区| 久草在线新免费首页资源站| 国内精品视频在线播放| 国产欧美欧美| 国产黄色大片免费看| 欧美日韩综合在线| a在线免费观看| 国内外成人免费视频| 日韩在线观看一区二区| 欧美一区二区三区观看| 日韩视频免费观看高清完整版 | 国产乱码在线| 鲁丝片一区二区三区| 喷白浆一区二区| 99精品久久久久| 日韩不卡中文字幕| 电影一区二区| 黄色成人在线免费观看| xfplay精品久久| 中文字幕码精品视频网站| 九九热这里只有在线精品视| 欧洲精品一区| www.污污视频| 亚洲sss视频在线视频| 国产永久免费高清在线观看视频| 91精品啪aⅴ在线观看国产| 国产综合色产| 国产91丝袜美女在线播放| 日韩精品在线一区二区| 日韩精品专区| 伊人再见免费在线观看高清版| 97精品电影院| 国产精品爽爽久久久久久| 韩剧1988免费观看全集| 99久久这里只有精品| 欲求不满的岳中文字幕| 在线播放91灌醉迷j高跟美女| 密臀av在线播放| 亚洲精品偷拍视频|