久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MongoDB中復(fù)制集集群的原理是什么

167次閱讀
沒有評論

共計 13032 個字符,預(yù)計需要花費 33 分鐘才能閱讀完成。

自動寫代碼機器人,免費開通

這篇文章給大家介紹 MongoDB 中復(fù)制集集群的原理是什么,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

復(fù)制集介紹

MongoDB 中的復(fù)制集 (也被稱為副本) 是一組維護相同數(shù)據(jù)集的 mongod 進程。副本集提供冗余性及和高可用,是所有生產(chǎn)部署的基礎(chǔ)。簡單來說,復(fù)制集有多臺 MongoDB 組成的一個集群,集群中有一個主節(jié)點 (Primary) 和 N 個副本節(jié)點 (Secondary) 等,它們有相同的數(shù)據(jù)庫,假如主 MongoDB 服務(wù)器或者 MongoDB 實例 Down 機之后,其它的副本服務(wù)器可以繼續(xù)提供服務(wù),實現(xiàn)數(shù)據(jù)的高可用及可靠性。

復(fù)制集群架構(gòu)

術(shù)語介紹:

術(shù)語類型描述 Primary 主節(jié)點負責整個集群的讀寫操作,包含了所有改變操作的日志 Secondary 備節(jié)點同步主服務(wù)器所有的數(shù)據(jù),負責集群的讀取請求,主服務(wù)器宕機可以稱為主節(jié)點 Arbiter 仲裁者在主節(jié)點宕機后只進行投票,不參與選舉,不同步主節(jié)點數(shù)據(jù)

MongoDB 中復(fù)制集集群的原理是什么

此架構(gòu)由一個 Primary 節(jié)點和兩個 Secondary 節(jié)點組成

1)Primary 節(jié)點為主節(jié)點,所有的寫操作或者更改操作都只能從 Primary 節(jié)點中操作(復(fù)制集內(nèi)的所有成員都可以接收讀操作,但是,默認情況下,應(yīng)用程序?qū)⑵渥x操作指向主成員),主節(jié)點上所有的更改及寫操作都會記錄到 oplog 日志中。

2)兩臺 Secondary 節(jié)點復(fù)制 Primary 節(jié)點的 oplog 日志,通過異步的方式去執(zhí)行 oplog 日志中的記錄來和 Primary 節(jié)點達到數(shù)據(jù)一致性。

3)oplog 作用主要是記錄主節(jié)點的寫入操作,充當復(fù)制源。

MongoDB 中復(fù)制集集群的原理是什么

4)如果 Primary 節(jié)點無故 Down 機之后,復(fù)制集集群會通過投票機制在兩臺 Secondary 中選舉一臺升級為 Primary 節(jié)點。

投票選舉機制

MongoDB 節(jié)點之間維護心跳檢查,主節(jié)點選舉由心跳觸發(fā)。

心跳檢查 MongoDB 復(fù)制集成員會向自己之外的所有成員發(fā)送心跳并處理響應(yīng)信息,因此每個節(jié)點都維護著該節(jié)點看到的其它所有節(jié)點的狀態(tài)信息,節(jié)點根據(jù)自己的集群狀態(tài)判斷是否需要更新新的 Primary。在實現(xiàn)的時候主要由兩個異步的過程分別處理心跳響應(yīng)和超時,每個復(fù)制集成員都會在后臺運行與復(fù)制集所有節(jié)點的心跳線程,在以下幾種情況下會觸發(fā)狀態(tài)檢測過程:

bull;Secondary 節(jié)點權(quán)重 (Priority) 比 Primary 節(jié)點高時,發(fā)起替換選舉;

bull;Secondary 節(jié)點發(fā)現(xiàn)集群中沒有 Primary 時,發(fā)起選舉;

bull;Primary 節(jié)點不能訪問到大部分成員時主動降級,降級操作會斷開連接,終止用戶請求等;

bull; 復(fù)制集成員心跳檢測結(jié)果發(fā)生變化,比如某個節(jié)點掛了或者新增節(jié)點,發(fā)起重新投票選舉規(guī)則;

bull; 超過 4s 沒有執(zhí)行狀態(tài)檢測過程,發(fā)起替換選舉;

