mongdb 副本集

二,mongo  副本集

副本集也是一個主從的同步,不過他支持主從的自動切換

這裏的master不是固定的,因爲副本集會根據選舉來決定誰是master,而且,當一個master掛掉以後,會進行重新選舉,選出新master,踢掉掛掉的機器

配置步驟:

hostname   rac1.example.com   192.168.78.130

hostname   rac2.example.com   192.168.78.131

首先每個機器的/etc/hosts 文件中,都有服務器ip對應的主機名

步驟一:

在130上

啓動mongo:

. [root@rac1 bin]# ./mongod --dbpath=/root/data --logpath=/root/data/mongo.log --logappend --fork --port=10001  --replSet test/rac1.example.com:10001

forked process: 6661

all output going to: /root/data/mongo.log

child process started successfully, parent exiting

在131上:

[root@rac2 bin]# ./mongod --dbpath=/root/data --logpath=/root/data/mongo.log --logappend --fork --port=10002 --replSet test/rac2.example.com:10002

forked process: 5617

all output going to: /root/data/mongo.log

child process started successfully, parent exiting

下面進行初始化

> use admin

switched to db admin

> db.runCommand({"replSetInitiate":{"_id":"test","member":[{"_id":1,"host":"rac1.example.com:10001"},{"_id":2,"host":"rac2.example.com:10002"}]}})

如果在這裏報錯了,是因爲沒有初始化成功,我們需要使用rs.initiate() 進行初始化

> rs.initiate()

{

        "info2" : "no configuration explicitly specified -- making one",

        "me" : "rac1.example.com:10001",

        "info" : "Config now saved locally.  Should come online in about a minute.",

        "ok" : 1

}

成功後,我們查看一下,會發現提示符已經變化了,提示符的前面test表示這個副本集的名字,後面表示primary

test:PRIMARY> use local     

switched to db local

test:PRIMARY> show dbs

local   0.140625GB

pincer  0.0625GB

test:PRIMARY> show collections

oplog.$main

oplog.rs

slaves

system.indexes

system.replset

通過system.replset去查看狀態

test:PRIMARY> db.system.replset.find()

{ "_id" : "test", "version" : 1, "members" : [ { "_id" : 0, "host" : "rac1.example.com:10001" } ] }

這裏可以看到,這裏只有一個member  rac1  但是rac2不見了

我們去rac2 機器上,發現這裏還是沒有加入,  

通過rs命令,我們去rac1上執行

新加,則用rs.add("rac2.example.com:10002"))

}

test:PRIMARY> rs.add("rac2.example.com:10002")

然後過一會,發現rac2上的狀態變了

test:STARTUP2> 

test:SECONDARY>

通過提示符,可以看到狀態從startup 變成secondary了

然後再查看一下狀態

test:SECONDARY> rs.status()

{

        "set" : "test",

        "date" : ISODate("2013-08-08T02:24:07Z"),

        "myState" : 2,

        "syncingTo" : "rac1.example.com:10001",

        "members" : [

                {

                        "_id" : 0,

                        "name" : "rac1.example.com:10001",

                        "health" : 1,

                        "state" : 1,

                        "stateStr" : "PRIMARY",

                        "uptime" : 54,

                        "optime" : Timestamp(1376785130000, 1),

                        "optimeDate" : ISODate("2013-08-18T00:18:50Z"),

                        "lastHeartbeat" : ISODate("2013-08-08T02:24:05Z"),

                        "pingMs" : 1

                },

                {

                        "_id" : 1,

                        "name" : "rac2.example.com:10002",

                        "health" : 1,

                        "state" : 2,

                        "stateStr" : "SECONDARY",

                        "uptime" : 1514,

                        "optime" : Timestamp(1376785130000, 1),

                        "optimeDate" : ISODate("2013-08-18T00:18:50Z"),

                        "self" : true

                }

        ],

        "ok" : 1

}

也可以使用一下方法初始化

cfg={"_id":1,members:[{"_id":1,"host":"rac1.example.com:10001"},{"_id":2,"host":"rac2.example.com:10002"}]}

rs.initiate(cfg)

新加,則用rs.add("rac2.example.com:10002"))

下面做個自動切換,到130 上去關閉mongo

test:PRIMARY> use admin

switched to db admin

test:PRIMARY> db.shutdownServer()

Sun Aug 18 08:46:45 DBClientCursor::init call() failed

Sun Aug 18 08:46:45 query failed : admin.$cmd { shutdown: 1.0 } to: 127.0.0.1:10001

server should be down...

Sun Aug 18 08:46:45 trying reconnect to 127.0.0.1:10001

Sun Aug 18 08:46:45 reconnect 127.0.0.1:10001 failed couldn't connect to server 127.0.0.1:10001

> exit

bye

然後到131上,過1分總登陸上去

[root@rac2 bin]# ./mongo rac2.example.com:10002/admin

MongoDB shell version: 2.2.2

connecting to: rac2.example.com:10002/admin

test:PRIMARY>

這時提示符都已經變成primary了,可以在這裏插入和查詢了

從下面可以看到,rac1的statestr變成了"SECONDARY"

test:PRIMARY> rs.status()

{

        "set" : "test",

        "date" : ISODate("2013-08-08T02:58:19Z"),

        "myState" : 1,

        "members" : [

                {

                        "_id" : 0,

                        "name" : "rac1.example.com:10001",

                        "health" : 1,

                        "state" : 2,

                        "stateStr" : "SECONDARY",

                        "uptime" : 374,

                        "optime" : Timestamp(1376786436000, 1),

                        "optimeDate" : ISODate("2013-08-18T00:40:36Z"),

                        "lastHeartbeat" : ISODate("2013-08-08T02:58:18Z"),

                        "pingMs" : 1

                },

                {

                        "_id" : 1,

                        "name" : "rac2.example.com:10002",

                        "health" : 1,

                        "state" : 1,

                        "stateStr" : "PRIMARY",

                        "uptime" : 3566,

                        "optime" : Timestamp(1376786436000, 1),

                        "optimeDate" : ISODate("2013-08-18T00:40:36Z"),

                        "self" : true

                }

        ],

        "ok" : 1

}

也可以使用一下方法初始化

cfg={"_id":1,members:[{"_id":1,"host":"rac1.example.com:10001"},{"_id":2,"host":"rac2.example.com:10002"}]}

rs.initiate(cfg)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章