简介
- 什么是NoSQL?与传统的关系型数据库有啥区别?
- NoSQL是not only sql的简称,相对于关系型数据库,不需要预定义的字段。横向扩展方便,字段类型灵活。但缺点一般不容易保证事务,支持最终一致性,也就是可能存在过渡状态。
- 主要有redis、es、MongoDB等。
- MongoDB是用C++语言编写的,基于分布式文档储存的开源数据库系统。
- 主要特点:基于文档数据模型;类似json的BSON格式存储数据。文档聚合是基于collections,相对于mysql中的table;支持临时查询,不需要提前定义字段类型(这个是NoSQL类数据库的公共特性);索引是B-tree;支持主键索引和次级索引。
基本概念
mongodb | mysql | 说明 |
---|
collection | table | 集合/数据表 |
document | row | 文档/行 |
field | column | 域/字段 |
index | index | |
不推荐 | joins | 多表 |
primary key | primary 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
- 进入容器,并进入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();
- 验证并尝试优雅关闭