MongoDB集群与LBS应用系列(一)

1. 概念

MongoDB作为著名的NoSQL,早已非常流行。它的地理应用也非常成熟,被foursquare用于生产环境也已经多时。本文主要记录今年6月份的一个地理产品中,使用MongoDB的过程和遇到的一些问题以及解决方案。我们在原型系统搭建时候,使用了三台机器,搭建MongoDB ReplicationSet 集群,作为地理数据库以使用。

2. 集群部署

2.1 硬件资源

三台操作系统为CentOS 64bit version6.4的服务器,IP地址和域名

192.168.2.22 mongodb0.ventlam.com
192.168.2.23 mongodb1.ventlam.com
192.168.2.24 mongodb2.ventlam.com

2.2 软件安装

2.2.1 创建MONGODB专有的软件源

下载并安装mongo 2.4.5版本,(3台机器分别执行)

vim /etc/yum.repos.d/10gen.repo 
  • 添加以下源列表
[10gen] name=10gen Repository baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64 gpgcheck=0 enabled=1 


* 安装MongoDB

 yum install mongo-10gen mongo-10gen-server 

2.2.2 REPLICATION SET 集群搭建

部署生产环境下的MongoDB ReplicationSet ,需要数据库部署在尽可能隔离的机器上(每个数据库部署在不同的物理机器,使用不同的网络和不同的电源)。

2.2.2.1 需要配置mongodb 通过域名能够访问

修改/etc/host或者配置DNS实现(3台机器分别执行)

vim /etc/host

添加如下命令

192.168.2.22 mongodb0.ventlam.com
192.168.2.23 mongodb1.ventlam.com
192.168.2.24 mongodb2.ventlam.com

修改数据库配置文件(3台机器分别执行)

vim /etc/mongod.conf 

在配置文件加入以下参数:

port = 27017 dbpath = /mnt/mongo replSet = rs0 

启动数据库 (3台机器分别执行) 创建数据目录 mkdir /mnt/mongodb/,并修改配置文件启动mongodb

vim /etc/rc.d/init.d/mongod 

启动

mongod service mongod start 

添加开机启动

chkconfig mongod on 

2.2.2.2 检查三台机器数据库是否可以互联

首先开放27017端口 (3台机器分别执行)

 /sbin/iptables -I INPUT -p tcp --dport 27017 -j ACCEPT 
/etc/rc.d/init.d/iptables save

然后分别检查连接情况,在所有机器输入以下命令:

mongo --host mongodb1.ventlam.com --port 27017 mongo --host mongodb2.ventlam.com --port 27017 

如果都可以进入mongo shell界面,即可。否则,请检查防火墙规则。

2.2.2.3 配置repilcation set

进入mongo shell mongo 输入以下配置命令(只需要在任意一台机器执行)

rsconf = { \_id: "rs0", 
  members: [ { _id: 0, host: "mongodb0.ventlam.com" },
         { _id: 1, host: "mongodb1.ventlam.com" },
         { _id: 2, host: "mongodb2.ventlam.com" } ] }

2.2.2.4 初始化

rsconf rs.initiate(rsconf) 

查看rsconf配置情况

rs.conf() 

如果返回下列值,证明mongodb集群搭建成功

{ "_id" : "rs0", "version" : 1, 
"members" : [ { "\_id" : 0, "host" : "mongodb0.ventlam.com:27017" },
{ "\_id" : 1, "host" : "mongodb1.ventlam.com:27017" },
        { "\_id" : 2, "host" : "mongodb2.ventlam.com:27017" } ] }

2.2.2.5 添加删除数据实例

rs.add("<hostname>:27017")

rs.remove("<hostname>:27017")


本作品由VentLam创作,采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。

MongoDB学习之--增删改查(2)

 

昨天简单介绍了官方驱动操作MongoDB进行增删查操作的,今天继续介绍更新操作.....

方法简介

官方驱动中更新操作使用collection的Update方法,有泛型和非泛型两个版本:

其签名如下(列出了两个简单并常用的的重载,还有几个):

public virtual WriteConcernResult Update(IMongoQuery query, IMongoUpdate update);
public virtual WriteConcernResult Update(IMongoQuery query, IMongoUpdate update, UpdateFlags flags)

首先分析一下方法参数:

IMongoQuery 和 IMongoUpdate只是两个约束接口,实现了该接口的类均可作为该方法参数,对于前者,在这里我们主要通过Query类的静态方法和 QueryBuilder<T>这个泛型类的实例方法来构造
IMongoQuery ;对于IMongoUpdate我们主要通过Update类以及其泛型版本的静态方法来构造,其静态方法返回值类型为UpdateBuilder,该类恰好实现了IMongoUpdate接口。

分析类比调用

基础实体类:

 

在我们关系数据库中,比如oracle或者sqlserver中按照实体类设计,表结构应该是两个,学生信息表以及地址表,但是我们假设存储在一个表中方便我们类比;我要更新数据库中信息,通常关系数据库中我们是这么做的:

update tableName set  a='a' and  b='b'  where  c='c'

在mongodb中我们就是向下面这样做:

use dbName;

db.CollectionName.update({query:"query"},{"$set":{update:"update"}})

现在看我们通过C#驱动怎么构造这样一种结构:关于IMongoQuery的构造上一篇我也介绍过一些,这里只谈下上次没说的部分 ,

首先构造IMongoQuery:

a.通过QueryBuilder<T>构造

