<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 介紹 replicattion set 多臺服務器維護相同的數據副本,提高服務器的可用性,總結下來有以下好處: >1. 數據備份與恢復 2. 讀寫分離 ### MongoDB 復制集的結構以及基本概念 ![此處輸入圖片的描述][1] 正如上圖所示,MongoDB 復制集的架構中,主要分為兩部分:主節點(Primary)和從節點(Secondary)。 **主節點**:在一個復制集中只有并且必須有一個主節點,主節點也是眾多實例中**唯一可以接收客戶端寫操作**的節點,當然也可以進行讀操作; **從節點**:從節點會復制主節點的操作,以獲取完全一致的數據集。客戶端不能夠直接對從節點進行寫操作,但是可以進行讀操作,這個需要通過復制集選項進行設置。 **投票節點**:投票節點 并不含有 復制集中的數據集副本,且也 無法 升職為主節點。投票節點的存在是為了使復制集中的節點數量為奇數,這樣保證在進行投票的時候不會出現票數相同的情況。如果添加了一個節點后,總節點數為偶數,那么就需要相應的增加一個投票節點。 > 注:MongoDB 3.0 把復制集中的成員數量從原來的12個提升到了50個,但是投票節點的數量仍然保持不變,還是7個。 ### 最基本的復制集架構 ![此處輸入圖片的描述][2] **一個主節點,兩個從節點,自動化故障切換的特性** 最基本的復制集架構是有3個節點的形式。這樣在主節點不可用以后,從節點會進行投票選出一個節點成為主節點,繼續工作。如下圖所示: ![此處輸入圖片的描述][3] #### **重新投票選出主節點** 三個節點的復制集架構,還有另外一種形式:一個主節點,一個從節點,一個投票節點。如下圖所示: ![此處輸入圖片的描述][4] **一個主節點,一個從節點,一個投票節點** 在這種架構中,當主節點不可用時,只有從節點可以升為主節點,而投票節點是不可以成為主節點的。投票節點僅僅在選舉中進行投票。如下圖所示: ![此處輸入圖片的描述][5] ### **從節點無法升職為主節點的情況** **其他概念** 從節點還有集中特殊的設置情況,不同的設置有不同的需求: **優先級為0**:設置 priority:0 ,那么該結點將不能成為主節點,但是其數據仍是與主節點保持一致的,而且應用程序也可以進行讀操作。這樣可以在某些特殊的情況下,保證其他特定節點優先成為主節點。 ![此處輸入圖片的描述][6] **隱藏節點**:隱藏節點與主節點的數據集一致,但是對于應用程序來說是不可見的。隱藏節點可以很好的與 復制集 中的其他節點隔離,并應對特殊的需求,比如進行報表或者數據備份。隱藏節點也應該是一個**不能升職為主節點的優先級為0**的節點。 ![此處輸入圖片的描述][7] **延時節點**:延時節點也將從 復制集 中主節點復制數據,然而延時節點中的數據集將會比復制集中主節點的數據延后。舉個例子,現在是09:52,如果延時節點延后了1小時,那么延時節點的數據集中將不會有08:52之后的操作。 由于延時節點的數據集是延時的,因此它可以幫助我們在人為誤操作或是其他意外情況下恢復數據。舉個例子,當應用升級失敗,或是誤操作刪除了表和數據庫時,我們可以通過延時節點進行數據恢復。 **oplog**:全拼 oprations log,它保存有數據庫的所有的操作的記錄。在復制集中,主節點產生 oplog,然后從節點復制主節點的 oplog 進行相應的操作,這樣達到保持數據集一致的要求。因此從節點的數據與主節點的數據相比是有延遲的。 ## 配置 ``` # 創建數據存儲目錄 mkdir -p /data/r0 /data/r1 /data/r2 # 創建日志文件 touch /var/log/mongo17.log /var/log/mongo18.log /var/log/mongo19.log #啟動3個實例,且聲明實例屬于某復制集 rsa ./bin/mongod --port 27017 --dbpath /data/r0 --smallfiles --replSet rsa --fork --logpath /var/log/mongo17.log ./bin/mongod --port 27018 --dbpath /data/r1 --smallfiles --replSet rsa --fork --logpath /var/log/mongo18.log ./bin/mongod --port 27019 --dbpath /data/r2 --smallfiles --replSet rsa --fork --logpath /var/log/mongo19.log # 進入27017進行配置初始化 ./bin/mongo --port 27017 rsconf = { _id:'rsa', members: [ {_id:0, host:'192.168.42.168:27017' } ] } rs.initiate(rsconf); # 如果以后需要再重載一下config的話,用rs.reconfig(rsconf); # 添加節點 rs.add('192.168.42.168:27018'); rs.add('192.168.42.168:27019'); # 查看狀態 rs.status(); # 刪除節點 rs.remove('192.168.1.201:27019'); # 主節點插入數據 >use test >db.user.insert({uid:1,name:'lily'}); #連接secondary查詢同步情況 ./bin/mongo --port 27019 >show dbs rsa:SECONDARY> show dbs; 2015-08-27T11:39:00.638+0800 E QUERY Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" } # 還可以通過isMaster()命令來查看信息; rsa:PRIMARY> db.isMaster(); { "setName" : "rsa", "setVersion" : 5, "ismaster" : true, "secondary" : false, "hosts" : [ "192.168.42.168:27018", "192.168.42.168:27019", "192.168.42.168:27017" ], "primary" : "192.168.42.168:27018", "me" : "192.168.42.168:27018", "electionId" : ObjectId("55dea0cffa0c638625a82486"), "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2015-08-27T05:49:13.740Z"), "maxWireVersion" : 3, "minWireVersion" : 0, "ok" : 1 } # 出現上述錯誤,是因為slave默認不許讀寫 >rs.slaveOk(); >show dbs; # 執行上面一個語句就可以看到和primary一致的數據,并且可以把讀和寫分離開來; ``` 以上便是一個最簡單的復制集架構,其中如果27017的主節點崩潰,那27018的節點就由從節點變為主節點;注意,如果再添加原來的27017節點進來,那主節點還是27018; ### 自動化配置腳本 ``` #!/bin/bash IP='192.168.1.202' NA='rsb' if [ "$1" = "reset" ] then pkill -9 mongo rm -rf /home/m* exit fi if [ "$1" = "install" ] then mkdir -p /home/m0 /home/m1 /home/m2 /home/mlog /usr/local/mongodb/bin/mongod --dbpath /home/m0 --logpath /home/mlog/m17.log --logappend --port 27017 --fork --replSet ${NA} /usr/local/mongodb/bin/mongod --dbpath /home/m1 --logpath /home/mlog/m18.log --logappend --port 27018 --fork --replSet ${NA} /usr/local/mongodb/bin/mongod --dbpath /home/m2 --logpath /home/mlog/m19.log --logappend --port 27019 --fork --replSet ${NA} exit fi if [ "$1" = "repl" ] then /usr/local/mongodb/bin/mongo <<EOF use admin rsconf = { _id:'${NA}', members:[ {_id:0,host:'${IP}:27017'}, {_id:1,host:'${IP}:27018'}, {_id:2,host:'${IP}:27019'}, ] } rs.initiate(rsconf) EOF fi ``` > 問題是...在程序中,在主節點崩潰的情況下,如何無縫的轉移到新的主節點進行讀寫操作? [1]: http://docs.mongodb.org/manual/_images/replica-set-read-write-operations-primary.png [2]: http://docs.mongoing.com/manual-zh/_images/replica-set-primary-with-two-secondaries.png [3]: http://docs.mongoing.com/manual-zh/_images/replica-set-trigger-election.png [4]: http://docs.mongoing.com/manual-zh/_images/replica-set-primary-with-secondary-and-arbiter.png [5]: http://docs.mongoing.com/manual-zh/_images/replica-set-w-arbiter-trigger-election.png [6]: http://docs.mongoing.com/manual-zh/_images/replica-set-three-members-geographically-distributed.png [7]: http://docs.mongoing.com/manual-zh/_images/replica-set-hidden-member.png
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看