mongodb (2)数据库副本集

副本集

MongoDB复制是将数据同步在多个服务器的过程。
复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
复制还允许您从硬件故障和服务中断中恢复数据。

  • 保障数据的安全性
  • 数据高可用性 (24*7)
  • 灾难恢复
  • 无需停机维护(如备份,重建索引,压缩)
  • 分布式读取数据

原理

mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。
mongodb各个节点常见的搭配方式为:一主一从、一主多从。
主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。

mongodb (2)数据库副本集_第1张图片
image.png

客户端从主节点读取数据,在客户端写入数据到主节点时, 主节点与从节点进行数据交互保障数据的一致性。

特征

  • 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

接着,我们进入第一个服务器,进行副本集设置
( 代表自己的ip地址)

#连接数据库
> mongo  27017
#初始化rs
> rs.initiate({
_id: "rs0",
           members: [
                      {
                       _id: 0,
                       host: ":27017"
                      }
                    ]
         }
})
#查看rs的状态
>rs.status()    

此时,我们可以看见,rs中已经有一台自己的服务器了


mongodb (2)数据库副本集_第2张图片
image.png

接着我们来添加两个从服务器

rs.add(':27018')
rs.add(':27019')

至此,我们已经添加成功了,成功组成了一个主复制集,两个从复制集的操作,复制集的主从是有服务器自动推选出来的,如果主服务器DOWN掉,马上其他从服务器替换为主服务器。

仲裁者

副本集要求参与选举投票(vote)的节点数为奇数,当我们实际环境中因为机器等原因限制只有两个(或偶数)的节点,这时为了实现 Automatic Failover引入另一类节点:仲裁者(arbiter),仲裁者只参与投票不拥有实际的数据,并且不提供任何服务,因此它对物理资源要求不严格。

rs.addArb("192.168.158.132:27017")  

遇到的问题

  1. 权限问题
    当使用非root用户时,一定要注意权限问题,否则很多命令都会出错,像 mongod 等
  2. ip地址问题
    一定要注意 Ip地址问题,你在rs.conf()中做的修改会影响到整个应用,如果你在本机上使用了127.0.0.1 (当然,他不会让你这么干),那么当你的mongo 服务和应用服务不在同一个服务器,就对导致报错。碰到一个奇葩问题是,当在服务器上使用 rs.initiate() 时,不加参数,他默认就会把当前库加到配置里,但是服务器的name会变成坑爹的计算机名称(hostname):端口,导致应用无法识别。所以最好是使用 本机ip地址,如192.168.1.3,而不要使用local localhost 127...* 等

参考 http://blog.chinaunix.net/uid-15795819-id-3075083.html

其他要注意的

  1. 所有的Secondary都宕机、或则副本集中只剩下一个节点,则该节点只能为Secondary节点,官方推荐的最小的副本集也应该具备一个primary节点和两个secondary节点。两个节点的副本集不具备真正的故障转移能力。
  2. 投票节点最多只能有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

你可能感兴趣的:(mongodb (2)数据库副本集)