副本集
MongoDB复制是将数据同步在多个服务器的过程。
复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
复制还允许您从硬件故障和服务中断中恢复数据。
- 保障数据的安全性
- 数据高可用性 (24*7)
- 灾难恢复
- 无需停机维护(如备份,重建索引,压缩)
- 分布式读取数据
原理
mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。
mongodb各个节点常见的搭配方式为:一主一从、一主多从。
主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。
客户端从主节点读取数据,在客户端写入数据到主节点时, 主节点与从节点进行数据交互保障数据的一致性。
特征
- N 个节点的集群
- 任何节点可作为主节点
- 所有写入操作都在主节点上
- 自动故障转移
- 自动恢复
实验
首先关闭服务器上所有的mongodb服务
然后建立三个文件夹 /data/db1 /data/db2 /data/db3
然后使用命令
mongod --port 27017 --dbpath "/data/db1" --replSet rs0
Mongodb同时还提供了一种后台Daemon方式启动,只需要加上一个"--fork"参数即可,值得注意的是,用到了"--fork"参数就必须启用"--logpath"参数。如下所示:
mongod --port 27017 --dbpath=data/db --fork --logpath=log/mongodb.log
启动一个实例,接着打开另外两个从节点服务
mongod --port 27018 --dbpath "/data/db2" --fork --logpath=log/2.log --replSet rs0
mongod --port 27019 --dbpath "/data/db3" --fork --logpath=log/3.log --replSet rs0
接着,我们进入第一个服务器,进行副本集设置
(<hostname> 代表自己的ip地址)
#连接数据库
> mongo <hostname> 27017
#初始化rs
> rs.initiate({
_id: "rs0",
members: [
{
_id: 0,
host: "<hostname>:27017"
}
]
}
})
#查看rs的状态
>rs.status()
此时,我们可以看见,rs中已经有一台自己的服务器了
接着我们来添加两个从服务器
rs.add('<hostname>:27018')
rs.add('<hostname>:27019')
至此,我们已经添加成功了,成功组成了一个主复制集,两个从复制集的操作,复制集的主从是有服务器自动推选出来的,如果主服务器DOWN掉,马上其他从服务器替换为主服务器。
仲裁者
副本集要求参与选举投票(vote)的节点数为奇数,当我们实际环境中因为机器等原因限制只有两个(或偶数)的节点,这时为了实现 Automatic Failover引入另一类节点:仲裁者(arbiter),仲裁者只参与投票不拥有实际的数据,并且不提供任何服务,因此它对物理资源要求不严格。
rs.addArb("192.168.158.132:27017")
遇到的问题
- 权限问题
当使用非root用户时,一定要注意权限问题,否则很多命令都会出错,像 mongod 等 - ip地址问题
一定要注意 Ip地址问题,你在rs.conf()中做的修改会影响到整个应用,如果你在本机上使用了127.0.0.1 (当然,他不会让你这么干),那么当你的mongo 服务和应用服务不在同一个服务器,就对导致报错。碰到一个奇葩问题是,当在服务器上使用 rs.initiate() 时,不加参数,他默认就会把当前库加到配置里,但是服务器的name会变成坑爹的计算机名称(hostname):端口,导致应用无法识别。所以最好是使用 本机ip地址,如192.168.1.3,而不要使用local localhost 127...* 等
其他要注意的
- 所有的Secondary都宕机、或则副本集中只剩下一个节点,则该节点只能为Secondary节点,官方推荐的最小的副本集也应该具备一个primary节点和两个secondary节点。两个节点的副本集不具备真正的故障转移能力。
- 投票节点最多只能有7个
要注意的是,这个命令只允许在本地,或是一个经过认证的客户端。
引用
http://www.cnblogs.com/zhoujinyi/p/3554010.html
http://blog.csdn.net/yabingshi_tech/article/details/47044711
http://www.runoob.com/mongodb/mongodb-replication.html