mongodb是一个开源的分布式文档数据库,介于关系型和非关系型数据库之间,支持的数据结构非常松散,是类似json和bson格式,支持比较复杂的数据格式,支持复杂的查询,支持对数据建立索引。
1、网络资源
源码:https://github.com/mongodb/mongo
wiki:https://github.com/mongodb/mongo/wiki
2、组件和工具
bin/mongod - The database process.
bin/mongos - Sharding controller.
bin/mongo - The database shell (uses interactive javascript).
bsondump-display BSON files in a human-readable format
mongoimport-Convert data from JSON, TSV or CSV and insert them into a collection
mongoexport-Write an existing collection to CSV or JSON format
mongodump/mongorestore-Dump MongoDB backups to disk in .BSON format, or restore them to a live database
mongostat-Monitor live MongoDB servers, replica sets, or sharded clusters
mongofiles-Read, write, delete, or update files in GridFS
mongooplog-Replay oplog entries between MongoDB servers
mongotop-Monitor read/write activity on a mongo server
3、基本概念
1)数据库
一个mongodb中可以建立多个数据库。
MongoDB的默认数据库为"db",该数据库存储在data目录中。
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
2)文档
文档是一个键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
3)集合
集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。
集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
4、基本框架
参考:http://www.iteye.com/news/24836
5、分片
为何需要水平分片
1) 减少单机请求数,降低单机负载,提高总负载
2) 减少单机的存储空间,提高总存空间。
下图一目了然:
mongodb sharding 服务器架构
1) mongos 路由进程, 应用程序接入mongos再查询到具体分片。
2) config server 路由表服务。 每一台都具有全部chunk的路由信息。
3) shard为数据存储分片。 每一片都可以是复制集(replica set)。
6、主从机制
1)选master
通过心跳来同步节点间信息并触发选举。
MongoDB选举和复制协议基于Raft协议,正确性得以保证
在Raft基础上,扩展了选举和复制协议,方便使用和运维
选举规则:
选举超时包括一定随机性,减少平票的可能性
同一任期(Term),只为一个候选人投票
一个任期内,得到大多数投票,则成为主结点
只有当候选人的操作日志至少跟投票人一样新时,才投赞同票
2)主从同步数据
(1)intial sync 全量同步
同步集合数据(耗时)
拉取oplog并重放
建立索引(耗时)
拉取oplog并重放
(2)replication 增量同步
不断拉取master上的oplog并重放