Redis—为何持久化使用子进程
AOF重写以及bgsave的时候为什么采用fork子进程而不是子线程?
- 进程间内存隔离
独立的内存空间:子进程拥有与主进程独立的内存空间,确保即使在重写过程中发生崩溃或错误,也不会影响主进程的运行和内存状态。
数据安全性:由于子进程和主进程的内存是隔离的,子进程在重写AOF文件时出现的问题不会污染或破坏主进程的内存数据,极大地提高了数据安全性。
- 避免复杂的并发控制
简化并发管理:使用子进程避免了线程间共享数据带来的复杂性,如竞争条件和锁机制。这简化了并发控制,降低了编程复杂度和错误概率。
减少锁开销:线程之间需要通过锁机制来同步数据,锁的使用会引入一定的开销和性能问题。使用子进程则无需处理这些问题,因为子进程之间不共享内存数据。
- 资源管理
独立的资源控制:子进程有自己的文件描述符、堆栈等系统资源,可以独立管理,不会干扰主进程的资源使用。
简化资源回收:当子进程完成任务或出现故障时,操作系统可以自动回收其资源,简化了资源管理。
- 利用操作系统的进程复制机制
写时复制(Copy-On-Write):使用fork系统调用创建子进程时,主进程的内存页会被标记为只读,当任何一个进程(父进程或子进程)尝试写入共享的只读内存页时,会触发一个页错误,操作系统捕获这个页错误,并分配一个新的物理内存页,将原始数据复制到这个新页中,然后将写入操作重定向到新页。
独立崩溃恢复:即使子进程在AOF重写过程中崩溃,主进程仍然可以继续处理客户端请求和其他操作,确保系统的稳定性和可用性。
隔离故障影响:子进程的故障不会影响主进程的执行,保证了Redis服务的连续性和稳定性