MongoDB简介
MongoDB是一个开源的面向文档存储的NoSQL数据库,它没有了表结构的概念和数据结构的限制;一个数据库包含多个集合,每个集合理论上包含无数个文档,每个文档就是一条记录;每个文档的格式都是BSON格式,BSON是一种类JSON的一种二进制形式的存储格式,简称Binary JSON;文档的最大存储空间是16M,当文件大小超过16M之后要使用MongoDB的GridFS;GridFS适合大文件的存储,本质上是将大文件拆成多个小文档进行存储。
MongoDB其他特点如下:
1、技术成熟,相关工具和文档支持较好,支持Java、C、C++、PHP等多种语言。
2、可以创建数据镜像,扩展性强。
3、在高负载的情况下,可以通过分片技术增加节点保证服务器性能,支持分布式集群。
4、每个数据库都分成一个主数据库和两个从数据库,安全性高。
5、支持完全的索引:单键索引、多键索引、数组索引、全文索引、地理位置索引。
6、性能高且稳定。
7、每个文档可以创建多个键值对,利于排序,业务开发更方便。
对Java语言的支持
在 Java 程序中如果要使用 MongoDB,需要安装了 Java 环境及 MongoDB JDBC驱动。MongoDB JDBC驱动的名称叫做mongo-java-driver,只需要将该Jar包包含在classPath中或集成进项目中即可。
mongo-java-driver中提供的API简单易懂,操作非常简单,具体示例代码如下:
1、 创建数据库示例代码如下:
try {
//连接到MongoDB服务 如果是远程连接可以替换“localhost”为服务器所在IP地址
//ServerAddress()两个参数分别为 服务器地址 和 端口
ServerAddress serverAddress = new ServerAddress("localhost",27017);
List<ServerAddress> addrs = new ArrayList<ServerAddress>();
addrs.add(serverAddress);
//MongoCredential.createScramSha1Credential()三个参数分别为 用户名 数据库名称 密码
MongoCredential credential = MongoCredential.createScramSha1Credential("username", "databaseName", "password".toCharArray());
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
credentials.add(credential);
//通过连接认证获取MongoDB连接
MongoClient mongoClient = new MongoClient(addrs,credentials);
//连接到数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase("databaseName");
System.out.println("Connect to database successfully");
} catch (Exception e) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
}
2、 创建集合示例代码如下:
mongoDatabase.createCollection("test");
3、 插入文档示例代码如下:
append("description", "database").
append("likes", 100).
append("by", "Fly");
List<Document> documents = new ArrayList<Document>();
documents.add(document);
collection.insertMany(documents);
System.out.println("文档插入成功");
4、 更新文档示例代码如下:
//更新文档 将文档中likes=100的文档修改为likes=200
collection.updateMany(Filters.eq("likes", 100), new Document("$set",new Document("likes",200)));
5、 删除文档示例代码如下:
//删除符合条件的第一个文档
collection.deleteOne(Filters.eq("likes", 200));
//删除所有符合条件的文档
collection.deleteMany (Filters.eq("likes", 200));
6、大文件存储(超过16M),GridFS使用示例如下:
//获取GridFS
GridFS gridFS = new GridFS(db, "fs");
//保存文件
File file = new File("c:\\testBig.zip");
GridFSInputFile gridFSFile = gridFS.createFile(file);
gridFSFile.save();
//查找文件
BasicDBObject query = new BasicDBObject();
query.put("filename", fileName);
GridFSDBFile gridFSOne = gridFS.findOne(query);
MongoDB数据库中大文件(超过16M)存储情况如下:
左侧集合中有两项,一个是fs.files,一个是fs.chunks。其中fs.files中存储文件的基本信息和此次记录的唯一ID,如上图所示。fs.chunks集合中分块存储实际的文件,每一块中都包含一个递增的序号和在fs.files对应的记录ID,如下图:
性能分析
MongoDB的性能非常强劲和稳定,广受使用者的好评。根据MongoDB官网测试报告,最新版本的MongoDB3.0在性能表现上更是比以前提升了一大截。
1、并发量
在YCSB测试中,MongoDB3.0在100%写操作的情况下,可达225000 ops/sec;在95%读操作、5%写操作的情况下,可达300000 ops/sec;在50%读、50%写的情况下,可达150000 ops/sec。
2、响应延迟
在性能测试中仅仅监测并发量是不够的,我们还要考虑操作的响应延迟 。在读操作响应延迟上,MongoDB3.0稳定的保持在1ms甚至更小的数值内;在平衡(读写各50%)的工作负荷下,MongoDB3.0也能稳定的保持在1ms左右。
YCSB测试配置如下:3千万的文档和3千万的操作;文档包含一个100字节的字段(总共151字节)。
服务器都是具有下列规格的Softlayer 裸机:
1、CPU: 2x Deca Core Xeon 2690 V2 – 3.00GHz (Ivy Bridge) – 2 x 25MB cache;
2、 RAM: 128 GB Registered DDR3 1333;
3、 Storage: 2x 960GB SSD drives, SATA Disk Controller;
4、 Network: 10 Gbps;
5、 Ubuntu 14.10 (64 bit);
6、 MongoDB Versions: MongoDB 2.6.7; MongoDB 3.0.1
详细测试报告见:https://www.mongodb.com/blog/post/performance-testing-mongodb-30-part-1-throughput-improvements-measured-ycsb