選舉發(fā)起 發(fā)起選舉的節(jié)點首先需要做一些條件判斷,維護主節(jié)點的有 N 個備用節(jié)點,備用節(jié)點中的所有節(jié)點都可能被選舉成為主節(jié)點,成為主節(jié)點前每個備節(jié)點都會檢測自身以及全局條件是否滿足,檢測條件如下:

1. 是否看見復(fù)制集中是否有 Majority 在線

2. 自身 Priority 是否大于 0

3. 自身不為 arbiter

4. 自身 opTime 不能落后于最新節(jié)點 10s 以上

5. 自身存儲的集群程序按信息為最新

如果所有條件滿足,則將自身添加到主節(jié)點的備用列表中,否則,將自身從列表中移除

自身檢測

bull;MongoDB 選舉需要獲得大多數(shù)投票才能通過,如果沒有節(jié)點投反對票,且獲得成票數(shù)超過有權(quán)投票節(jié)點總數(shù)的 1 /2,則能成為 Primary。否則進入下一輪選舉。為避免陷入無限重復(fù)選舉,MongoDB 建議復(fù)制集的成員個數(shù)為奇數(shù),當 Secondary 為雙數(shù)時,可以增加一個 Arbiter 節(jié)點。

bull; 選舉過程中,復(fù)制集沒有主節(jié)點,所有成員都是只讀狀態(tài)

bull; 選舉過程很復(fù)雜,一般情況下需要 5s 左右進行選主。

bull; 如果新選擇的主節(jié)點立刻掛掉,至少需要 30s 時間重新選主。

大多數(shù)的定義 假設(shè)復(fù)制集內(nèi)投票成員數(shù)量為 N,則大多數(shù) = N/2 + 1,當復(fù)制集內(nèi)存活成員數(shù)量不足大多數(shù)時,整個復(fù)制集將無法選舉出 Primary,復(fù)制集將無法提供寫服務(wù),處于只讀狀態(tài)。我們按照上面的架構(gòu)來舉例,三臺 MongoDB,一臺 Primary,兩臺 Secondary,主節(jié)點掛了之后,只有兩臺 Secondary 可以投票,根據(jù)公式我們來算“2/2 + 1 = 2”,也就是算大多數(shù)等于 2,但是當復(fù)制集內(nèi)存活的成員數(shù)量不足大多數(shù)時,我們的大多數(shù)為 2,集群成員也為 2,所以這兩臺集群成員會發(fā)起選舉投票機制,如果兩臺 Secondary 節(jié)點自身條件都滿足的情況下,則先發(fā)起選舉節(jié)點的成員成為 Primary 節(jié)點

投票成員數(shù)大多數(shù)容忍失效數(shù) 110220321431532642743

復(fù)制集群成員說明

Secondary 正常情況下,復(fù)制集的 Seconary 會參與 Primary 選舉(自身也可能會被選為 Primary),并從 Primary 同步最新寫入的數(shù)據(jù),以保證與 Primary 存儲相同的數(shù)據(jù)。Secondary 可以提供讀服務(wù),增加 Secondary 節(jié)點可以提供復(fù)制集的讀服務(wù)能力,同時提升復(fù)制集的可用性。另外,Mongodb 支持對復(fù)制集的 Secondary 節(jié)點進行靈活的配置,以適應(yīng)多種場景的需求。

Arbiter Arbiter 節(jié)點只參與投票,不能被選為 Primary,并且不從 Primary 同步數(shù)據(jù)。比如你部署了一個 2 個節(jié)點的復(fù)制集,1 個 Primary,1 個 Secondary,任意節(jié)點宕機,復(fù)制集將不能提供服務(wù)了(無法選出 Primary),這時可以給復(fù)制集添加一個 Arbiter 節(jié)點,即使有節(jié)點宕機,仍能選出 Primary。Arbiter 本身不存儲數(shù)據(jù),是非常輕量級的服務(wù),當復(fù)制集成員為偶數(shù)時,最好加入一個 Arbiter 節(jié)點,以提升復(fù)制集可用性。

Priority0 Priority0 節(jié)點的選舉優(yōu)先級為 0,不會被選舉為 Primary。比如你跨機房 A、B 部署了一個復(fù)制集,并且想指定 Primary 必須在 A 機房,這時可以將 B 機房的復(fù)制集成員 Priority 設(shè)置為 0,這樣 Primary 就一定會是 A 機房的成員。(注意:如果這樣部署,最好將『大多數(shù)』節(jié)點部署在 A 機房,否則網(wǎng)絡(luò)分區(qū)時可能無法選出 Primary)

