mongoDB是近几年新兴起的一种非关系型数据库(NoSQL),其具有灵活的数据存储方式。数据存储采用bson格式,可以存储比较复杂的数据类型。
相对于传统的数据库,mongoDB具有如下特性:
- 读写性能高
- 灵活的文档模式
- 极大的数据存储能力(humongous)
核心机制
mongoDB采用操作流程提供的 MMAP (内存文件映射)机制进行数据文件的读写,把文件直接映射到进程的内存空间。(访问到的数据会被操作系统映射到内存)对文件的读写是通过操作内存进行的,不需要经过文件缓冲区,即不需要使用fread,fwrite的文件操作方式。mongo3.0加入了集合锁级别的MMAP VI存储引擎和文档锁级别的WiredTiger存储引擎,从而实现了多个用户同时更新一个集合内多个文档的功能,解决了因库锁而排队的问题。
被访问到的数据会被转移到内存,但内存是有限的。不建议热加载的数据大于内存的存储空间。mongoDB在固定的时间内会把内存中的数据刷到磁盘,时间可调。
若服务器突然宕机,数据没有来的及刷新到磁盘。数据是不是就丢失了?? 当然不,强大的mongoDB内部通过journal日志将所有的记录都保存了下来。服务宕机重启后,通过journal上的操作记录就可以把数据全部恢复。
基本操作
mongoDB将关系模型转换成了文档模型,存储更灵活。集合就是一组文档,mysql中的行就是这里的文档,表就是这里的集合。每个集合都是相互独立的。有三个数据库名是预留的:admin,local,config
- 插入数据
>db.person.insert({"name":"a","age":25})
上边的命令即为插入文档的操作,person为集合名,即传统型中的表名。不需要手动创建,自动创建。
- 其他操作
查看上边的命令,可以看到其和高级语言对字符串的处理及其类似。那么查找文档、删除文档等就是调用不同的函数实现。同时可以进行简单的逻辑判断和数组操作。数组操作相对于传统的数据库极大的方便了存储,不需要重新建表。
mongoDB集群的搭建
mongodb集群搭建有以下几种方案:主从、 副本级和分片
主从架构 主节点的数据会同步到从节点,主写数据,从读数据。主从备份的缺点有主节点宕机后,并不支持主动切换连接,目前仅可以手动切换;主节点压力过大的问题没办法解决;不支持数据的路由。
副本级架构 使用多台机器做一份数据的异步同步,一个主节点,多台副本节点。主节点用来写入数据,副本节点用来读数据,主节点是通过选举机制选择出来的,通过oplog日志同步数据。在主节点宕机后可自动切换重新选举主节点,但宕机数大于等于节点数的一半时,将停止选举主节点,故节点数最好为奇数个。为了选举的正常进行,还可以加入一个仲裁节点。
- 分片 分片是为了解决单个集群性能达到瓶颈产生的一种架构方式,即将一台服务器上的压力分散到多个服务器上。分片的架构包括三个组件:mongos(数据库集群请求的入口),config serves(配置服务器),shard server(分片服务器)。分片架构中可以包含副本级架构,将其部署在分片服务器上。由于配置信息的重要性,配置服务器也需要配置多台