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

注释和共享

webrtc入门简介

发布在 webrtc


最近一直在研究webrtc的相关工作,在这里也直接坐下记录。

什么是WebRtc

webrtc是还未正式发布的一种视频通讯的新的解决方案,其核心在于通过浏览器来完成这一工作,只要你有浏览器你就可以使用(传统的视频还是通过浏览器嵌入flash插件,或者c++脚本来达到播放视频的效果)。
具体详情点击HERE

主要内容

  • webrtc的原理
  • webrtc在服务器端上的实现
  • webrtc在android端上的实现

webrtc的原理

webrtc在服务器端上的实现

在服务器端上的实现我们又可以分为两部分

  • webrtc在web上的实现
  • webrtc在后端的实现
webrtc在web上的实现

从上面的图片中我们可以看出来,对于web上实现最大的问题还是浏览器的支持,下面是支持webrtc的浏览器

从上面我们看到其实支持的浏览器还是比较少的,至于IE,Safari是打算做自己的WebRtc标准,当然这只 是“小道消息”。
对于页面显示我们要借助与HTML5的Video标签

1
<div class="video_box">
	 <video id="mini" muted="true" autoplay="autoplay" width='192'height='144'></video>
	 <div id="videos" >
   </div>
</div>

Webrtc在web上主要用到下面几个API:

  • PeerConnection
  • RTCSessionDescription
  • getUserMedia

这三种API在不同浏览器中是不同的赋值方式,详情可参阅官方API

webrtc在服务器中的实现

在这里我们要提供两种东西,一种是单纯的socket交互,告诉用户端接下来要怎么做。另外一点就是要提供一个stunserver。
stunsever:因为我们使用Node.js来实现,所以我们使用一个modules—-stunsrv

1
var stunServer = require('stunsrv').createServer();
stunServer.setAddress0("127.0.0.1");
stunServer.setAddress1('0.0.0.0'); //外网IP
stunServer.setPort0(9001);
stunServer.setPort1(9001);
stunServer.listen();

它的功能就是用于穿透路由器,比如在不同网段中聊天,我们首先要确定其在哪个公网ip,然后需要知道是在这个公网ip路由下的哪个本地ip,然后才能进行连接。

Socket:

socket主要由下面几个功能:

  • 实现用户跟服务器之间的持续连接
  • 告诉用户除了你还有谁
  • 告诉用户与你要建立连接的用户所处的状态

通过以上几个功能便能实现用户p2p交流的基本功能了。

webrtc在android端上的实现

在很早之前,google已经在Android的源码中实现了webrtc的功能,但是并没有将此功能实现在大众面前而已。google已经实现了android和ios上的webrtc实现,具体可见HERE(在国内想要完成这个任务还是比较艰巨的)

最终我们要使用的是一个名字叫做libjingle_peerconnection的库,在这里面封装了WebRtc的API,详情可点击这里 而实际上API的使用方式都是相同的,大家可以参照下巨人的例子来进行学习。

参考

注释和共享

Download Java

Android tools runing by Java, so we must install Java before everything.
In ubuntu, we can install it by apt-get, which is very convenient.

1
sudo apt-get install default-jre

Download sdk

1
wget http://dl.google.com/android/android-sdk_r22.0.5-linux.tgz

Config hosts

In china, if we do not config anything else, it will download slowly. So we must config Google’s hosts.

1
sudo vim /etc/hosts

add follow text to hosts file.

1
#Google主页
203.208.46.146 www.google.com
#这行是为了方便打开Android开发官网 现在好像不VPN也可以打开
74.125.113.121 developer.android.com
#更新的内容从以下地址下载
203.208.46.146 dl.google.com
203.208.46.146 dl-ssl.google.com

then save.

Run update

unzip the android-sdk_r22.0.5-linux.tgz file. and into this directory. run this commmand :

1
tools/android update sdk --no-ui -s

then it will update automaticlly.

Config android Path

if we want to use android command tools. We must add sdk to out path.

1
export ANDROID_HOME=~/android-sdk-linux
export PATH=$ANDROID_HOME/tools:$PATH
export PATH=$ANDROID_HOME/platform-tools:$PATH

added this to you .bashrc then source it. Now your can use it.

注释和共享

mysql常用命令

