最近弄了下mongodb的副本集,

首先说下没有认证情况的副本集,相对比较简单,因为环境有限,我在同一台服务器上做了模拟。

--rest参数是打开web监控页面,比如我们这里监听37017端口,则打开http://192.168.75.132:38017/(mongod端口加上1000)就可以看到这个mongodb数据库进程的信息,如果是副本集就能查看整个副本集的相关信息。

  1. 启动三个mongo节点,这个是最简单的副本集的结构,两个节点是不能起到副本集的作用的。
  2. ./bin/mongod --fork --dbpath data/rs0-/ --logpath log/rs0-/rs0-.log --rest --replSet rs0 --port
  3. ./bin/mongod --fork --dbpath data/rs0-/ --logpath log/rs0-/rs0-.log --rest --replSet rs0 --port
  4. ./bin/mongod --fork --dbpath data/rs0-/ --logpath log/rs0-/rs0-.log --rest --replSet rs0 --port
  5.  
  6. 进入作为主节点的mongo
  7. ./bin/mongo -port
  8. use admin
  9.  
  10. #初始化一个Replica set,创建一个副本集配置对象
  11. rsconf={
  12. "_id" : "rs0",
  13. "members" : [
  14. {
  15. "_id" : ,
  16. "host" : "192.168.75.132:37017"
  17. }
  18. ]
  19. }
  20. rs.initiate(rsconf)
  21.  
  22. 添加另外两个从节点
  23. rs.add("192.168.75.132:37018")
  24. rs.add("192.168.75.132:37019")
  25.  
  26. rs.conf()可以查看集群的配置情况,还可以使用此来修改节点的属性,还可以设置 priorityhidden, slaveDelay
  27. cfg=rs.conf()

{
"_id" : <num>,
"host" : <hostname:port>,
"priority" : 0,  //设置为0后则不会通过投票变为主节点
"slaveDelay" : <seconds>,  // 延迟同步时间
"hidden" : true   // 隐藏节点,则客户端不能连接,但是可以投票
}

  1. cfg.members[].priority =
  2. rs.reconfig(cfg, {'force':true})
  3. 执行rs.reconfig()命令会强制整个副本集集群进行一次election,这样priority较高的37019节点便成了primary节点
  4. 整个election过程需要一点时间,在这之间整个集群的所有节点都是secondaryelection的策略不仅仅就是根据priority值来,会综合很多其他的因素。经过测试,就算是priority值高,但如果是出现问题,刚刚启动,一般不会成为primary节点,而是变为secondary节点。
  5.  
  6. 添加仲裁者:
  7. mkdir p data/rs0-arb;mkdir p log/rs0-arb
  8. ./bin/mongod --fork --dbpath data/rs0-arb/ --logpath log/rs0-arb/rs0-arb.log --rest --replSet rs0 --port
  9. 然后进入primary节点执行下面命令添加arbiter
  10. rs.addArb("192.168.75.132:40000")
  11.  
  12. 移除成员:
  13. 移除一个成员使用rs.remove()命令:
  14. rs.remove("192.168.75.132:37019")

