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树
MongoDB Compass 使用Explain Plan查看查询的示意图目的:提升查询数据速度,同时会在增删改时,由于增加了对索引空间的操作会有缺陷;
关于查询速度的探讨,可用执行计划工具查看,比如创建关于书本的数据库后,在里面插入随意添加5个数据,使用库存量来查询出不同量的数据;
MongoDB Compass 使用Indexes 对Stock创建索引当我们查询其中一本书的时候,查询的文件总数还是5次,所以,需要索引;
再次执行之前的查询语句,可用看到经历的文件数目与得到的目标文件一样多,相比之前遍历查询降低了超级多,想知道为什么,可以自行查询B树的数据结构,当然还可以查B树和B+树相关【B树节点自带数据信息,它允许每个节点可以拥有多个子节点,这样做可以降低树的深度;B+树数据信息是存在最后的叶子节点,查询索引都是通过主键找到叶子节点,除非把所有的字段都创建索引;同时,叶子节点之间会存在一个链指针,由左往右关联,可以减少磁盘IO的次数....;】,可以了解关系型数据库的某些知识;
索引:不支持中文索引,可使用Elasticsearch【分词,聚合】解决分析全文索引的问题
索引的其他:全文索引,聚合索引
6,复制集 --多库
MongoDB配置集群,MongoDB数据库安装路径最好不要存在中文 打开后,上面三个是默认配置,配置复制集需要replication目的:保证MongoDB的高可用,多个数据库实例会保证数据访问的稳定性和数据的高访问性能,和SQL Server数据库中的快照订阅监听实现读写分离是一个道理,MongoDB复制集属于主从结构搭建的,它使用oplog实现主从数据库的数据同步;
创建复制集可自查,网上例子很多;
主从之间如何处理宕机,又如何从从节点中选举出新的作为主节点?
--主从【主从,从从】节点之间会保持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,后续再加
网友评论