一、相关概念
1.1 业务应用场景
有如下需求:
对数据库高并发读写需求;
对海量数据的高效存储和访问;
对数据库的高可扩展性和高可用性;(mongodb的列可以自动扩展)
应用场景:
社交场景,使用mongoDB存储用户信息/朋友圈信息,通过地理位置索引实现附近的人等
游戏场景,存储游戏用户信息,用户装备、积分、经验等直接以内嵌文档的形式存储,方便查询
物流场景,存储订单信息,订单状态在运送过程中会不断更新,以内嵌数组的方式存储,一次查询就可以得到订单所有的变更信息
物联网场景,存储接入的智能设备信息,设备日志等
视频直播,存储用户信息、点赞互动信息等
不同场景的共同特地:
数据量大
写入操作频繁(读写都很频繁)
价值较低的数据,对事物性要求不高
什么时候考虑使用MongoDB:
应用不需要事务 以及复杂join支持
新应用,需求频繁变化,数据模型无法确定,想要快速迭代开发
需要2000-3000以上的QPS
需要TB甚至PB级别的数据存储
需要99.999%高可用
需要大量的地理位置查询、文本查询
1.2 简介
无模式的文档型数据库。 是最像关系型DB的非关系型数据库。
MongoDB中的记录是一个文档,由字段和值对(field:value)组成的数据结构, 类似于JSON对象,一个文档可以认为就是一个对象;
value除了使用基本的一些类型外,还可以使用包括其它文档、普通数组、文档数组;
不支持联表查询;
1.3 体系结构
SQL术语 | MongoDB术语 | 说明 |
---|---|---|
database | database | 数据库 |
table | collection | 表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
嵌入文档 | MongoDB通过嵌入式文档来代替多表连接 | |
primary key | primary key | 主键,MongoDB自动将_id设置为主键 |
1.4 数据模型
MongoDB最小存储单位就是文档-document-对应关系型数据库的行。
数据在MongoDB中以BSON(Binary-JSON)文档的格式存储在磁盘上。
BSON是一种类JSON的一种二进制形式的存储格式
数据类型 | 描述 | 举例 |
---|---|---|
字符串 | UTF-8字符串 | {“x”:“xxx”} |
对象ID | 是文档的12字节的唯一ID | {"_id":ObjectId()} |
布尔值 | true/false | {“x”: true} |
数组 | 值的集合或者列表 | {“x”: [“a”,“b”,“c”]} |
32位整型 | 类型不可用。JavaScript仅支持64位浮点数,所以会被自动转换 | shell中不支持,会默认转换为64为浮点数 |
64位整型 | 类型不可用。shell会使用一个特殊的内嵌文档来显示64位整数 | shell中不支持,会默认转换为64为浮点数 |
64位浮点数 | shell中数字就这一种类型 | {“x”:3.14159, “y”:3} |
undefined | 文档中也可以使用未定义类型 | {“x”: undefined} |
符号 | shell不支持,shell会将数据库中符号类型数据自动转换为字符串 | |
正则表达式 | 采用JavaScript的正则表达式语法 | {“x”: /foobar/i} |
二进制数据 | shell中无法使用 | |
最大值/最小值 | BSON包括一个特殊类型。shell中没有这个类型 |
二、安装
2.1 docker单机
// 省略下载镜像
// 启动容器 --auth:需要密码才能访问容器
-d,--detach:在容器中后台执行命令
-i,--interactive=true|false:打开标准输入接受用户输入命令,默认为false
-t,--tty=true|false:分配伪终端,默认false
// 这里我指定了我本地的配置文件映射,然后给容器固定了IP
docker run -itd --name mongodb1 --privileged --network=mynet --ip=172.168.60.4 -v /Users/tangye/softTools/mongodb/replicaSets/mongodb1/data/db:/data/db -v /Users/tangye/softTools/mongodb/replicaSets/mongodb1/conf/mongod.conf:/data/configdb/mongo.conf -p 27017:27017 -p 7003:22 mongo -f /data/configdb/mongo.conf
// 添加用户和设置密码,并进入容器
docker exec -it mongodb-one mongo admin
>db.createUser({ user:'admin', pwd:'123456', roles:[ { role:'userAdminAnyDatabase', db:'admin' }, "readWriteAnyDatabase" ]});
>db.auth('admin','123456');
2.2 docker集群
TODO