Vote0 Mongodb 3.0 里,復(fù)制集成員最多 50 個,參與 Primary 選舉投票的成員最多 7 個,其他成員(Vote0)的 vote 屬性必須設(shè)置為 0,即不參與投票。

Hidden Hidden 節(jié)點不能被選為主(Priority 為 0),并且對 Driver 不可見。因 Hidden 節(jié)點不會接受 Driver 的請求,可使用 Hidden 節(jié)點做一些數(shù)據(jù)備份、離線計算的任務(wù),不會影響復(fù)制集的服務(wù)。

Delayed Delayed 節(jié)點必須是 Hidden 節(jié)點,并且其數(shù)據(jù)落后與 Primary 一段時間(可配置,比如 1 個小時)。因 Delayed 節(jié)點的數(shù)據(jù)比 Primary 落后一段時間,當錯誤或者無效的數(shù)據(jù)寫入 Primary 時,可通過 Delayed 節(jié)點的數(shù)據(jù)來恢復(fù)到之前的時間點。

優(yōu)先級為 0 復(fù)制集成員

MongoDB 中復(fù)制集集群的原理是什么

此架構(gòu)由一個 Primary 節(jié)點和兩個 Secondary 節(jié)點組成

1)此架構(gòu)由一臺 Primary 主節(jié)點和兩臺 Secondary 備節(jié)點組成,其原理就是主從復(fù)制架構(gòu)的原理,兩臺 Secondary 節(jié)點同樣通過 oplog 日志來與 Primary 主節(jié)點達成數(shù)據(jù)一致

2)與其不同的是在 Data Center2 節(jié)點上的 Secondary 備用節(jié)點的實例優(yōu)先級 priority 為 0,則不參與選舉,也不可能會成為 Primary 節(jié)點,將其優(yōu)先級配置為 0,主要是防止它成為主節(jié)點,這在多數(shù)據(jù)中心的部署特別有用。

3)優(yōu)先級值范圍為 0-100(0 表示不參與選舉),在復(fù)制集群中,優(yōu)先級高的優(yōu)先成為主節(jié)點,假如我們原來集群中有三臺節(jié)點,主節(jié)點優(yōu)先級為 2,其它兩臺備節(jié)點優(yōu)先級為 1,當我們新加入到集群一臺 MongoDB 實例,給它優(yōu)先級設(shè)置為 4,則該實例在加入集群后就會自動搶奪 Primary 到本機。

仲裁節(jié)點架構(gòu)

MongoDB 中復(fù)制集集群的原理是什么

上圖中,三個成員組成復(fù)制集群

一個主庫:負責整個集群的所有寫、更改操作

一個從庫:通過 oplog 日志來與主節(jié)點數(shù)據(jù)達成一致

一個 Airbiter 節(jié)點,在選舉中,只進行投票,不能成為主庫,而且不復(fù)制 Primary 的任何數(shù)據(jù),因此這個架構(gòu)中只能提供一個完成的副本 Secondary,Arbiter 只需要很少的資源,代價是有限的冗余和容錯,當 Primary 節(jié)點故障后,Aribiter 將票數(shù)頭給 Secondary,使其成為 Primary 節(jié)點,如果 Primary 節(jié)點再次故障后,集群將不可用,Arbiter 節(jié)點也未存儲任何數(shù)據(jù)。

MongoDB 中復(fù)制集集群的原理是什么

集群中還有其它的節(jié)點成員,但是我們用的比較少,所以此文章中沒有提到??梢宰孕胁殚喒俜轿臋n:https://docs.mongodb.com/manual/core/replica-set-members/

復(fù)制集集群環(huán)境部署

環(huán)境說明

本次使用一臺設(shè)備多實例進行,如果你準備在多臺設(shè)備上部署,你需要考慮的如下:1)時鐘是否一致 2)網(wǎng)絡(luò)是否通暢 3)SElinux 是否關(guān)閉或者策略放通 4)環(huán)境是否一致

[root@MongoDB ~]# lsb_release -a LSB Version: :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch Distributor ID: CentOS Description: CentOS Linux release 7.6.1810 (Core) Release: 7.6.1810 Codename: Core [root@MongoDB ~]# hostname -I 10.211.55.12 192.168.0.100 fdb2:2c26:f4e4:0:21c:42ff:fedf:4d85

