美文网首页
13-mongoDB

13-mongoDB

作者: 安然在路上 | 来源:发表于2021-07-28 10:46 被阅读0次

    重点:
    使用场景 集群搭建(路由节点,配置节点,分片集群) 安全认证 索引类型(ttl-过期索引 分片时也要用到索引)

    1 前言

    NoSQL数据库四大家族

    • 列存储 Hbase,
    • 键值(Key-Value)存储 Redis,
    • 图像存储 Neo4j,
    • 文档存储 MongoDB
    mongo DB

    mongoDB相关命令:
    启动:./bin/mongod -f mongo.conf(-f xxx表示指定配置文件启动)
    连接到服务端:./bin/mongo --port 57017(不带端口默认连接到27017)
    关闭服务器:连接到客服端后,use admin; db.shutdownServer();

    2 MongoDB集合数据操作(CURD)

    2.1 数据添加

    1. 插入单条数据 db.集合名.insert(文档)
      文档的数据结构和JSON基本一样。
    2. 例如:
      db.lg_resume_preview.insert({name:"张晓峰",birthday:new ISODate("2000-07-01"),expectSalary:15000,gender:0,city:"bj"})
      没有指定 _id 这个字段 系统会自动生成 当然我们也可以指定 _id
    3. 插入多条数据
      db.集合名.insert([文档,文档])

    2.2 数据查询

    2.2.1. 比较条件查询
    db.集合名.find(条件)

    条件查询
    2.2.2 逻辑条件查询
    and 条件
    MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件
    db.集合名.find({key1:value1, key2:value2}).pretty()
    or 条件
    db.集合名.find({or:[{key1:value1}, {key2:value2}]}).pretty() not 条件 db.集合名.find({key:{not:{$操作符:value}}).pretty()
    2.2.3. 分页查询
    db.集合名.find({条件}).sort({排序字段:排序方式})).skip(跳过的行数).limit(一页显示多少数据)

    2.3. 数据更新 调用update

    db.集合名.update(
    <query>,
    <update>,
    {
    upsert: <boolean>,
    multi: <boolean>,
    writeConcern: <document>
    }
    )
    

    ps:

    1. <query>:json格式的查询条件
    2. <update>三种更新类型:set - 设置字段值,unset - 删除指定字段,inc - 对修改的值进行自增 举例: db.集合名.update({条件},{set:{字段名:值}},{multi:true})

    2.4 数据删除

    db.collection.remove(
    <query>,
    {
    justOne: <boolean>,
    writeConcern: <document>
    }
    ) 
    

    参数说明:
    query :(可选)删除的文档的条件。
    justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值false,则删除所有匹配条件的文档。
    writeConcern :(可选)用来指定mongod对写操作的回执行为。
    例如:
    db.lg_resume_previem.remove({expectSalary:18000})

    3 实战

    3.1 MongoDB的适用场景

    3.1.1

    ● 网站数据:Mongo 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
    ● 缓存:由于性能很高,Mongo 也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。
    ps:(????mongo真的可以拿来做缓存吗)
    ● 大尺寸、低价值的数据:使用传统的关系型数据库存储一些大尺寸低价值数据时会比较浪费,在此之前,很多时候程序员往往会选择传统的文件进行存储。
    ● 高伸缩性的场景:Mongo 非常适合由数十或数百台服务器组成的数据库,Mongo 的路线图中已经包含对MapReduce 引擎的内置支持以及集群高可用的解决方案。
    ● 用于对象及JSON 数据的存储:Mongo 的BSON 数据格式非常适合文档化格式的存储及查询。

    3.1.2 行业具体应用场景

    ● 游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新。
    ● 物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。
    ● 社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。
    ● 物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。
    ● 直播,使用 MongoDB 存储用户信息、礼物信息等。

    3.1.3 是否使用MongoDB

    是否使用mongo

    3.2 Spring Boot 访问 MongoDB

    有MongoTemplate 方式和MongoRepository 方式,个人更倾向于MongoRepository 方式。
    1、 jar包

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
    <version>2.2.2.RELEASE</version>
    </dependency>
    

    2、配置文件 application.properties

    spring.data.mongodb.host=192.168.211.133
    spring.data.mongodb.port=37017
    spring.data.mongodb.database=lg_resume
    

    3、编写实体类 并在实体类上打@Document(“集合名”)
    4、编写 Repository 接口 继承 MongoRepository
    方法具体参考
    如果内置方法不够用 就自己定义 如:定义find|read|get 等开头的方法进行查询
    5、从Spring容器中获取Repository对象 进行测试

    3.3 复制集

    主从结构没有自动故障转移功能,需要指定master和slave端,不推荐在生产中使用。mongodb4.0后不再支持主从复制,从而使用复制集。
    复制集是由一组拥有相同数据集的mongod实例做组成的集群。
    复制集是一个集群,它是2台及2台以上的服务器组成,以及复制集成员包括Primary主节点,secondary从节点和投票节点。
    复制集提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,保证数据的安全性。
    (仲裁节点也要写dbpath!!!)

    3.4 分片

    分片集群由分片、mongos路由器和配置服务器组成。


    分片

    分片集群由以下3个服务组成:

    • Shards Server: 每个shard由一个或多个mongod进程组成,用于存储数据。
    • Router Server: 数据库集群的请求入口,所有请求都通过Router(mongos)进行协调,不需要在应用程序添加一个路由选择器,Router(mongos)就是一个请求分发中心它负责把应用程序的请求转发到对应的Shard服务器上。
    • Config Server: 配置服务器。存储所有数据库元信息(路由、分片)的配置。
      片键(shard key)
      区块(chunk)

    分片策略:

    • 范围分片(Range based sharding)
      范围分片是基于分片主键的值切分数据,每一个区块将会分配到一个范围。
      范围分片适合满足在一定范围内的查找,例如查找X的值在[20,30)之间的数据,mongo 路由根据Config server中存储的元数据,可以直接定位到指定的shard的Chunk中。
      缺点: 如果shard key有明显递增(或者递减)趋势,则新插入的文档多会分布到同一个chunk,无法扩展写的能力。
    • hash分片(Hash based sharding)
      Hash分片是计算一个分片主键的hash值,每一个区块将分配一个范围的hash值。
      Hash分片与范围分片互补,能将文档随机的分散到各个chunk,充分的扩展写能力,弥补了范围分片的不足,缺点是不能高效的服务范围查询,所有的范围查询要分发到后端所有的Shard才能找出满足条件的文档。
    • 组合片键 A + B(散列思想 不能是直接hash)
      数据库中没有比较合适的片键供选择,或者是打算使用的片键基数太小(即变化少如星期只有7天可变化),可以选另一个字段使用组合片键,甚至可以添加冗余字段来组合。一般是粗粒度+细粒度进行组合。

    链接们:
    1、mongodb添加用户
    2、mongodb复制集中的节点
    3、MongoDB的路由器
    4、MongoDB实战-分片概念和原理
    5、centos固定ip sudo vim ifcfg-ens33
    6、mongo的日志解析

    相关文章

      网友评论

          本文标题:13-mongoDB

          本文链接:https://www.haomeiwen.com/subject/ieowmltx.html