参考文献
- 下载地址 https://www.mongodb.com/download-center#community
- 在线文档 https://docs.mongodb.com/manual/introduction/
- 名词解释:
MongoDB是一个使用C++编写的、开源的、面向文档的NoSQL(Not Only SQL)数据库,也是当前最热门的NoSql数据库之一。
NoSQL简介
NoSQL的意思是“不仅仅是SQL”,是目前流行的“非关系型数据库”的统称。常见的NoSQL数据库如:Redis、CouchDB、MongoDB、HBase、Cassandra等。
背景
出现NoSQL的原因:为解决在Web2.0时代出现的三高要求:
- 对数据库高并发读写的需求
- 对海量数据的高效率存储和访问的需求
- 对数据库的高可扩展性和高可用性的需求
- 而RDB里面的一些特性,在web2.0里面往往变得不那么重要,比如:
- 数据库事务一致性
- 数据库的实时读写
- 复杂的SQL查询,特别是多表关联查询
CAP定理
又被称作布鲁尔定理(Eric Brewer)它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
- 强一致性(Consistency):系统在执行某项操作后数据状态仍然处于一致,例如在分布式系统中,更新操作执行成功后所有的用户都应该读取到最新的值,这样的系统被认为具有强一致性。
- 可用性(Availability):每一个操作总是能够在一定的时间内返回结果
- 分区容错性(Partition tolerance):单个节点故障不应导致整个系统崩溃,也就是说尽管网络在节点之间丢弃(或延迟)任意数量的消息,但是系统继续操作。
根据CAP原理将数据库分成了满足CA原则、满足CP原则和满足AP原则三大类
- CA:单点集群,满足一致性,可用性,通常在可扩展性上不太强大,比如RDB。
- CP:满足一致性和分区容错性,通常性能不是特别高,如分布式数据库。
- AP:满足可用性和分区容错性,通常可能对一致性要求低一些,如大多数的NoSQL。
BASE(Basically Available,Soft-state,Eventual consistency)
eBay的架构师Dan Pritchett源于对大规模分布式系统的实践总结,在ACM上发表文章提出BASE理论,BASE理论是对CAP理论的延伸,核心思想是即使无法做到强一致性(Strong Consistency,CAP的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。
- 基本可用(Basically Available):系统能够基本运行并一直提供服务。
- 软状态(Soft-state):系统不要求一直保持强一致状态。
- 最终一致性(Eventual consistency):系统需要在某一时刻后达到一致性要求。
NoSQL的特点
优点
- 扩展简单方便,尤其是水平横向扩展(纵向扩展是指用更强的机器;横向扩展是指把数据分散到多个机器)。
- 读写快速高效,多数都会映射到内存操作。
- 成本低廉,用普通机器,分布式集群即可。
- 数据模型灵活,没有固定的数据模型。
缺点
- 不提供对SQL的支持
- 对事务操作的支持较弱
MongoDB使用场景
下列举例出业界经常使用的场景
- 游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新
- 物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。
- 社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能
- 物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析
- 视频直播,使用 MongoDB 存储用户信息、礼物信息等
并没有某个业务场景必须要使用 MongoDB才能解决,但使用 MongoDB 通常能让你以更低的成本解决问题(包括学习、开发、运维等成本),下面是 MongoDB 的主要特性,大家可以对照自己的业务需求看看,匹配的越多,用 MongoDB 就越合适。
MongoDB 特性 | 优势 |
---|---|
事务支持 | MongoDB 目前只支持单文档事务,需要复杂事务支持的场景暂时不适合 |
灵活的文档模型 | JSON 格式存储最接近真实对象模型,对开发者友好,方便快速开发迭代 |
高可用复制集 | 满足数据高可靠、服务高可用的需求,运维简单,故障自动切换 |
可扩展分片集群 | 海量数据存储,服务能力水平扩展 |
高性能 | mmapv1、wiredtiger、mongorocks(rocksdb)、in-memory 等多引擎支持满足各种场景需求 |
强大的索引支持 | 地理位置索引可用于构建 各种 O2O 应用、文本索引解决搜索的需求、TTL索引解决历史数据自动过期的需求 |
Gridfs | 解决文件存储的需求 |
aggregation & mapreduce | 解决数据分析场景需求,用户可以自己写查询语句或脚本,将请求都分发到 MongoDB 上完成 |
安装
mongodb的安装方式比较简单,下面演示在CentOS7上用yum方式安装。
使用yum方式安装
在实际生产环境中服务器上的软件通常都由运维人员安装,我们通过此种傻瓜式安装是为了方便现在学习。
-
整个mongodb(社区版)包含如下软件
软件名称 描述 mongodb-org-server 包含mongod守护程序和关 联的配置和init脚本 mongodb-org-mongos 包含mongos守护程序 mongodb-org-shell 包含mongo shell,它是一个连接mongodb的命令行客户端,允许用户直接输入nosql语法管理数据库。 mongodb-org-tools 包含以下工具的MongoDB:数据导入、导出、备份、恢复等等 -
创建yum源文件
vim /etc/yum.repos.d/mongodb-org-3.4.repo1
- 把下面的内容复制到上面的文件中
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc123456
- 启动yum命令开始安装
yum install -y mongodb-org1
- 如果使用SELinux,则必须配置SELinux,以允许在基于Red Hat Linux的系统(Red Hat Enterprise Linux或CentOS Linux)上启动MongoDB。
vim /etc/selinux/config
#在打开的文件中将值设置为disabled
SELINUX=disabled
关闭THP
自CentOS6版本开始引入了Transparent Huge Pages(THP),从CentOS7版本开始,该特性默认就会启用。尽管THP的本意是为提升内存的性能,不过某些数据库厂商还是建议直接关闭THP(比如说Oracle、MariaDB、MongoDB等),否则可能会导致性能出现下降。
首先检查THP的启用状态:不关闭mongo启动的时候会警告。
-
// 检查THP状态 cat /sys/kernel/mm/transparent_hugepage/defrag [always] madvise never cat /sys/kernel/mm/transparent_hugepage/enabled [always] madvise never 这个状态就说明都是启用的。
-
//禁用THP,编辑rc.local文件 vim /etc/rc.d/rc.local 增加下列内容: if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag fi
编辑完了需要重启服务器才能生效。
配置信息
mongo配置文件操作
-
安装完后寻找相关配置信息
-
whereis mongd
-
mongod: /usr/bin/mongod /etc/mongod.conf /usr/share/man/man1/mongod.1
-
mongd.conf 就是配置文件。
-
打开就可以看到相关配置信息。
mongdb权限操作配置信息
Built-In Roles(内置角色):
- 数据库用户角色:
- read、readWrite;
- 数据库管理角色:
- dbAdmin、dbOwner、userAdmin;
- 集群管理角色:
- clusterAdmin、clusterManager、clusterMonitor、hostManager;
- 备份恢复角色:
- backup、restore;
- 所有数据库角色:
- readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户角色:
- root
- 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
- root
- 内部角色:
- __system
具体角色:
- Read:
- 允许用户读取指定数据库。
- readWrite:
- 允许用户读写指定数据库。
- dbAdmin:
- 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile。
- userAdmin:
- 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户。
- clusterAdmin:
- 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
- readAnyDatabase:
- 只在admin数据库中可用,赋予用户所有数据库的读权限。
- readWriteAnyDatabase:
- 只在admin数据库中可用,赋予用户所有数据库的读写权限。
- userAdminAnyDatabase:
- 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限。
- dbAdminAnyDatabase:
- 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
- root:
- 只在admin数据库中可用。超级账号,超级权限。
开启用户权限
提示:即便设置了账号密码依然可以不通过密码链接,需要在mongo 启动的时候开启认证。
- 创建用户
- 注意读写用户的权限请使用readWrite。
show dbs;
//显示数据库列表
use admin;
//进入admin collections
db.createUser({"user":"root","pwd":"z201.com","roles":[{"role":"root","db":"admin"}]})
//创建超级管理员root库管理账号
db.auth("root","z201.com")
//校验账号是否匹配
1
//显示1表示匹配成功
- 修改密码
db.changeUserPassword('root','z201.com');
- 数据库开启认证,注意请进入数据库中在执行。
security:
authorization:true
基础操作
启动
- systemctl start mongod
重启
- systemctl restart mongod
- 如果无效
- use admin
- db.shutdownServer();
停止
- systemctl stop mongod
认证模式启动
- nohup mongod --auth --port 27017 --dbpath /var/lib/mongo/ &
- /var/bin/mongd 可以在mongod.conf中查看。
CURD
- 插入
db.ops_dev.insert({title: 'MongoDB ',
description: 'MongoDB 是一个 Nosql 数据库',
tags: ['mongodb', 'database', 'NoSQL']
})