---------
开源文档数据库, 高性能,高可用及伸缩性
文档数据库 Document Database
-------------------------------
1 文档的数据结构JSON格式(由键-值对组成,值可以是另外一个文档)
2 传统数据库的一条记录相当一个文档
3 文档必须小于 16MB
高性能
-------------
1 支持嵌入文档减少连接操作, 减少IO活动
2 支持更快的索引查询(B树索引)
高可用
-------------
1 提供复制工具, 即副本集来自动故障转移, 数据冗余。
副本集
-------------
一组MongoDB服务器, 管理同一个数据集. 提供最终一致性读,低延迟,高吞吐量的部署。
自动伸缩性
-------------
核心的功能支持水平扩展 - 集群
自动跨集群的分片及分发数据(sharding key)
名词
-----------
database 数据库
collection 集合(表)
document 文档(表记录)
index 索引
sharding 分片
namespace 命名空间(数据库.集合)
bson 二进制JSON
driver 驱动
replication 复制(主 - 备 - 从结构, 从主复制到备与从节点,按语句数量达到一个特定值触发,通过 oplog 日志复制, 复制是异步的,通常与主节点相差 ms 级.)
memory-mapped file 内存映射文件(BSON数据直接加载到内存,不需要转换成对象.mongodb 直接操作内存)
view 视图
work set 索引的子集
replica set 副本集
data model 数据模型(优化: 使用引用(关联)而不是嵌套文档降低数据增长, 数据增长影响性能; 使用索引; 调整小集合大小; 调整内核参数;
使用
-----------
1 连接数据库
shell> mongo
>db >show dbs >use mydb >db.user.insert( {name: 'bisoft', age: 20} ) >db.user.insert( {name: 'amos_tl', age: 29} ) >show collections >db.user.find() { "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "bisoft", "age" : 20 } { "_id" : ObjectId("4c2209fef3924d31102bd84b"), "name" : "amos_tl, "age" : 30 } >db.user.findOne() { "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "bisoft", "age" : 20 } >db.user.find().limit(1)
_id 字段表示对象的ID(Object ID), 是惟一的.
游标(cursor)
------------
var c = db.user.find() // 返回一个游标 while ( c.hasNext() ) printjson( c.next() ) // 遍历游标 printjson( c [ 4 ] ) // 游标.toArray() - 隐式转换, 此方法会将游标的全部文档加载到内存,可能导致内存溢出
条件查询
db.user.find( { age : 20 } ) db.user.find( { age : {$gt: 25 }} ) //排序 db.user.find( { age : 20 } ) db.user.find( { age : {$gt: 25 } ).sort( {age : 1} ) // 分页 db.students.find().skip(pageNumber > 0 ? ((pageNumber-1)*pageSize) : 0).limit(pageSize) // 投影 db.records.find( { "user_id": { $lt: 42 } }, { "name": 1, "email": 1 } ) 返回包括 _id , name, email. db.records.find( { "user_id": { $lt: 42} }, { "_id": 0, "name": 1 , "email": 1 } ) 返回包括 name, email. // 聚集 db.user.count() db.user.distinct()
集合(Collections)
--------------------
相当于表, 一组文档,共享索引.
BSON & JSON
----------------
BSON 表示二进制的 JSON.
CRUD
--------
// 更新,多行更新,默认只更新一个文档,加 multi: true, 表示更新所有行 db.users.update( { age: { $gt: 18 } }, { multi: true } ) // 没有文档可更新时,想要插入数据时,加upsert: true ,表示更新或插入. // 删除所有 db.collection.remove({}) // 删除指定条件 db.inventory.remove( { type : "amos_tl" }) // 删除一条记录 db.inventory.remove( { name : "amos_tl" }, 1 ) // 保存替换 db.collection.save( { name: "test"} )
Write Concern 写关注(写操作只发生在主节点上)
保证写操作成功, 写关注级别:
unacknowledged 0
acknowledged 1 默认(保证所有写操作都是成功的)
>1 确保已经写到磁盘
majority
w : 1
journaled: 确保已经写到磁盘; 数据先写到journaled日志,然后才异步写到磁盘. 这个日志类似重做日志. oplog 是操作日志, 用于复制.
j : true
wtimeout: 当w>1时,可以设置超时.
wtimeout : 100
<tag set>
备份与恢复
--------------------
使用 mongodump, mongoexport, mongoimport, mongorestore
集群
--------
主节点
mongod --master --dbpath /data/masterdb/ --oplogSize 1024M
从节点
mongod --slave --source <masterhostname><:<port>> --dbpath /data/slavedb/ --autoresync
local.sources 集合(表)
use local
db.sources.find()
db.sources.insert( { host: <masterhostname> <,only: databasename> } );
配置证书
keyFile = /srv/mongodb/keyfile
openssl rand -base64 741