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. MVC中,视图的Layout使用

    本文目标 1.能够重用Razor模板进行页面的组件化搭建 本文目录 1.母板页_Layout.cshtml 2.用户自定义控件 3.默认Layout引用的使用(_ViewStart.cshtml) 1 ...

  2. 【Python】Python与文本处理langid工具包的文本语言检测和歧视

    1.问题的叙述性说明 使用Python文本处理.文字有时被包括中国.英语.在日本和其他语言文字,进行处理.这个时候就须要判别当前文本是属于哪个语系的. Python中有个langid工具包提供了此功能 ...

  3. 【百度地图API】建立全国银行位置查询系统(二)——怎样为地图添加控件

    原文:[百度地图API]建立全国银行位置查询系统(二)--怎样为地图添加控件 <摘要>你将在第二章中学会以下知识: 使用手写代码的利器——notepad++: 如何为地图添加控件——鱼骨. ...

  4. Roundabout for jQuery

    效果图: Roundabout是一个转换静态HTML元素结构为交互式播放区域的jQuery插件(而且并不仅仅是一个转盘,还有许多的形状) 首先你要下载好Jquery.min.js,和Jquery-Ro ...

  5. The Swift Programming Language-官方教程精译Swift(9) 枚举-- --Enumerations

    枚举定义了一个通用类型的一组相关的值,使你可以在你的代码中以一个安全的方式来使用这些值.   如果你熟悉 C 语言,你就会知道,在 C 语言中枚举指定相关名称为一组整型值.Swift 中的枚举更加灵活 ...

  6. ExtJs--15--Ext.is*各种类型推断的方法,简单看源代码就能够明确了

    /** * Returns true if the passed value is empty, false otherwise. The value is deemed to be empty if ...

  7. c#之函数创建和闭包

    c#之函数创建和闭包 阅读目录: 动态创建函数 匿名函数不足之处 理解c#中的闭包 闭包的优点 动态创建函数 大多数同学,都或多或少的使用过.回顾下c#中动态创建函数的进化: C# 1.0中: pub ...

  8. CentOs Linux 安装MySql服务失败 安装需要依靠包error:Failed dependencies

    [root@sh158-xen data]#rpm -ivh MySQL-server-5.5.24-1.linux2.6.x86_64.rpm error: Failed dependencies: ...

  9. 访问Google神器,魔高一尺,道高一丈!

    最近谷歌的IP被大范围的禁用了.身处一个连谷歌都用不了的过度的程序员,深感命运多舛.幸好,魔高一尺,道高一丈.下面是几种可以使用谷歌的方法. 方法一 1)在chrome浏览器中输入:chrome:// ...

  10. 用CQRS+ES实现DDD

    用CQRS+ES实现DDD 这篇文章应该算是对前三篇的一个补充,在写之前说个题外话,有园友评论这是在用三层架构在写DDD,我的个人理解DDD是一种设计思想,跟具体用什么架构应该没有什么关系,DDD也需 ...