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 }
{ "ok" : 1 }
作者:syl_json
链接:https://www.imooc.com/article/285856
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合