Open jinhailang opened 7 years ago
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应 用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能 最丰富,最像关系数据库的。
NoSQL一词最早出现于1998年,是Carlo Strozzi开发的一个轻量、开源、不提供 SQL功能的关系数据库。 2009年,Last.fm的Johan Oskarsson发起了一次关于分布式开源数据库的讨论 [2],来自Rackspace的Eric Evans再次提出了NoSQL的概念,这时的NoSQL主要指 非关系型、分布式、不提供ACID的数据库设计模式。 NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不 同于传统的关系型数据库的数据库管理系统的统称。 NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿 比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
在计算机科学中, CAP定理(CAP theorem), 又被称作 布鲁尔定理(Brewer's theorem), 它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
mongod:数据库节点
mkdir -p /data/db cd ./bin/ && sudo ./mongod
mongo:MongoDB后台管理 Shell
sudo ./mongo OR sudo ./mongo 127.0.0.1/admin -supper -p123abc - 创建新用户 > use m_test > db.createUser({ user: "mtest", pwd: "123abc", roles: [ { role: "readWrite", db: "admin" }, { role: "read", db: "test" }, { role: "read", db: "m_test" }, ] }) 注意:roles 定义了操作权限,`验证数据库和权限数据库是分离的`,这里的账号密码可以连接数据库 `m_test`,但连接 `admin`或其他数据库会报验证失败 - 查看当前操作的数据库 > db test - 插入一些简单的记录并查找它: > db.runoob.insert({x:10}) WriteResult({ "nInserted" : 1 }) > db.runoob.find() { "_id" : ObjectId("5604ff74a274a611b0c990aa"), "x" : 10 }
MongoDb web:用户界面
MongoDB 提供了简单的 HTTP 用户界面。 如果你想启用该功能,需要在启动的时候指定参数 --rest
./mongod --dbpath=/data/db --rest
MongoDB 的 Web 界面访问端口比服务的端口多1000。默认:http://localhost:28017
常用操作
use DATABASE_NAME 切换/创建数据库
db.dropDatabase() 删除当前数据库
db.collection.drop() 删除集合 collection
collection
show dbs 查看当前所有数据库
show collections 查看当前数据库的所有集合
db.COLLECTION_NAME.insert(document) 插入文档
db.COLLECTION_NAME.find() 查询集合的的所有文档
> db.rundb.find().pretty() { "_id" : ObjectId("58ef5da28b88263cdf51ecea"), "user" : "jin", "sex" : "man", "age" : 24 "by" : "sb", "tags" :[ "a", "b", "c" ] } 与操作 > db.col.find({"sex":"man","age":24}).pretty() 或操作 > db.col.find({$or:[{"sex":"man"},{"age":24}]}).pretty()
条件操作符
示例:db.rundb.find({"age" : {$gt : 18}})
db.COLLECTION_NAME.find().limit(NUMBER) 读取指定数量的数据记录
db.COLLECTION_NAME.ensureIndex({KEY:1}) 建索引,1:升序 -1:降序
1
-1
示例:> db.rundb.ensureIndex({"title":1,"description":-1})
> db.rundb.ensureIndex({"title":1,"description":-1})
db.COLLECTION_NAME.find().sort({KEY:1}) 排序
aggregate() 聚合(group)
高级操作
全文检索
建立索引 > db.rundb.ensureIndex({user:"text"}) 查找 >db.rundb.find({$text:{$search:"ji"}})
正则表达式
> db.rundb.find({user:{$regex:"ji"}})
MongoDB复制是将数据同步在多个服务器的过程。 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性。 主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。MongoDB的副本集与我们常见的主从有所不同,主从在主机宕机后所有服务将停止,而副本集在主机宕机后,副本会接管主节点成为主节点,不会出现宕机的情况。
MongoDB复制结构图如下所示:
启动主节点: mongod --port 27017 --dbpath "./data" --replSet rs0 在客户端操作 启动副本集: > rs.initiate() 副本集添加成员: > rs.add(HOST_NAME:PORT)
在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。
MongoDB中使用分片集群结构分布:
操作步骤:
1)mkdir -p /data/shard/log && mkdir -p /data/shard/s0 && mkdir -p /data/shard/s1 ... 2)./mongod --port 27020 --dbpath=/data/shard/s0 --logpath=/data/shard/log/s0.log --logappend --fork ... ./mongod --port 27023 --dbpath=/data/shard/s1 --logpath=/data/shard/log/s1.log --logappend --fork 3)./mongod --port 27100 4)./mongos --port 40000 --configdb localhost:27100 --fork --logpath=/data/shard/log/route.log --chunkSize 500 * chunk的大小的,单位是MB,默认大小为200MB. 5)使用MongoDB Shell登录到mongos,添加Shard节点 ./mongo admin --port 40000 > db.runCommand({ addshard:"localhost:27020" }) > db.runCommand({ enablesharding:"test" }) #设置分片存储的数据库 6)直接按照连接普通的mongo数据库那样,将数据库连接接入接口 40000
在Mongodb中我们使用mongodump命令来备份MongoDB数据。该命令可以导出所有数据到指定目录中。 mongodump命令可以通过参数指定导出的数据量级转存的服务器。
备份: > mongodump -h dbhost -d dbname -o dbdirectory 示例:> mongodump -h 127.0.0.1:27017 -d test -o /data/dump 恢复: > mongorestore -h <hostname><:port> -d dbname <path>
RockMongo是PHP5写的一个MongoDB管理工具。 通过 Rockmongo 你可以管理 MongoDB服务,数据库,集合,文档,索引等等。 它提供了非常人性化的操作。类似 phpMyAdmin(PHP开发的MySql管理工具)
Rockmongo 下载地址:http://rockmongo.com/downloads
概述
NoSQL
RDBMS vs NoSQL
CAP定理(CAP theorem)
在计算机科学中, CAP定理(CAP theorem), 又被称作 布鲁尔定理(Brewer's theorem), 它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
组件
mongod:数据库节点
mongo:MongoDB后台管理 Shell
MongoDb web:用户界面
MongoDB 提供了简单的 HTTP 用户界面。 如果你想启用该功能,需要在启动的时候指定参数 --rest
./mongod --dbpath=/data/db --rest
MongoDB 的 Web 界面访问端口比服务的端口多1000。默认:http://localhost:28017
使用
常用操作
use DATABASE_NAME 切换/创建数据库
db.dropDatabase() 删除当前数据库
db.collection.drop() 删除集合
collection
show dbs 查看当前所有数据库
show collections 查看当前数据库的所有集合
db.COLLECTION_NAME.insert(document) 插入文档
db.COLLECTION_NAME.find() 查询集合的的所有文档
条件操作符
示例:db.rundb.find({"age" : {$gt : 18}})
db.COLLECTION_NAME.find().limit(NUMBER) 读取指定数量的数据记录
db.COLLECTION_NAME.ensureIndex({KEY:1}) 建索引,
1
:升序-1
:降序示例:
> db.rundb.ensureIndex({"title":1,"description":-1})
db.COLLECTION_NAME.find().sort({KEY:1}) 排序
aggregate() 聚合(group)
高级操作
全文检索
正则表达式
> db.rundb.find({user:{$regex:"ji"}})
数据操作
复制(副本集)
MongoDB复制是将数据同步在多个服务器的过程。 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性。 主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。MongoDB的副本集与我们常见的主从有所不同,主从在主机宕机后所有服务将停止,而副本集在主机宕机后,副本会接管主节点成为主节点,不会出现宕机的情况。
MongoDB复制结构图如下所示:
分片
在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。
MongoDB中使用分片集群结构分布:
操作步骤:
备份与恢复
在Mongodb中我们使用mongodump命令来备份MongoDB数据。该命令可以导出所有数据到指定目录中。 mongodump命令可以通过参数指定导出的数据量级转存的服务器。
管理工具
RockMongo是PHP5写的一个MongoDB管理工具。 通过 Rockmongo 你可以管理 MongoDB服务,数据库,集合,文档,索引等等。 它提供了非常人性化的操作。类似 phpMyAdmin(PHP开发的MySql管理工具)
Rockmongo 下载地址:http://rockmongo.com/downloads
参考