mongo 复制

mongo的复制有主从和复制集两种策略,熟悉数据库的都了解主从,复制集与主从类似,但它更强大,一旦主节点挂掉会从从节点当中会挑选一个成为新的主节点。

主从复制

配置

主服务器:

 ./mongod --dbpath /data/db/master --logpath /data/db/master.log --logappend  --fork --port 2717 --master --oplogSize 64 
从服务器:

 ./mongod  --dbpath /data/db/slave  --logpath /data/db/slaver.log --logappend  --fork  -port 27018 --slave --slavedelay 5 --autoresync --source localhost:27017  
需要注意的是,主从不能使用同样的数据目录和端口。mongo也支持一主多从的模式,但从多了同样会对主造成性能影响。当然mongo也支持双master的模式,但双master模式一直存在数据同步延迟造成某一方数据被冲掉的情况,根据情况灵活使用。

启动选项

  • --master,指定主节点
  • --slave,指定从节点
  • --fastsync,以主节点的数据快照为基础启动从节点,用该选项启动比做完整同步快很多
  • --oplogSize arg,指定主节点oplog的大小(MB)
  • --source arg <serverIp:port>,在主节点上指定从节点地址,在从节点上指定主节点地址
  • --only  arg,在从节点上指定复制特定的数据库,默认复制所有数据库
  • --slavedelay arg,设定从节点同步主节点数据的延迟时间
  • --autoresync,如果主从节点不同步了,则自动重新同步

动态添加删除源

在启动从节点时可以不用指定主节点地址而是在启动后在shell里通过命令动态的添加或删除主节点:

db.sources.insert({'host':'ip:port'});  
db.sources.remove({'host':'ip:port'});
db.sources.find()

sources集合可以和其它集合一样的操作。需要注意的时,从节点在切换主节点时会将同样的集合合并。

复制集

前面讲了复制集(replica set)能自动的恢复,它能保证在集群中总有一个活跃节点(primary)可用和一个或多个备份节点(secondary)。

启动

先启动两台服务器:

./mongod --dbpath /data/db1/ --logpath mo1.log --replSet shard1 --port 27017
./mongod --dbpath /data/db2/ --logpath mo2.log --replSet shard1 --port 27018

--replSet指定了复制集名字,通过该选项可以将不同的实例放在同一个复制集中。上面添加了两个实例,当然可以添加多个实例。启动复制集但还不可用,需要进行初始化。

初始化

在shell中连接上面两个实例中的任意一个,敲入如下命令进行初始化:

cfg={_id:'shard1',members:[
{_id:0,host:'127.0.0.1:27017'},
{_id:1,host:'127.0.0.1:27018'}]
}
rs.initiate(cfg)
cfg是配置信息,_id指定了复制集的名字,members指定了复制集中的实例。rs.initiate命令进行初始化,它返回初始化是否成功以及相应信息。初始化成功之后,shell会显示你正在使用primary还是secondary,也可以使用rs.status()查看状态信息,复制集的配置信息存储在local.system.replset集合中。

登录secondary节点,在正常查询前需要输入rs.slaveOK()。

添加节点

现在需要添加一个新的节点,先要启动新节点:

./mongod --dbpath /data/db3/ --logpath mo3.log --replSet shard1 --port 27019
然后登录primary节点,执行如下命令:

rs.add('127.0.0.1:27019')
rs.reconfig(rs.conf()) 

节点

复制集中有几种不同类型的节点:

  • standard,常规节点,存储完整的数据备份,参与选举投票,可能成为活跃节点;
  • passive,存储完整的数据备份,参与选举投票,不能成为活跃节点;
  • arbiter,只参与投票,不存储数据,不能成为活跃节点。

每个节点有一个priority属性,范围是0~1000,默认值是1,它的值决定了该节点是standard还是passive,如果是0则是passive,否则是standard。

standard节点中也根据priority的值从大到小决定谁能成为新的活跃节点,如果多个节点的priority值一样,则看哪个节点的数据比较新。

在添加节点时,可以设置节点的属性arbiterOnly为true,则设置改节点为arbiter。

复制原理

主节点将操作计入oplog,从节点启动时复制主节点中的每一个文档,之后获取主节点的oplog并执行其中的操作以达到数据同步。oplog保存在local.oplog集合中,主从节点都会维护一个syncedTo的属性,主节点通过db.slaves.find(),从节点通过db.sources.find()查看,表示从节点上次同步时间,这样就知道下次该从哪个时间开始做同步了。

### 如何在 Docker 中配置 MongoDB 主从复制集 #### 创建并启动主节点容器 为了建立MongoDB主从复制环境,首先需要创建一个作为主服务器运行的Docker容器。通过指定端口映射、容器名称以及使用的镜像来完成此操作[^1]。 ```bash docker run -d -p 27017:27017 --name mongo-master bitnami/mongodb:latest ``` 这里`-d`参数表示以后台模式运行容器;`-p`用于定义主机与容器之间的端口转发关系;`--name`给定新创建的服务实例命名以便于管理;最后是指定要拉取的基础镜像版本。 #### 设置从节点容器 接着按照相同的方式启动至少一个以上的从属节点服务,并确保它们能够访问到之前部署好的主节点。对于每一个额外加入集群中的成员都需要单独执行一次类似的命令[^3]。 ```bash docker run -d -p 27018:27017 --name mongo-slave \ --link mongo-master:mongo-master \ bitnami/mongodb:latest mongod --source mongo-master:27017 ``` 上述指令中增加了`--link`选项用来连接两个同的容器之间通信路径,同时设置了副本集的名字(`rs0`)并通过`--source`指定了数据同步的目标地址即为主节点所在位置。 #### 初始化副本集配置 当所有的参与方都已经成功上线之后,则可以进入任意一台机器内部利用mongo shell来进行初始化工作了。这一步骤主要是向系统告知哪些成员应该被纳入当前组内共同维护同一份数据库副本[^2]。 ```javascript // 进入mongodb shell docker exec -it mongo-master bash mongosh // 开始配置副本集 use admin; config = { _id : "rs0", members : [ { _id : 0, host : "mongo-master:27017" }, { _id : 1, host : "mongo-slave:27017" } ] }; rs.initiate(config); ``` 以上脚本先切换到了管理员库下再构建了一个包含所有预期参与者信息的对象结构体,随后调用了`rs.initiate()`方法正式开启了整个过程。 #### 测试验证 一旦完成了前面几步的操作就可以尝试往集合里写入一些测试文档看看能否正常传播至其他地方去了。如果一切顺利的话那么恭喜您已经掌握了如何借助Docker搭建起一套简单的MongoDB主从架构方案!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值