前期準備

# 創(chuàng)建用戶組  useradd mongod echo  abcdef  | passwd --stdin mongod #下載 MongoDB wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.0.tgz # 添加文件打開數(shù)和 mongod 用戶進程連接數(shù)  cat   /etc/security/limits.conf   EOF * soft nofile 65536 * hard nofile 65536 mongod soft nproc 32768 mongod hard nproc 32768 EOF # 使下面兩個文件修改為 never echo never   /sys/kernel/mm/transparent_hugepage/enabled echo never   /sys/kernel/mm/transparent_hugepage/defrag # 開機自動修改  cat   /etc/rc.local   EOF if test -f /sys/kernel/mm/transparent_hugepage/enabled;then echo never   /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag;then echo never   /sys/kernel/mm/transparent_hugepage/defrag fi EOF  此步驟完成后  #官方給出 MongoDB 需要以下兩個庫的依賴  yum install libcurl openssl -y #解壓并復(fù)制程序文件到 bin 目錄  mkdir /usr/local/mongodb tar xf mongodb-linux-x86_64-rhel70-4.2.0.tgz cp -rf mongodb-linux-x86_64-rhel70-4.2.0/bin/ /usr/local/mongodb/ chown -Rf mongod.mongod /usr/local/moongodb/ # 添加程序環(huán)境  cat   /etc/profile   EOF export MONGODB_HOME=/usr/local/mongodb export PATH=\$MONGODB/bin:\$PATH EOF source /etc/profile

環(huán)境配置

1)接下來使用 mongod 用戶來操作

su mongod

2)創(chuàng)建文件目錄

#!/bin/bash for i in 27017 27018 27019 do mkdir -p /usr/local/mongodb/$i/{conf,data,logs,run} done

配置文件

編輯一臺配置文件,然后復(fù)制到其它實例,配置文件為 yaml 語法 關(guān)于以下配置文件詳解,請參考:”https://abcops.cn/mongodb-conf/“

cat   mongod.conf   EOF systemLog: destination: file path: /usr/local/mongodb/27017/logs/mongodb.log logAppend: true verbosity: 0 logRotate: rename storage: journal: enabled: true dbPath: /usr/local/mongodb/27017/data directoryPerDB: true engine: wiredTiger wiredTiger: engineConfig: cacheSizeGB: 1 directoryForIndexes: true journalCompressor: zlib collectionConfig: blockCompressor: zlib indexConfig: prefixCompression: true processManagement: fork: true pidFilePath: /usr/local/mongodb/27017/run/mongod.pid net: port: 27017 bindIp: 10.211.55.12 maxIncomingConnections: 65536 wireObjectCheck: true ipv6: false replication: oplogSizeMB: 4096 replSetName: abcops_repl setParameter: connPoolMaxShardedConnsPerHost: 200 connPoolMaxConnsPerHost: 200 EOF

復(fù)制配置文件到目錄中,并修改其端口及目錄位置

#!/bin/bash for i in 27017 27018 27019 do \cp /home/mongod/mongod.conf /usr/local/mongodb/$i/conf sed -i  s/27017/$i/g  /usr/local/mongodb/$i/conf/mongod.conf done

啟動 MongoDB 實例

啟動腳本如下

#!/bin/bash for i in 27017 27018 27019 do /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/$i/conf/mongod.conf done

關(guān)閉腳本如下

#!/bin/bash for i in 27017 27018 27019 do /usr/local/mongodb/bin/mongod --shutdown -f /usr/local/mongodb/$i/conf/mongod.conf done

三個實例啟動后,不代表復(fù)制集已經(jīng)搭建成功了,還需要進行復(fù)制集初始化

配置復(fù)制集

連接任何一個實例都可以進行配置

