mongodb 3.4 副本集副本集和副本集分片的区别

详解MongoDB中用sharding将副本集分配至服务器集群的方法
作者:lucifercn
字体:[ ] 类型:转载 时间:
副本集是MongoDB的主从复制中的重要功能,经常被用来作额外的备份,这里我们就来详解MongoDB中用sharding将副本集分配至服务器集群的方法,首先还是来回顾一下MongoDB中副本集的基本知识:
关于副本集
副本集是一种在多台机器同步数据的进程。
副本集体提供了数据冗余,扩展了数据可用性。在多台服务器保存数据可以避免因为一台服务器导致的数据丢失。
也可以从硬件故障或服务中断解脱出来,利用额外的数据副本,可以从一台机器致力于灾难恢复或者备份。
在一些场景,可以使用副本集来扩展读性能。客户端有能力发送读写操作给不同的服务器。
也可以在不同的数据中心获取不同的副本来扩展分布式应用的能力。
mongodb副本集是一组拥有相同数据的mongodb实例,主mongodb接受所有的写操作,所有的其他实例可以接受主实例的操作以保持数据同步。
主实例接受客户可的写操作,副本集只能有一个主实例,因为为了维持数据一致性,只有一个实例可写,主实例的日志保存在oplog。
Client Application Driver
|Replication|Replication
二级节点复制主节点的oplog然后在自己的数据副本上执行操作,二级节点是主节点数据的反射,如果主节点不可用,会选举一个新的主节点。默认读操作是在主节点进行的,但是可以指定读取首选项参数来指定读操作到副本节点。
可以添加一个额外的仲裁节点(不拥有被选举权),使副本集节点保持奇数,确保可以选举出票数不同的直接点。仲裁者并不需要专用的硬件设备。
仲裁者节点一直会保存仲裁者身份。
1.异步复制
副本节点同步直接点操作是异步的,然而会导致副本集无法返回最新的数据给客户端程序。
2.自动故障转移
如果主节点10s以上与其他节点失去通信,其他节点将会选举新的节点作为主节点。
拥有大多数选票的副节点会被选举为主节点。
副本集提供了一些选项给应用程序,可以做一个成员位于不同数据中心的副本集。
也可以指定成员不同的优先级来控制选举。
sharding转换一个副本集为分片集群
1. 部署一个测试副本集
创建第一个副本集实例,名称为firstset:
1.1 创建副本集并且插入数据如下:
/data/example/firstset1
/data/example/firstset2
/data/example/firstset3
mkdir -p /data/example/firstset1 /data/example/firstset2 /data/example/firstset3
1.2 在其他终端启动三个mongodb实例,如下:
mongod --dbpath /data/example/firstset1 --port 10001 --replSet firstset --oplogSize 700 --rest --fork --logpath /data/example/firstset1/firstset1.log --logappend --nojournal --directoryperdb
mongod --dbpath /data/example/firstset2 --port 10002 --replSet firstset --oplogSize 700 --rest --fork --logpath /data/example/firstset2/firstset2.log --logappend --nojournal --directoryperdb
mongod --dbpath /data/example/firstset3 --port 10003 --replSet firstset --oplogSize 700 --rest --fork --logpath /data/example/firstset3/firstset3.log --logappend --nojournal --directoryperdb
--oplog选项强制每个mongodb实例操作日志为700M,不使用该参数则默认为分区空间的5%,限制oplog的大小,可以使每个实例启动的快一点。
1.3 连接一个mongodb实例的shell
mongo mongo01:10001/admin
如果是运行在生产环境下,或者不同主机名或IP的机器上,需要修改mongo01为指定名称。
1.4 在mongo shell上初始化副本集
var config = {
"_id" : "firstset",
"members" : [
{"_id" : 0, "host" : "mongo01:10001"},
{"_id" : 1, "host" : "mongo01:10002"},
{"_id" : 2, "host" : "mongo01:10003"},
rs.initiate(config);
"info" : "Config now saved locally. Should come online in about a minute.",
db.runCommand(
{"replSetInitiate" :
{"_id" : "firstset",
"members" : [
{"_id" : 0, "host" : "mongo01:10001"},
{"_id" : 1, "host" : "mongo01:10002"},
{"_id" : 2, "host" : "mongo01:10003"}
1.5 在mongo shell中创建并插入数据:
switched to db mydb
animal = ["dog", "tiger", "cat", "lion", "elephant", "bird", "horse", "pig", "rabbit", "cow", "dragon", "snake"];
for(var i=0; i&100000; i++){
name = animal[Math.floor(Math.random()*animal.length)];
boolean = [true, false][Math.floor(Math.random()*2)];
added_at = new Date();
number = Math.floor(Math.random()*10001);
db.test_collection.save({"name":name, "user_id":user_id, "boolean": boolean, "added_at":added_at, "number":number });
上面的操作会向集合test_collection插入100万条数据,根据系统不同,可能会花费几分钟的时间。
脚本会加入如下格式的文档:
2. 部署一个分片设施
创建三个配置服务器来保存集群的元数据。
对于开发或者测试环境下,一个配置服务器足够了,在生产环境下,需要三天配置服务器,因为它们只需要占用很少的资源来保存元数据。
2.1 创建配置服务器的数据文件保存目录:
/data/example/config1
/data/example/config2
/data/example/config3
mkdir -p /data/example/config1 /data/example/config2 /data/example/config3
2.2 在另外的终端下,启动配置服务器:
mongod --configsvr --dbpath /data/example/config1 --port 20001 --fork --logpath /data/example/config1/config1.log --logappend
mongod --configsvr --dbpath /data/example/config2 --port 20002 --fork --logpath /data/example/config2/config2.log --logappend
mongod --configsvr --dbpath /data/example/config3 --port 20003 --fork --logpath /data/example/config3/config3.log --logappend
2.3 在另外的终端下,启动mongos实例:
mongos --configdb mongo01:20001,mongo01:20002,mongo01:20003 --port 27017 --chunkSize 1 --fork --logpath /data/example/mongos.log --logappend
如果使用的是以前创建的表或者测试环境下,可以使用最小的chunksize(1M),默认chunksize为64M意味着在mongodb自动分片启动前,集群必须拥有64MB的数据文件。
在生产环境下是不能使用很小的分片大小的。
configdb选项指定了配置服务器。mongos实例运行在默认的mongodb27017端口。
2.4 可以在mongos添加第一个分片,在新的终端执行以下命令:
2.4.1 连接mongos实例
mongo mongo01:27017/admin
2.4.2 使用addShard命令添加第一个分片
db.runCommand( { addShard : "firstset/mongo01:10001,mongo01:10002,mongo01:10003" } )
2.4.3 出现以下信息,表示成功:
{ "shardAdded" : "firstset", "ok" : 1 }
3. 部署另一个测试副本集
创建另外一个副本集实例,名称为secondset:
3.1 创建副本集并且插入数据如下:
/data/example/secondset1
/data/example/secondset2
/data/example/secondset3
mkdir -p /data/example/secondset1 /data/example/secondset2 /data/example/secondset3
3.2 在其他终端启动三个mongodb实例,如下:
mongod --dbpath /data/example/secondset1 --port 30001 --replSet secondset --oplogSize 700 --rest --fork --logpath /data/example/secondset1/secondset1.log --logappend --nojournal --directoryperdb
mongod --dbpath /data/example/secondset2 --port 30002 --replSet secondset --oplogSize 700 --rest --fork --logpath /data/example/secondset2/secondset2.log --logappend --nojournal --directoryperdb
mongod --dbpath /data/example/secondset3 --port 30003 --replSet secondset --oplogSize 700 --rest --fork --logpath /data/example/secondset3/secondset3.log --logappend --nojournal --directoryperdb
3.3 连接一个mongodb实例的shell
mongo mongo01:20001/admin
3.4 在mongo shell上初始化副本集
db.runCommand(
{"replSetInitiate" :
{"_id" : "secondset",
"members" : [
{"_id" : 0, "host" : "mongo01:30001"},
{"_id" : 1, "host" : "mongo01:30002"},
{"_id" : 2, "host" : "mongo01:30003"}
3.5 将该副本集加入分片集群
db.runCommand( { addShard : "secondset/mongo01:30001,mongo01:30002,mongo01:30003" } )
返回成功信息:
{ "shardAdded" : "firstset", "ok" : 1 }
3.6 通过运行listShards命令证实分片都添加成功。如下:
db.runCommand({listShards:1})
"shards" : [
"_id" : "firstset",
"host" : "firstset/mongo01:10001,mongo01:10002,mongo01:10003"
"_id" : "secondset",
"host" : "secondset/mongo01:30001,mongo01:30002,mongo01:30003"
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具mongodb部署--主备、副本及数据分片
主备复制是最基本的一种多点部署方案,在读写分离、热备份、数据恢复等方面具有重要作用。
在真实的生产环境,主备库肯定需要部署在不同的服务器中,但鉴于学习测试,这里以一台机器的不同端口进行模拟。
准备工作:
安装Mongodb的二进制程序 假设已经安装在/usr/local/mongodb/目录
为主库及备库创建数据目录:
主库目录:/var/mongodb_master/data/
/var/mongodb_master/logs/
备库目录:/var/mongodb_slave/data/
/var/mongodb_slave/logs/
启动主备库服务:
sudo -u mongodb /usr/local/mongodb/bin/mongod --dbpath=/var/mongodb_master/data/ --logpath=/var/mongodb_master/logs/log.log --master --port 27017 -fork
sudo -u mongodb /usr/local/mongodb/bin/mongod --dbpath=/var/mongodb_slave/data/ --logpath=/var/mongodb_slave/logs/log.log --slave --port 27117 --source=127.0.0.1:27017 -fork
说明:在启动主库时,比普通启动多指定一个--master选项;在启动库备时比普通启动多指定一个--slave和--source选项。
master 说明当前实例以主库模式启动
slave 说明当前实例以备库模式启动
source 给备库指定主库的位置
通过上面几个步骤,其实就已经部署好了一主一备的mongodb集群。可以启动两个不同的mongo shell 连接到不同机器上,看主备数据是否能同步呢?
sudo -u mongodb /usr/local/mongodb/bin/mongo 127.0.0.1:27017 ## 连到主库
sudo -u mongodb /usr/local/mongodb/bin/mongo 127.0.0.1:27117 ## 连到备库
在主库上添加几条数据:
for(var i = 0; i & 10; i++) {
db.blog.insert({"author":"enjiex_" + i, "title":"mongodb title " + i});
到备库的shell上看下:
db.blog.find()
很神奇,数据竟然已经同步到备库上了。
如果只有一个主服务,另外一个计划外的服务如果想成为备库,也不需要重启服务的,只需要在将成为备库的local库里把主备source添加进来就ok。
db.sources.insert("host":"127.0.0.1:27017")
不过,在备库上只能查询,并不能写入数据,并且当主备宕机或需要主备互换时甚至需要停止服务,所以对于热切换来说,还有更好的选择:副本集。
副本集,即副本的集合,每个mongodb服务在启动时并不区分主库备库,在运行中也没有特定的主库,所有的选择都是靠选举决定的。如果主库宕机,就会自动推选出新的主库。
先以两个副本为例:
sudo -u mongodb /usr/local/mongodb/bin/mongod --dbpath=/usr/mongodb_s1/data/ --logpath/usr/mongodb_s1/logs/log.log --port 27017 --replSet enjiex/127.0.0.1:27117 -fork
sudo -u mongodb /usr/local/mongodb/bin/mongod --dbpath=/usr/mongodb_s2/data/ --logpath/usr/mongodb_s2/logs/log.log --port 27117 --replSet enjiex/127.0.0.1:27017 -fork
创建副本也并没什么特别的地方,只需要在启动服务时指定--replSet选项即可,表示服务以副本集的方式部署。replSet后的参数:enjiex/127.0.0.1:27117中的enjiex为副本名称,后面的127.0.0.1:27117为副本集中另一副本的主机地址,也就是说需要在replSet后面指定副本名称和副本集中除自己外的其他副本服务的主机地址,如果有多个副本,用","隔开主机地址。
好了,副本集创建好了,但这时副本集还不能使用,因为需要先对他做下初始化。很简单,只需要通过mongo shell登录到任一副本服务,执行如下初始化命令即可:
db.runCommand({"replSetInitiate":{
"_id":"enjiex",
"members":[{
"host":"127.0.0.1:27017"
"host":127.0.0.1:27117
具有两个副本的副本集初始化完成,在初始化过程中,指定了副本集名称id:enjiex,以及两个副本成员。
一般情况下,执行副本初始化命令的那个服务会成为主服务,能提供正常的读写操作,并且其上的写操作会同步到各副本上。而其他的副本只有打开slaryOk后才能提供读服务,但始终不能提供写服务,除非其成为主服务。在副本节点上打开slaveOk命令如下:
rs.slaveOk()
上面的主服务一般称为主节点,副本服务称为副本节点。对于上面的场景,假如主节点宕机,副本节点是否能顺利的晋升为主节点提供写服务呢?先来了解下选举算法吧。在mongodb的选举算法中,当主机宕机所有其他活跃的节点进行投票,当得票数大于副本集节点(包括已宕机的主节点)半数的节点才能成为主节点。所以对于上面的场景,如果主节点宕机,只有一个副本节点对自己投了一票,不满足当前主节点的条件,因此时间副本集就会处于不可写状态,直到主节点恢复。
为了避免上面的问题,在生产场景一般部署的副本集节点为奇数,所以可以基于上面的场景,再在副本集中添加一个副本节点或仲裁节点。副本节点在上面我们已经有所了解,那仲裁节点呢?其实也可看作是一个不能开启slaveOk的副本节点,也就是说完成不能提供读写服务,也不会成为主节点的节点,只能参与投票的节点。
添加仲裁节点和副本节点的方式基本是一样的,都需要先把副本启动:
sudo -u mongodb /usr/local/mongodb/bin/mongod --dbpath=/usr/mongodb_s2/data/ --logpath/usr/mongodb_s2/logs/log.log --port 27217 --replSet enjiex/127.0.0.1:.0.1:27117 -fork
如果是添加副本节点,在主节点上执行:
rs.add("127.0.0.1:27217")
如果添加的是仲裁节点,则在主节点上执行:
rs.addAbr("127.0.0.1:27217")
好了,现在副本集中有3个节点,假如这时主节点宕机了,那么另外存活的副本节点就会投票选出一个新的主节点出来。(记住:仲裁节点只参与投票,但不能被选举)。如果原来宕机的主机又恢复服务了,那它也就只能以普通副本存在了。
在运行过程中,可以随机在副本集的任一台机器上执行如下命令查看副本集状态:
rs.status()
该命令会列出副本集中的各节点及每个节点的状态:PRIMARY(主节点)、SECONDARY(副本节点)、ARBITER(仲裁节点),还能看到各节点的健康状态等信息。
最后,一个副本不再需要的话,可以在主节点上执行remove删除副本:
rs.remove("127.0.0.1:27217")
数据分片技术是为避免单个集合数据量过大影响性能,而把单个集合拆分到不同的mongodb服务集群中;因此至少需要两个mongod实例用于分片存储数据,另外还需要一个mongo-configdb用于存储分片配置及片键(即分片规则),基于mongo-configdb,执行mongos命令即可启动分片服务。
启动mongo-configdb
sudo -u mongodb /usr/local/mongodb/bin/mongod --dbpath=/var/mongodb_config/data/ --logpath=/var/mongodb_config/logs/log.log --port27017 -fork
可以看出,mongo-configdb就是一个普通的mongod服务。
开启mongos分片服务
sudo -u mongodb /usr/local/mongodb/bin/mongos --logpath=/var/mongodb_mongos/logs/log.log --port 27117 --configdb=127.0.0.1:27017 -fork
mongos可以看作是一个对分片数据的路由,其本身不存储数据,因此无须dbpath,但其配置是基于mongo-configdb,所以需要通过configdb参数指定配置信息
启动两个mongod服务
sudo -u mongodb /usr/local/mongodb/bin/mongod --dbpath=/usr/mongodb_s1/data/ --logpath/usr/mongodb_s1/logs/log.log --port 27217 -fork
sudo -u mongodb /usr/local/mongodb/bin/mongod --dbpath=/usr/mongodb_s2/data/ --logpath/usr/mongodb_s2/logs/log.log --port 27317 -fork
在分片集群中,mongos作为服务入口,因此客户端只需要连接到mongos服务上,无须知道后端的实际存储服务的位置。分片服务的配置也是在mongos上完成的:
sudo -u mongodb /usr/local/mongodb/bin/mongo 127.0.0.1:27117
db.runCommand({"addshard":"127.0.0.1:27217", "allowLocal":true})
db.runCommand({"addshard":"127.0.0.1:27317", "allowLocal":true})
上面添加了两个mongod服务作为mongos分片的数据存储服务,然后还需要指定需要分片的库和表、以及分片字段规则:
db.runCommand({"enablesharding":"blogs"})
db.runCommand({"shardcollection":"blogs.blog", "key":{"author":1}})
尝试在mongos上添加些数据:
for(var i = 0; i & 100; i++) {
db.blog.insert({"author":"enjiex" + i, "title":"monge title" + i})
db.blog.find()
查看分片情况:
db.printShardingStatue()
阅读(...) 评论()cd_azhuang 的BLOG
用户名:cd_azhuang
文章数:54
评论数:40
访问量:25237
注册日期:
阅读量:5863
阅读量:12276
阅读量:403659
阅读量:1092804
51CTO推荐博文
MongoDB 副本集(类似高可用)1.节点类型standard:常规节点,它存储一份完整的数据副本,参与选举投票,有可能成为活跃节点。passive:存储了完整的数据副本,参与投票,不能成为活跃节点。arbiter:仲裁节点,只参与投票,不接收复制的数据,也不能成为活跃节点。2.参数说明--dbpath & 数据文件路径--logpath &日志文件路径--port & & & &端口号,默认是27017.我这里使用的也是这个端口号.--replSet & 复制集的名字,一个replica sets中的每个节点的这个参数都要用一个复制集名字,这里是1905.--replSet & 这个后面跟的是其他standard节点的ip和端口--maxConns & 最大连接数--fork & & & 后台运行--logappend & 日志文件循环使用,如果日志文件已满,那么新日志覆盖最久日志。3.创建副本集环境说明:ip:192.168.3.206 & #standard节点ip:192.168.3.210 & #standard节点ip:192.168.3.201 & #仲裁节点4.安装方法&参照http://blog.csdn.net/liu/article/details/来安装。安装成功后,不要用博客上面的启动命令。5.启动方法&启动第一个standard节点(ip:192.168.3.206)&/usr/local/mongodb/bin/mongod &--dbpath=/data/mongodb/ --logpath /data/logs/mongodb/log.log --logappend --port=27017 -replSet 1905 -maxConns=2000 -fork&启动第一个standard节点(ip:192.168.3.210)&/usr/local/mongodb/bin/mongod &--dbpath=/data/mongodb/ --logpath /data/logs/mongodb/log.log --logappend --port=27017 -replSet 1905 -maxConns=2000 -fork&启动arbiter节点,也就是仲裁节点 (ip:192.168.3.201)&/usr/local/mongodb/bin/mongod &--dbpath=/data/mongodb/ --logpath /data/logs/mongodb/log.log --logappend --port=27017 -replSet 1905 -maxConns=2000 -fork6.shell初始化副本集启动了以上服务器后,日志告诉你副本集没有初始化。连接其中一台standard(192.168.3.206)节点服务器。初始化命令只能执行一次&db.runCommand({"replSetInitiate" : { && & "_id" : "1905", && & "members" : [ && & { && & "_id" : 0, && & "host" : "192.168.3.206:27017" && & }, && & { && & "_id" : 1, && & "host" : "192.168.3.210:27017" && & } && & ]}}) &rs.status(){"startupStatus" : 3,"info" : "run rs.initiate(...) if not yet done for the set","ok" : 0,"errmsg" : "can't get local.system.replset config from self or any seed (EMPTYCONFIG)"}如果通过rs.status()得到上面结果。说明还没有得到副本集合的配置信息,然后执行下面语句config_rs={_id:'1905',members:[{_id:0,host:'192.168.3.206:27017'},{_id:1,host:'192.168.3.210:27017'}]}rs.initiate(config_rs);{"info" : "Config now saved locally. &Should come online in about a minute.","ok" : 1}表示已经得到副本集合了。7.测试副本集7.1查看副本集合&rs.status(){"set" : "1905","date" : ISODate("T03:11:53Z"),"myState" : 1,"members" : [{"_id" : 0,"name" : "192.168.3.206:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 4777,"optime" : Timestamp(, 1),"optimeDate" : ISODate("T03:10:30Z"),"electionTime" : Timestamp(, 1),"electionDate" : ISODate("T03:10:40Z"),"self" : true},{"_id" : 1,"name" : "192.168.3.210:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 81,"optime" : Timestamp(, 1),"optimeDate" : ISODate("T03:10:30Z"),"lastHeartbeat" : ISODate("T03:11:53Z"),"lastHeartbeatRecv" : ISODate("T03:11:53Z"),"pingMs" : 0,"syncingTo" : "192.168.3.206:27017"}],"ok" : 1}7.2加入仲裁节点执行以下命令:&rs.addArb("192.168.3.201:27017");{ "ok" : 1 }我们可以再次查看当前状态:rs.status(){"set" : "1905","date" : ISODate("T03:18:58Z"),"myState" : 1,"members" : [{"_id" : 0,"name" : "192.168.3.206:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 5202,"optime" : Timestamp(, 1),"optimeDate" : ISODate("T03:17:39Z"),"electionTime" : Timestamp(, 1),"electionDate" : ISODate("T03:10:40Z"),"self" : true},{"_id" : 1,"name" : "192.168.3.210:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 506,"optime" : Timestamp(, 1),"optimeDate" : ISODate("T03:17:39Z"),"lastHeartbeat" : ISODate("T03:18:58Z"),"lastHeartbeatRecv" : ISODate("T03:18:58Z"),"pingMs" : 0,"syncingTo" : "192.168.3.206:27017"},{"_id" : 2,"name" : "192.168.3.201:27017","health" : 1,"state" : 7,"stateStr" : "ARBITER","uptime" : 79,"lastHeartbeat" : ISODate("T03:18:57Z"),"lastHeartbeatRecv" : ISODate("T03:18:58Z"),"pingMs" : 0}],"ok" : 1}&rs.status()通过这个命令,可以查看各个节点的ip、角色已经是否正常我们看到已经成功配置。&7.3查看活跃节点:db.isMaster();&{"setName" : "1905","setVersion" : 2,"ismaster" : true,"secondary" : false,"hosts" : ["192.168.3.206:27017","192.168.3.210:27017"],"arbiters" : ["192.168.3.201:27017"],"primary" : "192.168.3.206:27017","me" : "192.168.3.206:27017","maxBsonObjectSize" : ,"maxMessageSizeBytes" : ,"maxWriteBatchSize" : 1000,"localTime" : ISODate("T03:23:18.798Z"),"maxWireVersion" : 2,"minWireVersion" : 0,"ok" : 1}可以看到现在192.168.3.206:27017为活跃节点。检测是否配置成功7.4模拟故障可以强制primary和standard节点角色互换,从而验证是否能够实现副本集功能进入主节点后执行下面命令rs.stepDown() &&执行完成后:db.isMaster(){"setName" : "1905","setVersion" : 2,"ismaster" : false,"secondary" : true,"hosts" : ["192.168.3.206:27017","192.168.3.210:27017"],"arbiters" : ["192.168.3.201:27017"],"primary" : "192.168.3.210:27017","me" : "192.168.3.206:27017","maxBsonObjectSize" : ,"maxMessageSizeBytes" : ,"maxWriteBatchSize" : 1000,"localTime" : ISODate("T03:43:25.102Z"),"maxWireVersion" : 2,"minWireVersion" : 0,"ok" : 1}&可以看到现在主节点已经修改为192.168.3.210:27017了。8.动态扩展增加节点&为了节约服务器,我们在ip:192.168.3.210上面重新增加端口27027为standard节点&mkdir -p /data/mongodb1 & &#27027端口数据目录&mkdir -p /data/logs/mongodb1/ #27027端口日志目录&#启动27027端口standard节点&/usr/local/mongodb/bin/mongod &--dbpath=/data/mongodb1/ --logpath /data/logs/mongodb1/log.log --logappend --port=27027 -replSet 1905 -maxConns=2000 -fork进入活跃节点的服务器rs.add("192.168.3.210:27027"); &{ "ok" : 1 }我们可以再次查看当前状态:rs.status(){"set" : "1905","date" : ISODate("T05:55:37Z"),"myState" : 1,"members" : [{"_id" : 0,"name" : "192.168.3.206:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 838,"optime" : Timestamp(, 1),"optimeDate" : ISODate("T05:55:34Z"),"electionTime" : Timestamp(, 1),"electionDate" : ISODate("T05:47:58Z"),"self" : true},{"_id" : 1,"name" : "192.168.3.210:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 314,"optime" : Timestamp(, 1),"optimeDate" : ISODate("T05:55:34Z"),"lastHeartbeat" : ISODate("T05:55:36Z"),"lastHeartbeatRecv" : ISODate("T05:55:37Z"),"pingMs" : 0,"syncingTo" : "192.168.3.206:27017"},{"_id" : 2,"name" : "192.168.3.201:27017","health" : 1,"state" : 7,"stateStr" : "ARBITER","uptime" : 836,"lastHeartbeat" : ISODate("T05:55:35Z"),"lastHeartbeatRecv" : ISODate("T05:55:35Z"),"pingMs" : 0},{"_id" : 3,"name" : "192.168.3.210:27027","health" : 1,"state" : 5,"stateStr" : "STARTUP2","uptime" : 3,"optime" : Timestamp(0, 0),"optimeDate" : ISODate("T00:00:00Z"),"lastHeartbeat" : ISODate("T05:55:36Z"),"lastHeartbeatRecv" : ISODate("T00:00:00Z"),"pingMs" : 0}],"ok" : 1}已经出现192.168.3.210:27027说明动态增加节点成功。9.动态扩展删除节点进入活跃节点的服务器rs.remove("192.168.3.210:27027"); &T14:00:10.118+0800 DBClientCursor::init call() failedT14:00:10.119+0800 Error: error doing query: failed at src/mongo/shell/query.js:81T14:00:10.121+0800 trying reconnect to 127.0.0.1:2.0.1) failedT14:00:10.122+0800 reconnect 127.0.0.1:2.0.1) ok我们可以再次查看当前状态:&rs.status(){"set" : "1905","date" : ISODate("T06:00:31Z"),"myState" : 1,"members" : [{"_id" : 0,"name" : "192.168.3.206:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 1132,"optime" : Timestamp(, 1),"optimeDate" : ISODate("T06:00:10Z"),"electionTime" : Timestamp(, 1),"electionDate" : ISODate("T05:47:58Z"),"self" : true},{"_id" : 1,"name" : "192.168.3.210:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 21,"optime" : Timestamp(, 1),"optimeDate" : ISODate("T06:00:10Z"),"lastHeartbeat" : ISODate("T06:00:30Z"),"lastHeartbeatRecv" : ISODate("T06:00:29Z"),"pingMs" : 0,"lastHeartbeatMessage" : "syncing to: 192.168.3.206:27017","syncingTo" : "192.168.3.206:27017"},{"_id" : 2,"name" : "192.168.3.201:27017","health" : 1,"state" : 7,"stateStr" : "ARBITER","uptime" : 21,"lastHeartbeat" : ISODate("T06:00:30Z"),"lastHeartbeatRecv" : ISODate("T06:00:30Z"),"pingMs" : 2}],"ok" : 1}192.168.3.210:27027已经没有出现在副本集合里面,说明删除节点成功。10.为主节点模拟写数据10.1在主节点上面操作&use mytest& db.test03.insert({age:26})WriteResult({ "nInserted" : 1 })& db.test03.find(){ "_id" : ObjectId("53c4f9dd7f7a3afaa3dd2415"), "age" : 26 }10.2在从节点上面操作&admin & (empty)local & 1.078GBmytest &0.078GB#mytest数据库已经自动同步OKT14:17:21.849+0800 error: { "$err" : "not master and slaveOk=false", "code" : 13435 } at src/mongo/shell/query.js:131#上面提示从节点不能读,所以不能查看集合。rs.slaveOk() &#执行此命令允许从节点可以读取,但是不能写。system.indexestest03&db.test03.find(){ "_id" : ObjectId("53c60edaf2c66b02d9c99338"), "age" : 26 }本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)}

我要回帖

更多关于 mongodb副本集原理 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信