下面说下带认证的副本集的配置,说明下,下面的是3.*版本的环境下的,2.*版本的会有不一样的地方,不过建议使用3.*版本的。

  1. 副本集搭建有认证情况
  2. 在此我们需要配置三个mong单节点,然后将其结合组成副本集,
  3. 安装路径/usr/local/mongd
  4. 三个mongdb分别占用端口27017
  5. 在/usr/local/mongd下面创建四个数据目录和一个配置目录以及一个日志目录
  6. mkdir /usr/local/mongd/data{..}
  7. mkdir /usr/local/mongd/log
  8. mkdir /usr/local/mongd/etc
  9. 三个mongodb的配置文件分别如下所示:配置文件的路径: /usr/local/mongd/etc/
  10. 添加三个配置文件,内容如下:
  11. mongodb_primary.conf
  12. port=
  13. dbpath=/usr/local/mongod/data1/
  14. logpath=/usr/local/mongod/log/mongodb.log
  15. pidfilepath=/usr/local/mongod//mongod.pid
  16. fork=true
  17. logappend=true
  18. shardsvr=true
  19. directoryperdb=true
  20. #auth=true
  21. #replSet=rs0
  22. #oplogSize=
  23. #keyFile=/usr/local/mongod/etc/mongo.pass ###这个文件后边需要手动生成,路径和文件名都是自定义的
  24.  
  25. mongodb_slave1.conf
  26. port=
  27. dbpath=/usr/local/mongod/data2/
  28. logpath=/usr/local/mongod/log/mongodb.log
  29. pidfilepath=/usr/local/mongod//mongod.pid
  30. fork=true
  31. logappend=true
  32. shardsvr=true
  33. directoryperdb=true
  34. #auth=true
  35. replSet=rs0
  36. oplogSize=
  37. keyFile=/usr/local/mongod/etc/mongo.pass ###三个配置文件中这个文件需要一致
  38.  
  39. mongodb_slave2.conf
  40. port=
  41. dbpath=/usr/local/mongod/data3/
  42. logpath=/usr/local/mongod/log/mongodb3.log
  43. pidfilepath=/usr/local/mongod//mongod3.pid
  44. fork=true
  45. logappend=true
  46. shardsvr=true
  47. directoryperdb=true
  48. #auth=true
  49. replSet=rs0
  50. oplogSize=
  51. keyFile=/usr/local/mongod/etc/mongo.pass ###三个配置文件中这个文件需要一致
  52. ###还可以添加一个仲裁的配置文件
  53. mongodb_arb.conf
  54. port=
  55. dbpath=/usr/local/mongod/data_arb/
  56. logpath=/usr/local/mongod/log/mongodb_arb.log
  57. pidfilepath=/usr/local/mongod//mongod_arb.pid
  58. fork=true
  59. logappend=true
  60. shardsvr=true
  61. directoryperdb=true
  62. #auth=true
  63. replSet=rs0
  64. oplogSize=
  65. keyFile=/usr/local/mongod/etc/mongo.pass ###三个配置文件中这个文件需要一致
  66.  
  67. 首先启动一个节点,即先启动第一个mongodb27017端口的那个,因为在此我想用其做primary节点
  68. mongod -f /usr/local/mongod/etc/mongodb_primary.conf
  69.  
  70. 启动后,连接节点,在里面添加用户,在此 我添加了一个root角色的用户(权限最高的用户了),
  71. 添加用的方法如下:
  72. use admin
  73. db.createUser({user:"admin",pwd:"",roles:[{role:"root",db:"admin"}]})
  74.  
  75. 用户添加完成后,关闭mongodb,然后修改mongodb的配置文件,只修改第一个的配置文件就行,因为在此,我们就启动了第一个mongodb数据库,
  76. 修改的配置如下所示:
  77. port=
  78. dbpath=/usr/local/mongod/data1/
  79. logpath=/usr/local/mongod/log/mongodb.log
  80. pidfilepath=/usr/local/mongod//mongod.pid
  81. fork=true
  82. logappend=true
  83. shardsvr=true
  84. directoryperdb=true
  85. auth=true ###去掉注释
  86. replSet=rs0 ###去掉注释
  87. oplogSize= ###去掉注释
  88. keyFile=/usr/local/mongod/etc/mongo.pass ###去掉注释
  89.  
  90. 然后生成一个keyFile,副本集之间通过此文件来进行验证,
  91. openssl rand -base64 > /usr/local/mongod/etc/mongo.pass ###这个名字随意定义,但是配置文件中也需要制定这个文件的,在此我的是同一台机器,所以,路径相同,如果是不同机器之间的做副本集,则需要将此文件复制到不同的机器上去
  92. 创建完成后,还需要修改此文件的权限为600,只有拥有者有权限,其余的组和其他用户没有任何的权限
  93. chmod /usr/local/mongod/etc/mongo.pass
  94.  
  95. 修改完成后,启动mongdb数据库即可
  96. 这次需要三个数据都启动,
  97. 然后登陆数据库进行操作就行,但是,切记需要先验证账号和密码才可以
  98. use admin;
  99. db.auth('admin', '');
  100.  
  101. 接下来就可以配置副本集了
  102. #初始化一个Replica set,创建一个副本集配置对象
  103. rsconf={
  104. "_id" : "rs0",
  105. "members" : [
  106. {
  107. "_id" : ,
  108. "host" : "192.168.75.132:37017"
  109. }
  110. ]
  111. }
  112. rs.initiate(rsconf)
  113. #添加两个从的副本集节点
  114. rs.add("192.168.75.132:37018");
  115. rs.add("192.168.75.132:37019");
  116. rs.addArb("192.168.75.132:40000");
  117.  
  118. 然后就是添加用户和建库
  119. 这些都要在primary节点执行,
  120. use robo;
  121. db.createUser({user:'robo',pwd:'robo',roles:[{role:'readWrite',db:'robo'}]});//经测试,使用Robomongo连接,选择两种认证(MONGODB-CR,SCRAM-HAS-1)都可以联通

