MongoDB的特点和适用场景
实用性
MongoDB是一个面向文档的数据库,它并不是关系型数据库,直接存取BSON,这意味着MongoDB更加灵活,因为可以在文档中直接插入数组之类的复杂数据类型,并且文档的key和value不是固定的数据类型和大小,所以开发者在使用MongoDB时无须预定义关系型数据库中的”表”等数据库对象,设计数据库将变得非常方便,可以大大地提升开发进度。下面这个表格是MongoDB和MySQL的逻辑结构对比图。
MongoDB |
MySQL |
文档(document) |
行(row) |
集合(collection) |
表(table) |
数据库(db) |
数据(schema) |
实例(instance) |
实例(instance) |
可用性和负载均衡
MongoDB在高可用和读负载均衡上的实现非常简洁和友好,MongoDB自带了副本集的概念,通过设计适合自己业务的副本集和驱动程序,可以非常有效和方便地实现高可用,读负载均衡。而在其他数据库产品中想实现以上功能,往往需要额外安装复杂的中间件,大大提升了系统复杂度,故障排查难度和运维成本。下图就是最常用的MongoDB架构图之一,即一个Primary节点,两个Secondary节点组成高可用。整个副本集通过客户端驱动连接,当主节点宕机,后台可从其中一个Secondary中自动选举出新的Primary节点,而客户端驱动上也可以配置多种副本集的读写策略。
扩展性
在扩展性方面,假设应用数据增长非常迅猛的话,通过不断地添加磁盘容量和内存容量往往是不现实的,而手工的分库分表又会带来非常繁重的工作量和技术复杂度。在扩展性上,MongoDB有非常有效的,现成的解决方案。通过自带的Mongos集群,只需要在适当的时候继续添加Mongo分片,就可以实现程序段自动水平扩展和路由,一方面缓解单个节点的读写压力,另外一方面可有效地均衡磁盘容量的使用情况。整个mongos集群对应用层完全透明,并可完美地做到各个Mongos集群组件的高可用性。
下图是一个典型的mongos架构图