<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] ### 概述 在 MongoDB 中,有兩種數據冗余方式,一種 是 Master-Slave 模式(主從復制),一種是 Replica Sets 模式(副本集)。 ``` Mongodb一共有三種集群搭建的方式: Replica Set(副本集)、 Sharding(切片) Master-Slaver(主從)【目前已不推薦使用了!!!】 其中,Sharding集群也是三種集群中最復雜的。 副本集比起主從可以實現故障轉移!!非常實用! MongoDB目前已不推薦使用主從模式,取而代之的是副本集模式。副本集其實一種互為主從的關系,可理解為主主。 副本集指將數據復制,多份保存,不同服務器保存同一份數據,在出現故障時自動切換。對應的是數據冗余、備份、鏡像、讀寫分離、高可用性等關鍵詞; 而分片則指為處理大量數據,將數據分開存儲,不同服務器保存不同的數據,它們的數據總和即為整個數據集。追求的是高性能。 在生產環境中,通常是這兩種技術結合使用,分片+副本集。 ``` ### MongoDB主從 ***** #### 主從配置 主從復制是[MongoDB](http://lib.csdn.net/base/mongodb)最常用的復制方式,也是一個簡單的[數據庫](http://lib.csdn.net/base/mysql)同步備份的集群技術,這種方式很靈活.**可用于備份,故障恢復,讀擴展**等.? ` ` 最基本的設置方式就是建立一個主節點和一個或多個從節點,每個從節點要知道主節點的地址。采用雙機備份后主節點掛掉了后從節點可以接替主機繼續服務。所以這種模式**比單節點的高可用性要好很多**。 ?配置主從復制的注意點: ``` 1)在數據庫集群中要明確的知道誰是主服務器,主服務器只有一臺. 2)從服務器要知道自己的數據源也就是對應的主服務是誰. 3)--master用來確定主服務器,--slave 和 --source 來控制從服務器 ``` ` ` master-node.conf ``` port=27017 bind_ip = 182.48.115.238 dbpath=/usr/local/mongodb/data logpath=/usr/local/mongodb/log/mongo.log logappend=true journal = true fork = true master = true //確定自己是主服務器 ``` slave-node.conf ``` port=27017 dbpath=/usr/local/mongodb/data logpath=/usr/local/mongodb/log/mongo.log logappend=true journal = true fork = true bind_ip = 182.48.115.236 //確定主數據庫端口 source = 182.48.115.238:27017 //確定主數據庫端口 slave = true //確定自己是從服務器 ``` #### 主從復制的原理 ``` 在主從結構中,主節點的操作記錄成為oplog(operation log)。oplog存儲在一個系統數據庫local的集合oplog.$main中,這個集合的每個文檔都代表主節點上執行的一個操作。 從服務器會定期從主服務器中獲取oplog記錄,然后在本機上執行!對于存儲oplog的集合,MongoDB采用的是固定集合,也就是說隨著操作過多,新的操作會覆蓋舊的操作! 主從復制的其他設置項 --only 從節點指定復制某個數據庫,默認是復制全部數據庫 --slavedelay 從節點設置主數據庫同步數據的延遲(單位是秒) --fastsync 從節點以主數據庫的節點快照為節點啟動從數據庫 --autoresync 從節點如果不同步則從新同步數據庫(即選擇當通過熱添加了一臺從服務器之后,從服務器選擇是否更新主服務器之間的數據) --oplogSize 主節點設置oplog的大小(主節點操作記錄存儲到local的oplog中) ``` >在slave-node從節點的local數據庫中,存在一個集合sources。這個集合就保存了這個服務器的主服務器是誰 ### MongoDB副本集(Replica Sets)? ***** mongodb 不推薦主從復制,推薦建立副本集(Replica Set)來保證1個服務掛了,可以有其他服務頂上,程序正常運行,幾個服務的數據都是一樣的,后臺自動同步。主從復制其實就是一個單副本的應用,沒有很好的擴展性和容錯性。 ` ` Replica Set 使用的是 n 個 mongod 節點,構建具備自動的容錯功能(auto-failover),自動恢復的(auto-recovery)的高可用方案。使用 Replica Set 來實現讀寫分離。通過在連接時指定或者在主庫指定 slaveOk,由Secondary 來分擔讀的壓力,Primary 只承擔寫操作。對于 Replica Set 中的 secondary 節點默認是不可讀的。 ` ` #### 副本集的結構及原理 副本集包括三種節點:主節點、從節點、仲裁節點: * **主節點負責處理客戶端請求,讀、寫數據, 記錄在其上所有操作的 oplog**; * **從節點定期輪詢主節點獲取這些操作,然后對自己的數據副本執行這些操作**,從而保證從節點的數據與主節點一致。默認情況下,從節點不支持外部讀取,但可以設置; 副本集的機制在于主節點出現故障的時候,余下的節點會選舉出一個新的主節點,從而保證系統可以正常運行。 * **仲裁節點不復制數據,僅參與投票**。由于它沒有訪問的壓力,比較空閑,因此不容易出故障。由于副本集出現故障的時候,存活的節點必須大于副本集節點總數的一半, 否則無法選舉主節點,或者主節點會自動降級為從節點,整個副本集變為只讀。因此,增加一個不容易出故障的仲裁節點,可以增加有效選票,降低整個副本集不可用的 風險。仲裁節點可多于一個。也就是說只參與投票,不接收復制的數據,也不能成為活躍節點。 >官方推薦MongoDB副本節點最少為3臺, 建議副本集成員為奇數,最多12個副本節點,最多7個節點參與選舉。限制副本節點的數量,主要是因為一個集群中過多的副本節點,增加了復制的成本,反而拖累了集群 的整體性能。 太多的副本節點參與選舉,也會增加選舉的時間。而官方建議奇數的節點,是為了避免腦裂 的發生。 ` ` ##### 如何選舉主庫 MongoDB 的副本集不同于以往的主從模式:自動故障轉移 ` ` **影響選舉的因素和條件** 以下因素都會決定一個從庫能否成為主庫。 * **心跳**:副本集成員每 2 秒發送一次心跳(pings),如果心跳在 10 秒內沒有返回,則其它成員將其標記為不可訪問。每個節點內部都會維護一個狀態映射表,表明當前每個節點是什么角色、日志時間戳等關鍵信息。如果是主節點,除了維護映射表 外還需要檢查自己能否和集群中內大部分節點通訊,如果不能則把自己降級為secondary只讀節點。 * **優先級**:其它成員更愿投票給 priority 值高的。 * Priority 為 0 的不能成為 primary 也不會尋求選舉 * 只要當前主節點具有最高優先級值,或者沒有具有較高優先級的輔助節點在該集合中的最新 oplog(操作日志)條目的 10 秒內,副本集就不會保持選舉。 * 如果優先級較高的成員在當前主節點的最新 oplog 條目的 10 秒內趕上,則該集合保持選舉,以便為優先級較高的節點提供成為主節點的機會。 * **Optime**:時間戳比較老的不能成為 primary。 * **Connections**:如果大多數副本集不可訪問或不可用,則所有剩余成員變為只讀。何為大多數?例如 3 個副本集中 2 個為大多數,5 個副本集中有 3 個為大多數。選舉需要時間,在選舉的過程中,副本集由于沒有 primary,不能接受寫入,所有剩余成員都變為只讀。 ` ` ##### 選舉過程 整個選舉過程其實非常快,對用戶來說幾乎是透明的。以下步驟為具體選舉步驟。 1. 得到每個服務器節點的最后操作時間戳。每個 mongodb 都有 oplog 機制會記錄本機的操作,方便和主服務器進行對比數據是否同步還可以用于錯誤恢復。 2. 如果集群中大部分服務器 down 機了,保留活著的節點都為 secondary 狀態并停止,不選舉了。 3. 如果集群中選舉出來的主節點或者所有從節點最后一次同步時間看起來很舊了,停止選舉等待人來操作。 4. 如果上面都沒有問題就選擇最后操作時間戳最新(保證數據是最新的)的服務器節點作為主節點。 ` ` ##### 選舉觸發條件 正常情況下不會觸發選舉,如有以下條件之一則會出觸發選舉。 1. 初始化一個副本集時。 2. 副本集和主節點斷開連接,可能是網絡問題。 3. 主節點掛掉。 ` ` ##### 如何降級為 Standalone 模式 有些場景例如核心業務從 MongoDB 下架等,則可以從副本集模式降級為 Standalone 模式。 1. 注釋掉`replicaSet`參數。 2. 刪除數據庫目錄下的`local.*`文件(注意刪除操作必須在 MongoDB 停止服務的情況下進行)。 ***注意**:當切換回 Standalone 模式下時所做的任何事情都是沒有 oplog 的,這意味著當再次回到 Replica Set 模式中時會丟失部分數據(直接使用 SECONDARY 未經過刪除`local.*`文件的原配置啟動),此時MongoDB 會報錯,此處是個坑。所以這個時候得重新搭建副本集。* ` ` ##### 將 Standalone 模式轉化為副本集模式 項目前期對于 MongoDB 的要求沒有那么高,隨著業務的增長,發現項目對 MongoDB 的可靠性要求越來越高,此時可以將 MongoDB 切換為副本集模式。 1. 關閉 mongodb 實例。 2. 配置 replSet 參數以及生成配置 keyFile 。 3. 連接到 mongodb。 4. 初始化,增加成員。 ` ` ##### 數據同步 ``` 副本集同步分為初始化同步和keep復制。初始化同步指全量從主節點同步數據,如果主節點數據量比較大同步時間會比較長。而keep復制指初始化同步過后,節點 之間的實時同步一般是增量同步。初始化同步不只是在第一次才會被處罰,有以下兩種情況會觸發: 1)secondary第一次加入,這個是肯定的。 2)secondary落后的數據量超過了oplog的大小,這樣也會被全量復制。 ``` ` ` 相對于傳統主從模式的優勢: ``` 傳統的主從模式,需要手工指定集群中的 Master。如果 Master 發生故障,一般都是人工介入,指定新的 Master。 這個過程對于應用一般不是透明的,往往伴隨著應用重 新修改配置文件,重啟應用服務器等。 而 MongoDB 副本集,集群中的任何節點都可能成為 Master 節點。一旦 Master 節點故障,則會在其余節點中選舉出一個新的 Master 節點。 并引導剩余節點連接到新的 Master 節點。這個過程對于應用是透明的。 ``` >一個副本集即為服務于同一數據集的多個 MongoDB 實例,其中一個為主節點,其余的都為從節點。主節 點上能夠完成讀寫操作,從節點僅能用于讀操作。主節點需要記錄所有改變數據庫狀態的操作,這些記錄 保存在 oplog 中,這個[文件存儲](https://cloud.tencent.com/product/cfs?from=10680)在 local 數據庫,各個從節點通過此 oplog 來復制數據并應用于本地,保持 本地的數據與主節點的一致。**oplog 具有冪等性,即無論執行幾次其結果一致**,這個**比 mysql 的二進制日 志更好用**。 ` ` #### 副本集的搭建 ***** * OS: CentOS 7 64 位。 * Software: 采用的`mongodb-linux-x86_64-4.0.10`二進制包。 * 準備三臺虛擬機:mg1(primary)->10.0.4.23,mg2(secondary)->10.0.4.64,mg3(secondary)->10.0.4.33。 ` ` ##### 配置副本集 建立三個成員的副本集,首先你得建立三個數據庫的存放目錄: ``` mkdir -p ./sd01 ./sd02 ./sd03 ``` 然后我們啟動三個副本集成員,其中`replSet`參數后面跟的是副本集的名稱,將需要有關聯的成員的副本集名稱要一致: ``` mongod --dbpath ./s01 --port 27017 --replSet s0 mongod --dbpath ./s02 --port 27018 --replSet s0 mongod --dbpath ./s03 --port 27019 --replSet s0 ``` 創建仲裁者也同樣非常簡單,建立一個空的數據目錄,然后和其他副本集成員一樣設置同樣的副本集名稱啟動,最后通過`rs.add`方法的第二個參數設置為`true`: ``` mongod --dbpath ./replDb/s5 --port 27020 --replSet s0 mongod --port 27017 --host localhost > rs.add('localhost:27020', true); ``` 然后通過Mongo Shell進入到端口為27017的成員中,并配置副本集: ``` mongod --port 27017 --host localhost ``` 進入到Mongo Shell后通過`rs.initiate`方法來配置副本集: ``` > var conf = { _id: 'r0', version: 1, members: [ { _id: 0, host: 'localhost:27017' }, { _id: 1, host: 'localhost:27018' }, { _id: 2, host: 'localhost:27019' }, { _id: 3, host: 'localhost:27020' } ] }; > rs.initiate(conf); ``` `initiate`接受一個對象,對象`_id`為副本集名稱,必須和啟動副本集設置的一致才能添加進來(本例為`rs0`)。`version`為版本號,每當我們修改副本集配置的時候這個版本號都會遞加1,而`members`則為副本集成員,我們可以在這里一次性添加完,也可以只添加一個后面再通過`add`方法添加,比如下面這樣: ``` > rs.add('localhost:27018'); > rs.add('localhost:27019'); ``` ` ` ##### 刪除副本集 刪除副本集通過`rs.remove`方法來刪除,它接受一個`<localhost>:<port>`這樣的字符串。下面是刪除一個副本集成員: ``` > rs.remove('localhost:27019'); ``` 方法二: ``` cfg = rs.conf() cfg.members[0].host = "你的IP 或者域名" rs.reconfig(cfg) ``` ` ` ##### 查詢副本集配置 查看副本集配置是通過`rs.conf`方法查詢,返回包含所有副本集的配置內容. ``` > rs.conf(); ``` ` ` ##### 查詢主節點 每當使用`rs.add`方法添加成員的時候可能會影響選舉來選擇主節點是誰,查看主節點通過`rs.isMaster()`方法來查看。 ``` > rs.isMaster(); ``` 返回的內容中有幾個可以了解 ``` { "hosts" : [ //副本集成員 "localhost:27017", "localhost:27018", "localhost:27019" ], "setName" : "rs0", //副本集名稱 "setVersion" : 3, //副本集配置版本 "ismaster" : true, //是否是主節點 "primary" : "localhost:27017", //主節點成員的主機地址 "me" : "localhost:27017", //當前所在主機 } ``` ` ` ##### 讀取副節點 副節點默認是無法讀取的,我們可以通過`rs.setSlaveOk()`方法來設置Slave屬性為true。下面是設置端口為27018的副節點可以進行讀取 ``` mongod --port 27018 --host localhost > rs.setSlaveOk(); ``` ` ` ##### 隱藏成員 隱藏成員通過設置成員的`hidden`屬性為`true`并且優先值`priority`為0則可以隱藏此成員,隱藏成員不能當主節點也不能當其他成員的復制源 ``` > rs.add({ > _id: 1, > _host: 'localhost:27017', > hidden: true, > priority: 0 > }) ``` ` ` ##### 延遲復制 通過設置成員的`slaveDelay`的值并且優先值`priority`為0,來讓當前成員滯后多少秒后才開始復制數據。 ``` > rs.add({ > _id: 1, > _host: 'localhost:27017', > slaveDelay: 120, > priority: 0 > }) ``` ` ` ##### 索引管理 通過成員的`buildIndexes`的值并且優先值`priority`為0,來設置是否在備份機器上建立相同的索引,一般這個選項只用于純粹備份的服務器。 下面的代碼設置添加的副本集成員不創建索引。 ``` > rs.add({ > _id: 1, > _host: 'localhost:27017', > buildIndexes: false > priority: 0 > }) ``` ` `
                  <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>

                              哎呀哎呀视频在线观看