mirror of
https://github.com/tiennm99/zfoo.git
synced 2026-05-20 03:26:57 +00:00
67 lines
2.2 KiB
Markdown
67 lines
2.2 KiB
Markdown
# 一、安全写入数据
|
||
|
||
## 1.MongoDB的四种写入级别
|
||
|
||
- Unacknowledged 非确认式写入
|
||
|
||
```
|
||
{ writeConcern:{w:0}}
|
||
非确认式写入不返回响应结果。
|
||
```
|
||
|
||
- Acknowledged 确认式写入,mogodb客户端默认的写入模式
|
||
|
||
```
|
||
确认式写入返回写入失败的错误信息,比如DuplicateKey Error。使用命令:
|
||
{ writeConcern:{w:1}}
|
||
```
|
||
|
||
- Journaled 日志写入
|
||
|
||
```
|
||
一般的写入完成只是写入到内存中,并没有持久化到硬盘,日志写入模式会写入完成之后把记录保存到journal日志后才返回响应结果,这种写入方式能够承受服务器突然断电崩溃,更有效的保障数据的安全。
|
||
{ writeConcern:{j:true}}
|
||
```
|
||
|
||
- Replica Acknowledged 复制集确认式写入
|
||
|
||
```
|
||
写操作不仅要得到主节点的写入确认,还需要得到从节点的写入确认,这里还可以设置写入节点的个数。这种方式适用于对写入安全要求更高的场景。
|
||
{ writeConcern:{w:2}}
|
||
```
|
||
|
||
# 二、Journal日志
|
||
|
||
## 1.单机开启Journal,多机器使用副本集
|
||
|
||
```
|
||
Journal是MongoDB中的redolog(MySQL),而Oplog则负责副本集的同步(binlog MySQL)
|
||
不开启Journal,数据会写入内存,一般每60秒写入一次到硬盘
|
||
开启Journal,每100毫秒左右往Journal日志文件写入一次数据(顺序写速度快),即使宕机,结果Journal恢复也只丢死100毫秒数据
|
||
```
|
||
|
||
## 2.生产环境不要信任repair恢复的数据
|
||
|
||
```
|
||
如果数据库崩溃了,而且没有开启--journal的情况下,千万不要这些数据拿来就用,因为数据库能损坏,索引可能混乱。
|
||
|
||
如果开启了Journal就可以使用mongod --repair修复一次。修复过程是将所有的文档导出后马上导入,忽略无效的文档,完成后会重建索引。
|
||
但是这不是最优的选择,因为可能会丢失数据而且需要大量的磁盘空间。repair是最差的做法,比较好的做法是用以前备份过的数据库恢复,或者使用副本集部署。
|
||
```
|
||
|
||
# 三、锁
|
||
|
||
- 查看锁的情况
|
||
|
||
```
|
||
db.serverStatus()
|
||
db.currentOp()
|
||
```
|
||
|
||
- 解锁
|
||
|
||
```
|
||
db.currentOp() # 找出有锁状态的执行操作,找到opid,根据之前获取的opid
|
||
db.killOp(opid) # kill掉对应的操作
|
||
```
|