溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

mongodb主從復(fù)制安裝文檔

發(fā)布時(shí)間:2020-07-19 06:51:17 來(lái)源:網(wǎng)絡(luò) 閱讀:811 作者:linuxblind 欄目:MongoDB數(shù)據(jù)庫(kù)
  • 環(huán)境說(shuō)明

IPRole
10.240.216.151master
10.240.216.152slave(standby master)
10.240.216.153slave


  • mongodb下載與安裝

  • 在10.240.216.151(主庫(kù))上

# wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-2.0.4.tgz

(如果不能正常下載,可以直接從瀏覽器下載下來(lái),然后傳到服務(wù)器上)

# tar -zxf mongodb-linux-x86_64-2.0.4.tgz-C /usr/local/

# mkdir -p /data/{db/geomaster/,log}

# touch /data/log/geomaster.log

# cd /usr/local/

# mv mongodb-linux-x86_64-2.0.4 mongodb

# /usr/local/mongodb/bin/mongod --fork--port 4000 --master --dbpath /data/db/geomaster/ --logpath /data/log/geomaster.log--logappend   啟動(dòng)數(shù)據(jù)庫(kù)

# kill -2 `ps -ef |grep mongod |grep -vgrep |awk '{print $2}'`    關(guān)閉數(shù)據(jù)庫(kù)

  • 在10.240.216.152 和 10.240.216.153(備庫(kù))上

# wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-2.0.4.tgz

(如果不能正常下載,可以直接從瀏覽器下載下來(lái),然后傳到服務(wù)器上)

# tar -zxf mongodb-linux-x86_64-2.0.4.tgz-C /usr/local/

# mkdir -p /data/{db/geoslave/,log}

# touch /data/log/geosalve.log

# cd /usr/local/

# mv mongodb-linux-x86_64-2.0.4 mongodb

# /usr/local/mongodb/bin/mongod --fork--port 4000 --slave --source 10.240.216.151:4000 --dbpath /data/db/geoslave/--logpath /data/log/geosalve.log --logappend --nojournal      啟動(dòng)數(shù)據(jù)庫(kù)

# kill -2 `ps -ef |grep mongod |grep -vgrep |awk '{print $2}'`    關(guān)閉數(shù)據(jù)庫(kù)

 

  • 驗(yàn)證

  • 在主庫(kù)上

# /usr/local/mongodb/bin/mongo127.0.0.1:4000

> db.runCommand ( {"isMaster": 1 } )

{ "ismaster" : true,"maxBsonObjectSize" : 16777216, "ok" : 1 }

  • 在備庫(kù)上

# /usr/local/mongodb/bin/mongo127.0.0.1:4000

> db.runCommand ( {"isMaster": 1 } )

{

        "ismaster" : 0,

        "info" : "dead: data toostale halted replication",

        "maxBsonObjectSize" :16777216,

        "ok" : 1

}

> use local

switched to db local

> db.sources.find()

{ "_id" :ObjectId("55ebfa53ecf735439d6bafeb"), "host" :"10.240.216.151:4000", "source" : "main","syncedTo" : { "t" : 1441528400000, "i" : 1 } }

 

  • 在主庫(kù)上創(chuàng)建庫(kù)和表以及添加一條數(shù)據(jù)

> use mydb

switched to db mydb

> db

mydb

>db.mydb.user.insert({"username":"zdh"});

> db.mydb.user.find();

{ "_id" :ObjectId("55ebfc2d92e237c3cb30ef9a"), "username" :"zdh" }

> show dbs;

local   6.2001953125GB

mydb    0.203125GB

  • 在從庫(kù)上檢查數(shù)據(jù)同步情況

> show dbs;

local   0.203125GB

mydb    0.203125GB

> use mydb

switched to db mydb

> db.mydb.user.find()

{"_id" : ObjectId("55ebfc2d92e237c3cb30ef9a"),"username" : "zdh" }


以上輸出結(jié)果表示OK

 

對(duì)于上面這種master-slave結(jié)構(gòu)有一個(gè)很重要的缺陷就是當(dāng)主庫(kù)掛掉后,從庫(kù)要晉升為主庫(kù)時(shí),需要手動(dòng)做大量的工作才行,具體步驟有:

1. 停掉其中一臺(tái)slave,然后重新以master的身份啟動(dòng)(晉升10.240.216.152為主庫(kù))

# kill -2 `ps -ef |grep mongod |grep -vgrep |awk '{print $2}'`

# /usr/local/mongodb/bin/mongod --fork--port 4000 --master --dbpath /data/db/geoslave/ --logpath/data/log/geosalve.log –logappend

2. 如果不能找到研發(fā)修改代碼指向新的主庫(kù)IP,那么可以將原主庫(kù)關(guān)機(jī)并將其的IP切到新主庫(kù)服務(wù)器上(切IP場(chǎng)景,這種情況下slave端不需要重啟mongodb進(jìn)程,此時(shí)原主庫(kù)將不能啟動(dòng),這是一個(gè)問(wèn)題)

# ifconfig bond0:1 10.240.216.151 netmask255.255.255.0 up

# arping -I bond0 -c 3 -s 10.240.216.15110.240.216.254

3. 將從庫(kù)10.240.216.153指向新的主庫(kù),需要先停掉mongodb,然后source指向新主庫(kù)啟動(dòng)(在不切IP的情況下操作)

# kill -2 `ps -ef |grep mongod |grep -vgrep |awk '{print $2}'`

# rm -f /data/db/geoslave/mongod.lock /data/db/geoslave/local.*