发布在 DB

在这里只是简单记录下mysql的常用命令,以备忘记。

  • mysql新建用户
1
mysql>insert into mysql.user(Host,User,Password) values('localhost','node','1234');
//刷新系统权限表
mysql>flush privileges;
  • 新建DB
1
mysql>create database nodeDB;
  • 将一个表的行为授权给某个用户
1
mysql>grant all privileges on nodeDb.* to 'node@localhost' identified by '1234';

注释和共享

Promise模式

发布在 node.js

Promise简介

我们都知道javascript最令人头痛的问题就是异步问题,所以理所当然的产生了许多解决异步问题的方案,例如在Node.js中(下文中介绍也是Node.js),async,es6 generator等都是很好的解决方案,而在这里我们介绍的是Promise模式。而我们做举例的插件是 bluebird

catch error

之所以接触promise也是因为try catch的问题,当时发现try catch竟然可以捕获 callback方法里面的error,当时感觉到很无语,之后被人推荐才接触了promise。
promise提供了捕获错误的机制,例如下面代码

1
new Promise(function (fulfilled, rejected){
  var name = yuansc.name;
}).catch(function (e) {
    console.log('error:',e);
  })

如下代码就可以直接捕获异常,而且免去了写try catch的麻烦,打印如下

1
error: [ReferenceError: yuansc is not defined]

callback方法的使用

很多时候我们需要用到callback的方法,那么promise怎么使用callback呢

1
function callbackTest(callback) {
  return  new Promise(function (fuifilled, rejected) {
    fs.readFile('./file1', function(err, result) {
      if(err) {
    	rejected(err);
      }
      fuifilled(result);
    })
  }).nodeify(callback);
}
callbackTest(function (err, result) {
  console.log(err, result.toString());
});

根据上面代码我们可以看到promise一开始接收两个参数 fulfilled,以及rejected,当你使用这两个方法的是时候 rejected代表着callback第一个选项,fulfilled则对应着第二个选项,如果对应err,result的话,那么rejected是err, fulfilled 对应着result.

return Promise

promise很大的特点是你使用的时候可以继续返回一个promise对象,可以继续沿用promise的属性

1
function returnPromise() {
  return  new Promise(function (fulfilled, rejected) {
    fs.readFile('./file1', function(err, result) {
      if(err) {
        rejected(err);
      }
      fulfilled(result);
    })
  })
}
returnPromise().then(function (result) {
  console.log("result", result.toString());
}).catch(function (e) {
  console.log("error", e);
});

这样就达到了promise沿用的效果

then的沿用

then是promise很著名的一个关键字,而then也确实十分好用

1
function dothen() {
  return new Promise(function (fulfilled, rejected) {
    fulfilled("hello");
  }).then(function (value) {
      return value +" world"
    }).then(function (value) {
      console.log(value);
    })
}

这句话打印之后会是

1
hello world

PS

介绍不是很全面,更多细节请点击下面API
源代码
API

注释和共享

《参与感》

发布在 读书

本栏由来

不知道从什么时候开始,开始读网络小说之外的东西,当发现的时候想了一下,正好,一方面陶冶情操,另一方面也改一下我一目十行的坏毛病。

正文

我不是一个纯正的米粉,因为小米推出来的时候我也是抱着看SB一样的眼神看它,国产手机,怎么会好。但到今天,当时的想法早已经远去,而我的手机也换成了小米3手机。而当我去深度思考小米的手机,发现这是一个了不起的公司。
读的第一本关于小米的书是《小米的尖叫》,算是《参与感》的极简版,当时也通过书籍了解到了一些之前不知道的事情,那时候发现小米很牛。而最近小米四周年之际小米推出的这本《参与感》更是让我发现,小米真的很厉害,确实值得很多公司去深思,同时也去害怕它。甚至当我们回头看小米的时候,真应了一句话“小米干哪个行业,哪个行业的规则就会被打破”。

  • 小米定义了新的互联网产品的产生过程,让用户参与进来,根据用户的需求做相应的修改,这是之前从没有过的,之前的过程都是,公司定义产品,然后用户被动去接受。而小米论坛的产生真正的发掘了用户的能量,让用户参与进来,让用户直接向工程师说我想要什么样的,这是一种很大的创新。
  • 小米的价格。依稀记得小米出来时,小米的价格是无可争议的最合适,甚至当时怀疑过这样赚钱吗?实际上是赚钱,只不过是别的企业赚得太多了。
  • 小米通过论坛,通过miui充分的将用户与企业联系建立了起来,并且发展出了一大批像果粉一样的米粉,这在联想华为这种企业的产品中是绝对看不到这种现象的。

