Mongodb副本集部署

 副本集的创建

主机:
192.168.1.101   primary
192.168.1.102   secondary
192.168.1.103   arbiter
配置文件:(其他节点配置一样,只需要更改bind_ip即可)
#绑定的端口
port=27017
#服务实例绑定的IP
bind_ip = 192.168.1.103
#mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
dbpath=/var/lib/mongo
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
logpath=/var/log/mongodb/mongo.log
#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
logappend=true
#指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
pidfilepath=/var/run/mongodb/mongod.pid
#启用在后台运行mongos或mongod进程的守护进程模式
fork=true
#副本集的名称
replSet =hqmongodb
#oplogsize大小设置oplog不是无限大,默认如果不手动设置,那么oplogSize就是磁盘空间的5%。超过了5%,oplog会被覆盖
oplogSize=10000
启动节点服务
/usr/bin/mongod -f /etc/mongod.conf
初始化配置副本集和主节点
use admin
config
={ _id:'hqmongodb', members:[ {_id:1, host:'192.168.1.100:27011',priority:2}, {_id:2, host:'192.168.1.101:27012',priority:1}, {_id:3, host:'192.168.1.102:27013',arbiterOnly:true} ] } rs.initiate(config) “ok”的值为1,说明创建成功。

_id:'hqmongodb'表示副本集名称,与前面conf配置文件中的replSet参数配置的名称要一致。

priority:2表示优先级,优先级越高,副本集初始化时会选举为主库。

arbiterOnly:true表示该实例为仲裁节点,不存储数据,只参与投票。

查看副本集的配置内容
rs.conf()
说明:
1) "_id" : "hqmongodb" :副本集的配置数据存储的主键值,默认就是副本集的名字
2) "members" :副本集成员数组,此时只有一个: "host" : "180.76.159.126:27017" ,该成员不
是仲裁节点: "arbiterOnly" : false ,优先级(权重值): "priority" : 1,
3) "settings" :副本集的参数配置。
查看副本集状态
rs.status()
说明:
1) "set" : "hqmongodb" :副本集的名字
2) "myState" : 1:说明状态正常
3) "members" :副本集成员数组,此时有: "name" : "192.168.1.101:27017" ,该成员的
角色是 "stateStr" : "PRIMARY", 该节点是健康的: "health" : 1 。
添加副本从节点
rs.add("180.76.159.126:27018")
说明:
1) "ok" : 1 :说明添加成功。

添加仲裁从节点

rs.addArb("192.168.1.103:27019")
删除副本从节点
rs.remove("180.76.159.126:27018") 
说明:
1) "ok" : 1 :说明添加成功。

 副本集的数据读写操作

