MongoDB从小白到小工
这个blog我们来聊聊MongoDB
MongoDB是一款非常优秀的文档数据库,长期处于全球数据库排名前十的地位。
通过在文档中嵌入文档和数组 ,面向文档的方法能够仅使用一条记录来表现复杂的层次关系,这与使用现代面向对象语言的开发者对数据的看法一致。
无需预定义模式,根据需要添加或删除 字段变得更容易了。
本人作为一个DBA,工作中一直有使用MongoDB,刚开始是架构师或运维同事进行安装和维护。近期这部分维护工作移交到我这边,于是将近期学MongoDB的笔记整理为系列blog。
一.MongoDB介绍
这里简单的介绍了MongoDB,参考的是《MongoDB权威指南》,MongoDB在一定程度上颠覆了关系型数据库,单表即可表示复杂的关系。但是需要注意MongoDB缺少关系型数据库的连表查询,设计的时候要考虑这一点,不然需要将MongoDB的数据同步到关系型数据库,再进行运算,比较麻烦。
二.安装及shell简介
Centos 7安装MongoDB
mongo shell简介
MongoDB 官方提供yum源,直接就可以使用yum安装,比起关系型数据库来说,要方便一些。
mongo shell是用来操作MongoDB的一个命令行工作,需要掌握常见的shell使用方法。
三.mongo身份验证和权限管理
前些年很多用户对mongodb的安全意识是很淡漠的,也因此在前几年出现了一些很严重的针对mongodb的攻击。mongodb提供了一系列的加强安全的措施,经常会用到的也就是用户验证(本文称为client auth)和集群成员间的验证(本文称为internal auth)。上述blog介绍了MongoDB的用户验证。
四.MongoDB 数据库、集合常用操作
MongoDB 创建和删除数据库及集合
MongoDB 简单的增删改查
MongoDB 查询简介
MongoDB同关系型数据库一样,也有数据库,MongoDB集合对应关系型数据库的表。
上述blog介绍了MongoDB数据库及文档的常用操作,已经增删改查语句。
需要注意的是,MongoDB并不兼容SQL,而是自己全新的一套 增删改查的语法,对于SQL常用的查询、过滤记录、字段筛选、排序、比大小、正则、or操作、聚合函数都支持。开始学习MongoDB的要重新学习MongoDB的语法,而不像其他关系型数据库都兼容标准SQL,在此基础上有各自的特殊SQL语法。
另外,MongoDB还支持查询计划,可以说MongoDB是最像关系型数据库的非关系型数据库了。
五.MongoDB备份和恢复
MongoDB同关系型数据库一样支持逻辑备份的导入导出,以及物理备份的 备份和还原。
物理备份的时候要使用fsync命令强制MongoDB服务器同步所有内存数据,然后对数据库加锁防止写入操作,物理备份完成后,再释放掉锁,来保证数据的一致性。
期待MongoDB推出类关系型数据库的热备工作。
另外,MongoDB独有的克隆collection,可以复制数据,当然,由于性能等一些列的原因,后续版本已经不支持此功能。
六.MongoDB 副本集及分片
MongoDB的副本集有点类似MySQL的MHA,也是主从架构,当主库宕机了,从库会升级为主库,其它的从库会从新的主库同步数据。当然MongoDB的副本集是官方推出的工具,比MHA这种第三方的脚本会强大很多。为了保障高可用,强烈建议上MongoDB副本集。
MongoDB的分片这个功能简直不要太强大.
对于一些日志、流水类批量写入的业务,关系型数据库的单机顶不住。一般情况下都是进行分库分表,对业务层的改动太大,而且业务量加大了后,又要继续的分库分表,应用层得改来改去。工作量大不说,期间对服务带来的影响也会给公司带来一定的损失。
MongoDB的分片完美的解决了这个问题,一个mongos服务器用于来响应应用端的请求,mongo配置服务器记录了数据分布的位置,mongo分片服务器实际存储数据。当业务量、并发量加大后,只需要增加分片服务器即可,整个操作对应用透明,应用层无需修改。
生产环境MongoDB分片最好与副本集配合使用,保证数据分布式存储的同时也保证了数据的安全及服务的高可用。
七.MongoDB优化
MongoDB优化常见的方法就是 查询分析器、索引和hint。
这些都是关系型数据库的特性,所以MongoDB也坐实了最像关系型数据库的非关系型数据库。
MongoDB推出了类似MySQL慢查询的慢查询工具,开启了查询分析器后,通过系统表即可以获取。
MongoDB支持MySQL的exlain语句,也可以通过分析查询的执行计划来优化查询。
MongoDB支持关系型数据库拥有的索引,不过与MySQL使用B+tree不同,MongoDB使用的B-tree,使用MongoDB的时候要记住这个区别。
MongoDB支持hint,用于调优MongoDB的慢查询。