题外话

工作3年,了解的技术颇多,但都是一知半解,了解不是很透澈。用过的技术,就像猴子搬过的包谷,搬一个丢一个。几年风雨,真有点一缕清风过,片叶不沾身的味道。

为强化知识点,提升文档及学习能力,我把以前做过的各种技术点,建成一个分类工具库。在做好每一个技术工具库后,将自己的心得体会写成博客。

正文

一、简介

  • 什么是MongoDB

MongoDB是一种非关系型的基于分布式文档存储的数据库(系统)。支持的数据结构是类似json的BSON格式,而BSON格式本身就支持保存二进制格式的数据,

所以可以存储比较复杂的数据类型。主要解决海量数据访问效率问题和海量计算问题,达到高扩展性、高性能、灵活数据模型、高可用性。

  • 特点

  1. 安装部署简单,支持多种编程语言。
  2. 使用二进制存储数据,适合存储各种大型媒体(音频)对象。
  3. 无完整性约束,支持内嵌文档和数组,随时可以存储自定义的数据格式,支持运行时横向扩展、运行时索引操作。
  4. 无对SQL语言解析过程和对表的锁定与解锁过程,减少很多额外开销。
  5. 支持索引,又是基于键值对存储,使用内存映射访问数据库,有利于提高查询速度。
  6. 支持分配预处理,其中就有提前给每个数据库分配增长大小的文件集,可避免潜在的文件碎片。
  7. 支持复制,分片。
  • 缺陷

  1. 虽然支持内嵌和数组,但是在多表复杂关联情况下就会力不从心。
  2. 无完整性约束,较难保证数据可靠性。
  3. 预分配数据库空间可能造成存储浪费。
  • 实用场景

  1. 做缓存用:由于MongoDB是文件存储,可以保证数据不丢失;使用内存映射访问数据库,访问速度很高;单独服务,不会想IIS被GC自动回收。
  2. 低成本:需快速开发,成本估计较低的项目。
  3. 采集数据:适合存储用于统计功能的高并发采集数据。
  4. 网站数据:MongoDB非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。

二、安装MongoDB

  • 下载安装包

下载地址:https://www.mongodb.com/download-center,根据自己的电脑配置下载相应的安装包。

我下载的是:mongodb-win32-x86_64-2008plus-ssl-3.4.2-signed.msi 这个Windows功能增强“插件”。不用解压,方便直接安装。

  • 建立安装文件夹

在安装磁盘建立文件夹,我是安装在D盘,所以在D盘建立D:\mongodb。内部手动再建立3个文件夹。D:\mongodb\data\db,用于放数据库文件;

D:\mongodb\log,用于放日志文件;D:\mongodb\conf,用于存放配置文件。

  • 正式安装

点击安装,将数据库安装到D:\mongodb文件夹下面,最终安装效果如图:

  • 再在D盘建立两个文件夹,为副本集做准备(不做副本集,可以不管这一步)

在D盘在新建2个文件夹,分别是mongodb1,mongodb2,再将mongodb文件夹中的信息复制粘贴到这2个文件夹里面。

  • CMD将MongoDB安装为安装多个windows服务,并启动

分别在CMD中执行下面3个命令,生成windows服务。

D:\mongodb\bin\mongod --port 27018 --dbpath D:\mongodb\data\db --logpath d:\mongodb\log\mongodb.log --replSet test

--logappend --serviceDisplayName "MongoDB"  --serviceName "MongoDB" --install

D:\mongodb1\bin\mongod --port 27019 --dbpath D:\mongodb1\data\db --logpath d:\mongodb1\log\mongodb.log --replSet test

--logappend --serviceDisplayName "MongoDB1" --serviceName "MongoDB1" --install

D:\mongodb2\bin\mongod --port 27020 --dbpath D:\mongodb2\data\db --logpath d:\mongodb2\log\mongodb.log --replSet test

--logappend --serviceDisplayName "MongoDB2" --serviceName "MongoDB2" --install

      (replSet 是为了后面做副本集做准备,如果只是单服务,只需要执行第一个就可以了)

       下表为mongodb启动的参数说明

  注意:mongodb拒绝访问

该问题,有可能是因为你在cmd下没有权限所致,以管理员身份(win+x,然后A键)启动cmd以后,再执行你原来的命令就没问题了。

 或者使用配置文件形式:

mongo.config,在D:\mongodb\conf中创建配置文件mongo.config,内容如下:

dbpath = D:\mongodb\data\db
logpath = D:\mongodb\log\mongodb.log
logappend = true
directoryperdb = true
serviceName = MongoDB
serviceDisplayName = MongoDB
port = 27018
auth = true

cmd:D:\mongodb\bin\mongod --config D:\mongodb\conf\mongo.config --serviceDisplayName "MongoDB"  --serviceName "MongoDB" --install