登录主节点192.168.1.100,写入和读取数据:
[root@bobohost ~]# /usr/local/mongodb/bin/mongo --host 192.168.1.100 --port27017
myrs:PRIMARY> use articledb
switched to db articledb
myrs:PRIMARY> db
articledb
myrs:PRIMARY> db.comment.insert({"articleid":"100000","content":"今天天气真好,阳光明媚","userid":"1001","nickname":"Rose","createdatetime":new Date()})
WriteResult({ "nInserted" : 1 })
myrs:PRIMARY> db.comment.find()
{ "_id" : ObjectId("5d4d2ae3068138b4570f53bf"), "articleid" : "100000","content" : "今天天气真好,阳光明媚", "userid" : "1001", "nickname" : "Rose","createdatetime" : ISODate("2019-08-09T08:12:19.427Z") }
登录从节点
[root@bobohost ~]# /usr/local/mongodb/bin/mongo --host 192.168.1.101 --port 27018
myrs:SECONDARY> show dbs;
2019-09-10T10:56:51.953+0800 E QUERY  [js] Error: listDatabases failed:{
    "operationTime" : Timestamp(1568084204, 1),
    "ok" : 0,
    "errmsg" : "not master and slaveOk=false",
    "code" : 13435,
    "codeName" : "NotMasterNoSlaveOk",
    "$clusterTime" : {
        "clusterTime" : Timestamp(1568084204, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
       }
   }
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:139:1
shellHelper.show@src/mongo/shell/utils.js:882:13
shellHelper@src/mongo/shell/utils.js:766:15
@(shellhelp2):1:1
发现,不能读取集合的数据。当前从节点只是一个备份,不是奴隶节点,无法读取数据,写当然更不行。
因为默认情况下,从节点是没有读写权限的,可以增加读的权限,但需要进行设置。
设置读操作权限:
rs.slaveOk()
#或
rs.slaveOk(true)

提示:
该命令是 db.getMongo().setSlaveOk() 的简化命令。
【示例】
在192.168.1.102上设置作为奴隶节点权限,具备读权限:

rs:SECONDARY> rs.slaveOk()

此时,在执行查询命令,运行成功!
但仍然不允许插入。

myrs:SECONDARY> rs.slaveOk()
myrs:SECONDARY> show dbs;
admin    0.000GB
articledb  0.000GB
config   0.000GB
local    0.000GB
myrs:SECONDARY> use articledb
switched to db articledb
myrs:SECONDARY> show collections
comment
myrs:SECONDARY> db.comment.find()
{ "_id" : ObjectId("5d7710c04cfd7eee2e3cdabe"), "articleid" : "100000",
"content" : "今天天气真好,阳光明媚", "userid" : "1001", "nickname" : "Rose",
"createdatetime" : ISODate("2019-09-10T02:56:00.467Z") }
myrs:SECONDARY> db.comment.insert({"_id":"1","articleid":"100001","content":"我们
不应该把清晨浪费在手机上,健康很重要,k一杯温水幸福你我
他。","userid":"1002","nickname":"相忘于江湖","createdatetime":new Date("2019-08-
05T22:08:15.522Z"),"likenum":NumberInt(1000),"state":"1"})
WriteCommandError({
    "operationTime" : Timestamp(1568084434, 1),
    "ok" : 0,
    "errmsg" : "not master",
    "code" : 10107,
    "codeName" : "NotMaster",
    "$clusterTime" : {
        "clusterTime" : Timestamp(1568084434, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
       }
   }
})

现在可实现了读写分离,让主插入数据,让从来读取数据。
如果要取消作为奴隶节点的读权限:

myrs:SECONDARY> rs.slaveOk(false)
myrs:SECONDARY> db.comment.find()
Error: error: {
    "operationTime" : Timestamp(1568084459, 1),
    "ok" : 0,
    "errmsg" : "not master and slaveOk=false",
    "code" : 13435,
    "codeName" : "NotMasterNoSlaveOk",
    "$clusterTime" : {
        "clusterTime" : Timestamp(1568084459, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
       }
   }
}

仲裁者节点,不存放任何业务数据的,可以登录查看

[root@bobohost ~]# /usr/local/mongodb/bin/mongo --host 192.168.1.102 --port 27019
myrs:ARBITER> rs.slaveOk()
myrs:ARBITER> show dbs
local  0.000GB
myrs:ARBITER> use local
switched to db local
myrs:ARBITER> show collections
replset.minvalid
replset.oplogTruncateAfterPoint
startup_log
system.replset
system.rollback.id
myrs:ARBITER>

发现,只存放副本集配置等数据。

【了解】修改优先级
比如,下面提升从节点的优先级:
1)先将配置导入cfg变量

myrs:SECONDARY> cfg=rs.conf()

2 )然后修改值(ID号默认从0开始):

myrs:SECONDARY> cfg.members[1].priority=2
2

3 )重新加载配置 稍等片刻就会重新开始选举

myrs:SECONDARY> rs.reconfig(cfg)
{ "ok" : 1 }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


作者:syl_json
链接:https://www.imooc.com/article/285856
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合

posted @ 2020-08-03 11:56  fat_girl_spring  阅读(284)  评论(0编辑  收藏  举报