本篇內容介紹了“怎么使用分庫分表”的有關(guān)知識,在實(shí)際案例的操作過(guò)程中,不少人都會(huì )遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學(xué)有所成!
MySQL使用分庫分表
1 什么是分庫分表?
把原本存儲于一個(gè)庫的數據分塊存儲到多個(gè)庫上,把原本存儲于一個(gè)表的數據分塊存儲到多個(gè)表上。
2 為什么要分庫分表?
數據庫中的數據量不一定是可控的,在未進(jìn)行分庫分表的情況下,隨著(zhù)時(shí)間和業(yè)務(wù)的發(fā)展,庫中的表會(huì )越來(lái)越多,表中的數據量也會(huì )越來(lái)越大,相應地,數據操作,增刪改查的開(kāi)銷(xiāo)也會(huì )越來(lái)越大;另外,由于無(wú)法進(jìn)行分布式式部署,而一臺的資源(CPU、磁盤(pán)、內存、IO等)是有限的,最終數據庫所能承載的數據量、數據處理能力都將遭遇瓶頸。
3 分庫分表的實(shí)施策略。
分庫分表有垂直切分和水平切分兩種。
3.1 何謂垂直切分,即將表按照功能模塊、關(guān)系密切程度劃分出來(lái),部署到不同的庫上。例如,我們會(huì )建立定義數據庫workDB、商品數據庫payDB、用戶(hù)數據庫userDB、日志數據庫logDB等,分別用于存儲項目數據定義表、商品定義表、用戶(hù)數據表、日志數據表等。
3.2 何謂水平切分,當一個(gè)表中的數據量過(guò)大時(shí),我們可以把該表的數據按照某種規則,例如userID散列,進(jìn)行劃分,然后存儲到多個(gè)結構相同的表,和不同的庫上。例如,我們的userDB中的用戶(hù)數據表中,每一個(gè)表的數據量都很大,就可以把userDB切分為結構相同的多個(gè)userDB:part0DB、part1DB等,再將userDB上的用戶(hù)數據表userTable,切分為很多userTable:userTable0、userTable1等,然后將這些表按照一定的規則存儲到多個(gè)userDB上。
3.3 應該使用哪一種方式來(lái)實(shí)施數據庫分庫分表,這要看數據庫中數據量的瓶頸所在,并綜合項目的業(yè)務(wù)類(lèi)型進(jìn)行考慮。
如果數據庫是因為表太多而造成海量數據,并且項目的各項業(yè)務(wù)邏輯劃分清晰、低耦合,那么規則簡(jiǎn)單明了、容易實(shí)施的垂直切分必是首選。
而如果數據庫中的表并不多,但單表的數據量很大、或數據熱度很高,這種情況之下就應該選擇水平切分,水平切分比垂直切分要復雜一些,它將原本邏輯上屬于一體的數據進(jìn)行了物理分割,除了在分割時(shí)要對分割的粒度做好評估,考慮數據平均和負載平均,后期也將對項目人員及應用程序產(chǎn)生額外的數據管理負擔。
在現實(shí)項目中,往往是這兩種情況兼而有之,這就需要做出權衡,甚至既需要垂直切分,又需要水平切分。我們的游戲項目便綜合使用了垂直與水平切分,我們首先對數據庫進(jìn)行垂直切分,然后,再針對一部分表,通常是用戶(hù)數據表,進(jìn)行水平切分。
4 分庫分表存在的問(wèn)題。
4.1 事務(wù)問(wèn)題。
在執行分庫分表之后,由于數據存儲到了不同的庫上,數據庫事務(wù)管理出現了困難。如果依賴(lài)數據庫本身的分布式事務(wù)管理功能去執行事務(wù),將付出高昂的性能代價(jià);如果由應用程序去協(xié)助控制,形成程序邏輯上的事務(wù),又會(huì )造成編程方面的負擔。
4.2 跨庫跨表的join問(wèn)題。
在執行了分庫分表之后,難以避免會(huì )將原本邏輯關(guān)聯(lián)性很強的數據劃分到不同的表、不同的庫上,這時(shí),表的關(guān)聯(lián)操作將受到限制,我們無(wú)法join位于不同分庫的表,也無(wú)法join分表粒度不同的表,結果原本一次查詢(xún)能夠完成的業(yè)務(wù),可能需要多次查詢(xún)才能完成。
4.3 額外的數據管理負擔和數據運算壓力。
額外的數據管理負擔,最顯而易見(jiàn)的就是數據的定位問(wèn)題和數據的增刪改查的重復執行問(wèn)題,這些都可以通過(guò)應用程序解決,但必然引起額外的邏輯運算,例如,對于一個(gè)記錄用戶(hù)成績(jì)的用戶(hù)數據表userTable,業(yè)務(wù)要求查出成績(jì)最好的100位,在進(jìn)行分表之前,只需一個(gè)order by語(yǔ)句就可以搞定,但是在進(jìn)行分表之后,將需要n個(gè)order by語(yǔ)句,分別查出每一個(gè)分表的前100名用戶(hù)數據,然后再對這些數據進(jìn)行合并計算,才能得出結果。
下面是分庫分表產(chǎn)生的問(wèn)題,及注意事項
分庫分表維度的問(wèn)題
假如用戶(hù)購買(mǎi)了商品,需要將交易記錄保存取來(lái),如果按照用戶(hù)的緯度分表,則每個(gè)用戶(hù)的交易記錄都保存在同一表中,所以很快很方便的查找到某用戶(hù)的購買(mǎi)情況,但是某商品被購買(mǎi)的情況則很有可能分布在多張表中,查找起來(lái)比較麻煩。反之,按照商品維度分表,可以很方便的查找到此商品的購買(mǎi)情況,但要查找到買(mǎi)人的交易記錄比較麻煩。
所以常見(jiàn)的解決方式有:
a.通過(guò)掃表的方式解決,此方法基本不可能,效率太低了。
b.記錄兩份數據,一份按照用戶(hù)緯度分表,一份按照商品維度分表。
c.通過(guò)搜索引擎解決,但如果實(shí)時(shí)性要求很高,又得關(guān)系到實(shí)時(shí)搜索。
聯(lián)合查詢(xún)的問(wèn)題
聯(lián)合查詢(xún)基本不可能,因為關(guān)聯(lián)的表有可能不在同一數據庫中。
避免跨庫事務(wù)
避免在一個(gè)事務(wù)中修改db0中的表的時(shí)候同時(shí)修改db1中的表,一個(gè)是操作起來(lái)更復雜,效率也會(huì )有一定影響。
盡量把同一組數據放到同一DB服務(wù)器上
例如將賣(mài)家a的商品和交易信息都放到db0中,當db1掛了的時(shí)候,賣(mài)家a相關(guān)的東西可以正常使用。也就是說(shuō)避免數據庫中的數據依賴(lài)另一數據庫中的數據。
一主多備
在實(shí)際的應用中,絕大部分情況都是讀遠大于寫(xiě)。Mysql提供了讀寫(xiě)分離的機制,所有的寫(xiě)操作都必須對應到Master,讀操作可以在Master和Slave機器上進(jìn)行,Slave與Master的結構完全一樣,一個(gè)Master可以有多個(gè)Slave,甚至Slave下還可以?huà)霺lave,通過(guò)此方式可以有效的提高DB集群的QPS.
所有的寫(xiě)操作都是先在Master上操作,然后同步更新到Slave上,所以從Master同步到Slave機器有一定的延遲,當系統很繁忙的時(shí)候,延遲問(wèn)題會(huì )更加嚴重,Slave機器數量的增加也會(huì )使這個(gè)問(wèn)題更加嚴重。
此外,可以看出Master是集群的瓶頸,當寫(xiě)操作過(guò)多,會(huì )嚴重影響到Master的穩定性,如果Master掛掉,整個(gè)集群都將不能正常工作。
所以,1. 當讀壓力很大的時(shí)候,可以考慮添加Slave機器的分式解決,但是當Slave機器達到一定的數量就得考慮分庫了。 2. 當寫(xiě)壓力很大的時(shí)候,就必須得進(jìn)行分庫操作。
MySQL使用為什么要分庫分表?
可以用說(shuō)用到MySQL的地方,只要數據量一大, 馬上就會(huì )遇到一個(gè)問(wèn)題,要分庫分表.
這里引用一個(gè)問(wèn)題為什么要分庫分表呢?MySQL處理不了大的表嗎?
其實(shí)是可以處理的大表的.我所經(jīng)歷的項目中單表物理上文件大小在80G多,單表記錄數在5億以上,而且這個(gè)表
屬于一個(gè)非常核用的表:朋友關(guān)系表.
但這種方式可以說(shuō)不是一個(gè)最佳方式. 因為面臨文件系統如Ext3文件系統對大于大文件處理上也有許多問(wèn)題.
這個(gè)層面可以用xfs文件系統進(jìn)行替換.但MySQL單表太大后有一個(gè)問(wèn)題是不好解決: 表結構調整相關(guān)的操作基
本不在可能.所以大項在使用中都會(huì )面監著(zhù)分庫分表的應用.
從Innodb本身來(lái)講數據文件的Btree上只有兩個(gè)鎖, 葉子節點(diǎn)鎖和子節點(diǎn)鎖,可以想而知道,當發(fā)生頁(yè)拆分或是添加
新葉時(shí)都會(huì )造成表里不能寫(xiě)入數據.
所以分庫分表還就是一個(gè)比較好的選擇了.
那么分庫分表多少合適呢?
經(jīng)測試在單表1000萬(wàn)條記錄一下,寫(xiě)入讀取性能是比較好的. 這樣在留點(diǎn)buffer,那么單表全是數據字型的保持在
800萬(wàn)條記錄以下, 有字符型的單表保持在500萬(wàn)以下.
如果按 100庫100表來(lái)規劃,如用戶(hù)業(yè)務(wù):
500萬(wàn)100100 = 50000000萬(wàn) = 5000億記錄.
心里有一個(gè)數了,按業(yè)務(wù)做規劃還是比較容易的.
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站