启动服务

net start MongoDB

net start MongoDB1。。。

三、可视化工具操作

在网上找了一圈,找到很多工具强大的可视化工具。MongoDB Cloud ManagerMongoDB compassMongoDB Atlas

MongoClientmongo-expressadminMongoNoSQL Manager for MongoDBrobomongo都是比较好的工具,我选择使用

robomongo,原因就是网上说这款比较稳定,其他的没有具体试过,后期把每个拿来用用,看看他们的优缺点。

  • 链接数据库

如图所示,打开robomongo,点击file->connection,在MongoDB Connections 中可以操作链接设置。新建链接,点击create,

出现设置窗口,输入安装时配置的IP:Port,点击save即可。

  • 数据库操作

具体操作我看的 MongoDB查询文档,这个上面对MongoDB讲解比较全面,总结一句话,除了关键字与特殊操作符,其他都是JSON操作

  • 授权

db.createUser(
  {
  user:"lw",
  pwd: "123123",
  roles: [{ role: "readWrite", db: "LW_Test"}]
  }
)
db.auth('lw','123123')

四、MongoDB副本集模式

用多个节点进行同一数据的同步操作,使多个节点上都拥有同一数据的副本,并且在主节点出现故障的时候,通过内部心跳选举机制自动

重新选举一个节点成为主节点。如图所示:

特点

  • 实现故障转移,提高容灾率(提高数据安全性和数据可用性)
  • 可实现灾难恢复
  • 无停机维护(如备份,索引重建,压实)
  • 可实现读写分离。
  • 副本集对应用程序是透明

串联数据库,实现副本集

  • 连接主节点

     D:\mongodb\bin\mongo --port 27018

     

  • 加节点配置   

config = { _id:"test", members:[
... {_id:0,host:"127.0.0.1:27018"},
... {_id:1,host:"127.0.0.1:27019"},
... {_id:2,host:"127.0.0.1:27020"}]
... }

输出:

  • 初始化配置

rs.initiate(config);

        

  • 查看集群节点状态

      rs.status();

  • 测试:

操作数据库之前是没有数据的,当想住节点插入数据以后,副节点异步同步数据成功。当更新主节点信息时,副节点信息也跟着更新。

        

  • 故障转移测试

        将主节点停掉,连接副节点D:\mongodb\bin\mongo --port 27019,查看状态rs.status();可以看到主节点已经转移了。

五、功能难点-C#实现自增列

MongDB自身是没有自增列的功能的,如果需要自增列功能,就需要另想办法。我用的是MongoDB.Driver中的FindOneAndUpdate+InsertData实现。

首先数据库里面先有一行专门做标记行数的一行,每次插入之前需要在标记行里面去查询并修改行数据。

代码如下:

  1. /// <summary>
    /// 实现ID自增
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btn_modified_Click(object sender, EventArgs e)
    {
    string name = txt_name.Text;
    string age = txt_age.Text;
    string friends = textBox1.Text;
    if (!string.IsNullOrWhiteSpace(name) && !string.IsNullOrWhiteSpace(age) && !string.IsNullOrWhiteSpace(friends))
    {
    AutoIncrement autoIncrement = new AutoIncrement()
    {
    Name = name,
    Age = Convert.ToDouble(age),
    Friends = Convert.ToDouble(friends)
    };
    var mongoDBTest = new MongoDBTest();
    var result = mongoDBTest.TestInsertModify(autoIncrement);
    string resultStr = string.Empty;
    //if (result != null)
    //{
    // resultStr = "插入信息:姓名:" + result.Name + "-年龄:" + result.Age + "-朋友:" + result.Friends;
    //}
    txt_show.Text = resultStr;
    }
    else
    {
    txt_show.Text = "请输入姓名-年龄-朋友个数";
    }
    }

     

六、补充

1、实现读写分离还未实现,后续需要测试。

2、持久化中间件:MongoDB.Bson

3、推荐一篇文章,深入副本集:http://www.lanceyan.com/tech/mongodb_repset2.html

4、下一篇写MSMQ应用。

