• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            xiaoguozi's Blog
            Pay it forword - 我并不覺的自豪,我所嘗試的事情都失敗了······習慣原本生活的人不容易改變,就算現(xiàn)狀很糟,他們也很難改變,在過程中,他們還是放棄了······他們一放棄,大家就都是輸家······讓愛傳出去,很困難,也無法預料,人們需要更細心的觀察別人,要隨時注意才能保護別人,因為他們未必知道自己要什么·····
            本文圖片來自 Ricky Ho 的博文 MongoDB 構架MongoDB Architecture),這是個一聽就感覺很寬泛的話題,但是作者在文章中確實對 MongoDB 由內(nèi)至外的架構進行了剖析。本文截取了其文章中的幾張重點架構示意圖片進行簡單描述。希望對大家有用。
            MongoDB 數(shù)據(jù)文件內(nèi)部結構

            1. MongoDB 在數(shù)據(jù)存儲上按命名空間來劃分,一個 collection 是一個命名空間,一個索引也是一個命名空間
            2. 同一個命名空間的數(shù)據(jù)被分成很多個 Extent,Extent 之間使用雙向鏈表連接
            3. 在每一個 Extent 中,保存了具體每一行的數(shù)據(jù),這些數(shù)據(jù)也是通過雙向鏈接連接的
            4. 每一行數(shù)據(jù)存儲空間不僅包括數(shù)據(jù)占用空間,還可能包含一部分附加空間,這使得在數(shù)據(jù) update 變大后可以不移動位置
            5. 索引以 BTree 結構實現(xiàn)
              在 MongoDB 中實現(xiàn)事務

            眾所周知,MongoDB 只支持對單行記錄的原子性修改,并不支持對多行數(shù)據(jù)的原子操作。但是通過上圖中的變態(tài)操作,實際你也可以自己實現(xiàn)事務。其步驟如圖所未:
            • 第 1 步:先記錄一條事務記錄,將要修改的多行記錄的修改值寫到里面,并設置其狀態(tài)為 init(如果這時候操作中斷,那么在重新啟動時,會判斷到他處于 init 狀態(tài),從而將其保存的多行修改操作應用到具體的行上)
            • 第 2 步:然后更新具體要修改的行,將剛才寫的事務記錄的標識寫到它的 tran 字段中
            • 第 3 步:將事務記錄的狀態(tài)從 init 變成 pending(如果在這時候操作中斷,那么在重新啟動時,會判斷到它的狀態(tài)是 pending 的,這時候查看其所有對應的多條要修改的記錄,如果其 tran 有值,那么就進行第 4 步,如果沒值,說明第 4 步已經(jīng)執(zhí)行過了,直接將其狀態(tài)從 pending 變成 commited 了就行)
            • 第 4 步:將需要修改的多條記錄的相應值修改了,并且 unset 掉之前的 tran 字段
            • 第 5 步:將事務記錄那一條的狀態(tài)從 pending 變成 commited,事務完成

                    其實上面的步驟并不罕見,在支持事務的 DBMS 中,其事務原子性提交的保證大多都與上面類似。其實事務記錄的 tran 那條記錄,就類似于這些 DBMS 中的 redolog 一樣。

              MongoDB 數(shù)據(jù)同步

            上圖是 MongoDB 采用 Replica Sets 模式的同步流程
            • 紅色箭頭表示寫操作寫到 Primary 上,然后異步同步到多個 Secondary 上
            • 藍色箭頭表示讀操作可以從 Primary 或 Secondary 任意一個上讀
            • 各個 Primary 與 Secondary 之間一直保持心跳同步檢測,用于判斷 Replica Sets 的狀態(tài)

                    分片機制


            • MongoDB 的分片是指定一個分片 key 來進行,數(shù)據(jù)按范圍分成不同的 chunk,每個 chunk 的大小有限制
            • 有多個分片節(jié)點保存這些 chunk,每個節(jié)點保存一部分的 chunk
            • 每一個分片節(jié)點都是一個 Replica Sets,這樣保證數(shù)據(jù)的安全性
            • 當一個 chunk 超過其限制的最大體積時,會分裂成兩個小的 chunk
            • 當 chunk 在分片節(jié)點中分布不均衡時,會引發(fā) chunk 遷移操作

                    服務器角色

             

             上面講了分片的標準,下面是具體在分片時的幾種節(jié)點角色
            • 客戶端訪問路由節(jié)點 mongos 來進行數(shù)據(jù)讀寫
            • config 服務器保存了兩個映射關系,一個是 key 值的區(qū)間對應哪一個 chunk 的映射關系,另一個是 chunk 存在哪一個分片節(jié)點的映射關系
            • 路由節(jié)點通過 config 服務器獲取數(shù)據(jù)信息,通過這些信息,找到真正存放數(shù)據(jù)的分片節(jié)點進行對應操作
            • 路由節(jié)點還會在寫操作時判斷當前 chunk 是否超出限定大小,如果超出,就分列成兩個 chunk
            • 對于按分片 key 進行的查詢和 update 操作來說,路由節(jié)點會查到具體的 chunk 然后再進行相關的工作
            • 對于不按分片 key 進行的查詢和 update 操作來說,mongos 會對所有下屬節(jié)點發(fā)送請求然后再對返回結果進行合并

                    更多詳細內(nèi)容請看原文:MongoDB Architecture

             

            posted on 2012-12-19 11:52 小果子 閱讀(422) 評論(0)  編輯 收藏 引用 所屬分類: 學習筆記SQL開源
            潮喷大喷水系列无码久久精品| 亚洲精品tv久久久久久久久久| 久久久久亚洲AV片无码下载蜜桃| 国产人久久人人人人爽| 久久香蕉一级毛片| 久久精品国产久精国产果冻传媒 | 精品久久人人爽天天玩人人妻| 久久AAAA片一区二区| 久久精品国产亚洲AV忘忧草18| 九九久久99综合一区二区| 精品久久久久中文字幕一区| 久久久久亚洲av无码专区喷水| 精品国产91久久久久久久a| 久久亚洲精品成人AV| 伊人久久大香线蕉综合热线| 青草影院天堂男人久久| 久久99久国产麻精品66| 国产巨作麻豆欧美亚洲综合久久| 久久久久亚洲av综合波多野结衣 | 久久精品国产免费观看三人同眠| 精品免费tv久久久久久久| 久久综合九色综合网站| 亚洲国产成人精品女人久久久 | 久久一区二区免费播放| 97久久超碰成人精品网站| 免费久久人人爽人人爽av| AA级片免费看视频久久| 精品国际久久久久999波多野| 7777精品伊人久久久大香线蕉| 久久久久成人精品无码 | 国产午夜免费高清久久影院 | 中文字幕无码久久精品青草| 伊人久久大香线焦综合四虎| 狠狠久久亚洲欧美专区| 国产成人无码久久久精品一 | 久久精品免费网站网| 久久国产一区二区| 91精品国产91久久久久久蜜臀| 久久se精品一区二区| 狠狠色丁香久久综合五月| 国产精品久久久久久久久免费|