没长正的技术专栏 勤动手、多思考

MongoDB基础

2014-01-10

阅读:

2021-05-31

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)部署、分片部署、复本集与分片混合部署

2021-12-02_mongodb混合部署图解

图解MongoDB原理

  • 单机: 直接读、写

  • 主备:基于路由Mongos, 一般是奇数个服务; PSS (Primary DB、Secondary DB) 异步

  • 分片:基于Shard服务,Config服务,实现分片(类似分库分表:range模式,id 散列<路由选择>)

  • 主备与分片:组合

    深入浅出理解MongoDB的设计与实现

1.4 项目实战

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(包含readWritedbAdminuserAdmin),作用于哪个数据库  (确保数据库存在)
    # 一般用户: 读写权限即可  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"})

docker-mongo创建账号密码mongo权限

4.常用工具

mongo-express : mongo web 管理端

5.问题总结

  • 目录权限问题
  • 用户权限问题

6.Mongo集群

mongodb分布式集群

Mongodb集群架构由Mongos、Config副本集和多个分片组成;
安装过程中先初始化Config副本集、分片副本集,最后通过Mongos添加分片
Config副本集存储了集群访问的用户及角色权限,为了方便管理,可以给分片副本集添加本地用户
Mongodb提供了LocalException机制,首次安装数据库时可以在本机直接添加用

参考

菜鸟教程

dockerlearn

docker-mongo

Mongo无法启动

mongo设置用户与密码

mongo权限

mongodb分布式集群

图解MongoDB原理

深入浅出理解MongoDB的设计与实现

mongodb 源码实现系列 - Mongodb write 写 (增、删、改) 模块设计与实现


欢迎拍砖,多多交流,转载请注明出处:[没长正的技术专栏](http://blog.meizhangzheng.com) 如涉及侵权问题,请发送邮件到xsj34567@163.com,如情况属实本人将会尽快删除。


下一篇 MongoDB实战

Comments

Content