网上已经有一大堆的设置步骤的了,根据我遇到的问题,整理一下,如下:

首先先去下载一个mongodb最新版,目前最新版应该是2.6

  1. cd /usr/local/bin
  2. wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.6.0.tgz
  3. tar -zxvf  mongodb-linux-x86_64-2.6.0.tar
  4. mv mongodb-linux-x86_64-2.6.0/ mongodb2.6

先切换到安装目录,再下载,然后解压,最后改名!

  1. mkdir -p /mnt/mongodb/rs/data
  2. mkdir -p /mnt/mongodb/rs/logs
  3. mkdir -p /mnt/mongodb/rs/config

然后再进入/mnt/mongodb/rs/config目录,新建mongod.conf文件,用来启动mongodb,内容如下:

  1. dbpath=/mnt/mongodb/rs/data   #数据存放目录
  2. logpath=/mnt/mongodb/rs/logs/mongod.log  #日志文件目录
  3. pidfilepath=/mnt/mongodb/rs/mongod.pid  #pid端口文件
  4. port=12345   #mongodb端口
  5. logappend=true   #追加方式写日志文件
  6. fork=true        #后台运行
  7. journal=true     #启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里
  8. oplogSize=2048   #同步操作记录文件大小(MB)
  9. smallfiles=true  #使用较小的默认文件
  10. replSet=dbset    #副本集名称,同一个副本集,名称必须一致

保存退出后,再进入到bin目录下执行:

  1. ./mongod -f ../mongod.conf

提示:

  1. {
  2. "info" : "Config now saved locally.  Should come online in about a minute.",
  3. "ok" : 1
  4. }

即运行mongodb成功。 
如果有多台机器的话,只需重复以上步骤。 
如果同一个机器的话,则仅需要将mongod.conf文件作出相应的更改,如更改数据,日志,pid文件,端口等,但replSet的名称必须一致。

创建集合 
登录到其中一台已经成功运行mongodb的机器,

  1. cd /usr/local/bin/mongodb2.6/bin
  2. ./mongo 127.0.0.1:12345/admin

登录进去,输入以下命令:

  1. config={_id : 'dbset',members : [{_id : 1, host : '192.168.0.1:12345'},{_id : 2, host : '192.168.0.2:12345'},{_id : 3, host : '192.168.0.3:12345'}]}
  2. 回车后再输入
  3. rs.initiate(config); #初始化副本集

以上例子,说明一共有三台机器做副本集,并可以用rs.help()来查看rs下有什么命令可以用。

退出,再重新登录,发现提示符已经发生变化,再输入rs.status()可以查看当前的状态。 
其中: 
"health" : 1, #代表机器正常 
"stateStr" : "PRIMARY",  #代表是主节点,可读写,其中有以下几下状态

  1. 1. STARTUP:刚加入到复制集中,配置还未加载
  2. 2. STARTUP2:配置已加载完,初始化状态
  3. 3. RECOVERING:正在恢复,不适用读
  4. 4. ARBITER: 仲裁者
  5. 5. DOWN:节点不可到达
  6. 6. UNKNOWN:未获取其他节点状态而不知是什么状态,一般发生在只有两个成员的架构,脑裂
  7. 7. REMOVED:移除复制集
  8. 8. ROLLBACK:数据回滚,在回滚结束时,转移到RECOVERING或SECONDARY状态
  9. 9. FATAL:出错。查看日志grep “replSet FATAL”找出错原因,重新做同步
  10. 10. PRIMARY:主节点
  11. 11. SECONDARY:备份节点

至此你应该可以看到一台机为primary,二台机器的状态为secondary, 即完成副本集设置

维护: 
添加副本,在登录到主节点下输入:

  1. rs.add("ip:port");

即可

删除副本

  1. rs.remove("ip:port");

前提是这个ip:port必须是使用了同一个relpSet名称的mongodb实例即可

权限:

  1. use local
  2. db.addUser("username","password");

需要在主节点和从节点上的local数据库下,建个相同的用户名和密码的用户,可读写。 从节点连接主节点时,会用存储在local.system.users中的用户进行认证,最先尝试用repl用户,若没有,则用local.system.users中的第一个可用用户。(但网上有些人说会对效率产生影响,这个待验证。知道的朋友请跟帖说一下。谢谢!)

问题: 
按以上完成后,导入原有数据后,导入命令

  1. mongorestore -h 127.0.0.1:12345 -d syt --directoryperdb /mnt/mongo_data/

其中/mnt/mongo_data为要导入的json文件,后发现从节点都变成recovering状态。

问题原因 
出现这个问题的原因主要是secondary节点同步oplog的速度追不上primary几点的速度,造成一直处于recovering状态。

解决办法: 
    首先停掉从节点mongod进程,然后删除目录(rs)下面所有的数据,然后重启mongod进程,这里有一点需要注意,如果有arbiter的mongod进程也需要停掉,启动的时候,先启动replSet的mongod进程,再启动arbiter的mongod进程,启动之后,会自动由recovering状态切换为startup2状态,最后切换为secondary状态

当正在startup2状态时,可以查看mongodb.log文件,发现正在不断地导入数据。当出现

  1. [rsHealthPoll] replSet member 192.168.0.2:12345 is now in state SECONDARY

时,说明已经完成导入,状态也变为secondary了。

另一个解决办法是: 
    先对主节点机器完成数据导入,再设置为副本集的节点,即上述的步骤不需要重复操作。待数据完成导入,再操作

replica set权限认证 
权限认证搞了一天,搞书本上说的须在每个节点上的local数据库里加入repl这个用户,然后在启动的时候加入 --auth参数,开启权限认证,如果经过测试,是不行的。不知道是那里出问题,具体情况是:当启动一个是时候,另外的节点就会全部变成"stateStr" : "(not reachable/healthy)"这样的状态。

后来经过长时间的百度,google,还是google给力,说要用到keyFile这个参数,于是上官网那里看,要生一个keyfile文件,用于节点之间权限认证的。按官网的提示作以下操作:

  1. mkdir -p /mnt/mongodb/rs/config
  2. cd /mnt/mongodb/rs/config
  3. openssl rand -base64 741 > mongodb-keyfile
  4. chmod 300 mongodb-keyfile

官网上的是600的,必须要改为300,如果不是的话, 会在启动的时候mongodb.log里写权限太开放的原因导致启动mongodb失败!切记切记!这里也花了不少时间...

这里先确保你已经安装了openssl,如果没有装,yum install openssl

将mongodb-keyfile 个问题复制到每一个节点对应的目录下,如果之前已经启动的mongodb的话,用mongo进入到终端后,先查看那个节点是主节点,rs.status(); 去到主节点下执行:

  1. use admin  #选择需要认证的数据
  2. db.addUser('name','password');

当然,也可以某一个自建的库进行权限认证

  1. use test1
  2. db.addUser('test','123456');

提示添加成功后,全部停止,每一节点执行db.shutdownServer();然后对mongod.conf文件添加以下两行:

  1. auth=true
  2. keyFile=/mnt/mongodb/rs/confile/mongodb-keyfile

最后全部重启即可!

进入主节点终端,输入

  1. db.runCommand({getLastError:1, w: N});

如果没有N,或者小于2,命令就会立刻返回,如果N等于2,主节点要等到至少一个从节点复制了上个操作都会响应命令(主节点本身也包括在N里面)。主节点使用local.slaves中存放的"syncedTo"信息来跟踪从节点的更新情况。

当指定"w"选项后,还可以使用"wtimeout"选项,表示以毫秒为单位的超时。getLastError就能在上一个操作复制到N个节点超时时返回错误(默认情况下命令是没有超时的)。

阻塞复制会导致写操作明显变慢,尤其是"w"的值比较大时。实际上,对于重要的操作将其值设置为2或者3就能效率与安全兼备了。

    1. mongod的主要参数有:
    2. ------------------------------------基本配置----------------------
    3. --quiet     # 安静输出
    4. --port arg  # 指定服务端口号,默认端口27017
    5. --bind_ip arg   # 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP
    6. --logpath arg   # 指定MongoDB日志文件,注意是指定文件不是目录
    7. --logappend     # 使用追加的方式写日志
    8. --pidfilepath arg   # PID File 的完整路径,如果没有设置,则没有PID文件
    9. --keyFile arg   # 集群的私钥的完整路径,只对于Replica Set 架构有效
    10. --unixSocketPrefix arg  # UNIX域套接字替代目录,(默认为 /tmp)
    11. --fork  # 以守护进程的方式运行MongoDB,创建服务器进程
    12. --auth  # 启用验证
    13. --cpu   # 定期显示CPU的CPU利用率和iowait
    14. --dbpath arg    # 指定数据库路径
    15. --diaglog arg   # diaglog选项 0=off 1=W 2=R 3=both 7=W+some reads
    16. --directoryperdb    # 设置每个数据库将被保存在一个单独的目录
    17. --journal   # 启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里
    18. --journalOptions arg    # 启用日志诊断选项
    19. --ipv6  # 启用IPv6选项
    20. --jsonp     # 允许JSONP形式通过HTTP访问(有安全影响)
    21. --maxConns arg  # 最大同时连接数 默认2000
    22. --noauth    # 不启用验证
    23. --nohttpinterface   # 关闭http接口,默认关闭27018端口访问
    24. --noprealloc    # 禁用数据文件预分配(往往影响性能)
    25. --noscripting   # 禁用脚本引擎
    26. --notablescan   # 不允许表扫描
    27. --nounixsocket  # 禁用Unix套接字监听
    28. --nssize arg (=16)  # 设置信数据库.ns文件大小(MB)
    29. --objcheck  # 在收到客户数据,检查的有效性,
    30. --profile arg   # 档案参数 0=off 1=slow, 2=all
    31. --quota     # 限制每个数据库的文件数,设置默认为8
    32. --quotaFiles arg    # number of files allower per db, requires --quota
    33. --rest  # 开启简单的rest API
    34. --repair    # 修复所有数据库run repair on all dbs
    35. --repairpath arg    # 修复库生成的文件的目录,默认为目录名称dbpath
    36. --slowms arg (=100)     # value of slow for profile and console log
    37. --smallfiles    # 使用较小的默认文件
    38. --syncdelay arg (=60)   # 数据写入磁盘的时间秒数(0=never,不推荐)
    39. --sysinfo   # 打印一些诊断系统信息
    40. --upgrade   # 如果需要升级数据库
    41. -----------------------------------Replicaton 参数--------------------
    42. --fastsync  # 从一个dbpath里启用从库复制服务,该dbpath的数据库是主库的快照,可用于快速启用同步
    43. --autoresync    # 如果从库与主库同步数据差得多,自动重新同步,
    44. --oplogSize arg     # 设置oplog的大小(MB)
    45. ---------------------------------* 主/从参数-------------------------
    46. --master    # 主库模式
    47. --slave     # 从库模式
    48. --source arg    # 从库 端口号
    49. --only arg  # 指定单一的数据库复制
    50. --slavedelay arg    # 设置从库同步主库的延迟时间
    51. -----------------------------------Replica set(副本集)选项----------------------
    52. --replSet arg   # 设置副本集名称
    53. -----------------------------------Sharding(分片)选项------------------------
    54. --configsvr     # 声明这是一个集群的config服务,默认端口27019,默认目录/data/configdb
    55. --shardsvr  # 声明这是一个集群的分片,默认端口27018
    56. --noMoveParanoia    # 关闭偏执为moveChunk数据保存
    57. # 上述参数都可以写入 mongod.conf 配置文档里例如:
    58. dbpath = /data/mongodb
    59. logpath = /data/mongodb/mongodb.log
    60. logappend = true
    61. port = 27017
    62. fork = true
    63. auth = true

参考:http://tcrct.iteye.com/blog/2108099

mongodb replica set(副本集)设置步骤的更多相关文章

  1. MongoDB学习笔记——Replica Set副本集

    副本集 可以将MongoDB中的副本集看作一组服务器集群由一个主节点和多个副本节点等组成,相对于之前讲到的主从复制提供了故障自动转移的功能 副本集实现数据同步的方式依赖于local数据库中的oplog ...

  2. 第38章:MongoDB-集群--Replica Sets(副本集)---多机的搭建

    ①机器环境 182.48.115.236    master-node(主节点) 182.48.115.237    slave-node1(从节点) 182.48.115.238    slave- ...

  3. Mongodb主从复制 及 副本集+分片集群梳理

    转载努力哥原文,原文连接https://www.cnblogs.com/nulige/p/7613721.html 介绍了Mongodb的安装使用,在 MongoDB 中,有两种数据冗余方式,一种 是 ...

  4. MongoDB Replica Set搭建集群

    MongoDB做集群,版本3.2官网推荐的集群方式Replica Set 准备服务器3台 两个standard节点(这两个节点直接可以互切primary secondary). 一个arbiter节点 ...

  5. 【六】MongoDB管理之副本集

    一.复制介绍 所谓的复制就是在多个主机之间同步数据的过程. 1.数据冗余及可用性 复制技术提供数据冗余及可用性,在不同的数据库服务器上使用多个数据副本,复制技术防止单个数据库服务器出现数据故障而出现数 ...

  6. MongoDB 复制(副本集)学习

    MongoDB 复制(副本集)学习 replication set复制集,复制集,多台服务器维护相同的数据副本,提高服务器的可用性.MongoDB复制是将数据同步在多个服务器的过程.复制提供了数据的冗 ...

  7. mongo副本集设置主库权重,永远为主

    mongo副本集设置主库权重,即使主库宕机了再重启也还是主库. cfg = rs.conf()     ------->(查看序列)cfg.members[0].priority = 1 (设置 ...

  8. MongoDB 3.4 高可用集群搭建(二)replica set 副本集

    转自:http://www.lanceyan.com/tech/mongodb/mongodb_repset1.html 在上一篇文章<MongoDB 3.4 高可用集群搭建(一):主从模式&g ...

  9. Mongodb 笔记06 副本集的组成、从应用程序连接副本集、管理

    副本集的组成 1. 同步:MongoDB的复制功能是使用操作日志oplog实现的,操作日志包含了主节点的每一次写操作.oplog是主节点的local数据库中的一个固定集合.备份节点通过查询整个集合就可 ...

随机推荐

  1. NeHe OpenGL教程 第四十课:绳子的模拟

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  2. 帝国CMS商城功能高级使用

    一.常见问题1.为什么自定义模型加入购物车提示“非商城表的信息”?答:模型要使用商城的功能,要先到:后台>商城>商城参数设置:“指定使用商肠能的数据表”勾选你这个自定义模型表,才可以使用. ...

  3. JQ获取当前是第几个元素,以及直接选取第几个元素的方法

    一.获取当前是第几个元素的方法使用:$(this).index() 实例: $(function () { $('.menu li').mouseover(function () { alert($( ...

  4. HTTP Get请求URL最大长度

    各浏览器HTTP Get请求URL最大长度并不相同,几类常用浏览器最大长度及超过最大长度后提交情况如下: IE6.0                :url最大长度2083个字符,超过最大长度后无法提 ...

  5. RESTful Api 身份认证中的安全性设计探讨

    REST 是一种软件架构风格.RESTful Api 是基于 HTTP 协议的 Api,是无状态传输.它的核心是将所有的 Api 都理解为一个网络资源.将所有的客户端和服务器的状态转移(动作)封装到 ...

  6. .Net调用非托管代码数据类型不一致的问题

    什么是Net互操作?.Net不能直接操作非托管代码,这时就需要互操作了.   c#中调用非托管c++函数,此函数又包含指向某个结构的指针,譬如指向c#中的byte数组.对于这样的参数,考虑到非托管变量 ...

  7. 20145305《JAVA程序设计》实验二

    实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验要求 1.没有Linux基础的同学 ...

  8. 20145305 《Java程序设计》第3周学习总结

    教材学习内容总结 1."一类一文件" 2.参考名称与对象数据成员同名时,可以在数据成员前使用this区别 3.不能用==直接比较浮点数运算结果 4.=是用在指定参考名称参考某个对象 ...

  9. centos 下安装.net core

    先要安装libunwind, libunwind库为基于64位CPU和操作系统的程序提供了基本的堆栈辗转开解功能,32位操作系统不要安装.其中包括用于输出堆栈跟踪的API.用于以编程方式辗转开解堆栈的 ...

  10. (easy)LeetCode 191.Number of 1 Bits

    Number of 1 Bits Write a function that takes an unsigned integer and returns the number of ’1' bits ...