同时我认为小米创造了一种新的方向,小米的产品文化,企业文化,使别的公司引起了注意,让他们发现用户的重要性,用户也不再是一个空的概念,也许未来的成功,必须依靠于用户,用户说的好的才是真的好。

注释和共享

ubuntu安装gitlab

发布在 ubuntu

GitLab简介

简言之,gitlab就是山寨的github,但gitlab是开源的,而且github是死命的贵,所以对于中小企业来说gitlab真心
是不错的选择。

环境

ubuntu 14.04

具体步骤

URl:https://about.gitlab.com/downloads/

1
 wget https://downloads-packages.s3.amazonaws.com/ubuntu-14.04/gitlab_7.0.0-omnibus-1_amd64.deb
 sudo apt-get install openssh-server
 sudo apt-get install postfix # Select 'Internet Site', using sendmail or exim is also OK
 sudo dpkg -i gitlab_7.0.0-omnibus-1_amd64.deb

 //Edit the configuration file to add your hostname
 sudo edit /etc/gitlab/gitlab.rb

//Install and start GitLab
 sudo gitlab-ctl reconfigure

 //Browse to the hostname and login 
 //Username: root 
 //Password: 5iveL!fe

之所以发此文,是想说一下,真的比之前要简单的多得多了,记得之前各种麻烦,各种安装,现在有点一步登天的感觉。

注释和共享

wordpress是世界上现在用的最多的博客系统,就不再过多介绍;
但是绝大多数wordpress是依靠LAMP(linux+apache+mysql+php)的模式运行,在这里给大家介绍使用nginx反向代理的方式

准备

1 linux(ubuntu server 14.04 64位)
2 mysql(5.6版本,直接通过apt-get install mysql-server安装)
3 nginx(直接通过apt-get install nginx安装)
4 php(php5 安装php5-fpmphp5-mysql 模块)

配置nginx

编辑/etc/nginx/sites-available/default文件
修改成如下样式:

1
server {
	listen 80 ;

	root /var/www/wordpress;
	index index.php;

   ...

	location ~ \.php$ {
		fastcgi_split_path_info ^(.+\.php)(/.+)$;
		fastcgi_pass unix:/var/run/php5-fpm.sock;
		fastcgi_index index.php;
		include fastcgi_params;
	}
}

重启nginx

1
sudo service nginx restart

下载wordpress

1
wget http://cn.wordpress.org/wordpress-3.9-zh_CN.tar.gz

//下载完成后
tar zxvf wordpress-3.9-zh_CN.tar.gz

//复制到 /var/www/wordpress目录下
sudo cp -r wordpress/*  /var/www/wordpress

###配置权限

1
sudo chmod 777 /var/www/wordpress
sudo chmod 777 /var/www/
sudo chmod 777 /var/

配置mysql数据库

命令行输入

1
mysql -u root -p

进入数据库,添加wordpress数据库

1
create database wordpress

5分钟安装

浏览器打开ip 就进入了wordpress安装界面,就可以直接安装了

注释和共享

我们在开发的过程中经常为遇到生成唯一标识符的情况,一个订单,一笔交易,等等。

以前

先上以前的代码:

1
var time=new Date().getTime();
  var randomNum=Math.floor(Math.random()*1000+1);
  return ''+time+randomNum;

很麻烦而且唯一性并不是很好。

node-uuid

在这里给大家介绍一种比较方便的生成方式:

浏览器

1
<script src="uuid.js"></script>

// Generate a v1 (time-based) id
uuid.v1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a'

// Generate a v4 (random) id
uuid.v4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1'

###node.js

1
npm install node-uuid
var uuid = require('node-uuid');

// Generate a v1 (time-based) id
uuid.v1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a'

// Generate a v4 (random) id
uuid.v4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1'

具体详情:点这

注释和共享

yuansc

生命不息,奋斗不止


改变世界