1、redis集群策略
redis提供了三种集群策略:
-
主从模式:这种模式比较简单,主库可以读写,并且会和从库进行数据同步,这种模式下,客户端直接连主库或某个从库,但是但主库或从库宕机后,客户端需要手动修改IP,另外,这种模式也比较难进行扩容,整个集群所能存储的数据受到某台机器的内存容量,所以不可能支持特大数据量。
-
哨兵模式:这种模式在主从的基础上新增了哨兵节点,但主库节点宕机后,哨兵会发现主库节点宕机,然后在从库中选择一个库作为新的主库,另外哨兵也可以做集群,从而可以保证但某一个哨兵节点宕机后,还有其他哨兵节点可以继续工作,这种模式可以比较好的保证redis集群的高可用,但是仍然不能很好的解决redis的容量上限问题。
-
cluster模式:cluster模式是用的比较多的模式,它支持多主多从,这种模式会按照key进行槽位的分配,可以使得不同的key分散在不同的主节点上,利用这种模式可以使得整个集群支持更大的数据容量,同时每个主节点可以拥有自己的多个从节点,如果该主节点宕机,会从它的从节点中选举一个新的主节点。
对于这三种模式,如果redis要存的数据量不大,可以选择哨兵模式,如果redis要存的数据量大,并且需要持续的扩容,那么选择cluster模式。
2、redis的持久化机制
持久化就是把内存中的数据存放到磁盘中,防止宕机后内存数据丢失
1、RDB是Redis默认的持久化方式。按照指定的时间间隔内将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。恢复时,将rdb文件直接读到内存中,具体做法:将rdb文件放到redis的启动目录上,redis会自动检查dump.rdb文件,恢复数据
优点:
-
整个redis数据库将只包含一个文件dump.rdb,方便持久化
-
容灾性好,方便备份
-
性能最大化,fork子进程来完成写操作,让主进程继续处理命令,所以是IO最大化。使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证了redis的高性能。
缺点:
- 数据安全性低,rdb需要一定的时间间隔进行操作,无法做到实时持久化,如果持久化之间发 生故障,会发生数据丢失。所以适合对数据完整性不高的持久化操作
- 由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果数据集较大时,fork 子进程时主进程有个短暂的阻塞,频率太高会导致整个服务器停止几百毫秒甚至1秒钟, fork会占用一定的内存和CPU
2、AOF持久化,则是将Redis执行的每次写命令记录到日志文件中,查询操作不会记录,当重启Redis会加载appendonly.aof文件来恢复数据。默认是不采用AOF的,需要在配置文件中修改。AOF是存放每条写命令的,所以会不断的增大,当大到一定程度时,AOF会做rewrite操作,rewrite操作就是基于当时redis的数据重新构造一个小的AOF文件,然后将大的AOF文件删除。
优点:
-
数据安全
-
通过append模式写文件,即使中途服务器宕机也不会破坏已经存在的内容,可以通过redis-check-aof工具解决数据一致性问题
-
AOF机制的rewrite模式,定期对AOF文件进行重写,以达到压缩的目的。
缺点:
-
AOF文件比RDB文件大,且恢复速度慢
-
数据集大的时候,比RDB启动效率低
-
运行效率没有RDB高