一、簡介:
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)采用一主一備一仲裁模型:
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
副本集