這是我連接 27017 的實例  /usr/local/mongodb/bin/mongo --host 10.211.55.12 --port 27017
 use admin   config={ _id: abcops_repl , members:[ {_id: 0, host:  10.211.55.12:27017 ,priority:2}, {_id: 1, host:  10.211.55.12:27018 ,priority:1}, {_id: 2, host:  10.211.55.12:27019 ,arbiterOnly:true}, ] }   rs.initiate(config) # 以上參數(shù)解析  use admin:進入 admin 數(shù)據(jù)庫  config:配置復(fù)制集  _id: abcops_repl:指定復(fù)制集組名稱,與配置文件中的  replSetName  參數(shù)需要保持一致  members:規(guī)定的函數(shù),不能更改  _id:設(shè)置組成員的 ID 編號,可以自定義,我這里為  0、1、2 host:指定加入復(fù)制集成員的 IP 地址及端口,我們在配置文件中指定了 bindIp 為 10.211.55.12,這里就不能寫 127.0.0.1, 必須寫為 bind_Ip 指定的地址  priority:指定優(yōu)先級 0 -100,優(yōu)先級最高的成為 Primary 節(jié)點,優(yōu)先級為可選選項,如果不指定默認都為 1  arbiterOnly:是否開啟仲裁節(jié)點 true/false rs.initiate(config):初始化復(fù)制集配置

以上參數(shù)圖示如下,給你提供下參照

MongoDB 中復(fù)制集集群的原理是什么

圖中開始為 SECONDARY, 代表復(fù)制集集群正在進行選舉 Primary 節(jié)點,大概 5s 左右,根據(jù)選舉機制選舉成功后,成為主節(jié)點的 SECONDARY 狀態(tài)變?yōu)?PRIMARY

復(fù)制集常用命令

1)查看誰是主節(jié)點

abcops_repl:PRIMARY  db.isMaster()

2)查看當前復(fù)制集集群中成員的配置

abcops_repl:PRIMARY  rs.conf()

3)查看復(fù)制集集群成員狀態(tài)

abcops_repl:PRIMARY  rs.status()

4)新增節(jié)點到復(fù)制集 新增節(jié)點之前,該實例的配置中的 replSetName 復(fù)制集名稱,必須和集群一致

abcops_repl:PRIMARY  rs.add(10.211.55.12:27020)

5)新增仲裁節(jié)點

abcops_repl:PRIMARY  rs.addArb(10.211.55.12:27020)

6)從復(fù)制集內(nèi)刪除節(jié)點

abcops_repl:PRIMARY  rs.remove(10.211.55.12:27020)

7)檢查 oplog 日志時間和大小

abcops_repl:PRIMARY  rs.printReplicationInfo() configured oplog size: 4096MB log length start to end: 2422secs (0.67hrs) oplog first event time: Wed Sep 11 2019 12:22:13 GMT+0800 (CST) oplog last event time: Wed Sep 11 2019 13:02:35 GMT+0800 (CST) now: Wed Sep 11 2019 13:02:37 GMT+0800 (CST)

8)降級服務(wù)器 此操作只能在 PRIMARY 上操作 通過執(zhí)行 rs.stepDown 命令將當前主服務(wù)器主動降級為備用節(jié)點,120 單位為 s,為 120 秒內(nèi)這個實力不能把自己選為 PRIMARY 角色,120 秒后由于它本身的優(yōu)先級較高,所以會重新?lián)屨?PRIMARY 節(jié)點。

abcops_repl:PRIMARY  rs.stepDown(120)

9)允許在 Secondary 節(jié)點可以進行查詢 在副本節(jié)點上操作

rs.slaveOk()

10)查看當前連接

db.getMongo()

修改優(yōu)先級

修改 27018 的優(yōu)先級為 3,使其優(yōu)先級超過 27017 實例,奪得 PRIMARY 角色,此操作需在 PRIMARY 上執(zhí)行

abcops_repl:PRIMARY  config=rs.conf() abcops_repl:PRIMARY  config.members[1].priority=3 3 abcops_repl:PRIMARY  rs.reconfig(config) {  ok  : 1,  $clusterTime  : {  clusterTime  : Timestamp(1568179129, 1),  signature  : {  hash  : BinData(0, AAAAAAAAAAAAAAAAAAAAAAAAAAA=),  keyId  : NumberLong(0) } },  operationTime  : Timestamp(1568179129, 1) } abcops_repl:PRIMARY  rs.conf() abcops_repl:SECONDARY  db.isMaster() # 以上參數(shù)解析  config=rs.conf():將現(xiàn)有的配置讀取到變量中進行存儲  config.members[1].priority=3:修改變量中的值,1 是指執(zhí)行 rs.conf()中看到節(jié)點的順序,不是 ID 號哦,rs.conf()看到的順序是從 0 開始排序,三個副本集排序就是 0 -3 rs.reconfig(config):將修改后的數(shù)據(jù)同步到配置,使修改生效  rs.conf():查看當前配置,可以看到優(yōu)先級哦  db.isMaster():查看誰是 Primary 節(jié)點

