MongoDB 复制(副本集)学习

mac2022-06-30  18

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@localhost bin]$ ./mongo

要管理配置,所以切换到admin上:>use admin(配置是json格式)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.1var 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)查看刚才的配置。然后执行初始化:>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@localhost bin]$ ./mongo --port=27018,即切换到rs2:SECONDARY>状态。

测试:在主服务上,创建库和集合,rs2:PRIMARY> use studentswitched to db studentrs2: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默认不允许读写:>rs.slaveOk();然后就可以看到主服务器创建的库和集合了。同理27019也需要执行这个命令才能自动同步和读写。

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

shell脚本:

#!/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)

 

转载于:https://www.cnblogs.com/gyfluck/p/9816943.html

最新回复(0)