美文网首页
MongoDb in .Net

MongoDb in .Net

作者: 王清水 | 来源:发表于2021-04-06 00:57 被阅读0次

        1,MongoDb解决的问题

        大数据的增删改查
            --限制:a,32为系统寻址4GB,存储上限仅4GB
                          b,Mongodb3.0 副本集成员最多支持50个,即副本集最大支持50个节点,每个节点支持32T,但时间建议不要超过4T(数据量影响备份恢复时间)
                           c,通常分片会使用默认的chunk大小为64M,分片key (片键)values值是512字节,分片节点支持最大32768个,也就是最大支持数据量为32768TB,其中单个片键大小不能超过512字节

        2,相对关系型数据库

        --关系型数据库 索引B+树限制    --可使用分表+中间件解决,如果不分库的话,存在数据库性能瓶颈(数据库连接池,最大连接数)
            缺陷:维护成本,增加库表时,管理成本加大

        --不支持表连接

        3,核心概念

        --数据库  database

        --集合 collection

        --文档 document

        --字段 field

        --索引 index

        --主键 primary  key

        4,高并发  & 高可用

        索引              --查询优化   
        复制集工具   --高可用   
        分片工具      --高并发

        5,索引  --b树

        目的:提升查询数据速度,同时会在增删改时,由于增加了对索引空间的操作会有缺陷;

        关于查询速度的探讨,可用执行计划工具查看,比如创建关于书本的数据库后,在里面插入随意添加5个数据,使用库存量来查询出不同量的数据;

    MongoDB Compass 使用Explain Plan查看查询的示意图

    当我们查询其中一本书的时候,查询的文件总数还是5次,所以,需要索引;

    MongoDB Compass 使用Indexes 对Stock创建索引

        再次执行之前的查询语句,可用看到经历的文件数目与得到的目标文件一样多,相比之前遍历查询降低了超级多,想知道为什么,可以自行查询B树的数据结构,当然还可以查B树和B+树相关【B树节点自带数据信息,它允许每个节点可以拥有多个子节点,这样做可以降低树的深度;B+树数据信息是存在最后的叶子节点,查询索引都是通过主键找到叶子节点,除非把所有的字段都创建索引;同时,叶子节点之间会存在一个链指针,由左往右关联,可以减少磁盘IO的次数....;】,可以了解关系型数据库的某些知识;

        索引:不支持中文索引,可使用Elasticsearch【分词,聚合】解决分析全文索引的问题

        索引的其他:全文索引,聚合索引

        6,复制集 --多库

        目的:保证MongoDB的高可用,多个数据库实例会保证数据访问的稳定性和数据的高访问性能,和SQL Server数据库中的快照订阅监听实现读写分离是一个道理,MongoDB复制集属于主从结构搭建的,它使用oplog实现主从数据库的数据同步;

    MongoDB配置集群,MongoDB数据库安装路径最好不要存在中文 打开后,上面三个是默认配置,配置复制集需要replication

    创建复制集可自查,网上例子很多;

    主从之间如何处理宕机,又如何从从节点中选举出新的作为主节点?
        --主从【主从,从从】节点之间会保持2s的心跳(Heartbeat)检测,如果10s内从节点没有收到主节点的返回信息,那么就认为主节点已宕机,那么从节点就会进行投票(Vote),投票的过程是从节点会实现给自己投一票,而后,某个从节点主动要求自己成为主节点,那么其他节点会给其他主动要票的投递选取票,这里的谁选举的最后结果,主要是网络因素和其他机制;

    主从节点数据如何实现同步?
        --oplog(关于数据操作的所有记录)
            主节点存有oplog日志,可以提供操作记录
        --定时器
            从节点使用定时器,向主节点拉取oplog日志【异步主动操作】,得到oplog后,从中解析得到数据,存储到自身节点

    复制集的缺点:
        --主从数据始终一致,且每个节点访问压力一致,所以并发量是单个节点实例的并发量,无法做到高并发

        7,分片机制  【传统的分库分表机制】

    分片:拆分数据,分开存储

    以上说的的复制集无法做到高并发,so,引入了分片机制,它由路由Router,分片集群,配置中心 Config Server 组成,它们都是MongoDB实例;

    Router:拆分数据存储到某分片

    Config Server: 存储分片的数据量、数据库以及集合的信息

    Shard:Mongodb实例,用于存储数据

    分片实施需要:当前的最新Mongodb版本,至少需要启动6个实例【2个分片实例,1个路由实例,配置中心3个(这里考虑到高可用,这里是主从节点)】
        --具体实施可自查百度,基本都是配置 .cfg文件,通过rs命令行...,其中启动路由实例需要使用mongos.exe 启动,通过sh命令
        --路由设置不同策略将数据分配到不同的分配中【分片键--字段索引】, 【sh.enableSharding("DbName") sh.shardCollection(fullName, key, unique, options)】如:sh.shardCollection("DbName.CollectionName", {"IndexFieldName": 1})  ....  1或者-1是表示索引的升序降序 

    路由如何将数据存储到分片中的?
        --存储前,路由将数据存储包装为churk(默认64M大小),当churk文档大小比64M小,那么存储的数据依然会存储到之前的分片,所以,测试的时候,需要考虑到这一点;分片的数据大小信息一直存在于Config Server中;如果一次存储的数据大于64M,那么就会存在问题!所以,后续引入了不按照churk大小,而是按照churk数量来分配,所以需要使用hash分片,前者使用的是自动分片。

    hash分片
        -- sh.shardCollection("DbName.CollectionName", {"IndexFieldName": “hashed”}) 

    范围分片  --管理查询
        --后续加

    以上的配置是非常麻烦的,所以需要使用docker + k8s,后续再加

    相关文章

      网友评论

          本文标题:MongoDb in .Net

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