MongDB应用的更多相关文章

  1. solr+mongo-connector+mongdb+tomcat集成

    话题:solr安装 一.下载solr 本例采用4.10.3版本. Solr所有版本下载地址:http://archive.apache.org/dist/lucene/solr/ 下载完成后,解压的目 ...

  2. [MongDB] 主从架构--官方极力不推荐

    一.缘由: 看着数据库大家庭都有主从模式,想着Mongodb应该也不会落下.但从官网看来,先是早先舍弃了Master-Master模式,现在又在不推荐 Master-Slave模式,这是要标新立异呀. ...

  3. MongDB/C# 杂项

    1.MongDB的时间类型字段输出时为UTC的解决方法:保存到数据库中的数据还是按UTC存的,读出来的就按标识值读 [BsonDateTimeOptions(Kind = DateTimeKind.L ...

  4. HBase与MongDB等NoSQL数据库对照

    HBase概念学习(十)HBase与MongDB等NoSQL数据库对照 转载请注明出处: jiq•钦's technical Blog - 季义钦 一.开篇 淘宝之前使用的存储层架构一直是MySQL数 ...

  5. go语言mongdb管道使用

    原始json: { "listsn": "", "code": "fwq_add", "detail" ...

  6. HBase概念学习(十)HBase与MongDB等NoSQL数据库对照

    转载请注明出处: jiq•钦's technical Blog - 季义钦 一.开篇 淘宝之前使用的存储层架构一直是MySQL数据库,配合以MongDB,Tair等存储. MySQL因为开源,而且生态 ...

  7. mongdb创建自增主键(primary key)的相关讨论 - Jason.Zhi

    根据mongodb官方文档介绍,如果在插入(insert)操作时,没有指定主键id,那么它会自动给插入行自动附上一个主键id.看起来不错,但是详细看看,就会发现这个id值有点复杂. 如下图: mong ...

  8. mongdb Java demo

    接触MONGDB,感觉用起来还挺好.今天做了一个小demo. 一.启动mongdb的服务

  9. mongDB 的使用

    首先是启动 mongdb的service ,不启用的话,使用mong shell 连接的现象是: 启动服务端,指定默认的存储的位置即可: mongod  -- dbpath  F:/store  #数 ...

  10. springMVC+ mongdb + redis +Jedis 环境搭建

    环境信息: JDK1.7 : Eclipse 4.4.1 ; mongdb + mongVUE:mongDB的安装 redis的下载和安装:window下安装redis maven3.0.5 新建ma ...

随机推荐

  1. 配置个人Ip代理池

    做爬虫最害怕的两件事一个是被封账户一个是被封IP地址,IP地址可以使用代理来解决,网上有许多做IP代理的服务,他们提供大量的IP地址,不过这些地址不一定都是全部可用,因为这些IP地址可能被其他人做爬虫 ...

  2. 给SVN控制的项目添加忽略文件/文件夹

    忽略目录其实有些像建立一个文件夹,但却不放入版本控制.如果不加入版本控制又会在svn status命令中显示出来,很不方便,所以可以设置本文件夹属性,让它既加入版本控制,又忽略其变化 未加入控制的文件 ...

  3. BZOJ 1711 吃饭dining/Luogu P1402 酒店之王 拆点+最大流流匹配

    题意: (吃饭dining)有F种食物和D种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食物和一种饮料.现在有n头牛,每头牛都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几头牛同时享 ...

  4. python装饰器、迭代器、生成器

    装饰器:为已存在的函数或者或者对象添加额外的功能 def wrapper(f): #装饰器函数,f是被装饰的函数 def inner(*args,**kwargs): '''在被装饰函数之前要做的事' ...

  5. 【转】C语言中access函数

    头文件:unistd.h 功 能: 确定文件或文件夹的访问权限.即,检查某个文件的存取方式,比如说是只读方式.只写方式等.如果指定的存取方式有效,则函数返回0,否则函数返回-1. 用 法: int a ...

  6. linux traceroute-显示数据包到主机间的路径

    博主推荐:更多网络测试相关命令关注 网络测试  收藏linux命令大全 traceroute命令用于追踪数据包在网络上的传输时的全部路径,它默认发送的数据包大小是40字节. 通过traceroute我 ...

  7. 10.Spring Bean的生命周期

    Spring IOC容器可以管理Bean的生命周期,允许在Bean声明周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进行管理的过程. 1.通过构造器或工厂方法创建Bean实 ...

  8. nginx下TP5 隐藏入口文件+支持pathinfo模式+配置多项目根目录

    首先说下项目目录情况  跟目录/usr/share/nginx/html/(别说怎么这么深  0.0) html文件夹下面两个目录 pssh  pssh_shop 两个tp5项目分别对应两个二级域名 ...

  9. 06-看图理解数据结构与算法系列(AVL树)

    AVL树 AVL树,也称平衡二叉搜索树,AVL是其发明者姓名简写.AVL树属于树的一种,而且它也是一棵二叉搜索树,不同的是他通过一定机制能保证二叉搜索树的平衡,平衡的二叉搜索树的查询效率更高. AVL ...

  10. WebLoad 解析服务器返回的JSON格式内容

    服务器返回Json格式的响应内容经常是以 String (txt) 形式返回给客户端.客户端需要把 文本形式的内容还原为Json格式以进一步做处理(如,取得返回内容的一个值作为下个请求的一个输入).这 ...