復(fù)制測試

1)插入數(shù)據(jù)

#連接當前 Primary 節(jié)點  /usr/local/mongodb/bin/mongo --host 10.211.55.12 --port 27018 # 進入 abcops 數(shù)據(jù)庫,在 documents 文檔中插入以下 JSON 格式的數(shù)據(jù)  abcops_repl:PRIMARY  use abcops abcops_repl:PRIMARY  db.documents.insert( {name:  xuweiliang , age: 25, Job:  DevOps} ) # 查看 documents 文檔中的數(shù)據(jù)  abcops_repl:PRIMARY  db.documents.find() {  _id  : ObjectId( 5d78863768fbf9eac4704232),  name  :  xuweiliang ,  age  : 25,  Job  :  DevOps  } # 查看復(fù)制節(jié)點狀態(tài)  abcops_repl:PRIMARY  rs.printSlaveReplicationInfo() source: 10.211.55.12:27017 syncedTo: Wed Sep 11 2019 13:30:42 GMT+0800 (CST) 0 secs (0 hrs) behind the primary

2)登錄 Secondary 節(jié)點查看

/usr/local/mongodb/bin/mongo --host 10.211.55.12 --port 27017 abcops_repl:SECONDARY  rs.slaveOk() # 運行副本節(jié)點可進行查詢  abcops_repl:SECONDARY  show dbs # 查看當前節(jié)點的數(shù)據(jù)庫  abcops 0.000GB admin 0.000GB config 0.000GB local 0.000GB abcops_repl:SECONDARY  use abcops #abcops 數(shù)據(jù)庫已經(jīng)從主節(jié)點同步至此  switched to db abcops abcops_repl:SECONDARY  db.getCollectionNames() # 以下連續(xù)三個命令都是查看進入到 abcops 庫中的文檔命令  [  documents  ] abcops_repl:SECONDARY  show collections documents abcops_repl:SECONDARY  show tables documents abcops_repl:SECONDARY  db.documents.find() # 查看文檔中的內(nèi)容  {  _id  : ObjectId( 5d78863768fbf9eac4704232),  name  :  xuweiliang ,  age  : 25,  Job  :  DevOps  }

創(chuàng)建復(fù)制集中的賬戶

1)連接到主節(jié)點,創(chuàng)建用戶 以下創(chuàng)建的用戶及權(quán)限和角色請參考下面用戶權(quán)限說明

/usr/local/mongodb/bin/mongo --host 10.211.55.12 --port 27018 abcops_repl:PRIMARY  use admin abcops_repl:PRIMARY  db.createUser( { user: abcops , pwd: 123456 , roles:[ { role:  root , db:  admin  } ] } ) Successfully added user: {  user  :  abcops ,  roles  : [ {  role  :  root ,  db  :  admin  } ] } # 查看所有創(chuàng)建的用戶信息  abcops_repl:PRIMARY  show users

用戶中權(quán)限的說明

權(quán)限說明 Read 允許用戶讀取指定數(shù)據(jù)庫 readWrite 允許用戶讀寫指定數(shù)據(jù)庫 dbAdmin 允許用戶在指定數(shù)據(jù)庫中指定管理函數(shù),如(索引創(chuàng)建、刪除、查看統(tǒng)計訪問 system.profile)userAdmin 允許用戶向 system.users 集合寫入,可以找指定數(shù)據(jù)里面創(chuàng)建、刪除和管理用戶 clusterAdmin 只在 admin 數(shù)據(jù)庫中可用,賦予用戶所有分片和復(fù)制集相關(guān)函數(shù)的管理權(quán)限 readAnyDatabase 只在 admin 數(shù)據(jù)庫中可用,賦予用戶所有數(shù)據(jù)庫的讀權(quán)限 readWriteAnyDatabase 只在 admin 數(shù)據(jù)庫中可用,賦予用戶所有數(shù)據(jù)庫的讀寫權(quán)限 userWriteAnyDatabase 只在 admin 數(shù)據(jù)庫中可用,賦予用戶所有數(shù)據(jù)庫的 userAdmin 權(quán)限 dbAdminAnyDatabase 只在 admin 數(shù)據(jù)庫中可用,賦予用戶所有數(shù)據(jù)庫的 dbAdmin 權(quán)限 root 只在 admin 數(shù)據(jù)庫中可用,超級管理員

