zoukankan      html  css  js  c++  java
  • MongoDB集群与LBS应用系列(一)

    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接口。

    分析类比调用

    基础实体类:

     View Code

    在我们关系数据库中,比如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
  • 相关阅读:
    模型命名规范
    Jquery 将表单序列化为Json对象
    Failed to read auto-increment value from storage engine错误的处理方法
    css样式表中设置table的第一列的宽度是固定值
    thinkphp中I("parm")用法的注意事项
    获取凌晨00:00:00的时间
    php empty()和isset()的区别
    react续集
    react的笔记整理
    vuex
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3315844.html
Copyright © 2011-2022 走看看