-
測試環境
操作系統:CentOS 7.2 最小化安裝
主服務器IP地址:192.168.197.21 master-node
從服務器IP地址:192.168.197.22 slave-node
關閉selinux,關閉防火牆。
Mongodb版本:mongodb-linux-x86_64-3.4.10.tgz
-
上傳mongodb包到/software目錄下,然后解壓縮該包
[root@localhost software]# tar -zxvf mongodb-linux-x86_64-3.4.10.tgz
-
移動解壓縮之后的文件至/usr/local/mongodb目錄
[root@localhost software]# mv mongodb-linux-x86_64-3.4.10 /usr/local/mongodb
-
在mongodb下面創建data目錄和logs目錄,用於存放data和logs
[root@localhost local]# mkdir -p /usr/local/mongodb/data
[root@localhost local]# mkdir -p /usr/local/mongodb/logs
-
增加環境變量,並使環境變量生效
[root@localhost data]# vi /etc/profile
export PATH=$PATH:/usr/local/mongodb/bin
[root@localhost data]# source /etc/profile
-
創建mongodb.conf文件並寫入一下內容
[root@localhost data]# touch /usr/local/mongodb/bin/mongodb.conf
[root@localhost data]# vi /usr/local/mongodb/bin/mongodb.conf
-
主服務器配置
[root@master-node software]# more /usr/local/mongodb/bin/mongodb.conf
port=27017
dbpath= /usr/local/mongodb/data
logpath= /usr/local/mongodb/logs/log.log
logappend=true
fork=true
maxConns=100
noauth=true
journal=true
storageEngine=wiredTiger
bind_ip = 192.168.197.21
master=true
-
從服務器配置
[root@slave-node software]# more /usr/local/mongodb/bin/mongodb.conf
port=27017
dbpath= /usr/local/mongodb/data
logpath= /usr/local/mongodb/logs/log.log
logappend=true
fork=true
maxConns=100
noauth=true
slave=true
journal=true
storageEngine=wiredTiger
bind_ip = 192.168.197.22
source=192.168.197.21:27017
-
使用配置文件啟動兩台服務器上的數據庫
mongod --config /usr/local/mongodb/bin/mongodb.conf
-
在主服務器上登陸數據庫創建testa數據庫,並寫入20條數據
[root@master-node software]# mongo 192.168.197.21:27017
MongoDB shell version v3.4.10
connecting to: 192.168.197.21:27017
MongoDB server version: 3.4.10
Server has startup warnings:
2019-02-10T21:38:04.484-0500 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2019-02-10T21:38:04.484-0500 I CONTROL [initandlisten]
2019-02-10T21:38:04.485-0500 I CONTROL [initandlisten]
2019-02-10T21:38:04.485-0500 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2019-02-10T21:38:04.485-0500 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2019-02-10T21:38:04.485-0500 I CONTROL [initandlisten]
2019-02-10T21:38:04.485-0500 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2019-02-10T21:38:04.485-0500 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2019-02-10T21:38:04.485-0500 I CONTROL [initandlisten]
> use testa
switched to db testa
> function add(){var i = 0;for(;i<20;i++){db.persons.insert({"nameA":"li"+i})}}
> add()
> db.persons.find()
{ "_id" : ObjectId("5c61272206144917c514f1a3"), "nameA" : "li0" }
{ "_id" : ObjectId("5c61272206144917c514f1a4"), "nameA" : "li1" }
{ "_id" : ObjectId("5c61272206144917c514f1a5"), "nameA" : "li2" }
{ "_id" : ObjectId("5c61272206144917c514f1a6"), "nameA" : "li3" }
{ "_id" : ObjectId("5c61272206144917c514f1a7"), "nameA" : "li4" }
{ "_id" : ObjectId("5c61272206144917c514f1a8"), "nameA" : "li5" }
{ "_id" : ObjectId("5c61272206144917c514f1a9"), "nameA" : "li6" }
{ "_id" : ObjectId("5c61272206144917c514f1aa"), "nameA" : "li7" }
{ "_id" : ObjectId("5c61272206144917c514f1ab"), "nameA" : "li8" }
{ "_id" : ObjectId("5c61272206144917c514f1ac"), "nameA" : "li9" }
{ "_id" : ObjectId("5c61272206144917c514f1ad"), "nameA" : "li10" }
{ "_id" : ObjectId("5c61272206144917c514f1ae"), "nameA" : "li11" }
{ "_id" : ObjectId("5c61272206144917c514f1af"), "nameA" : "li12" }
{ "_id" : ObjectId("5c61272206144917c514f1b0"), "nameA" : "li13" }
{ "_id" : ObjectId("5c61272206144917c514f1b1"), "nameA" : "li14" }
{ "_id" : ObjectId("5c61272206144917c514f1b2"), "nameA" : "li15" }
{ "_id" : ObjectId("5c61272206144917c514f1b3"), "nameA" : "li16" }
{ "_id" : ObjectId("5c61272206144917c514f1b4"), "nameA" : "li17" }
{ "_id" : ObjectId("5c61272206144917c514f1b5"), "nameA" : "li18" }
{ "_id" : ObjectId("5c61272206144917c514f1b6"), "nameA" : "li19" }
-
登陸從服務器的數據庫查看數據是否同步過來
[root@slave-node software]# mongo 192.168.197.22:27017
MongoDB shell version v3.4.10
connecting to: 192.168.197.22:27017
MongoDB server version: 3.4.10
Server has startup warnings:
2019-02-10T21:43:16.796-0500 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2019-02-10T21:43:16.796-0500 I CONTROL [initandlisten]
2019-02-10T21:43:16.796-0500 I CONTROL [initandlisten]
2019-02-10T21:43:16.796-0500 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2019-02-10T21:43:16.796-0500 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2019-02-10T21:43:16.796-0500 I CONTROL [initandlisten]
2019-02-10T21:43:16.796-0500 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2019-02-10T21:43:16.796-0500 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2019-02-10T21:43:16.796-0500 I CONTROL [initandlisten]
> show dbs
2019-02-11T02:43:26.999-0500 E QUERY [thread1] Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:781:19
shellHelper@src/mongo/shell/utils.js:671:15
@(shellhelp2):1:1
> rs.slaveOk()
> show dbs
admin 0.000GB
local 0.000GB
master_slave 0.000GB
testa 0.000GB
> use testa
switched to db testa
> db.persons.find()
{ "_id" : ObjectId("5c61272206144917c514f1a3"), "nameA" : "li0" }
{ "_id" : ObjectId("5c61272206144917c514f1a4"), "nameA" : "li1" }
{ "_id" : ObjectId("5c61272206144917c514f1a5"), "nameA" : "li2" }
{ "_id" : ObjectId("5c61272206144917c514f1a6"), "nameA" : "li3" }
{ "_id" : ObjectId("5c61272206144917c514f1a7"), "nameA" : "li4" }
{ "_id" : ObjectId("5c61272206144917c514f1a8"), "nameA" : "li5" }
{ "_id" : ObjectId("5c61272206144917c514f1a9"), "nameA" : "li6" }
{ "_id" : ObjectId("5c61272206144917c514f1aa"), "nameA" : "li7" }
{ "_id" : ObjectId("5c61272206144917c514f1ab"), "nameA" : "li8" }
{ "_id" : ObjectId("5c61272206144917c514f1ac"), "nameA" : "li9" }
{ "_id" : ObjectId("5c61272206144917c514f1ad"), "nameA" : "li10" }
{ "_id" : ObjectId("5c61272206144917c514f1ae"), "nameA" : "li11" }
{ "_id" : ObjectId("5c61272206144917c514f1af"), "nameA" : "li12" }
{ "_id" : ObjectId("5c61272206144917c514f1b0"), "nameA" : "li13" }
{ "_id" : ObjectId("5c61272206144917c514f1b1"), "nameA" : "li14" }
{ "_id" : ObjectId("5c61272206144917c514f1b2"), "nameA" : "li15" }
{ "_id" : ObjectId("5c61272206144917c514f1b3"), "nameA" : "li16" }
{ "_id" : ObjectId("5c61272206144917c514f1b4"), "nameA" : "li17" }
{ "_id" : ObjectId("5c61272206144917c514f1b5"), "nameA" : "li18" }
{ "_id" : ObjectId("5c61272206144917c514f1b6"), "nameA" : "li19" }
-
關於報錯
如果在slave-node節點上的數據庫中查看,有報錯:"errmsg" : "not master and slaveOk=false"!!!
首先這是正常的,因為SECONDARY是不允許讀寫的, 在寫多讀少的應用中,使用Replica Sets來實現讀寫分離。通過在連接時指定或者在主庫指定slaveOk,由Secondary來分擔讀的壓力,Primary只承擔寫操作。對於replica set 中的secondary 節點默認是不可讀的。
解決辦法:在slave-node節點數據庫中執行"rs.slaveOk();"命令即可
在slave-node節點數據庫中發現已經同步過來了testa庫的20條數據,說明mongodb的主從復制環境已經成功了!當配置完主從服務器后,一但主服務器上的數據發生變化,從服務器也會發生變化。
-
設置mongodb的開機啟動。
首先要在系統服務目錄下創建啟動文件mongodb.servicer然后寫入一下內容
[root@localhost system]# cd /lib/systemd/system
[root@localhost system]# vi mongodb.service
[Unit]
Description=mongodb
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/mongodb.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/usr/local/mongodb/bin/mongod --shutdown
PrivateTmp=true
[Install]
WantedBy=multi-user.target
注冊到開機啟動
[root@localhost system]# systemctl enable mongodb.service
Created symlink from /etc/systemd/system/multi-user.target.wants/mongodb.service to /usr/lib/systemd/system/mongodb.service.
啟動
systemctl start mongodb.service
關閉
systemctl stop mongodb.service