内容简介:副本集的目的是实现能够持续性提供服务以及数据的异地安全备份,一般每个实例节点会存放在一个服务器节点上,这里没有那么多服务器,便在同一服务器上进行搭建,使用不同的端口创建实例。连接到该实例10. 可以看到,secondary节点已经将数据同步过来了,至此我们已经完成了基本副本集的搭建,不过,不过显而易见的是,我们在启动数据库实例的时候并没有添加--auth选项,也就是说,我们不需要任何验证就可以对数据库进行操作,这在生产环境中是不可行的,所以我们需要添加--auth选项,那我们先把三个服务实例关闭
副本集(Replica Set)是一组 MongoDB 实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成。通过Replication,将数据的更新由Primary推送到其他实例上,在一定的延迟之后,每个MongoDB实例维护相同的数据集副本。通过维护冗余的数据库副本,能够实现数据的异地备份,读写分离和自动故障转移。 早期的MongoDB版本使用master-slave,一主一从和 MySQL 类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主。目前已经淘汰master-slave模式,改为副本集,这种模式下有一个主(primary),和多个从(secondary),只读。支持给它们设置权重,当主宕掉后,权重最高的从切换为主。在此架构中还可以建立一个仲裁(arbiter)的角色,它只负责裁决,而不存储数据。此架构中读写数据都是在主上,要想实现负载均衡的目的需要手动指定读库的目标server。 以上内容引自(http://blog.51cto.com/zero01/2059033) 复制代码
二. 开始动手搭建
副本集的目的是实现能够持续性提供服务以及数据的异地安全备份,一般每个实例节点会存放在一个服务器节点上,这里没有那么多服务器,便在同一服务器上进行搭建,使用不同的端口创建实例。
1. 依次执行三条命令
`` mongod --dbpath=/home/mongodb/db/testReplPrim --logpath=/home/mongodb/logs/mongolog_testReplPrim --logappend --fork --port=27017 --replSet=testRepl ``` ``` mongod --dbpath=/home/mongodb/db/testReplSec1 --logpath=/home/mongodb/logs/mongolog_testReplSec1 --logappend --fork --port=27018 --replSet=testRepl ``` ``` mongod --dbpath=/home/mongodb/db/testReplSec2 --logpath=/home/mongodb/logs/mongolog_testReplSec2 --logappend --fork --port=27019 --replSet=testRepl ``` 复制代码
2. 选择一个mongodb实例作为primary节点,这里我们选择27017
连接到该实例
`` mongo --port 27017 ``` ``` use admin ``` 复制代码
3. 在admin下创建用户
`` db.createUser({ user:"test01", pwd:"abc123", roles:[{ role:"userAdminAnyDatabase",db:"admin" },{ role:"clusterAdmin",db:"admin" }]}) ``` ``` db.auth('test01','abc123') ``` 复制代码
4. 初始化副本集
`` rs.initiate({"_id":"testRepl","members":[{"_id":0,"host":"10.10.10.10:27017",priority:3},{"_id":1,"host":"10.10.10.10:27018",priority:2},{"_id":2,"host":"10.10.10.10:27019",priority:0,slaveDelay:86400}]}) ``` ip是随机写的,此时我们已经初始化好了mongodb副本集,其中27017是primary节点,27018和27019位secondary节点,20179实例会延时60秒同步数据。 复制代码
5. 新建一个数据库
``use testdb``` 复制代码
6. 创建一个user
``db.createUser({"user":"testdb01","pwd":"abc123",roles:[{role:"readWrite",db:"testdb"}]})``` 复制代码
7. 新增一个customers集合并加一条文档
``db.customers.insert({"name":"wang"})``` 此时,27017实例中,testdb库下的customer集合会有一条文档,在其他两个实例中也会有相同的数据 复制代码
8. 连接27018实例
``mongo --port 27018``` ```use testdb``` ```show collections``` 复制代码
9. 这时会显示:
`` 2018-11-08T16:50:10.122+0800 E QUERY [thread1] Error: listCollections failed: { "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 } : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype._getCollectionInfosCommand@src/mongo/shell/db.js:773:1 DB.prototype.getCollectionInfos@src/mongo/shell/db.js:785:19 DB.prototype.getCollectionNames@src/mongo/shell/db.js:796:16 shellHelper.show@src/mongo/shell/utils.js:753:9 shellHelper@src/mongo/shell/utils.js:650:15 @(shellhelp2):1:1 ``` 由于我们是在secondary节点,需要执行如下命令 ```rs.slaveOk()``` ```show collections``` 复制代码
10. 可以看到,secondary节点已经将数据同步过来了,至此我们已经完成了基本副本集的搭建,不过,不过显而易见的是,我们在启动数据库实例的时候并没有添加--auth选项,也就是说,我们不需要任何验证就可以对数据库进行操作,这在生产环境中是不可行的,所以我们需要添加--auth选项,那我们先把三个服务实例关闭
`` mongod --dbpath=/home/mongodb/db/testReplPrim --logpath=/home/mongodb/logs/mongolog_testReplPrim --logappend --fork --port=27017 --replSet=testRepl --shutdown ``` ``` mongod --dbpath=/home/mongodb/db/testReplSec1 --logpath=/home/mongodb/logs/mongolog_testReplSec1 --logappend --fork --port=27018 --replSet=testRepl --shutdown ``` ``` mongod --dbpath=/home/mongodb/db/testReplSec2 --logpath=/home/mongodb/logs/mongolog_testReplSec2 --logappend --fork --port=27019 --replSet=testRepl --shutdown ``` 复制代码
11. 然后分别启动三个实例
`` mongod --dbpath=/home/mongodb/db/testReplPrim --logpath=/home/mongodb/logs/mongolog_testReplPrim --logappend --fork --port=27017 --replSet=testRepl --auth ``` ``` mongod --dbpath=/home/mongodb/db/testReplSec1 --logpath=/home/mongodb/logs/mongolog_testReplSec1 --logappend --fork --port=27018 --replSet=testRepl --auth ``` ``` mongod --dbpath=/home/mongodb/db/testReplSec2 --logpath=/home/mongodb/logs/mongolog_testReplSec2 --logappend --fork --port=27019 --replSet=testRepl --auth ``` 复制代码
12. 连接primary实例节点
``mongo --port 27017``` ```use admin``` ```db.auth('test01','abc123')``` ```rs.status()``` 会看到如下状态 ``` { "set" : "testRepl", "date" : ISODate("2018-11-08T10:36:32.750Z"), "myState" : 3, "term" : NumberLong(6), "heartbeatIntervalMillis" : NumberLong(2000), "members" : [ { "_id" : 0, "name" : "59.110.11.138:25231", "health" : 1, "state" : 3, "stateStr" : "RECOVERING", "uptime" : 1002, "optime" : { "ts" : Timestamp(1541671316, 2), "t" : NumberLong(6) }, "optimeDate" : ISODate("2018-11-08T10:01:56Z"), "infoMessage" : "could not find member to sync from", "configVersion" : 1, "self" : true }, { "_id" : 1, "name" : "59.110.11.138:25232", "health" : 0, "state" : 6, "stateStr" : "(not reachable/healthy)", "uptime" : 0, "optime" : { "ts" : Timestamp(0, 0), "t" : NumberLong(-1) }, "optimeDate" : ISODate("1970-01-01T00:00:00Z"), "lastHeartbeat" : ISODate("2018-11-08T10:36:30.447Z"), "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"), "pingMs" : NumberLong(0), "authenticated" : false, "configVersion" : -1 }, { "_id" : 2, "name" : "59.110.11.138:25233", "health" : 0, "state" : 6, "stateStr" : "(not reachable/healthy)", "uptime" : 0, "optime" : { "ts" : Timestamp(0, 0), "t" : NumberLong(-1) }, "optimeDate" : ISODate("1970-01-01T00:00:00Z"), "lastHeartbeat" : ISODate("2018-11-08T10:36:30.452Z"), "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"), "pingMs" : NumberLong(0), "authenticated" : false, "configVersion" : -1 } ], "ok" : 1 } ``` 说明主节点无法建立与其他节点互访认证,那如何建立互访认证呢,就需要用到Keyfile 复制代码
三. 使用keyfile访问控制的方式建立各节点间认证机制
1. 生成keyfile
openssl rand -base64 100 > /usr/local/keyfile/mongodb_keyfile` 复制代码
2. 修改文件权限
chmod 600 /usr/local/keyfile/mongodb_keyfile` 复制代码
3. 将生成的keyfile文件拷贝到各节点的机器上,注意路径要和mongodb启动时指定的keyfile路径一致
4. 关闭三个服务实例
mongod --dbpath=/home/mongodb/db/testReplPrim --logpath=/home/mongodb/logs/mongolog_testReplPrim --logappend --fork --port=27017 --replSet=testRepl --shutdown` `mongod --dbpath=/home/mongodb/db/testReplSec1 --logpath=/home/mongodb/logs/mongolog_testReplSec1 --logappend --fork --port=27018 --replSet=testRepl --shutdown` `mongod --dbpath=/home/mongodb/db/testReplSec2 --logpath=/home/mongodb/logs/mongolog_testReplSec2 --logappend --fork --port=27019 --replSet=testRepl --shutdown` 复制代码
5. 重启三个服务实例
mongod --dbpath=/home/mongodb/db/testReplPrim --logpath=/home/mongodb/logs/mongolog_testReplPrim --logappend --fork --port=27017 --replSet=testRepl keyFile=/usr/local/keyfile/mongodb_keyfile --auth` `mongod --dbpath=/home/mongodb/db/testReplSec1 --logpath=/home/mongodb/logs/mongolog_testReplSec1 --logappend --fork --port=27018 --replSet=testRepl keyFile=/usr/local/keyfile/mongodb_keyfile --auth` `mongod --dbpath=/home/mongodb/db/testReplSec2 --logpath=/home/mongodb/logs/mongolog_testReplSec2 --logappend --fork --port=27019 --replSet=testRepl keyFile=/usr/local/keyfile/mongodb_keyfile--auth` 复制代码
6. 连接端口为21071实例
mongo --port 27017` `use admin` `db.auth('test01','abc123')` `rs.status()` 复制代码
大功告成,此时我们在主节点添加数据时,在secondary节点就可以同步显示出来,27019节点延时60秒,这里不再做演示。ok,为什么贴这么多命令呢而没有太多的讲解呢,直观(懒)嘛,跟着命令搞一遍自然就懂了,具体细节看起来就容易了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
ACM国际大学生程序设计竞赛
俞勇 编 / 2012-12 / 29.00元
《ACM国际大学生程序设计竞赛:知识与入门》适用于参加ACM国际大学生程序设计竞赛的本科生和研究生,对参加青少年信息学奥林匹克竞赛的中学生也很有指导价值。同时,作为程序设计、数据结构、算法等相关课程的拓展与提升,《ACM国际大学生程序设计竞赛:知识与入门》也是难得的教学辅助读物。一起来看看 《ACM国际大学生程序设计竞赛》 这本书的介绍吧!