1、关于redis
首先来了解一下redis
传统的关系型数据库比如MySQL、Oracle、DB2等,数据储存在磁盘的文件系统中,通过增删改查频繁的在内存与外存之间交换数据,耗不耗时间先不说,系统资源那是肯定耗的,所有redis应运而生。
redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库 。
2、redis特点
- Redis支持数据的持久化,周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
- Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
- Redis还支持 publish/subscribe, 通知, key过期等高级特性。
3、什么是redis集群
Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。
4、redis三种集群策略
1、主从复制
在主从复制中,数据库分为两类,主数据库(master)和从数据库(slave)其中主从复制有以下特点。
- 主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库
- 从数据库一般都是只读的,并且接收主数据库同步过来的数据
- 一个master可以拥有多个slave,但是一个slave只能对应一个master
主从复制的工作机制
当slave启动后,主动向master发送SYNC命令,master接收到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave,slave接收到快照文件和命令后加载快照文件和缓存的执行命令。
复制初始化后,master每次接收到的写命令都会同步发送给slave,保证主从数据一致性。
2、哨兵
哨兵的作用是监控 redis系统的运行状况
- 监控主从数据库是否正常运行
- master出现故障时,自动将slave转化为master
- 多哨兵配置的时候,哨兵之间也会自动监控
- 多个哨兵可以监控同一个redis
工作原理:在哨兵集群启动的时候,每个节点都会启动三个定时任务。
第一个定时任务是:每个哨兵都会定时向其他哨兵或者master、slave发送ping命令。用于心跳检测。
第二个定时任务是:每个哨兵都会定时向master的 sentinel:hello这个channel发送自己掌握的最新的集群信息和自身的一些信息,这个是利用redis的pub/sub消息订阅功能实现的,每个哨兵都会订阅这个channel,所以每个哨兵都能接收到其他哨兵所掌握的信息。如果哨兵正在接收到的master配置比上次接收到master配置要旧,则哨兵会马上更新master的配置。
第三个定时任务是:每个哨兵都会定时向master和slave返送info命令,获取最新的集群拓扑。
3、集群
使用集群,只需要将每个数据库节点的cluster-enable配置打开即可。每个集群中至少需要三个主数据库才能正常运行。
即使使用哨兵,redis每个实例也是全量存储,每个redis存储的内容都是完整的数据,浪费内存且有木桶效应。为了最大化利用内存,可以采用集群,就是分布式存储。即每台redis存储不同的内容。
集群至少需要3主3从,且每个实例使用不同的配置文件,主从不用配置,集群会自己选。