Mongo副本结点的相关配置

本文详细介绍了如何在多台机器上设置并维护MongoDB的副本集,包括创建集合、初始化副本集、添加和删除副本、权限认证、导入原有数据及解决数据导入过程中遇到的问题。同时,还阐述了副本集的维护方法,如添加副本、删除副本等,并讨论了副本集权限认证的实现方式。此外,文章还提供了解决数据导入时从节点处于recovering状态的两种方法。
摘要由CSDN通过智能技术生成



提示: 
Java代码   收藏代码
  1. {  
  2.         "info" : "Config now saved locally.  Should come online in about a minute.",  
  3.         "ok" : 1  
  4. }  

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

创建集合 
登录到其中一台已经成功运行mongodb的机器, 
Java代码   收藏代码
  1. cd /usr/local/bin/mongodb2.6/bin  
  2. ./mongo 127.0.0.1:12345/admin  

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

Java代码   收藏代码
  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",  #代表是主节点,可读写,其中有以下几下状态 
Java代码   收藏代码
  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, 即完成副本集设置 

维护: 
添加副本,在登录到主节点下输入: 
Java代码   收藏代码
  1. rs.add("ip:port");  

即可 

删除副本 
Java代码   收藏代码
  1. rs.remove("ip:port");  


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


权限: 
Java代码   收藏代码
  1. use local  
  2. db.addUser("username","password");  

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



问题: 
按以上完成后,导入原有数据后,导入命令 
Java代码   收藏代码
  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文件,发现正在不断地导入数据。当出现
Java代码   收藏代码
  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文件,用于节点之间权限认证的。按官网的提示作以下操作: 
Java代码   收藏代码
  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(); 去到主节点下执行: 
Java代码   收藏代码
  1. use admin  #选择需要认证的数据  
  2. db.addUser('name','password');  


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

Java代码   收藏代码
  1. use test1  
  2. db.addUser('test','123456');  


提示添加成功后,全部停止,每一节点执行db.shutdownServer();然后对mongod.conf文件添加以下两行: 
Java代码   收藏代码
  1. auth=true  
  2. keyFile=/mnt/mongodb/rs/confile/mongodb-keyfile  


最后全部重启即可! 

进入主节点终端,输入 
Java代码   收藏代码
  1. db.runCommand({getLastError:!, w: N});  


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

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

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





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

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

创建集合 
登录到其中一台已经成功运行mongodb的机器, 
Java代码   收藏代码
  1. cd /usr/local/bin/mongodb2.6/bin  
  2. ./mongo 127.0.0.1:12345/admin  

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

Java代码   收藏代码
  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",  #代表是主节点,可读写,其中有以下几下状态 
Java代码   收藏代码
  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, 即完成副本集设置 

维护: 
添加副本,在登录到主节点下输入: 
Java代码   收藏代码
  1. rs.add("ip:port");  

即可 

删除副本 
Java代码   收藏代码
  1. rs.remove("ip:port");  


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


权限: 
Java代码   收藏代码
  1. use local  
  2. db.addUser("username","password");  

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



问题: 
按以上完成后,导入原有数据后,导入命令 
Java代码   收藏代码
  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文件,发现正在不断地导入数据。当出现
Java代码   收藏代码
  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文件,用于节点之间权限认证的。按官网的提示作以下操作: 
Java代码   收藏代码
  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(); 去到主节点下执行: 
Java代码   收藏代码
  1. use admin  #选择需要认证的数据  
  2. db.addUser('name','password');  


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

Java代码   收藏代码
  1. use test1  
  2. db.addUser('test','123456');  


提示添加成功后,全部停止,每一节点执行db.shutdownServer();然后对mongod.conf文件添加以下两行: 
Java代码   收藏代码
  1. auth=true  
  2. keyFile=/mnt/mongodb/rs/confile/mongodb-keyfile  


最后全部重启即可! 

进入主节点终端,输入 
Java代码   收藏代码
  1. db.runCommand({getLastError:!, w: N});  


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

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

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





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

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

提示: 
Java代码   收藏代码
  1. {  
  2.         "info" : "Config now saved locally.  Should come online in about a minute.",  
  3.         "ok" : 1  
  4. }  

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

创建集合 
登录到其中一台已经成功运行mongodb的机器, 
Java代码   收藏代码
  1. cd /usr/local/bin/mongodb2.6/bin  
  2. ./mongo 127.0.0.1:12345/admin  

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

Java代码   收藏代码
  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",  #代表是主节点,可读写,其中有以下几下状态 
Java代码   收藏代码
  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, 即完成副本集设置 

维护: 
添加副本,在登录到主节点下输入: 
Java代码   收藏代码
  1. rs.add("ip:port");  

即可 

删除副本 
Java代码   收藏代码
  1. rs.remove("ip:port");  


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


权限: 
Java代码   收藏代码
  1. use local  
  2. db.addUser("username","password");  

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



问题: 
按以上完成后,导入原有数据后,导入命令 
Java代码   收藏代码
  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文件,发现正在不断地导入数据。当出现
Java代码   收藏代码
  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文件,用于节点之间权限认证的。按官网的提示作以下操作: 
Java代码   收藏代码
  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(); 去到主节点下执行: 
Java代码   收藏代码
  1. use admin  #选择需要认证的数据  
  2. db.addUser('name','password');  


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

Java代码   收藏代码
  1. use test1  
  2. db.addUser('test','123456');  


提示添加成功后,全部停止,每一节点执行db.shutdownServer();然后对mongod.conf文件添加以下两行: 
Java代码   收藏代码
  1. auth=true  
  2. keyFile=/mnt/mongodb/rs/confile/mongodb-keyfile  


最后全部重启即可! 

进入主节点终端,输入 
Java代码   收藏代码
  1. db.runCommand({getLastError:!, w: N});  


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

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

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





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值