為復(fù)制集集群添加權(quán)限認證

復(fù)制集我們這里采用 keyfile 文件實現(xiàn)權(quán)限認證,并且副本集中的所有成員使用的 keyfile 必須一樣

添加安全認證配置

三臺實例必須都要配置

cat   /usr/local/mongodb/27017/conf/mongod.conf   EOF security: authorization: enabled clusterAuthMode: keyFile keyFile: /usr/local/mongodb/27017/conf/keyfile javascriptEnabled: true EOF cat   /usr/local/mongodb/27018/conf/mongod.conf   EOF security: authorization: enabled clusterAuthMode: keyFile keyFile: /usr/local/mongodb/27018/conf/keyfile javascriptEnabled: true EOF cat   /usr/local/mongodb/27019/conf/mongod.conf   EOF security: authorization: enabled clusterAuthMode: keyFile keyFile: /usr/local/mongodb/27019/conf/keyfile javascriptEnabled: true EOF

keyfile 文件操作

1)生產(chǎn) keyfile 文件

openssl rand -base64 90   ./keyfile

2)復(fù)制 keyfile 文件到其它實例中

#!/bin/bash for i in 27017 27018 27019 do \cp /home/mongod/keyfile /usr/local/mongodb/$i/conf/ done

3)修改 keyfile 權(quán)限 keyfile 文件權(quán)限必須為 X00,不能給 group 和 other 成員分配任何權(quán)限,否則實例無法啟動

#!/bin/bash for i in 27017 27018 27019 do chmod 400 /usr/local/mongodb/$i/conf/keyfile done

4)重啟所有實例

#!/bin/bash for i in 27017 27018 27019 do /usr/local/mongodb/bin/mongod --shutdown -f /usr/local/mongodb/$i/conf/mongod.conf sleep 3s /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/$i/conf/mongod.conf done

認證驗證

登錄驗證可以在連接的時候指定用戶名和密碼,也可以先連接到數(shù)據(jù)庫后再進行認證

1)登錄指定用戶密碼

/usr/local/mongodb/bin/mongo --host 10.211.55.12 --port 27018 --username abcops -p 123456 abcops_repl:PRIMARY  show dbs abcops 0.000GB admin 0.000GB config 0.000GB local 0.000GB

2)先登錄,后驗證

abcops_repl:PRIMARY  use admin # 必須要先切換到 admin 庫中才可以進行進行驗證  switched to db admin abcops_repl:PRIMARY  db.auth(  abcops , 123456  ) # 認證用戶名及密碼,認證成功返回 1,否則返回 0  1 abcops_repl:PRIMARY  show dbs abcops 0.000GB admin 0.000GB config 0.000GB local 0.000GB abcops_repl:PRIMARY  db admin

3)在備庫進行驗證 備庫只能進行查詢,勿要在備庫上進行任何操作

/usr/local/mongodb/bin/mongo --host 10.211.55.12 --port 27017 abcops_repl:SECONDARY  rs.slaveOk() abcops_repl:SECONDARY  use admin switched to db admin abcops_repl:SECONDARY  db.auth(abcops , 123456) 1

客戶端驗證

我們可以找一臺 SQL 管理工具來連接該庫

MongoDB 中復(fù)制集集群的原理是什么

可以看到我創(chuàng)建的 abcops 庫和一個文檔及三個字段

MongoDB 中復(fù)制集集群的原理是什么

關(guān)于 MongoDB 中復(fù)制集集群的原理是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向 AI 問一下細節(jié)

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-12-04發(fā)表,共計13032字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 桂阳县| 桃园市| 巴中市| 河西区| 蓬溪县| 福海县| 清原| 亚东县| 共和县| 乳源| 炉霍县| 井研县| 大石桥市| 定襄县| 普兰县| 遂昌县| 炉霍县| 尚义县| 汉阴县| 乌兰浩特市| 芮城县| 安福县| 班戈县| 福清市| 榆中县| 嘉义县| 新河县| 泗阳县| 沐川县| 鄂州市| 禄劝| 额济纳旗| 南平市| 林甸县| 通化县| 手机| 瓮安县| 寻乌县| 南皮县| 剑川县| 华宁县|