<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        數據庫水平切分的實現原理解析

        來源:懂視網 責編:小采 時間:2020-11-09 08:24:32
        文檔

        數據庫水平切分的實現原理解析

        數據庫水平切分的實現原理解析:第1章 引言 隨著互聯網應用的廣泛普及,海量數據的存儲和訪問成為了系統設計的瓶頸問題。對于一個大型的 互聯網應用,每天幾十億的PV無疑對數據庫造成了相當高的負載。對于系統的穩定性和擴展性造成了極大的問題。通過數據切分來提高網站性能,橫向擴展數據
        推薦度:
        導讀數據庫水平切分的實現原理解析:第1章 引言 隨著互聯網應用的廣泛普及,海量數據的存儲和訪問成為了系統設計的瓶頸問題。對于一個大型的 互聯網應用,每天幾十億的PV無疑對數據庫造成了相當高的負載。對于系統的穩定性和擴展性造成了極大的問題。通過數據切分來提高網站性能,橫向擴展數據

        第1章 引言 隨著互聯網應用的廣泛普及,海量數據的存儲和訪問成為了系統設計的瓶頸問題。對于一個大型的 互聯網應用,每天幾十億的PV無疑對數據庫造成了相當高的負載。對于系統的穩定性和擴展性造成了極大的問題。通過數據切分來提高網站性能,橫向擴展數據

        第1章 引言

        隨著互聯網應用的廣泛普及,海量數據的存儲和訪問成為了系統設計的瓶頸問題。對于一個大型的 互聯網應用,每天幾十億的PV無疑對數據庫造成了相當高的負載。對于系統的穩定性和擴展性造成了極大的問題。通過數據切分來提高網站性能,橫向擴展數據層 已經成為架構研發人員首選的方式。水平切分數據庫,可以降低單臺機器的負載,同時最大限度的降低了了宕機造成的損失。通過負載均衡策略,有效的降低了單臺 機器的訪問負載,降低了宕機的可能性;通過集群方案,解決了數據庫宕機帶來的單點數據庫不能訪問的問題;通過讀寫分離策略更是最大限度了提高了應用中讀取 (Read)數據的速度和并發量。目前國內的大型互聯網應用中,大量的采用了這樣的數據切分方案,Taobao,Alibaba,Tencent,它們大 都實現了自己的分布式數據訪問層(DDAL)。以實現方式和實現的層次來劃分,大概分為兩個層次(Java應用為例):JDBC層的封裝,ORM框架層的 實現。就JDBC層的直接封裝而言,現在國內發展較好的一個項目是被稱作“變形蟲”(Amoeba)的項目,由阿里集團的研究院開發,現在仍然處于測試階 段(beta版),其運行效率和生產時效性有待考究。就ORM框架層的實現而言,比如Taobao的基于ibatis和Spring的的分布式數據訪問 層,已有多年的應用,運行效率和生產實效性得到了開發人員和用戶的肯定。本文就是以ORM框架層為基礎而實現的分布式數據訪問層。本課題的難點在于分庫 后,路由規則的制定和選擇以及后期的擴展性,比如:如何做到用最少的數據遷移量,達到擴充數據庫容量(增加機器節點)的目的。核心問題將圍繞數據庫分庫分 表的路由規則和負載均衡策略展開。

        第2章 基本原理和概念

        2.1基本原理:

        人類認知問題的過程總是這樣的:what(什么)-?why(為什么)-?how(怎么

        做),接下來,本文將就這三個問題展開討論和研究:

        2.1.1什么是數據切分

        "Shard" 這個詞英文的意思是"碎片",而作為數據庫相關的技術用語,似乎最早見于大型多人在線角色扮演游戲中。"Sharding" 姑且稱之為"分片"。Sharding 不是一門新技術,而是一個相對簡樸的軟件理念。眾所周知,MySQL 5 之后才有了數據表分區功能,那么在此之前,很多 MySQL 的潛在用戶都對 MySQL 的擴展性有所顧慮,而是否具備分區功能就成了衡量一個數據庫可擴展性與否的一個關鍵指標(當然不是唯一指標)。數據庫擴展性是一個永恒的話題,MySQL 的推廣者經常會被問到:如在單一數據庫上處理應用數據捉襟見肘而需要進行分區化之類的處理,是如何辦到的呢? 答案是:Sharding。 Sharding 不是一個某個特定數據庫軟件附屬的功能,而是在具體技術細節之上的抽象處理,是水平擴展(Scale Out,亦或橫向擴展、向外擴展)的解決方案,其主要目的是為突破單節點數據庫服務器的 I/O 能力限制,解決數據庫擴展性問題。

        通過一系列的切分規則將數據水平分布到不同的DB或table中,在通過相應的DB路由 或者 table路由規則找到需要查詢的具體的DB或者table,以進行Query操作。這里所說的“sharding”通常是指“水平切分”, 這也是本文討 論的重點。具體將有什么樣的切分方式呢和路由方式呢?行文至此,讀者難免有所疑問,接下來舉個簡單的例子:我們針對一個Blog應用中的日志來說明, 比如日志文章(article)表有如下字段:

        面對這樣的一個表,我們怎樣切分呢?怎樣將這樣的數據分布到不同的數據庫中的表中去呢?其實 分析blog的應用,我們不難得出這樣的結論:blog的應用中,用戶分為兩種:瀏覽者和blog的主人。瀏覽者瀏覽某個blog,實際上是在一個特定的 用戶的blog下進行瀏覽的,而blog的主人管理自己的blog,也同樣是在特定的用戶blog下進行操作的(在自己的空間下)。所謂的特定的用戶,用 數據庫的字段表示就是“user_id”。就是這個“user_id”,它就是我們需要的分庫的依據和規則的基礎。我們可以這樣做,將user_id為 1~10000的所有的文章信息放入DB1中的article表中,將user_id為10001~20000的所有文章信息放入DB2中的 article表中,以此類推,一直到DBn。 這樣一來,文章數據就很自然的被分到了各個數據庫中,達到了數據切分的目的。接下來要解決的問題就是怎樣找 到具體的數據庫呢?其實問題也是簡單明顯的,既然分庫的時候我們用到了區分字段user_id,那么很自然,數據庫路由的過程當然還是少不了 user_id的。考慮一下我們剛才呈現的blog應用,不管是訪問別人的blog還是管理自己的blog,總之我都要知道這個blog的用戶是誰吧,也 就是我們知道了這個blog的user_id,就利用這個user_id,利用分庫時候的規則,反過來定位具體的數據庫,比如user_id是234,利 用該才的規則,就應該定位到DB1,假如user_id是12343,利用該才的規則,就應該定位到DB2。以此類推,利用分庫的規則,反向的路由到具體 的DB,這個過程我們稱之為“DB路由”。

        當然考慮到數據切分的DB設計必然是非常規,不正統的DB設計。那么什么樣的DB設計是正統的DB設計呢?

        我們平常規規矩矩用的基本都是。平常我們會自覺的按照范式來設計我們的數據庫,負載高點可能 考慮使用相關的Replication機制來提高讀寫的吞吐和性能,這可能已經可以滿足很多需求,但這套機制自身的缺陷還是比較顯而易見的(下文會提 及)。上面提到的“自覺的按照范式設計”。考慮到數據切分的DB設計,將違背這個通常的規矩和約束,為了切分,我們不得不在數據庫的表中出現冗余字段,用 作區分字段或者叫做分庫的標記字段,比如上面的article的例子中的user_id這樣的字段(當然,剛才的例子并沒有很好的體現出user_id的 冗余性,因為user_id這個字段即使就是不分庫,也是要出現的,算是我們撿了便宜吧)。當然冗余字段的出現并不只是在分庫的場景下才出現的,在很多大 型應用中,冗余也是必須的,這個涉及到高效DB的設計,本文不再贅述。

        2.1.2為什么要數據切分

        上面對什么是數據切分做了個概要的描述和解釋,讀者可能會疑問,為什么需要數據切分呢?像 Oracle這樣成熟穩定的數據庫,足以支撐海量數據的存儲與查詢了?為什么還需要數據切片呢?的確,Oracle的DB確實很成熟很穩定,但是高昂的使 用費用和高端的硬件支撐不是每一個公司能支付的起的。試想一下一年幾千萬的使用費用和動輒上千萬元的小型機作為硬件支撐,這是一般公司能支付的起的嗎?即 使就是能支付的起,假如有更好的方案,有更廉價且水平擴展性能更好的方案,我們為什么不選擇呢?

        但是,事情總是不盡人意。平常我們會自覺的按照范式來設計我們的數據庫,負載高點可能考慮使 用相關的Replication機制來提高讀寫的吞吐和性能,這可能已經可以滿足很多需求,但這套機制自身的缺陷還是比較顯而易見的。首先它的有效很依賴 于讀操作的比例,Master往往會成為瓶頸所在,寫操作需要順序排隊來執行,過載的話Master首先扛不住,Slaves的數據同步的延遲也可能比較 大,而且會大大耗費CPU的計算能力,因為write操作在Master上執行以后還是需要在每臺slave機器上都跑一次。這時候 Sharding可能會成為雞肋了。 Replication搞不定,那么為什么Sharding可以工作呢?道理很簡單,因為它可以很好的擴展。我們知道每臺機器無論配置多么好它都有自身的 物理上限,所以當我們應用已經能觸及或遠遠超出單臺機器的某個上限的時候,我們惟有尋找別的機器的幫助或者繼續升級的我們的硬件,但常見的方案還是橫向擴 展, 通過添加更多的機器來共同承擔壓力。我們還得考慮當我們的業務邏輯不斷增長,我們的機器能不能通過線性增長就能滿足需求?Sharding可以輕松的將計 算,存儲,I/O并行分發到多臺機器上,這樣可以充分利用多臺機器各種處理能力,同時可以避免單點失敗,提供系統的可用性,進行很好的錯誤隔離。

        綜合以上因素,數據切分是很有必要的,且我們在此討論的數據切分也是將MySql作為背景 的。基于成本的考慮,很多公司也選擇了Free且Open的MySql。對MySql有所了解的開發人員可能會知道,MySQL 5 之后才有了數據表分區功能,那么在此之前,很多 MySQL 的潛在用戶都對 MySQL 的擴展性有所顧慮,而是否具備分區功能就成了衡量一個數據庫可擴展性與否的一個關鍵指標(當然不是唯一指標)。數據庫擴展性是一個永恒的話題,MySQL 的推廣者經常會被問到:如在單一數據庫上處理應用數據捉襟見肘而需要進行分區化之類的處理,是如何辦到的呢? 答案也是Sharding,也就是我們所說的數據切分方案。

        我們用免費的MySQL和廉價的Server甚至是PC做集群,達到小型機+大型商業DB的效果,減少大量的資金投入,降低運營成本,何樂而不為呢?所以,我們選擇Sharding,擁抱Sharding。

        2.1.3怎么做到數據切分

        說到數據切分,再次我們講對數據切分的方法和形式進行比較詳細的闡述和說明。

        數據切分可以是物理 上的,對數據通過一系列的切分規則將數據分布到不同的DB服務器上,通過路由規則路由訪問特定的數據庫,這樣一來每次訪問面對的就不是單臺服務器了,而是N臺服務器,這樣就可以降低單臺機器的負載壓力。

        數 據切分也可以是數據庫內的 ,對數據通過一系列的切分規則,將數據分布到一個數據庫的不同表 中,比如將article分為article_001,article_002等子表,若干個子表水平拼合有組成了邏輯上一個完整的article表,這 樣做的目的其實也是很簡單的。 舉個例子說明,比如article表中現在有5000w條數據,此時我們需要在這個表中增加(insert)一條新的數 據,insert完畢后,數據庫會針對這張表重新建立索引,5000w行數據建立索引的系統開銷還是不容忽視的。但是反過來,假如我們將這個表分成100 個table呢,從article_001一直到article_100,5000w行數據平均下來,每個子表里邊就只有50萬行數據,這時候我們向一張 只有50w行數據的table中insert數據后建立索引的時間就會呈數量級的下降,極大了提高了DB的運行時效率,提高了DB的并發量。當然分表的好 處還不知這些,還有諸如寫操作的鎖操作等,都會帶來很多顯然的好處。

        綜上,分庫降低了單點機器的負載;分表,提高了數據操作的效率,尤其是Write操作的效率。 行文至此我們依然沒有涉及到如何切分的問題。接下來,我們將對切分規則進行詳盡的闡述和說明。

        上文中提到,要想做到數據的水平切分,在每一個表中都要有相冗余字符 作為切分依據和標記字段,通常的應用中我們選用user_id作為區分字段,基于此就有如下三種分庫的方式和規則: (當然還可以有其他的方式)

        按號段分:

        (1) user_id為區分,1~1000的對應DB1,1001~2000的對應DB2,以此類推;

        優點:可部分遷移

        缺點:數據分布不均

        (2)hash取模分:

        對user_id進行hash(或者如果user_id是數值型的話直接使用user_id 的值也可),然后用一個特定的數字,比如應用中需要將一個數據庫切分成4個數據庫的話,我們就用4這個數字對user_id的hash值進行取模運算,也 就是user_id%4,這樣的話每次運算就有四種可能:結果為1的時候對應DB1;結果為2的時候對應DB2;結果為3的時候對應DB3;結果為0的時 候對應DB4,這樣一來就非常均勻的將數據分配到4個DB中。

        優點:數據分布均勻

        缺點:數據遷移的時候麻煩,不能按照機器性能分攤數據

        (3)在認證庫中保存數據庫配置

        就是建立一個DB,這個DB單獨保存user_id到DB的映射關系,每次訪問數據庫的時候都要先查詢一次這個數據庫,以得到具體的DB信息,然后才能進行我們需要的查詢操作。

        優點:靈活性強,一對一關系

        缺點:每次查詢之前都要多一次查詢,性能大打折扣

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        數據庫水平切分的實現原理解析

        數據庫水平切分的實現原理解析:第1章 引言 隨著互聯網應用的廣泛普及,海量數據的存儲和訪問成為了系統設計的瓶頸問題。對于一個大型的 互聯網應用,每天幾十億的PV無疑對數據庫造成了相當高的負載。對于系統的穩定性和擴展性造成了極大的問題。通過數據切分來提高網站性能,橫向擴展數據
        推薦度:
        標簽: 原理 實現 數據庫
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: fc2免费人成在线视频| 亚洲国产理论片在线播放| 国产高清视频在线免费观看| 免费萌白酱国产一区二区三区| 日韩免费在线视频| 欧美在线看片A免费观看| 免费国产a国产片高清| 久久精品视频亚洲| 亚洲av片不卡无码久久| 国产免费人成视频尤勿视频| 日韩国产免费一区二区三区| 亚洲另类少妇17p| 久久亚洲精品成人777大小说| 狠狠综合亚洲综合亚洲色| 无码人妻一区二区三区免费n鬼沢| 国产高清在线免费视频| 国产精品亚洲а∨无码播放不卡| 国产精品99久久免费观看| 亚洲国产女人aaa毛片在线 | 国产成人免费午夜在线观看| 四只虎免费永久观看| 亚洲w码欧洲s码免费| 成人a视频片在线观看免费| 亚洲色图视频在线观看| sihu国产精品永久免费| 国产成A人亚洲精V品无码| 羞羞视频在线观看免费| 成人毛片视频免费网站观看| 亚洲欧洲日产韩国在线| 国产一区二区免费| 亚洲色一色噜一噜噜噜| 亚洲第一男人天堂| 99视频有精品视频免费观看| 国产L精品国产亚洲区久久| 久久午夜夜伦鲁鲁片免费无码| 国产日本亚洲一区二区三区| 999国内精品永久免费观看| 久久精品a亚洲国产v高清不卡| 久草视频在线免费看| 天堂亚洲国产中文在线| 久久亚洲高清综合|