Mongodb基本概念
官网 https://www.mongodb.com/
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
1、Mongodb的分片机制是mongodb数据库的核心机制,也是其可用性高,扩展性好的原因,分片—sharding 的意思就是将数据库数据分散存贮到不同的服务器上,来缓解高并发访问,均衡负载。 举例来说一下,比如说一个collection有TB级别的数据,在传统方式下如果有两个线程要访问其中的数据,即使这个线程访问的数据是不同的,为保证同步需要排队等待,分片机制可以很好的解决这个问题,分片机制其实就是分布式的集群,比如现在有五台服务器作为集群,mongodb可以将一个collection的数据分割成5个片—chunk 分别存放到5个server并且mongodb还会记录下每一条数据的位置,这样一来当用户访问集合里面的文档时,mongodb可以根据请求条件来查找到对应数据所在的服务器然后返回数据,这样下来可以将多请求的负责分摊到各个服务器的分片上,大大提高数据库系统的吞吐量。
分片:一份数据被分开保存在N台机器上,N个机器上的数据组合起来是一份数据。
副本集:同一份数据被保存在N台机器上,每台机器上都有一份数据。
2、分片的优点:
(1)读写方面。①读写的水平扩展。分片之后mongodb就可以分布这些读写的负载到集群中的不同分片,允许每一个分片去处理集群操作的一个子集。这样不管是读负载还是写负载都可以通过添加更多的分片来实现水平扩展。②读写的针对性路由。对于包含分片键或者复合分片键前缀的查询,mongos可以将查询直接路由到指定的分片或者一组分片上,这种针对性的操作通常是比向集群中每个分片进行广播请求要高效得多。
(2)存储能力。通过分片可以将数据分布在整个集群,这样每个分片只包含整个集群数据的一个子集。随着数据集的增长,通过新增分片就可以加大集群的存储能力。
(3)高可用。Config Server和分片作为副本集的部署提供了更高的可用性。即使一个或多个分片副本集变得完全不可用,分片集群也可以继续执行部分读写。也就是说,虽然无法访问不可用分片上的数据,但针对可用分片的读写仍然可以成功。
3、分片前需要考虑的点
分片集群
- 什么是分片?
将数据水平拆分到不同的服务器上
- 为什么要使用分片集群
数据量突破单机瓶颈,数据量大,恢复很慢,不利于数据管理
并发量突破单机性能瓶颈
MongoDB 分片集群由一下几部分组成
分片集群角色
路由节点
mongos, 提供集群单一入口,转发应用端请求,选择合适的数据节点进行读写,合并多个数据节点的返回。无状态,建议 mongos节点集群部署以提供高可用性。客户请求应发给mongos,而不是 分片服务器,当查询包含分片片键时,mongos将查询发送到指定分片,否则,mongos将查询发送到所有分片,并汇总所有查询结果。
配置节点
就是普通的mongod进程, 建议以复制集部署,提供高可用
提供集群元数据存储分片数据分布的数据。主节点故障时,配置服务器进入只读模式,
只读模式下,数据段分裂和集群平衡都不可执行。整个复制集故障时,分片集群不可用
数据节点
以复制集为单位,横向扩展最大1024分片,分片之间数据不重复,所有数据在一起才可以完整工作。
分片键
可以是单个字段, 也可以是复合字段
- 范围分片
比如 key 的值 从 min - max
可以把数据进行范围分片
- hash 分片
通过 hash(key ) 进行数据分段
片键值用来将集合中的文档划分为数据段,片键必须对应一个索引或索引前缀(单键、复合键),可以使用片键的值 或者片键值的哈希值进行分片
选择片键
- 片键值的范围更广(可以使用复合片键扩大范围)
- 片键值的分布更平衡(可使用复合片键平衡分布)
- 片键值不要单向增大、减小(可使用哈希片键)
数据段的分裂
当数据段尺寸过大,或者包含过多文档时,触发数据段分裂,只有新增、更新文档时才可能自动触发数据段分裂,数据段分裂通过更新元数据来实现
集群的平衡
后台运行的平衡器负责监视和调整集群的平衡,当最大和最小分片之间的数据段数量相差过大时触发;集群中添加或移除分片时也会触发
MongoDB分片集群特点
1.应用全透明
2.数据自动均衡
3.动态扩容,无需下线