MongoDB 基础
1.定义、应用场景、原理、项目实战
1.1 定义
MongoDB 是一个基于分布式文件存储的数据库 (4.0版本开始支持事务)。
1.2 应用场景
- 操作实时数据:非常适合实时数据的新增、更新和查询,能实时复制存储数据(主从 )及高度伸缩性(支持横向扩展);
- 作为数据缓存:搭建持久化的缓存数据,性能高;(主数据平台:主从 PSS);
- 数据量大,价值较低的数据存储;
- 对象或JSON存储数据 (微博、博客、IM等的消息存储业务中)
-
不适合的场景:
- 高度事务性系统;
- 传统商业BI(适合基于数仓:Hive …);
- 复杂SQL;查询效率,组合查询麻烦;
- 性能优化 :
- 连接数据:限制连接数(每个连接数约10M大小),会造成内存溢出。
- 设置缓存上线(引擎使用内存的上限 默认60%):wiredTigerCacheSizeGB =2
- 日志清理:定时
1.3 原理
大致:MongoClient客户端请求,经过Mongos 路由,依据Mongod Config配置,选择不同的分片或服务查询、写入Mongod 数据。(RPC、HTTP)
根据其部署方式不同,读写数据原理有差异:
MongoDB 的部署方案有单机部署、复本集(主备 PSS)部署、分片部署、复本集与分片混合部署
-
单机: 直接读、写
-
主备:基于路由Mongos, 一般是奇数个服务; PSS (Primary DB、Secondary DB) 异步
-
分片:基于Shard服务,Config服务,实现分片(类似分库分表:range模式,id 散列<路由选择>)路由选择>
-
主备与分片:组合
1.4 项目实战
- spring-data-mongodb
- 主数据服务平台
- 图片、视频文件系统
2.安装
# 基于dockerlearn 打包 (官网基础上添加了上海时间:mongo/4.4)
# 进入dockerfile文件的目录 无密码
docker build -t meizhangzheng/mongo .
#启动 无密码
docker run --name mongo -v /usr/meizhangzheng/data/mongo:/data/db -p 27017:27017 -d meizhangzheng/mongo:4.4
-
如果多次安装,注意清除原文件
-
目录权限 :读写 打包前
chmod +x docker-entrypoint.sh
-
容器内部常用命令不起作用,需重新安装
apt-get update && apt-get install -y vim
-
默认没有用户名与密码
-
如果启动命令中添加:–auth ,则创建用户后,登录需要密码。 mongo设置用户与密码
# 带密码登录 --auth docker run --name mongo -v /usr/meizhangzheng/mongo/data:/data/db -p 27017:27017 -d meizhangzheng/mongo:4.4 --auth #创建用户及权限 db.createUser({ user:'admin',pwd:'xsj+q',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},{ role:'dbOwner', db: 'admin'}]}); # 使用户生效 db.auth("admin","xsj+q"); # 权限: 为某个用户添加 dbOwner(包含readWrite、dbAdmin、userAdmin),作用于哪个数据库 (确保数据库存在) # 一般用户: 读写权限即可 db.createUser({ user:'mzz',pwd:'123456',roles:[ { role:'readWrite', db: 'admin'}]}); > db.grantRolesToUser("admin",[{role:"dbOwner",db:"admin"}]) > db.grantRolesToUser("admin",[{role:"dbOwner",db:"mylog"}]) > db.grantRolesToUser("admin",[{role:"dbOwner",db:"my_customer"}] # 通过客户端连接时,就需要用户名与密码、通过容器登录也需要密码 # docker exec -it mongo bash # mongo -u admin -p xsj+q 库名 # db # show users # 创建数据库 use mylog # 创建用户 db.createUser({ user:'mzz',pwd:'123456',roles:[ { role:'readWrite', db: 'mylog'}]}); db.auth("mzz","123456") # 如果mylog 没有数据,则不会创建该集合(数据库) show dbs #不能查看mylog
3.基本操作
#进入容器
docker exec -it mongo bash
#访问某一数据库
root@8cc31ea24bb0:/# mongo -u mzz -p 123456 mylog
#执行插入语句
db.mylog.insert({"name":"mzz"})
4.常用工具
mongo-express : mongo web 管理端
5.问题总结
- 目录权限问题
- 用户权限问题
6.Mongo集群
Mongodb集群架构由Mongos、Config副本集和多个分片组成;
安装过程中先初始化Config副本集、分片副本集,最后通过Mongos添加分片
Config副本集存储了集群访问的用户及角色权限,为了方便管理,可以给分片副本集添加本地用户
Mongodb提供了LocalException机制,首次安装数据库时可以在本机直接添加用