php的代码调用如下 :

  1. $server = "192.168.75.132:27017,192.168.75.132:27018,192.168.75.132:27019";// 可以只有一部分,如两台的信息
  2. $server = "192.168.75.132:27018,192.168.75.132:27019";
  3.  
  4. $options = [
  5. 'readPreference' => MongoClient::RP_SECONDARY_PREFERRED,
  6. 'replicaSet' => 'rs',//要连接的集群名称
  7. ];
  8. $user = 'wayne';
  9. $passwd = 'wayne';
  10. $dbname = 'wayne_com';
  11. $collectName = 'test_list';
  12.  
  13. $dsn = "mongodb://$user:$passwd@{$server}/{$dbname}";
  14. $mongo = new MongoClient($dsn, $options);
  15.  
  16. $mongo->selectDB($dbname);
  17. $coll = $mongo->selectCollection($dbname, $collectName);
  18.  
  19. $where = ['name'=>'tong'];
  20. $cursor = $coll->find([])->limit(5);
  21. if ($cursor) {
  22. foreach ($cursor as $doc) {
  23. var_dump($doc);
  24. }
  25. } else {
  26. echo 'empty data';
  27. }

今天测试了下node.js 调用副本集的脚本,测试通过。记录下来。

  1. var MongoClient = require('mongodb').MongoClient;
  2. // mongodb://user:password@server:port/dbname?replicaSet=replicaSetName 连接的完整格式,副本集不需要写出所有的服务器的列表,只写一部分也是可以使用的,但如果写入部分的服务器出问题了,是否会出现失败,待以后确认
  3. var url = 'mongodb://wayne:wayne@192.168.75.132:27018,192.168.75.132:27019/wayne_com?replicaSet=rs';
  4. MongoClient.connect(url, function (err, db) {
  5. console.log('error', 'db connect is ok');
  6. var collection = db.collection('test_list');
  7. console.log('error', 'collection is ok');
  8. collection.find({}).toArray(function (err, result) {
  9. console.log(err, result);
  10. });
  11. });

