數(shù)據(jù)分區(qū)是一種物理數(shù)據(jù)庫的設(shè)計(jì)技術(shù),它的目的是為了在特定的SQL操作中減少數(shù)據(jù)讀寫的總量以縮減響應(yīng)時(shí)間。
分區(qū)并不是生成新的數(shù)據(jù)表,而是將表的數(shù)據(jù)均衡分?jǐn)偟讲煌挠脖P,系統(tǒng)或是不同服務(wù)器存儲(chǔ)介子中,實(shí)際上還是一張表。另外,分區(qū)可以做到將表的數(shù)據(jù)均衡到不同的地方,提高數(shù)據(jù)檢索的效率,降低數(shù)據(jù)庫的頻繁IO壓力值,分區(qū)的優(yōu)點(diǎn)如下:
1、相對(duì)于單個(gè)文件系統(tǒng)或是硬盤,分區(qū)可以存儲(chǔ)更多的數(shù)據(jù);
2、數(shù)據(jù)管理比較方便,比如要清理或廢棄某年的數(shù)據(jù),就可以直接刪除該日期的分區(qū)數(shù)據(jù)即可;
3、精準(zhǔn)定位分區(qū)查詢數(shù)據(jù),不需要全表掃描查詢,大大提高數(shù)據(jù)檢索效率;
4、可跨多個(gè)分區(qū)磁盤查詢,來提高查詢的吞吐量;
5、在涉及聚合函數(shù)查詢時(shí),可以很容易進(jìn)行數(shù)據(jù)的合并;
就是把一張表的數(shù)據(jù)分成N個(gè)區(qū)塊,在邏輯上看最終只是一張表,但底層是由N個(gè)物理區(qū)塊組成的
就是把一張表按一定的規(guī)則分解成N個(gè)具有獨(dú)立存儲(chǔ)空間的實(shí)體表。系統(tǒng)讀寫時(shí)需要根據(jù)定義好的規(guī)則得到對(duì)應(yīng)的字表明,然后操作它。
一旦分表,一個(gè)庫中的表會(huì)越來越多
將整個(gè)數(shù)據(jù)庫比作圖書館,一張表就是一本書。當(dāng)要在一本書中查找某項(xiàng)內(nèi)容時(shí),如果不分章節(jié),查找的效率將會(huì)下降。而同理,在數(shù)據(jù)庫中就是分區(qū)。
單個(gè)表數(shù)據(jù)量越大,讀寫鎖,插入操作重新建立索引效率越低。
單個(gè)庫數(shù)據(jù)量太大(一個(gè)數(shù)據(jù)庫數(shù)據(jù)量到1T-2T就是極限)
單個(gè)數(shù)據(jù)庫服務(wù)器壓力過大
讀寫速度遇到瓶頸(并發(fā)量幾百)
一張表的查詢速度已經(jīng)慢到影響使用的時(shí)候。
sql經(jīng)過優(yōu)化
數(shù)據(jù)量大
表中的數(shù)據(jù)是分段的
對(duì)數(shù)據(jù)的操作往往只涉及一部分?jǐn)?shù)據(jù),而不是所有的數(shù)據(jù)
主要可以提升查詢效率
mysql5 開始支持分區(qū)功能
CREATE TABLE sales ( id INT AUTO_INCREMENT, amount DOUBLE NOT NULL, order_day DATETIME NOT NULL, PRIMARY KEY(id, order_day) ) ENGINE=Innodb PARTITION BY RANGE(YEAR(order_day)) ( PARTITION p_2010 VALUES LESS THAN (2010), PARTITION p_2011 VALUES LESS THAN (2011), PARTITION p_2012 VALUES LESS THAN (2012), PARTITION p_catchall VALUES LESS THAN MAXVALUE);
一張表的查詢速度已經(jīng)慢到影響使用的時(shí)候。
sql經(jīng)過優(yōu)化
數(shù)據(jù)量大
當(dāng)頻繁插入或者聯(lián)合查詢時(shí),速度變慢
分表后,單表的并發(fā)能力提高了,磁盤I/O性能也提高了,寫操作效率提高了
查詢一次的時(shí)間短了
數(shù)據(jù)分布在不同的文件,磁盤I/O性能提高
讀寫鎖影響的數(shù)據(jù)量變小
插入數(shù)據(jù)庫需要重新建立索引的數(shù)據(jù)減少
需要業(yè)務(wù)系統(tǒng)配合遷移升級(jí),工作量較大
分區(qū)和分表的目的都是減少數(shù)據(jù)庫的負(fù)擔(dān),提高表的增刪改查效率。
分區(qū)只是一張表中的數(shù)據(jù)的存儲(chǔ)位置發(fā)生改變,分表是將一張表分成多張表。
當(dāng)訪問量大,且表數(shù)據(jù)比較大時(shí),兩種方式可以互相配合使用。
當(dāng)訪問量不大,但表數(shù)據(jù)比較多時(shí),可以只進(jìn)行分區(qū)。
Range(范圍)
Hash(哈希)
按照時(shí)間拆分
Hash之后按照分表個(gè)數(shù)取模
在認(rèn)證庫中保存數(shù)據(jù)庫配置,就是建立一個(gè)DB,這個(gè)DB單獨(dú)保存user_id到DB的映射關(guān)系
單臺(tái)DB的存儲(chǔ)空間不夠
隨著查詢量的增加單臺(tái)數(shù)據(jù)庫服務(wù)器已經(jīng)沒辦法支撐
其主要目的是為突破單節(jié)點(diǎn)數(shù)據(jù)庫服務(wù)器的 I/O 能力限制,解決數(shù)據(jù)庫擴(kuò)展性問題。
將系統(tǒng)中不存在關(guān)聯(lián)關(guān)系或者需要join的表可以放在不同的數(shù)據(jù)庫不同的服務(wù)器中。
按照業(yè)務(wù)垂直劃分。比如:可以按照業(yè)務(wù)分為資金、會(huì)員、訂單三個(gè)數(shù)據(jù)庫。
需要解決的問題:跨數(shù)據(jù)庫的事務(wù)、jion查詢等問題。
例如,大部分的站點(diǎn)。數(shù)據(jù)都是和用戶有關(guān),那么可以根據(jù)用戶,將數(shù)據(jù)按照用戶水平拆分。
按照規(guī)則劃分,一般水平分庫是在垂直分庫之后的。比如每天處理的訂單數(shù)量是海量的,可以按照一定的規(guī)則水平劃分。需要解決的問題:數(shù)據(jù)路由、組裝。
對(duì)于時(shí)效性不高的數(shù)據(jù),可以通過讀寫分離緩解數(shù)據(jù)庫壓力。需要解決的問題:在業(yè)務(wù)上區(qū)分哪些業(yè)務(wù)上是允許一定時(shí)間延遲的,以及數(shù)據(jù)同步問題。
垂直分庫-->水平分庫-->讀寫分離
事務(wù)的支持,分庫分表,就變成了分布式事務(wù)
join時(shí)跨庫,跨表的問題
分庫分表,讀寫分離使用了分布式,分布式為了保證強(qiáng)一致性,必然帶來延遲,導(dǎo)致性能降低,系統(tǒng)的復(fù)雜度變高。
對(duì)于不同的方式之間沒有嚴(yán)格的界限,特點(diǎn)不同,側(cè)重點(diǎn)不同。需要根據(jù)實(shí)際情況,結(jié)合每種方式的特點(diǎn)來進(jìn)行處理。
選用第三方的數(shù)據(jù)庫中間件(Atlas,Mycat,TDDL,DRDS),同時(shí)業(yè)務(wù)系統(tǒng)需要配合數(shù)據(jù)存儲(chǔ)的升級(jí)。
單庫單表是最常見的數(shù)據(jù)庫設(shè)計(jì),例如,有一張用戶(user)表放在數(shù)據(jù)庫db中,所有的用戶都可以在db庫中的user表中查到。
隨著用戶數(shù)量的增加,user表的數(shù)據(jù)量會(huì)越來越大,當(dāng)數(shù)據(jù)量達(dá)到一定程度的時(shí)候?qū)ser表的查詢會(huì)漸漸的變慢,從而影響整個(gè)DB的性能。如果使用mysql, 還有一個(gè)更嚴(yán)重的問題是,當(dāng)需要添加一列的時(shí)候,mysql會(huì)鎖表,期間所有的讀寫操作只能等待。
可以通過某種方式將user進(jìn)行水平的切分,產(chǎn)生兩個(gè)表結(jié)構(gòu)完全一樣的user_0000,user_0001等表,user_0000 + user_0001 + …的數(shù)據(jù)剛好是一份完整的數(shù)據(jù)。
隨著數(shù)據(jù)量增加也許單臺(tái)DB的存儲(chǔ)空間不夠,隨著查詢量的增加單臺(tái)數(shù)據(jù)庫服務(wù)器已經(jīng)沒辦法支撐。這個(gè)時(shí)候可以再對(duì)數(shù)據(jù)庫進(jìn)行水平拆分。
總的來說,優(yōu)先考慮分區(qū)。當(dāng)分區(qū)不能滿足需求時(shí),開始考慮分表,合理的分表對(duì)效率的提升會(huì)優(yōu)于分區(qū)。
商品的評(píng)論數(shù)量:數(shù)十億條
每天的服務(wù)調(diào)用:數(shù)十億次
每年成倍增長
Mysql:只存儲(chǔ)非文本的基礎(chǔ)信息。包括:評(píng)論狀態(tài),用戶,時(shí)間等基礎(chǔ)數(shù)據(jù)。以及圖片,標(biāo)簽,點(diǎn)贊等附加信息。數(shù)據(jù)組織形式(不同的數(shù)據(jù)又可選擇不同的庫表拆分方案):
評(píng)論基礎(chǔ)數(shù)據(jù)按用戶ID進(jìn)行拆庫并拆表
圖片及標(biāo)簽處于同一數(shù)據(jù)庫下,根據(jù)商品編號(hào)分別進(jìn)行拆表
其它的擴(kuò)展信息數(shù)據(jù),因數(shù)據(jù)量不大、訪問量不高,處理于同一庫下且不做分表即可
文本存儲(chǔ)(評(píng)論的內(nèi)容)使用了mongodb、hbase
選擇nosql而非mysql
減輕了mysql存儲(chǔ)壓力,釋放msyql,龐大的存儲(chǔ)也有了可靠的保障
nosql的高性能讀寫大大提升了系統(tǒng)的吞吐量并降低了延遲
轉(zhuǎn)自:http://www.cnblogs.com/bluebluesky/articles/6413831.html
作者:bluebluesky
也可參考:https://blog.csdn.net/kingcat666/article/details/78324678
里面會(huì)有詳細(xì)的說明??!我就不轉(zhuǎn)載了?。?/p>
數(shù)據(jù)分片一般都是使用Key或Key的哈希值來計(jì)算Key的分布,常見的幾種數(shù)據(jù)分片的方法如下:
通過上面的對(duì)比,在這個(gè)系統(tǒng)選擇一致性哈希的方法來進(jìn)行數(shù)據(jù)分片。
為了讓系統(tǒng)有更好的擴(kuò)展性,這里提出存儲(chǔ)層VServer(虛擬服務(wù)器)的概念,一個(gè)VServer是一個(gè)邏輯上的存儲(chǔ)服務(wù)器,是分布式存儲(chǔ)系統(tǒng)的一個(gè)存儲(chǔ)單元,一臺(tái)物理設(shè)備上可以部署多個(gè)VServer,一個(gè)VServer支持一個(gè)寫進(jìn)程和多個(gè)讀進(jìn)程。
通過VServer的方式,會(huì)有下面一些好處:
數(shù)據(jù)分片是在接口層實(shí)現(xiàn)的,目的是把數(shù)據(jù)均勻地劃分到不同的VServer上。有了接口層的存在,邏輯層尋址就輕量了很多,尋址存儲(chǔ)層VServer的工作全部由接口層負(fù)責(zé),邏輯層只需要隨機(jī)選一個(gè)接口層機(jī)器訪問即可。
接口層使用了一致性哈希的割環(huán)算法來實(shí)現(xiàn)數(shù)據(jù)分片,在割環(huán)算法中,為了讓數(shù)據(jù)均勻分布到各個(gè)VServer,每個(gè)VServer需要有多個(gè)VNode(虛擬節(jié)點(diǎn))。一個(gè)Key尋址的過程如下圖所示,首先根據(jù)Hash(Key)在哈希環(huán)上找到對(duì)應(yīng)的VNode,在根據(jù)VNode和VServer的映射表確定所屬的VServer。
由上述查找過程可知,需要事先離線計(jì)算出VNode在哈希環(huán)上的分布、VServer和VNode映射關(guān)系。為了是計(jì)算結(jié)果具有通用性,即在擁有任何數(shù)量VServer的一個(gè)系統(tǒng)都可以使用該結(jié)果得到一致性哈希的映射表,這就要求結(jié)果是與機(jī)器無關(guān)的,比如不能使用IP來計(jì)算VNode的哈希值。在計(jì)算前需要確定每個(gè)VServer包含的VNode數(shù)量,以及一個(gè)系統(tǒng)所支持的最大VServer數(shù)量。一個(gè)簡單的方法是類似上文鏈接中提到的方法,但不能和IP相關(guān),可以改用VServer和VNode的編號(hào)來計(jì)算哈希值,如Hash("1#1"),Hash("1#2")… 這種方法要求一個(gè)VServer包含的VNode的數(shù)量比較多,大概需要500個(gè)才能使各個(gè)VServer上的數(shù)據(jù)比較均勻。當(dāng)然還有其他的一些方法做到一個(gè)VServer上包含更少的VNode數(shù)量,并且讓數(shù)據(jù)分布偏差在一定范圍內(nèi)。
Google提出了一種新的一致性哈希算法Jump Consistent Hash,此算法零內(nèi)存消耗,均勻分配,快速,并且只有5行代碼,優(yōu)勢非常明顯,詳細(xì)介紹見此處http://my.oschina.net/u/658658/blog/424161。和上面介紹的方法相比,一個(gè)最大的不同點(diǎn)是,在擴(kuò)容重新分布數(shù)據(jù)時(shí),在上面的方法中,新機(jī)器的一個(gè)VNode上的數(shù)據(jù)只會(huì)來自一個(gè)老機(jī)器上的VNode,而這種方法是會(huì)來自所有老機(jī)器上的VNode。這個(gè)問題可能會(huì)導(dǎo)致一些設(shè)計(jì)上復(fù)雜化,所以使用的時(shí)候要慎重考慮。
轉(zhuǎn):http://www.cnblogs.com/Leo_wl/p/5654789.html
數(shù)據(jù)的切分(Sharding)根據(jù)其切分規(guī)則的類型,可以分為兩種切分模式。
(1)一種是按照不同的表(或者Schema)來切分到不同的數(shù)據(jù)庫(主機(jī))之上,這種切分可以稱之為數(shù)據(jù)的垂直(縱向)切分
(2)另外一種則是根據(jù)表中的數(shù)據(jù)的邏輯關(guān)系,將同一個(gè)表中的數(shù)據(jù)按照某種條件拆分到多臺(tái)數(shù)據(jù)庫(主機(jī))上面,這種切分稱之為數(shù)據(jù)的水平(橫向)切分。
邏輯庫(schema) :
通常對(duì)實(shí)際應(yīng)用來說,并不需要知道中間件的存在,業(yè)務(wù)開發(fā)人員只需要知道數(shù)據(jù)庫的概念,所以數(shù)據(jù)庫中間件可以被看做是一個(gè)或多個(gè)數(shù)據(jù)庫集群構(gòu)成的邏輯庫。
邏輯表(table):
既然有邏輯庫,那么就會(huì)有邏輯表,分布式數(shù)據(jù)庫中,對(duì)應(yīng)用來說,讀寫數(shù)據(jù)的表就是邏輯表。邏輯表,可以是數(shù)據(jù)切分后,分布在一個(gè)或多個(gè)分片庫中,也可以不做數(shù)據(jù)切分,不分片,只有一個(gè)表構(gòu)成。
分片表:
是指那些原有的很大數(shù)據(jù)的表,需要切分到多個(gè)數(shù)據(jù)庫的表,這樣,每個(gè)分片都有一部分?jǐn)?shù)據(jù),所有分片構(gòu)成了完整的數(shù)據(jù)。 總而言之就是需要進(jìn)行分片的表。
非分片表:
一個(gè)數(shù)據(jù)庫中并不是所有的表都很大,某些表是可以不用進(jìn)行切分的,非分片是相對(duì)分片表來說的,就是那些不需要進(jìn)行數(shù)據(jù)切分的表。
分片節(jié)點(diǎn)(dataNode)
數(shù)據(jù)切分后,一個(gè)大表被分到不同的分片數(shù)據(jù)庫上面,每個(gè)表分片所在的數(shù)據(jù)庫就是分片節(jié)點(diǎn)(dataNode)。
節(jié)點(diǎn)主機(jī)(dataHost)
數(shù)據(jù)切分后,每個(gè)分片節(jié)點(diǎn)(dataNode)不一定都會(huì)獨(dú)占一臺(tái)機(jī)器,同一機(jī)器上面可以有多個(gè)分片數(shù)據(jù)庫,這樣一個(gè)或多個(gè)分片節(jié)點(diǎn)(dataNode)所在的機(jī)器就是節(jié)點(diǎn)主機(jī)(dataHost),為了規(guī)避單節(jié)點(diǎn)主機(jī)并發(fā)數(shù)限制,盡量將讀寫壓力高的分片節(jié)點(diǎn)(dataNode)均衡的放在不同的節(jié)點(diǎn)主機(jī)(dataHost)。
分片規(guī)則(rule)
前面講了數(shù)據(jù)切分,一個(gè)大表被分成若干個(gè)分片表,就需要一定的規(guī)則,這樣按照某種業(yè)務(wù)規(guī)則把數(shù)據(jù)分到某個(gè)分片的規(guī)則就是分片規(guī)則,數(shù)據(jù)切分選擇合適的分片規(guī)則非常重要,將極大的避免后續(xù)數(shù)據(jù)處理的難度。
聯(lián)系客服