好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

MongoDB 复制(副本集)学习笔记

本文实例讲述了MongoDB 复制(副本集)。分享给大家供大家参考,具体如下:

replication set复制集,
复制集,多台服务器维护相同的数据副本,提高服务器的可用性。
MongoDB复制是将数据同步在多个服务器的过程。
复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
复制还允许您从硬件故障和服务中断中恢复数据。

设置过程:

(1)创建示例

假设创建三台,创建三个实例目录和日志目录:
mkdir /home/m17 /home/m18 /home/m19 /home/mlog
启动三个示例,端口分别为27017、27018、27019。

?

1

2

3

. /mongod --dbpath= /home/m17 --logpath= /home/mlog/m17 .log --fork --port=27017 --replSet=rs2 --smallfiles

. /mongod --dbpath= /home/m18 --logpath= /home/mlog/m18 .log --fork --port=27018 --replSet=rs2 --smallfiles

. /mongod --dbpath= /home/m19 --logpath= /home/mlog/m19 .log --fork --port=27019 --replSet=rs2 --smallfiles

说明:

参数--replSet设置一样,才能属于同一个复制集
参数--smallfiles可以节省空间,提高速度。

然后使用ps aux | grep mongo可以查看到启动起来的三个端口。

(2)配置

使用客户端连接mongo进行配置:

?

1

[ test @localhost bin]$ . /mongo

要管理配置,所以切换到admin上:

?

1

>use admin

(配置是json格式)

?

1

2

3

4

5

6

7

8

var rsconf = {

_id: 'rs2' ,

members:[

{ "_id" :0,host: '192.168.8.172:27017' },

{_id:1,host: '192.168.8.172:27018' },

{_id:2,host: '192.168.8.172:27019' }

]

}

如果没有配置ip,使用127.0.0.1

?

1

2

3

4

5

6

7

8

var rsconf = {

_id: 'rs2' ,

members:[

{_id:0,host: '127.0.0.1:27017' },

{_id:1,host: '127.0.0.1:27018' },

{_id:2,host: '127.0.0.1:27019' }

]

}

执行后,使用 printjson(rsconf)查看刚才的配置。

然后执行初始化:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

>rs.initiate(rsconf);

> rs.initiate(rsconf);

{

"ok" : 1,

"operationTime" : Timestamp(1539933041, 1),

"$clusterTime" : {

"clusterTime" : Timestamp(1539933041, 1),

"signature" : {

"hash" : BinData(0, "AAAAAAAAAAAAAAAAAAAAAAAAAAA=" ),

"keyId" : NumberLong(0)

}

}

}

rs2:SECONDARY>

查看节点:

?

1

rs.status()

删除节点:

?

1

rs.remove( '127.0.0.1:27019' )

添加节点:

?

1

rs.add( '127.0.0.1:27019' )

切换节点:

默认是在27017端口,即rs2:PRIMARY>状态,
退出mongo客户端命令模式,
切换到另一个端口:

?

1

[ test @localhost bin]$ . /mongo --port=27018,

即切换到rs2:SECONDARY>状态。

测试:

在主服务上,创建库和集合,

?

1

2

3

4

5

6

rs2:PRIMARY> use student

switched to db student

rs2:PRIMARY> db.user.insert({uid:1,name: 'zhang san' })

WriteResult({ "nInserted" : 1 })

rs2:PRIMARY> db.user. find ();

{ "_id" : ObjectId( "5bc9889f85a0986431fd2499" ), "uid" : 1, "name" : "zhang san" }

去从服务上查看

show dbs

然后看到有错误,具体错误信息是:

...
"errmsg" : "not master and slaveOk=false",
...

是因为slave默认不允许读写:

?

1

>rs.slaveOk();

然后就可以看到主服务器创建的库和集合了。

同理27019也需要执行这个命令才能自动同步和读写。

当主服务器27017停掉的时候,
第二个27018就自动变成主服务器master状态。
但是27019需要再次执行rs.slaveOk()才能自动同步读写。

shell脚本:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#!/bin/bash

IP=127.0.0.1

NA=rs2

sudo mkdir -p /home/m17 /home/m18 /home/m19 /home/mlog

sudo chmod -R 777 /home/m17 /home/m18 /home/m19 /home/mlog

. /mongod --dbpath= /home/m17 --logpath= /home/mlog/m17 .log --fork --port=27017 --replSet=${NA} --smallfiles

. /mongod --dbpath= /home/m18 --logpath= /home/mlog/m18 .log --fork --port=27018 --replSet=${NA} --smallfiles

. /mongod --dbpath= /home/m19 --logpath= /home/mlog/m19 .log --fork --port=27019 --replSet=${NA} --smallfiles

. /mongo <<EOF

use admin

var rsconf = {

_id: 'rs2' ,

members:[

{_id:0,host: '${IP}:27017' },

{_id:1,host: '${IP}:27018' },

{_id:2,host: '${IP}:27019' }

]

}

rs.initiate(rsconf)

希望本文所述对大家MongoDB数据库程序设计有所帮助。

原文链接:https://HdhCmsTestcnblogs测试数据/gyfluck/p/9816943.html

查看更多关于MongoDB 复制(副本集)学习笔记的详细内容...

  阅读:23次