Mongo副本集的配置以及php node.js连接使用副本集的更多相关文章

  1. Node.js连接Mysql,并把连接集成进Express中间件中

    引言 在node.js连接mysql的过程,我们通常有两种连接方法,普通连接和连接池. 这两种方法较为常见,当我们使用express框架时还会选择使用中间express-myconnection,可以 ...

  2. Node.js连接MySQL数据库及构造JSON的正确姿势

    做一下整理,以前也很随意的引入包链接数据库,后来发现常常连接出问题,异常退出,后来使用在网上一个方法解决问题,网址由于书签丢失,抱歉不能引用了.再有就是简单的模块化下,使得目录合理点,再有就是说明一下 ...

  3. node.js连接MySQL操作及注意事项

    node.js作为服务端的js运行环境已经出现了有几年了,最近我有个朋友也在做这方面的开发,但是也是刚刚接触,遇到了很多坑.前几天他们在操作数据库的时候出现了点问题,后来我们一起看了看,其实都是nod ...

  4. Node.js 连接 MySQL 并进行数据库操作

    Node.js 连接 MySQL 并进行数据库操作  按照这篇操作mysql的指引,我远程操作了我另一台电脑的mysql数据库. var mysql = require('mysql'); var c ...

  5. Windows 7 下 Node.js 连接 Oracle

    原创作者: sailtseng 1. 安装 Oracle 11g express  详见: <Windows 7 x64 安装 Oracle 11g Express> 2. 安装 Micr ...

  6. Node.js使用PM2的集群将变得更加容易

    介绍 众所周知,Node.js运行在Chrome的JavaScript运行时平台上,我们把该平台优雅地称之为V8引擎.不论是V8引擎,还是之后的Node.js,都是以单线程的方式运行的,因此,在多核心 ...

  7. Nginx 配置HTTPS 与Node.js 配置HTTPS方法

    前段时间公司网站要求加上HTTPS安全CA证书,公司服务器全是阿里云服务器,并且配有负载均衡,所以选择直接在阿里云购买CA证书,阿里云有一种证书可以免费试用一年,决定申请此证书,阿里云证书需要验证,阿 ...

  8. 根据不同运行环境配置和组织node.js应用

    安装node-config模块 npm install config --save || yarn add config mkidr config // 创建config文件夹 在config文件夹下 ...

  9. windows下安装mongodb以及node.js连接mongodb

    一.MongoDB 下载 下载地址  https://www.mongodb.com/download-center#community  选择windows版下载,然后安装. 二.安装完毕后创建数据 ...

随机推荐

  1. 【Java面试题】43 说出一些常用的类,包,接口,请各举5个

    要让人家感觉你对java ee开发很熟,所以,不能仅仅只列core java中的那些东西,要多列你在做ssh项目中涉及的那些东西.就写你最近写的那些程序中涉及的那些类. 常用的类:BufferedRe ...

  2. 【Java面试题】35 List, Set, Map是否继承自Collection接口?

    Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set和List)的通用方法. Set 和List 都继承了Conllection:Set具有与Collection完全一样的接 ...

  3. u3d调用c++ dll的DllNotFoundExceion 问题

    原文地址:http://blog.csdn.net/boren31/article/details/8778504 问题年年有,今年特别多. 开发环境: Windows  XP sp3 Visual  ...

  4. [转]lsof详解

    lsof是一个功能强大的诊断工具,它可以通过进程与打开的文件进行联系,可以列出一个进程打开的所有文件信息. 1 寻找与打开的文件相关联的进程通过指定文件,可以发现正在使用这个文件的进程# lsof / ...

  5. 【MFC】OnInitDialog

    OnInitDialog OnInitDialog是MFC的面向对象编程语言的类CDialog中的初始化成员函数名(虚函数).相当于对对话框进行初始化处理.   属    性 初始化成员函数名 处   ...

  6. C/C++ 控制台演示彩色输出进度

    #include <stdio.h> #include <windows.h> BOOL SetConsoleColor(WORD wAttributes); int main ...

  7. oracle数据备份

    from:http://www.docin.com/p-728428621.html

  8. MySQL<添加、更新与删除数据>

    添加.更新与删除数据 添加数据 为表中所有字段添加数据 INSERT INTO 表名(字段名1,字段名2,……) VALUES(值1,值2,……); insert into 表名 values(值1, ...

  9. GIS-002-gdal2srtmtiles使用注意事项

    本次安装和配置过程重点参考了: 1.http://blog.csdn.net/wjkwjk/article/details/52560236 2.http://blog.csdn.net/wjkwjk ...

  10. NUC970烧录文件系统

    燒錄U-Boot依照下列步驟將編譯完成的U-Boot燒錄至NAND Flash/SPI Flash/eMMC 中.U-Boot的編譯方法請參考4.3章節.3.11.1 燒錄所需檔案4. u-boot. ...