var t1 = queryBuilder.EQ<String>(t => t.Address.City, "北京");//where city="北京"

b.通过Query构造

 var t2 = Query.EQ("Address.City", "北京");//where city="北京"
var t3 = Query<Student>.EQ<String>(t => t.Address.City, "北京");//where city="北京"

其次,构造IMongoUpdate

var u1 = Update<Student>.Set<String>(t => t.Address.City, "上海");//set city="上海"
var u2 = Update.Set("Address.City", "上海");//set city="上海"

这样可以往下调用update方法了

collection.Update(t1, u2);//只更新满足t1的一个文档对象
collection.Update(t1, u2, UpdateFlags.Multi);//更新满足t1的所有文档对象

今天就到这里了,另:Update类还有其他用于设置的方法不单set方法,这里有兴趣的可以看下api,加深下了解。。。

 
 
 
标签: mongodb数据库nosql
 
标签: NoSQLmongodb数据库lbs

MongoDB集群与LBS应用系列(一)的更多相关文章

  1. MongoDB集群与LBS应用系列(二)--与Hadoop集成

    长期以来,我每开个系列,只有兴趣写一篇,很难持之与恒.为了克服这个长久以来的性格弱点,以及梳理工作半年的积累.最近一个月会写两篇关于Mongo在地理大数据方面的实践和应用,一篇关于推荐系统的初期准备过 ...

  2. mongodb系列~mongodb集群介绍与管理

    mongodb 集群维护1 简介    谈谈mongodb的集群架构2 常用的维护命令   1 查看状态 sh.status()         1 version        2 shards: ...

  3. 搭建高可用mongodb集群(四)—— 分片(经典)

    转自:http://www.lanceyan.com/tech/arch/mongodb_shard1.html 按照上一节中<搭建高可用mongodb集群(三)-- 深入副本集>搭建后还 ...

  4. [转]搭建高可用mongodb集群(四)—— 分片

    按照上一节中<搭建高可用mongodb集群(三)—— 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的 ...

  5. 搭建高可用mongodb集群(四)—— 分片

    按照上一节中<搭建高可用mongodb集群(三)—— 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的 ...

  6. 搭建高可用mongodb集群(四)—— 分片

    按照上一节中<搭建高可用mongodb集群(三)-- 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的 ...

  7. 搭建高可用mongodb集群—— 分片

    从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出 ...

  8. MongoDB集群卡死问题

    一年前搭了个MongoDB集群,跑得还算不错,但是有几次遇到过服务卡死的问题.处理起来已经得心应手了,拿来跟大家分享一下: 故障现象: 业务查询缓慢,而且会有连接异常: { "serverU ...

  9. mongodb集群安装及到现在遇到的一些问题

    集群搭建 只有3台服务器,开始搭建mongodb集群里主要参照的是http://www.lanceyan.com/tech/arch/mongodb_shard1.html,端口的设置也是mongos ...

随机推荐

  1. Tomcat剖析(二):一个简单的Servlet服务器

    Tomcat剖析(二):一个简单的Servlet服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三) ...

  2. SSAS系列——【08】多维数据(程序展现Cube)

    原文:SSAS系列--[08]多维数据(程序展现Cube) 1.引用DLL? 按照之前安装的MS SQLServer的步骤安装完成后,发现在新建的项目中“Add Reference”时居然找不到Mic ...

  3. T4模板生成不同部署环境下的配置文件

    使用T4模板生成不同部署环境下的配置文件 在开发企业级应用的时候,通常会有不同的开发环境,比如有开发环境,测试环境,正式环境,生产环境等.在一份代码部署到不同环境的时候,不同环境的配置文件可能需要根据 ...

  4. C# 获取磁盘容量

    原文:C# 获取磁盘容量 /// 获取指定驱动器的空间总大小(单位为B) /// </summary> /// <param name="str_HardDiskName& ...

  5. 有空就写个C++程序

    近期工作变得轻松了非常多,有了一些空暇的时间,准备把大学时候的C++抓起来,而且研究研究算法: 第一个C++程序:计算圆的面积,也是看其它的博客写出来的C++程序. #include<iostr ...

  6. openstack shelve/unshelve/stop浅析

    声明: 本博客欢迎转发,但请保留原作者信息! 博客地址:http://blog.csdn.net/halcyonbaby 内容系本人学习.研究和总结,如有雷同,实属荣幸! stop的虚拟机仅仅是将虚拟 ...

  7. jQuery邮箱验证正则表达式验证邮箱合法

    if($.trim(email)==''||$.trim(email)=='邮    箱:'||$.trim(email)==null){ alert('邮箱不能为空!'); return false ...

  8. IS2009制作Oracle 静默安装包(一)感谢空白先生特许授权

    原文:IS2009制作Oracle 静默安装包(一)感谢空白先生特许授权 上一篇: MyEclipse中消除frame引起的“the file XXX can not be found.Please ...

  9. 最新发布树莓派2代Wi-Fi自动连接实战(适合初学者)

    话说天地会珠海分舵在上几天才刚给大家分享了个海外资讯说树莓派2已经发布且Windows10加盟之类的资讯,具体请查看<海外优秀资讯抢先看8 - Windows 10 for Raspberry ...

  10. JS获取渲染后的样式

    一般我们利用element.style.属性来获取CSS的样式,而此方法只能获取标签内的样式,无法获取头部或引入的样式,因此,而我们又需要获取其样式,则我们可以使用:(其中element为标签,pro ...