学堂 学堂 学堂公众号手机端

MongoDB中副本集的示例分析

lewis 1年前 (2024-03-26) 阅读数 6 #技术

这篇文章主要介绍了MongoDB中副本集的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

具体如下:

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


设置过程:

(1)创建示例

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

./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进行配置:

[test@localhostbin]$./mongo

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

>useadmin

(配置是json格式)

varrsconf={
_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

varrsconf={
_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)查看刚才的配置。

然后执行初始化:

>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>

查看节点:

rs.status()

删除节点:

rs.remove('127.0.0.1:27019')

添加节点:

rs.add('127.0.0.1:27019')

切换节点:

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

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

即切换到rs2:SECONDARY>状态。

测试:

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

rs2:PRIMARY>usestudent
switchedtodbstudent
rs2:PRIMARY>db.user.insert({uid:1,name:'zhangsan'})
WriteResult({"nInserted":1})
rs2:PRIMARY>db.user.find();
{"_id":ObjectId("5bc9889f85a0986431fd2499"),"uid":1,"name":"zhangsan"}

去从服务上查看

show dbs

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

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

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

>rs.slaveOk();

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

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

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

shell脚本:

#!/bin/bash
IP=127.0.0.1
NA=rs2
sudomkdir-p/home/m17/home/m18/home/m19/home/mlog
sudochmod-R777/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
useadmin
varrsconf={
_id:'rs2',
members:[
{_id:0,host:'${IP}:27017'},
{_id:1,host:'${IP}:27018'},
{_id:2,host:'${IP}:27019'}
]
}
rs.initiate(rsconf)

感谢你能够认真阅读完这篇文章,希望小编分享的“MongoDB中副本集的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持博信,关注博信行业资讯频道,更多相关知识等着你来学习!

版权声明

本文仅代表作者观点,不代表博信信息网立场。

热门