数据安全与性能保障
持久化
Redis 提供了两种持久化方式
- 快照(snapshotting):它可以将存在于某一时刻的所有数据都写入到硬盘中
- 只追加文件(AOF):在执行写命令时,会将写命令复制到硬盘中
两种方式可以同时使用,也可以单独使用。
快照持久化
- BGSAVE(background save),对于支持bgsave命令的平台(windows不支持),redis 会调用fork来创建一个子进程,然后子进程负责将将快照写入硬盘,而父进程则继续处理命令请求。
- SAVE,客户端可以通过向Redis发送SAVE指令来创建快照,redis在完成save指令之前,将不再响应其他任何命令。不常用,只有在没有足够内存去执行bgsave指令,或者即使不响应其他请求的时候,也没啥关系的时候
- 设置SAVE 配置选项,eg save 60 1000 那么redis 在最近一次创建快照后开始算起,如果60s内有超过1000次写入,redis会自动触发bgsave指令,如果配置多个,则执行多个。
- 收到shutdown指令,或者接受到标准Term(kill -15 )信号时,会执行save操作,阻塞所有客户端,不执行任何命令,并在save执行完成后,关闭客户端。
- 当以个redis服务器连接另一个redis 服务器,并发送sync命令开始复制操作时,如果主服务器没有正在执行bgsave操作,或者刚刚执行完bgsave,那么主服务器会执行bgsave。
只使用快照备份数据,如果系统发生崩溃,则会丢失最后一次备份成功之后的所有数据。
大量数据情况下,bgsave操作会越来越慢。不同硬件,执行停顿的时间不同,20G数据,正常200-400毫秒,在XEN虚拟机(亚马逊等云服务商)大概要406秒。eg. 68G内存,50G数据。bgsave 创建子线程需要15s,备份数据需要大概15-20分钟。而save只需要3-5分钟即可。
问题:
- fork 具体如何操作
- windows 的确不支持bgsave么
- 60s内超过1000,是如何计算的。每60s么?
- 标准term信号,kill -15?
- 或者刚刚执行完成bgsave,如何叫刚刚。。。