zoukankan      html  css  js  c++  java
  • MongDB应用

    题外话

           工作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:mongodbdatadb,用于放数据库文件;

    D:mongodblog,用于放日志文件;D:mongodbconf,用于存放配置文件。

    • 正式安装

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

        

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

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

         

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

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

            D:mongodbinmongod --port 27018 --dbpath D:mongodbdatadb --logpath d:mongodblogmongodb.log --replSet test

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

            D:mongodb1inmongod --port 27019 --dbpath D:mongodb1datadb --logpath d:mongodb1logmongodb.log --replSet test

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

            D:mongodb2inmongod --port 27020 --dbpath D:mongodb2datadb --logpath d:mongodb2logmongodb.log --replSet test

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

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

           下表为mongodb启动的参数说明

          

      注意:mongodb拒绝访问

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

     或者使用配置文件形式:

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

    dbpath = D:mongodbdatadb
    logpath = D:mongodblogmongodb.log
    logappend = true
    directoryperdb = true
    serviceName = MongoDB
    serviceDisplayName = MongoDB
    port = 27018
    auth = true

    cmd:D:mongodbinmongod --config D:mongodbconfmongo.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:mongodbinmongo --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:mongodbinmongo --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 = "请输入姓名-年龄-朋友个数";
                  }
              }
      View Code 

           

             

    六、补充

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

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

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

            4、下一篇写MSMQ应用。

  • 相关阅读:
    最全的项目
    最全的liunx系统修改root用户密码
    最全docker安装步骤
    最全的ideal 常 用 的 快 捷
    最全的ideal 常用的快捷
    ftp路径
    站点路径
    sublime text3 切换中文方法
    UI设计: PS 快捷键 Ctrl+Shift+alt+T,旋转复制
    SQL中表与表的简单关系
  • 原文地址:https://www.cnblogs.com/harveybarray/p/6598238.html
Copyright © 2011-2022 走看看