在进行配置副本集的前先进行一点说明



在启动单个mongod实例要启用安全认证 只要在启动的时候增加一个--auth启动参数即可,但是副本集的安全认证不是这样 他需要另外一个启动参数 --keyFile 加上你的密匙文件路径



密匙文件的内容生成可以使用linux命令随机生成



openssl rand -base64 741



生成完后 密匙文件的权限必须设置成没有用户组和其他权限的文件 否则你的mongo实例启动不了 切记!!!!



参考资料


http://docs.mongodb.org/manual/tutorial/generate-key-file/


 



副本集的配置过程大致分为两个步骤



1)启动实例



2)初始化副本集



 



副本集的配置过程



 



1.启动三个实例 有一个是仲裁节点



mongod --rest --replSet rs --port 40000 --dbpath /var/lib/mongodb/mongonode1 --directoryperdb --fork --logpath /var/log/mongo/mongodnode1.log --keyFile /root/authfile 
 
 
 

   mongod --rest --replSet rs --port 40001 --dbpath /var/lib/mongodb/mongonode2 --directoryperdb --fork --logpath /var/log/mongo/mongodnode2.log --keyFile /root/authfile 
 
 
 

   mongod --rest --replSet rs --port 40002 --dbpath /var/lib/mongodb/mongoarbiter  --fork --logpath /var/log/mongo/mongodarbiter.log --nojournal --keyFile /root/authfile

当然你也可以使用配置文件进行启动3份配置如下



# mongonode1.conf
 
 

   logpath=/var/log/mongo/mongodnode1.log 
 
 
 

   logappend=true 
 
 
 

     
 
 
 

   fork = true 
 
 
 

   port = 40000 
 
 
 

     
 
 
 

   dbpath=/var/lib/mongodb/mongonode1 
 
 
 

   directoryperdb=true 
 
 
 

     
 
 
 

   replSet=rs 
 
 
 

   keyFile=/root/authfile 
 
 
 

   rest=true 
 
 
 

     
 
 
 
# mongonode2.conf
 
 

   logpath=/var/log/mongo/mongodnode2.log 
 
 
 

   logappend=true 
 
 
 

     
 
 
 

   fork = true 
 
 
 

   port = 40001 
 
 
 

     
 
 
 

   dbpath=/var/lib/mongodb/mongonode2 
 
 
 

   directoryperdb=true 
 
 
 

     
 
 
 

   replSet=rs 
 
 
 

   keyFile=/root/authfile 
 
 
 

   rest=true 
 
 
 

     
 
 
 
# mongoarbiter.conf
 
 

   logpath=/var/log/mongo/mongodarbiter.log 
 
 
 

   logappend=true 
 
 
 

     
 
 
 

   fork = true 
 
 
 

   port = 40002 
 
 
 

     
 
 
 

   dbpath=/var/lib/mongodb/mongoarbiter 
 
 
 

   nojournal=true 
 
 
 

   nohttpinterface = true 
 
 
 

     
 
 
 

   replSet=rs 
 
 
 

   keyFile=/root/authfile 
 
 
 

   rest=true



2.连接到一个非仲裁节点的实例,进行初始化



初始化一个副本集,有3种方式可以:


1)db.runCommand({replSetInitiate : <config_object> } ) 
 
 
 

   2)rs.initiate(<config_object>) 
 
 
 

   3)rs.initiate()//先初始化,再通过rs.add、rs.remove等方法修改 
 
 
 

   开始执行如下命令 
 
 
 

   cfg={ 
 
 
 

     "_id":"rs", 
 
 
 

     "members":[{ 
 
 
 

       "_id":0, 
 
 
 

       "host":"192.168.247.45:40000" 
 
 
 

   }] 
 
 
 

   }  
 
 
 

     
 
 
 

   rs.initiate(cfg) 
 
 
 

   rs.add('192.168.247.45:40001') 
 
 
 

   rs.add('192.168.247.45:40002',{ariterOnly:true})



简单测试



在主节点执行如下脚本


for(var i=0;i<1000;i++){ 
  
 
  

        db.zjh.insert({name:'mongo'+i,count:1-i}); 
  
 
  

    } 
  
 
  

    rs:PRIMARY> db.zjh.ensureIndex({count:1});


到从节点实例进行查看 正确同步



至此你的副本集已经搭建完毕 可以进行你的各种测试了



 



 



members 数组成员属性说明(默认值在括号中):



_id:在副本集中的每一个成员都必须有一个_id表示,这个_id是通常是数字,从0开始增长。需要注意的是当其中一个成员退休了(指从副本集config中移除了),新加入的成员不能重新使用这个退休成员的_id;



host:ip地址和端口号;



arbiterOnly(false):如果是true,则表示这个成员为仲裁节点,不接收数据;



buildIndexes(true):如果设置为false,则会阻止在这个节点上创建第二索引,通常这个节点是作为纯粹的数据备份,从不用来被查询。不过也因为此节点没有第二索引,所以他写入的东西很少,也就需要很少的内存和磁盘。_id的索引还是会被创建的。只有当priority属性设置为0时,此项才能设置为false,一般不会用到这个选项;



hidden(false):如果此项为true,不要告诉客户端的此节点的存在,设置隐藏节点的原因是此节点的数据的使用模式和其他节点大为不同,比如:报表,统计,备份等。设置为ture时,允许你针对这个节点发送非主要查询。



priority(1.0):权重,更高的权重会被选举为主节点



tags({}):一个文档代表这台服务器的位置,有利于位置感知的读写。其实就是表示此节点位于哪个数据中心的,mongodb会根据tags找近的数据中心节点同步数据。



slaveDelay(0):同步数据的延迟,设置为0表示立即更新同步数据。



votes(1):此节点可以发出的投票数,一般不用修改他



settings 对象:settings对象可以在集群建立起来以后用再进行设置,通常使用默认值