RHEL7下MongoDB 3.0安装及启动
MongoDB 简介
MongoDB是一个开源的文档型数据库,支持索引,有复制功能(复制集replSet),支持数据分片等,可以搭建一个高性能,高可用,易扩展的服务器集群。
与MySQL相比不同有:
1. 非关系型,数据自包含,虽然相似的文档存储在一个集合中,但文档之间没有关系,集合与集合之间也类似
2. 没有表,行的概念,与之对应的是集合和文档,也没有外键,连接,但在3.2版本,提供了左外连接另一个集合
3. 无模式,集合中的文档结构不固定,可以存储各式各样的文档
4. 不支持事务,但不代表不能用于管理重要数据(MySQL的MYISAM存储引擎也不支持事务...)
数据库中的一条记录就是一个文档,文档可以嵌套文档,结构类似于JSON,官方称BSON,多个文档组成集合,多个集合组成了数据库。
本文主要记录一下,MongoDB一些概念和术语,关于MongoDB的操作、集群的搭建、会在后续整理
database:存储文档和集合,和MySQL一样,可以使用 use <db> 选择一个数据库,如果选中的数据库不存在,在第一次操作数据库时直接创建数据库
比如:
use myDb
db.book.insert({"x":1})
就会创建一个myDb数据库和一个book集合
collection:存储文档,相当于RDBMS的表,我们可以对集合进行,添加,删除,更新,查询文档,创建和删除索引等,当第一次插入数据时就隐式的创建集合,
还可以使用db.createCollection()显式的创建集合,在3.2版本可以指定插入时,对文档验证。
此外还有一个特殊的集合,固定集合,它的大小是固定的,
比如 db.createCollection( "log", { capped: true, size: 10000 } ) 只能存储10000字节的数据
db.createCollection("log", { capped : true, size : 10000, max : 5000 } ) 只能存储10000字节的数据并且文档数目不超过5000条
document:数据存储的地方,文档结构就和JSON类似
首先看一下MongoDB支持的数据类型:
1. String:字符串UTF-8;
2. Integer:32位int or 64位long;
3. Double:浮点数;
4. Boolean:true or false;
5. Null:空值或不存在的字段;
6. Array:[1, 2, 3]
7. ObjectId:每个文档都有一个唯一标识 "_id",它就是ObjectId类型的,再插入时,一般不用我们指定,数据库会自动生成,当然我们也可以在插入文档时指定这个字段的值,但要 保证唯一,不然插入会报错,"_id"是数据库默认的一个索引;
8. Date:64位整数,存储的是从1970.1.1到现在的毫秒数,var date = new Date();直接存储的话,在数据库好像慢了8h,(+8时区)
9. Timestamp:时间戳,64位的值,var a = new Timestamp();
10. Regular Expression:正则表达式,查询时的限定条件,语法与JavaScript的相同
11. Binary:二进制数据
11. Min key,
12. Max key。
当不同的类型进行排序时,各类型的值从低到高为:
1. MinKey (internal type)
2. Null
3. Numbers (ints, longs, doubles)
4. Symbol, String
5. Object
6. Array
7. BinData
8. ObjectId
9. Boolean
10. Date
11. Timestamp
12. Regular Expression
13. MaxKey (internal type)
以上是一些常用的类型
文档的局限性:每个文档最大不能超过16M,对于向电影,图片等大文件MongoDB使用GridFS来进行分块存储
> db.foo.insert({
... ... "String":"UTF-8 string",
... ... "Integer":NumberLong(1461334508012),
... ... "Double":3.14159265,
... ... "Boolean":true,
... ... "Null":"null",
... ... "Array":[1, 2, 3, "a"],
... ... "Date":new Date(),
... ... "Timestamp":new Timestamp()
... ... })
WriteResult({ "nInserted" : 1 })
> db.foo.find()
{ "_id" : ObjectId("571a33d6ef35d50971b1c675"), "String" : "UTF-8 string",
"Integer" : NumberLong("1461334508012"), "Double" : 3.14159265,
"Boolean" : true, "Null" : "null", "Array" : [ 1, 2, 3, "a" ],
"Date" : ISODate("2016-04-22T14:23:18.762Z"), "Timestamp" : Timestamp(1461334998, 1)
}
索引,同关系型数据库一样,都是为了提高查询速度的,再分片时,片键的前提是索引,随着索引的增加,数据总容量的增加,数据库写入的速度逐渐变慢,之前专门针对MongoDB进行了测试,测试服务器是128G内存,34CPU...测试报告也会整理贴出来,找机会把MySQL也测试对比一下。
关于聚合,目前项目主要的操作就是插入和查询,暂不写了,以后用到在更新
存储引擎:3.0以前默认的存储引擎是MMAPV1,3.0版本开始支持WiredTiger存储引擎,3.2版本WT引擎设置为了默认,这两个的一些区别,简单说下,锁的粒度不同,MMAPV1为集合级别锁,WT为文档级别锁,在高并发写入时,WT性能高;WT引擎应该是完全兼容MMAPV1引擎的,支持文档压缩,更详细的看MongoDB的发布说明吧
复制:就是跨多个服务器数据同步的过程,能够提高数据的冗余性和可用性。
副本集replSet其实就是拥有相同数据集的一组mongod进程,其中包含三种类型的成员:主节点,次要节点,仲裁节点(不存储数据,只是用来投票的)。
客户端所有的写操作均在主节点上执行,相关的操作都记录在oplog 操作日志里,从节点通过异步复制oplog,然后把相应的操作应用到自己的数据集上。当主节点不可用或者和其他节点不通讯超过10秒,自动故障转移,副本集会自动选出一个节点当主节点,而仲裁服务器就是确保这个选举正常进行。
副本集最低要求是:一个主节点,一个从节点,一个仲裁节点
一个标准的配置是一个主节点,两个次要节点,共三个成员
如果你的副本集成员数为偶数个,那么添加一个仲裁节点,变成奇数
关于副本集更多的介绍详见官方文档 https://docs.mongodb.org/manual/core/replication-introduction/
分片:就是把数据按照指定的规则(片键)拆分到分片服务器上,减轻服务器的读写压力,另外可以很方便的扩展
身份验证:MongoDB默认是不开启访问控制的,可使用 --auth 或者 设置security.authorization 启用认证,
MongoDB的用户权限有:
"read":读权限
"readWrite":读写权限
"dbAdmin":执行管理命令权限,如创建或删除索引,查看统计
"dbOwner":相当于联合 readWrite,dbAdmin和userAdmin
"userAdmin":创建,删除和管理用户的权限
admin数据库中相关权限,只在admin数据库中可用
"clusterAdmin":分片和复制集命令权限,最大的集群操作权限
"readAnyDatabase":所有数据库的读权限
"readWriteAnyDatabase":所有数据库的读写权限
"dbAdminAnyDatabase":所有数据库的dbAdmin权限
"userAdminAnyDatabase":所有数据库的userAdmin权限
超级用户权限
"root":可访问所有资源,所有操作
此外还可以自定义用户角色
写得有点乱,,接下来就在虚拟机里面模拟一个MongoDB集群,并用Java写个客户端测试,搭建和测试集群时,分为开启访问控制和不开启访问控制两种。
更多MongoDB相关教程见以下内容: