Mongodb互为主从配置

发布在 mongodb

接着上一篇,我们这一篇依旧来讲Mongodb

什么叫主从

Mongodb的主从是指一个为主数据库,一个为从数据库(备份数据库),备份数据库可以开启读操作,但是不能进行写操作

提出问题

我们需要解决 两个数据库数据同步,并且两个数据库都可以进行读写操作

解决问题

两台数据库服务器

Mongo1(192.168.0.1):

1
mongod --dbpath=/data/test/ --port=27017 --master --slave --source=192.168.0.2 --fork

Mongo2(192.168.0.2):

1
mongod --dbpath=/data/test/ --port=27017 --master --slave --source=192.168.0.1 --fork

参数说明:

  • master:表示为主服务器,因为我们这里互为主从,所以Mongo1和Mongo2都有
  • slave:表示从服务器,同上
  • source:表示主服务器的地址端口号

Ok,这样启动之后,就完成了,大家可以进行测试了

  • 两边进行更改数据是否同步?
  • 两边是否都能进行写数据?

问题遗留

性能方面没有测试,大家可以测试一下,大数据量同时写入,或者两边更改同一数据的时候,会不会出问题。

注释和共享

最近在研究mongodb灾难恢复的一些事情,在这里与大家分享。

Mongodb介绍

这就直接省略了,不理解的其实也没必要往下面读了。

什么是Mongodb副本集

《Mongodb权威指南》里面这样说: 副本集是一组服务器,其中一个是主服务器,用于处理客户请求;还有多个备份服务器,用于保存主服务器的数据副本。如果主服务器崩溃了,备份服务器自动将其中一个成员升级为新的主服务器。 由此可见副本集对于应对灾难性事件是多么的合适。

如何配置

在这里先说一下如何在数据库层面将各个数据库联合在一块,形成一个副本集。

准备

  • 3台装有Mongodb的服务器(虚拟机)(可联网,可相互访问)

命令行配置

1
mongod --dbpath ~/data/db/ --logpath ~/logs/log --replSet replset --fork --port 27017 --noauth

1、 三台服务器都要以如上命令启动:

其中解释一下参数名称:

  • dbpath: db数据文件存放位置
  • fork: 后台运行
  • port: 访问端口
  • noauth: 无认证访问(此处是为测试方便,请勿效仿)
  • replSet:副本集核心参数,副本集的名称,这个参数是必须的,而且必须三台机器完全一样
  • 更多参数可以根据需要添加

2、 将三台服务器进行连接:

在其中一台服务器中打开命令行

1
  #:mongo
  
//配置副本集参数
  >config ={
	"_id" : "replset",
	"version" : 4,
	"members" : [
		{
			"_id" : 0,
			"host" : "172.16.137.135:27017"
		},
		{
			"_id" : 1,
			"host" : "172.16.137.136:27017"
		},
		{
			"_id" : 3,
			"host" : "172.16.137.137:27017"
		}
	]
}
//初始化副本集
 >rs.initiate(config)
 
//初始化成功
 >{
        "info" : "Config now saved locally.  Should come online in about a minute.",
        "ok" : 1
}

如上我们副本集Db层面就配置好了,大家可以简单做下测试:

  • 在主服务器上写的数据能否同步到另外的备份数据库
  • 当出数据库挂掉(可用kill -9模拟)之后,是否会推出一台新的主数据库
  • 当挂掉的主数据库启动之后它的角色有没有变化

如果正常配置成功上面的答案应该分别是 能,会,它的新角色是备份数据库

Node.js如何使用Mongodb副本集

方法1

1
var Server = require('mongodb').Server;
var Db = require('mongodb').Db;
var replsetServer = require('mongodb').ReplSetServers;
var server1 = new Server('172.16.137.135', '27017', {});
var server2 = new Server('172.16.137.136', '27017', {});
var server3 = new Server('172.16.137.137', '27017', {});
var servers=[server1,server2,server3];
var replset = new replsetServer(servers);
var db = new Db('repl', replset, {native_parser:true});
db.open(function (err, db) {
  db.collection('user',function (err, collection) {
    collection.find({}).toArray(function(err, result) {
      console.log(err, result);
    })
  });
});

方法2

1
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://172.16.137.135,172.16.137.136,172.16.137.137:27017/repl';
MongoClient.connect(url, function (err, db) {
  var collection = db.collection('user');
  collection.find({}).toArray(function (err, result) {
    console.log(err, result);
  })
});

如上是我写的测试代码,用node-mongodb-native进行测试,Mongoose未测试,相信会Node的都能看懂就不过多讲解了。

参考

搭建高可用mongodb集群(二)—— 副本集

replSetServersQueries.js

注释和共享

写给使用node.js+mongodb的新人

准备工作

1
npm install mongodb

这是我们接下来要使用的一个第三方模块

组件下载

请点击:github

将此组件放到你项目目录下

1
config.js //数据库配置文件
DataProvider.js //普通文档数据操作方法文件
BinaryProvider.js //文件操作方法文件

使用方法

  • 配置config.js为你需要操作的数据库
  • 在/modules/dao文件夹下新建一个js文件,如UserProvider,其中this.collectionName为你选择的表名称
  • 新建一个userTest.js 引入组件

    1
    var UserProvider=require('./module/dao/UserProvider').UserProvider;
    var userProvder=new UserProvider();

文档数据操作

插入操作
1
function insert(){
    userProvder.insert({name:"yuansc"},{},function(err,result){
        console.log(err,result)
    })
}

这样你便完成插入一条名为{name:yuansc}的数据

查询操作
1
function find(){
    userProvder.find({name:'yuansc'},{},function(err,result){
        console.log(err,result)
    })
}

这样写便可以查询出你想要的数据,提示:你查询出来的result为数组

单条查询
1
function findOne(){
    userProvder.findOne({name:'yuansc'},{},function(err,result){
        console.log(err,result)
    })
}

这样可直接查找单条数据,result为json格式

其他

其他操作方式大家请看DataProvider.js有很多,,

文件操作

引入
1
var BinaryPrivider=require("../../module/BinaryProvider").BinaryProvider;
var binaryProvider=new BinaryPrivider();
存储图片
1
function save() {
    fs.readFile(path, function (err, data) {
        if (err) {
            console.log(err)
        } else {
            var imageID = new ObjectID();
            binaryProvider.write(data, fileType, filename, imageID, function (err, result) {
                if (err) {
                    console.log(err);
                } else {
                    console.log("success")
                }
            })
        }
    })
}

存取图片之前要先将图片转化为binary数据,然后通过write方法写入。fileType为文件类型,fileName为文件名称,imageID为生成的唯一标识

读取文件
1
function getPicture(){
    binaryProvider.read(new ObjectID(id),function(err,binaryData,fileType){
        if(err || result==null || result.length==0){
            console.log(err,result)
        }
        else
        {
           console.log("")
        }
    })
}

这是读取 id为数据库存储时的唯一标识
读取的数据位binary数据,你需要通过fs模块存储为文件,或者可直接将数据发送出去

注释和共享

  • 第 1 页 共 1 页

yuansc

生命不息,奋斗不止


改变世界