MongoDB Replica Set 集群


一、簡介:

Mongodb是時下流行的NoSql數據庫,它的存儲方式是文檔式存儲,並不是Key-Value形式。

Mongodb集群搭建有三種方式分別是Replica Set / Sharding / Master-Slaver。這里只說明Replica Set(副本集)集群搭建方式.

Replica Set

簡單來說就是集群當中包含了多份數據,保證主節點掛掉了,備節點能繼續提供數據服務,提供的前提就是數據需要和主節點一致,如下圖.

 

 

Mongodb(M)表示主節點,Mongodb(S)表示備節點,Mongodb(A)表示仲裁節點。主備節點存儲數據,仲裁節點不存儲數據。客戶端同時連接主節點與備節點,不連接仲裁節點。

默認設置下,主節點提供所有增刪查改服務,備節點不提供任何服務。但是可以通過設置使備節點提供查詢服務,這樣就可以減少主節點的壓力,當客戶端進行數據查詢時,請求自動轉到備節點上。這個設置叫做Read Preference Modes,同時Java客戶端提供了簡單的配置方式,可以不必直接對數據庫進行操作。

仲裁節點是一種特殊的節點,它本身並不存儲數據,主要的作用是決定哪一個備節點在主節點掛掉之后提升為主節點,所以客戶端不需要連接此節點。這里雖然只有一個備節點,但是仍然需要一個仲裁節點來提升備節點級別。

二、部署

1.下載mongodb

    MongoDB官網下載中心:MongoDB Download Center

    mongodb 3.4.10下載地址:https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.4.10.tgz

2.環境:

環境: 這里副本集(Replica Set)采用一主一備一仲裁模型:

Host Ip Software Port Usage OS
server-1 192.168.6.42 mongodb 3.4.10
27017 primary(主) Linux release 7.6.1810
server-2 192.168.6.43 mongodb 3.4.10 27017 secondary(備) Linux release 7.6.1810
server-3 192.168.6.44 mongodb 3.4.10 27017 arbiter(仲裁) Linux release 7.6.1810

3.. 解壓並創建目錄

[root@server-1 data]# tar zxvf mongodb-linux-x86_64-rhel70-3.4.10.tgz
[root@server-1 data]# mv mongodb-linux-x86_64-rhel70-3.4.10  mongodb    //為了方便簡潔,改名

同樣的,在server-2和server-3上也解壓並改名。

[root@server-1 ~]# mkdir -p /data/mongodb/primary    //在server-1上建立主數據存放目錄
 
[root@server-1 ~]# mkdir /etc/mongodb/      //即將存放primary的配置文件
 
[root@server-2 ~]# mkdir -p /data/mongodb/secondary    //在server-2上建立從數據存放目錄
 
[root@server-2 ~]# mkdir /etc/mongodb/      //即將存放secondary的配置文件
 
[root@server-3 ~]# mkdir -p /data/mongodb/arbiter    //在server-3上建立仲裁數據存放目錄
 
[root@server-3 ~]# mkdir /etc/mongodb/      //即將存放arbiter的配置文件

4. 新建配置文件

[root@server-1 ~]# vim /etc/mongodb/primary.conf    //新建主配置文件,內容如下:
#PRIMARY.CONF
dbpath=/data/mongodb/primary            //存放數據目錄
logpath=/data/mongodb/primary.log        //日志數據目錄
pidfilepath=/data/mongodb/primary.pid    //pid文件
#keyFile=/data/mongodb/mongodb.key        //節點間用戶認證文件,內容必須一致,權限600,僅副本集模式有效.
directoryperdb=true                        //數據庫是否分目錄存放
logappend=true                            //日志追加方式存放
replSet=do1                                //Replica Set名字,自己定義即可
bind_ip=192.168.6.42                      //
port=27017
#auth=true
oplogSize=100                            //設置oplog的大小,單位MB
fork=true                                //啟動到后台,守護進程方式啟動
noprealloc=true                            

集群配置文件:

[root@server-1 ~]# cat /etc/mongodb/primary.conf 
#PRIMARY.CONF
dbpath=/data/mongodb/primary
logpath=/data/mongodb/primary.log
pidfilepath=/data/mongodb/primary.pid
#keyFile=/data/mongodb/mongodb.key
directoryperdb=true
logappend=true
replSet=do1
bind_ip=192.168.6.42
port=27017
#auth=true
oplogSize=100
fork=true
noprealloc=true
[root@server-1 ~]# 

[root@server-2 ~]# vim /etc/mongodb/secondary.conf    //secondary的配置文件,如下:

[root@server-2 ~]# cat /etc/mongodb/secondary.conf 
#secondary.CONF
dbpath=/data/mongodb/secondary
logpath=/data/mongodb/secondary.log
pidfilepath=/data/mongodb/secondary.pid
#keyFile=/data/mongodb/mongodb.key
directoryperdb=true
logappend=true
replSet=do1
bind_ip=192.168.6.43
port=27017
#auth=true
oplogSize=100
fork=true
noprealloc=true
[root@server-2 ~]# 

[root@server-3 ~]# vim /etc/mongodb/arbiter.conf    // arbiter的配置文件內容如下

[root@server-3 ~]# cat /etc/mongodb/arbiter.conf 
#arbiter.CONF
dbpath=/data/mongodb/arbiter
logpath=/data/mongodb/arbiter.log
pidfilepath=/data/mongodb/arbiter.pid
#keyFile=/data/mongodb/mongodb.key
directoryperdb=true
logappend=true
replSet=do1
bind_ip=192.168.6.44
port=27017
#auth=true
oplogSize=100
fork=true
noprealloc=true

5. 啟動mongodb服務

[root@server-1 data]# ./mongodb/bin/mongod -f /etc/mongodb/primary.conf    //啟動主
 
[root@server-2 data]# ./mongodb/bin/mongod -f /etc/mongodb/secondary.conf    //啟動從
 
[root@server-3 data]# ./mongodb/bin/mongod -f /etc/mongodb/arbiter.conf    //啟動仲裁

如果出現started successfuly,則說明啟動成功.

6. 將節點配置組成集群

可以通過客戶端連接mongodb,也可以直接在三個節點中選擇一個連接mongodb節點,這里就在server-1操作,會出現一個交互界面:

[root@server-1 data]# ./mongodb/bin/mongo 192.168.6.42:27017    //使用mongo命令登錄,格式:mongo IP:PORT

初始化配置:

> use admin;  //直接回車
switched to db admin

cfg={ _id:"do1",members:[{_id:0,host:'192.168.6.42:27017',priority:2},{_id:1,host:'192.168.6.43:27017',priority:1},{_id:2,host:'192.168.6.44:27017',arbiterOnly:true}] };

使配置生效

> rs.initiate(cfg)    //使配置生效

說明:cfg名字可選,只要跟mongodb參數不沖突,_id為Replica Set名字,members里面的優先級priority值高的為主節點,

對於仲裁點一定要加上arbiterOnly:true,否則主備模式不生效。

查看是否生效:rs.status(),集群節點的狀態:主節點PRIMARY,副本節點SECONDARY

 

 

 

下面會顯示字樣:"ok" : 1,表明整個副本集已經搭建成功了。

7、測試副本集數據復制功能

在主節點192.168.6.42 上連接到終端:

cd /data/mongodb/bin

./mongo 192.168.6.42:27017

do1:PRIMARY> use test;      //建立test 數據庫
switched to db test
do1:PRIMARY> db.testdb.insert({"test1":"testval1"})   //往testdb表插入數據
WriteResult({ "nInserted" : 1 })
do1:PRIMARY> show tables;
testdb
do1:PRIMARY> 

在副本節點 192.168.6.43 上連接到mongodb查看數據是否復制過來。