# /usr/local/mongodb/bin/mongod --fork--port 4000 --slave --source 10.240.216.152:4000 --dbpath /data/db/geoslave/--logpath /data/log/geosalve.log --logappend –nojournal

# /usr/local/mongodb/bin/mongo127.0.0.1:4000

> use local

switched to db local

> db.sources.find()

{ "_id" :ObjectId("55ec04dadfd5d65f2f7fe404"), "host" :"10.240.216.152:4000", "source" : "main","syncedTo" : { "t" : 1441531234000, "i" : 1 } }

 

  • 針對(duì)以上操作復(fù)雜的過(guò)程,我們作如下優(yōu)化

  • 在主庫(kù)10.240.216.151上執(zhí)行

# /usr/local/mongodb/bin/mongod--fork --port 4000 --dbpath /data/db/geomaster/ --logpath/data/log/geomaster.log --logappend --master

  • 在從庫(kù)(備主)10.240.216.152上執(zhí)行

# /usr/local/mongodb/bin/mongod--fork --port 4000 --master --slave --dbpath /data/db/geoslave/ --logpath/data/log/geosalve.log –logappend

# /usr/local/mongodb/bin/mongo127.0.0.1:4000

> use local

switched to db local

> db.sources.find()

>db.sources.insert({"host":"10.240.216.151:4000"});

> db.sources.find()

{ "_id" :ObjectId("55ec120751fd14c6b2f23a18"), "host" :"10.240.216.151:4000" }

> db.sources.find()       隔30秒左右

{ "_id" :ObjectId("55ec120751fd14c6b2f23a18"), "host" :"10.240.216.151:4000", "source" : "main", "syncedTo": { "t" : 1441534596000, "i" : 1 } }

  • 在從庫(kù)10.240.216.153上執(zhí)行

#/usr/local/mongodb/bin/mongod --fork --port 4000 --slave  --dbpath /data/db/geomaster/ --logpath/data/log/geosalve.log --logappend –nojournal

# /usr/local/mongodb/bin/mongo127.0.0.1:4000

> use local

switched to db local

> db.sources.find()

>db.sources.insert({"host":"10.240.216.151:4000"})

>db.sources.insert({"host":"10.240.216.152:4000"})

> db.sources.find()

{ "_id" :ObjectId("55ec127a1924006f4e8b2e97"), "host" : "10.240.216.151:4000","source" : "main", "syncedTo" : { "t" :1441534586000, "i" : 1 } }

{ "_id" :ObjectId("55ec127e1924006f4e8b2e98"), "host" :"10.240.216.152:4000", "source" : "main","syncedTo" : { "t" : 1441534593000, "i" : 1 } }

 

以上配置完成。就實(shí)現(xiàn)了當(dāng)主庫(kù)10.240.216.151掛掉后,備用主庫(kù)10.240.216.152可以直接提供對(duì)外的服務(wù),無(wú)需重啟mongodb進(jìn)程,并且從庫(kù)無(wú)需作任何更改。

 

  • 驗(yàn)證

  • 在主庫(kù)10.240.216.151上

> show dbs

local   6.2001953125GB

mydb    0.203125GB

> use mydb

switched to db mydb

>db.mydb.user.insert({"username":"zhongguo","age":"26"})

> db.mydb.user.find()

{ "_id" :ObjectId("55ec12e4bab480b5485dd72e"), "username" :"zhongguo", "age" : "26" }

>db.mydb.user.insert({"username":"zhongguo2","age":"30"})

 

  • 在從庫(kù)(備主)10.240.216.152上

> use mydb

switched to db mydb

> db.mydb.user.find()

{ "_id" :ObjectId("55ec12e4bab480b5485dd72e"), "username" :"zhongguo", "age" : "26" }

> db.mydb.user.insert({"username":"finished","time":"2015-09-06"})

> db.mydb.user.find()

{ "_id" : ObjectId("55ec12e4bab480b5485dd72e"),"username" : "zhongguo", "age" : "26" }

{ "_id" : ObjectId("55ec133e51fd14c6b2f23a19"),"username" : "finished", "time" :"2015-09-06" }

> db.mydb.user.find()

{ "_id" :ObjectId("55ec12e4bab480b5485dd72e"), "username" :"zhongguo", "age" : "26" }

{ "_id" :ObjectId("55ec133e51fd14c6b2f23a19"), "username" :"finished", "time" : "2015-09-06" }

{ "_id" :ObjectId("55ec136abab480b5485dd72f"), "username" :"zhongguo2", "age" : "30" }

 

  • 在從庫(kù)10.240.216.153上

> use mydb

switched to db mydb

> db.mydb.user.find()

{ "_id" :ObjectId("55ec12e4bab480b5485dd72e"), "username" :"zhongguo", "age" : "26" }

> db.mydb.user.find()

{ "_id" : ObjectId("55ec12e4bab480b5485dd72e"),"username" : "zhongguo", "age" : "26" }

{ "_id" : ObjectId("55ec133e51fd14c6b2f23a19"),"username" : "finished", "time" :"2015-09-06" }

> db.mydb.user.find()

{ "_id" : ObjectId("55ec12e4bab480b5485dd72e"),"username" : "zhongguo", "age" : "26" }

{ "_id" :ObjectId("55ec133e51fd14c6b2f23a19"), "username" :"finished", "time" : "2015-09-06" }

{ "_id" :ObjectId("55ec136abab480b5485dd72f"), "username" :"zhongguo2", "age" : "30" }

上面的結(jié)果說(shuō)明,備用從庫(kù)是即可生效的,需要保證的是我們的寫(xiě)是確保從主庫(kù)上寫(xiě)入的。


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI