比较常见的mongodb副本集搭建是有:常规节点、数据副本、仲裁节点组成,也就是需要三台服务器组建。常规节点即数据的主存储节点,数据副本是主存储节点的从属节点,它定期去主节点获取更新日志来更新自己。仲裁节点作用辅助选主,选主需要半数以上同意,数据副本存储的是冗余数据,而仲裁节点不需要存储数据,主节点存活时连接主节点,主节点挂掉时连接从节点。

但上述方案有一个弊端,当仲裁节点挂掉以后,集群基本就失去了选主的能力(还要看机器的数量)。

(在这里做一下纠正,也谢谢贝贝对我的指点。)

 

第二种方案

  一个主节点,两个从节点。从节点都定期去主节点获取更新日志。当主节点挂掉以后,会按优先级在两个从节点中选取一个当作主节点。(为什么需要两个从节点呢,我设置一个从节点未能成功,貌似一个集群最少需要三台机器,如果你有好的想法欢迎来拍)。

  好了,本文重点演示第二种方案。该方案在windows环境下已正常运行过,linux还未尝试,只要有一些变通肯定也是可以的。

  前提假设:有三台机器,ip分别为192.168.0.11(),192.168.0.12(),192.168.0.13(

纠正一下:也可以ip分别为192.168.0.11(),192.168.0.12(),192.168.0.13(选举)

 

首先,在mongodb目录中创建三个文件夹,分别命名为 data、logs、security( 也可以根据自己的习惯或需要指定文件位置和名称,但要和配置文件中设置的路径保持一致)。

第二,在security中创建一个名为 key.txt的文件,在文件中随意输入十个以上字符,他会以此作为该集群中的key。

第三,在mongodb目录中创建一个配置文件(暂命名为test.conf),里边内容如下

auth=true 
 
 
 
    dbpath=E:\mongo\mytest\data  
 
 
 
 
    logpath=E:\mongo\mytest\logs\mg.log  
 
 
 
 
    directoryperdb=true  
 
 
 
 
    logappend=true  
 
 
 
 
    replSet=mytestRep  
 
 
 
 
    port=12116  
 
 
 
 
    oplogSize=5000  
 
 
 
 
    keyFile=E:\mongo\mytest\security\key.key

  各个参数的说明见本文最后。

第四,把这个mongodb目录copy到另外两台机器上。

第五,在每台机器上的mongodb中依次执行(windows可以用在当前文件夹启动命令行)命令:

mongod --config E:\mongo\mytest\mytest.conf --install

注意配置文件中和此处的路径都必须要用绝对路径。

第六,在192.168.0.11上mongodb文件夹运行mongo 192.168.0.11:12116。保证12116端口在你的机器上是放开的。

第七,配置副本集设置。

  在mongo中运行 cfgmytest={ _id:"mytestRep ", members:[ {_id:0,host:'192.168.0.11:12116',priority:12}, {_id:1,host:'192.168.0.12:12116',priority:11}, {_id:2,host:'192.168.0.13:12116',priority:9}] }

  priority是优先级,优先级较高的会被自动设置为主节点。

  再执行:rs.initiate(cfgmytest)

  执行完这句话时,并不能马上看到效果,你即使重新登录客户端,看到的也是

MongoDB更换仲裁节点 mongodb仲裁节点作用_mongodb

 (还是蛮长的,据说2.8之后的版本会优化.),剩余时间在重新初始化集群, 主要耗时在分配local文件上。(这里也是来自贝贝的建议)

 

 

现在思考一个问题,一个副本集需要三台机器,但是只有一台机器再工作,其余两台完全闲置(作为灾备),是否觉得太浪费呢?

解决办法是有的,只需在上文提到的test.conf中添加两个参数,一个是服务名称、一个是服务显示名称。

serviceName=MongoDB1  
  
   serviceDisplayName=MongoDB1

这样一台机器上就可以运行多个mongodb实例了。

注意端口不要重复。

 

 其实一个集群中的从属服务器作为系统的读服务器话(读取时相对于主服务器的数据来说会有延时),这些冗余服务器也不算是浪费。无奈我们的业务不允许延时,只能用上文的思路来更多利用服务器的性能了。

 

mongodb的常用参数说明

--quiet # 安静输出 
  
   

    --port arg # 指定服务端口号,默认端口27017 
  
   

    --bind_ip arg # 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP 
  
   

    --logpath arg # 指定MongoDB日志文件,注意是指定文件不是目录 
  
   

    --logappend # 使用追加的方式写日志 
  
   

    --pidfilepath arg # PID File 的完整路径,如果没有设置,则没有PID文件 
  
   

    --keyFile arg # 集群的私钥的完整路径,只对于Replica Set 架构有效 
  
   

    --unixSocketPrefix arg # UNIX域套接字替代目录,(默认为 /tmp) 
  
   

    --fork # 以守护进程的方式运行MongoDB,创建服务器进程 
  
   

    --auth # 启用验证 
  
   

    --cpu # 定期显示CPU的CPU利用率和iowait 
  
   

    --dbpath arg # 指定数据库路径 
  
   

    --diaglog arg # diaglog选项 0=off 1=W 2=R 3=both 7=W+some reads 
  
   

    --directoryperdb # 设置每个数据库将被保存在一个单独的目录 
  
   

    --journal # 启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里 
  
   

    --journalOptions arg # 启用日志诊断选项 
  
   

    --ipv6 # 启用IPv6选项 
  
   

    --jsonp # 允许JSONP形式通过HTTP访问(有安全影响) 
  
   

    --maxConns arg # 最大同时连接数 默认2000 
  
   

    --noauth # 不启用验证 
  
   

    --nohttpinterface # 关闭http接口,默认关闭27018端口访问 
  
   

    --noprealloc # 禁用数据文件预分配(往往影响性能) 
  
   

    --noscripting # 禁用脚本引擎 
  
   

    --notablescan # 不允许表扫描 
  
   

    --nounixsocket # 禁用Unix套接字监听 
  
   

    --nssize arg (=16) # 设置信数据库.ns文件大小(MB) 
  
   

    --objcheck # 在收到客户数据,检查的有效性, 
  
   

    --profile arg # 档案参数 0=off 1=slow, 2=all 
  
   

    --quota # 限制每个数据库的文件数,设置默认为8 
  
   

    --quotaFiles arg # number of files allower per db, requires --quota 
  
   

    --rest # 开启简单的rest API 
  
   

    --repair # 修复所有数据库run repair on all dbs 
  
   

    --repairpath arg # 修复库生成的文件的目录,默认为目录名称dbpath 
  
   

    --slowms arg (=100) # value of slow for profile and console log 
  
   

    --smallfiles # 使用较小的默认文件 
  
   

    --syncdelay arg (=60) # 数据写入磁盘的时间秒数(0=never,不推荐) 
  
   

    --sysinfo # 打印一些诊断系统信息 
  
   

    --upgrade # 如果需要升级数据库  * Replicaton 参数

--------------------------------------------------------------------------------

 

--fastsync # 从一个dbpath里启用从库复制服务,该dbpath的数据库是主库的快照,可用于快速启用同步 
  
   

    --autoresync # 如果从库与主库同步数据差得多,自动重新同步, 
  
   

    --oplogSize arg # 设置oplog的大小(MB)  * 主/从参数

 

--------------------------------------------------------------------------------

 

--master # 主库模式 
  
   

    --slave # 从库模式 
  
   

    --source arg # 从库 端口号 
  
   

    --only arg # 指定单一的数据库复制 
  
   

    --slavedelay arg # 设置从库同步主库的延迟时间  * Replica set(副本集)选项:

--------------------------------------------------------------------------------

 

--replSet arg # 设置副本集名称  * Sharding(分片)选项

 

--------------------------------------------------------------------------------

--configsvr # 声明这是一个集群的config服务,默认端口27019,默认目录/data/configdb 
  
   

    --shardsvr # 声明这是一个集群的分片,默认端口27018 
  
   

    --noMoveParanoia # 关闭偏执为moveChunk数据保存 
  
   

    # 上述参数都可以写入 mongod.conf 配置文档里例如:

 

dbpath = /data/mongodb 
  
   

    logpath = /data/mongodb/mongodb.log 
  
   

    logappend = true 
  
   

    port = 27017 
  
   

    fork = true 
  
   

    auth = true