[root@server-2 ~]# cd /data/mongodb/bin/
[root@server-2 bin]# ./mongo 192.168.6.43:27017
MongoDB shell version v3.4.10
connecting to: 192.168.6.43:27017
MongoDB server version: 3.4.10
do1:SECONDARY> do1:SECONDARY> use test;
switched to db test
do1:SECONDARY> show tables; 2020-02-28T22:24:42.525+0800 E QUERY    [thread1] Error: listCollections failed: {
    "ok" : 0,
    "errmsg" : "not master and slaveOk=false",
    "code" : 13435,
    "codeName" : "NotMasterNoSlaveOk"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype._getCollectionInfosCommand@src/mongo/shell/db.js:807:1
DB.prototype.getCollectionInfos@src/mongo/shell/db.js:819:19
DB.prototype.getCollectionNames@src/mongo/shell/db.js:830:16
shellHelper.show@src/mongo/shell/utils.js:774:9
shellHelper@src/mongo/shell/utils.js:671:15
@(shellhelp2):1:1 do1:SECONDARY> db.getMongo().setSlaveOk();
do1:SECONDARY> show tables;
testdb
do1:SECONDARY> 

#mongodb默認是從主節點讀寫數據的,副本節點上不允許讀,需要設置副本節點可以讀,執行如下命令即可 db.getMongo().setSlaveOk();

如果需要配置mongodb集群密碼訪問認證,則需要修改配置文件及執行如下操作(先創建用戶,然后在配置文件開啟認證參數auth、keyFile),具體見參考文檔:

db.createUser({user:"admin",pwd:"do1@1234",roles:[{role:"root",db:"admin"}]})  

db.createUser({user: "admin", pwd: "do1@1234", roles: [{ role: "dbOwner", db: "tiforg" }]})

./mongo  192.168.6.42:27017 -u "admin" -p "do1@1234" --authenticationDatabase tiforg

do1:PRIMARY> use tiforg;
switched to db tiforg
do1:PRIMARY> 
do1:PRIMARY> 
do1:PRIMARY> db.createUser({user: "admin", pwd: "do1@1234", roles: [{ role: "dbOwner", db: "tiforg" }]})
Successfully added user: {
    "user" : "admin",
    "roles" : [
        {
            "role" : "dbOwner",
            "db" : "tiforg"
        }
    ]
}
do1:PRIMARY> 

認證:
use tiforg
db.auth("admin","do1@1234")

使用 db.updateUser 修改用戶密碼

do1:PRIMARY> use tiforg
switched to db tiforg
do1:PRIMARY> db.updateUser("admin",{pwd:"do1#1234"});
do1:PRIMARY> exit

常用命令:

show dbs  #顯示數據庫列表 
show collections  #顯示當前數據庫中的集合(類似關系數據庫中的表)
show users  #顯示用戶
use <db name>  #切換當前數據庫,如果數據庫不存在則創建數據庫。 
db.help()  #顯示數據庫操作命令,里面有很多的命令 
db.foo.help()  #顯示集合操作命令,同樣有很多的命令,foo指的是當前數據庫下,一個叫foo的集合,並非真正意義上的命令 
db.foo.find()  #對於當前數據庫中的foo集合進行數據查找(由於沒有條件,會列出所有數據) 
db.foo.find( { a : 1 } )  #對於當前數據庫中的foo集合進行查找,條件是數據中有一個屬性叫a,且a的值為1
db.dropDatabase()  #刪除當前使用數據庫
db.cloneDatabase("127.0.0.1")   #將指定機器上的數據庫的數據克隆到當前數據庫
db.copyDatabase("mydb", "temp", "127.0.0.1")  #將本機的mydb的數據復制到temp數據庫中
db.repairDatabase()  #修復當前數據庫
db.getName()  #查看當前使用的數據庫,也可以直接用db
db.stats()  #顯示當前db狀態
db.version()  #當前db版本
db.getMongo()  #查看當前db的鏈接機器地址
db.serverStatus()  #查看數據庫服務器的狀態

 

參考文檔:https://www.cnblogs.com/gaomanito/p/11731658.html 

      https://www.cnblogs.com/guigujun/p/9595234.html

 

副本集


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM