MongoDB-入门学习+docker安装

简介

  • 什么是NoSQL?与传统的关系型数据库有啥区别?
    • NoSQL是not only sql的简称,相对于关系型数据库,不需要预定义的字段。横向扩展方便,字段类型灵活。但缺点一般不容易保证事务,支持最终一致性,也就是可能存在过渡状态。
    • 主要有redis、es、MongoDB等。
  • MongoDB是用C++语言编写的,基于分布式文档储存的开源数据库系统。
  • 主要特点:基于文档数据模型;类似json的BSON格式存储数据。文档聚合是基于collections,相对于mysql中的table;支持临时查询,不需要提前定义字段类型(这个是NoSQL类数据库的公共特性);索引是B-tree;支持主键索引和次级索引。

基本概念

  • 和mysql对应概念比较
mongodbmysql说明
collectiontable集合/数据表
documentrow文档/行
fieldcolumn域/字段
indexindex
不推荐joins多表
primary keyprimary key
  • 命名规范:统一建议不要使用特殊字符,字段长度不需要太长,区分大小写。
  • db常用命令
    命令说明
    show dbs显示所有db
    db显示当前db
    use tmpdb进入tmpdb,如果没有则创建
    db.dropDatabase()进入后,删除
  • collection常用命令
    命令说明
    db.c.insert({“a”:“1”})如果没有,可以隐式创建集合c
    db.c.drop()删除
  • document常用命令
    命令说明
    find()查询
    insert()插入,不建议
    insertOne(),insertMany()单条插入,批量插入
    update(),save()更新
    remove(),deleteOne(),deleteMany()删除
    count()查询数量

数据安全

数据写入过程
  • 先写入内存中的journal日志,然后写入内存中的Data对象。
    • journal日志文件,使用了在RocketMQ中也使用的内存映射技术,以及顺序写入。保证写入效速度。
  • 内存中的journal定时将数据同步到硬盘中,默认100ms。
  • 内存中的Data数据定时同步到硬盘中,默认60s或者2G。
  • 相对的mysql使用的是redoLog日志。但redoLog日志是实时实时写入的。
写入安全级别
  • 类似kafka写入过程中clinet处配置的ack属性的功能。
  • 包括非确认式写入、确认式写入、日志写入和复制确认式写入。
    • 非确认式写入就是只管发,不管响应,类似kafka中ack=0。
    • 确认式写入就是写道服务端内存中即可,kafka好像没有。
    • 日志写入就是journal日志写道磁盘上,类似kafka中ack=1。
    • 复制确认式写入,就是副本也确认式写入,类似kafka中ack=-1/all,但不同点是这里只是写道内存中没写道journal日志中。
  • 默认复制级写入。
  • 这里的多种写入方式也是可以公用的,这个和kafka中不一样。
写策略
writeConcern
db.blog.insert({
        "title" : "教程",
        "likes" : 100
},{writeConcern:{w:"majority","j":true}});
  • 这里的writeConcern对象就是写策略对象,属性值说明如下表。
说明
w内存确认写入数量,0:没有节点,1:一个节点,n(可以是任意数字):n个节点,majority:过半数量节点
j是否写入journal日志
wtimeout超时时间
  • 注意,w中的值建议使用majority,如果写值的话,副本数量不足会造成阻塞,直到超时。但数据会写入。
  • 默认就是{w:"majority","j":true}
读策略
readPerference
  • 这个一般在客户端设置。
  • 策略有5种:
    • primary(默认):只选择主节点,保证每次读到的数据都是最新的
    • primaryPerferred:优先选择主节点,如果不可用则选择从节点
    • secondary:只选择从节点
    • secondaryPreferred:优先选择从节点,如果从节点不可用则选择主节点
    • nearest:选择最近的节点,针对多区域部署的情况
readConcern
  • 确定那些数据可读,那些数据不可读。
  • 基于readPerference指定的节点来判断的。
  • 参数包括:
    • available:读取所有可用的数据
    • local(默认):读取所有可用且属于当前分片的数据
    • majority:读取再大多数节点上提交完成的数据
    • linearizable:可线性化读取文档
    • snapshot:读取最近快照中的数据

MongoDB集群

  • 架构组成:
    • mongos:数据分析客户端
    • configserver:管理服务
    • Shard:数据储存位置
  • 特殊角色:仲裁者,支持选举的特殊服务

docker单节点安装

  • 使用root用户,主要是这里可能没有涉及权限操作。
  • 再次说明,MongoDB这类有状态服务不建议使用容器化部署。这里是为了学习方便。
  • 参考资料
    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/packge/article/details/126539320
    
  • 拉取镜像
    docker pull mongo:4.4
    
  • 设置数据目录和日志目录
    mkdir -p /etc/mongodb /home/mongodb/{data,log}
    
  • 设置配置文件,略过
  • 启动容器
    docker run -d --name mongo -v /home/mongodb/data:/data/db -p 27017:27017 mongo:4.4 --auth
    
    命令说明
    –auth需要密码才能访问
  • 进入容器,并进入admin数据库
    docker exec -it mongo mongo admin
    
  • 创建用户
    db.createUser({ user:'root',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},'readWriteAnyDatabase']});
    
    db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'root', db: 'admin'}]});
    
  • 连接mongo数据库
    db.auth('root', '123456');
    
  • 创建user表,并插入一条数据
    db.user.insert({"name":"zhangsan","age":18});
    
    db.user.find();
    
  • 验证并尝试优雅关闭
    • 为root用户添加hostManager权限
      db.grantRolesToUser("root", [{ role: "hostManager", db: "admin" }]);
      
    • 切换到admin仓库
      use admin;
      
    • 执行优雅关闭
      db.shutdownServer();
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

田秋浩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值