在Redis中,实现高可用的技术主要包括持久化、主从复制、哨兵和 Cluster集群。
Redis是内存数据库,数据都是存储在内存中,为了避免服务器断电等原因导致Redis进程异常退出后数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘;当下次Redis重启时,利用持久化文件实现数据恢复。
原理:周期性的把内存中的数据保存在磁盘中。
1、手动触发:
2、自动触发:save m n(假设 900 10 则表示900秒内或者10次语句执行,则触发RDB持久化)
3、特殊触发:当手动关闭时redis时,会进行RDB方式持久化,关闭时shutdown
注: kill 删除进程不会触发RDB。
缺点:
1、数据完整性不如AOE。
2、RDB类似于快照(完备)。
3、在进行备份时会阻塞进程。
优点:
1、持久化的速度比较快(因为保存的是数据结果),在写入到*.rcb持久化文件,会进行压缩,来减小自身的体积。
2、在集群中,redis主从复制 从-》主服务器进行同步,默认先用RDB文件进行恢复操作,所以同步性能较高。
原理:从redis的操作日志记录中将执行的过程同步到磁盘中。
1、手动触发
2、自动触发:
1、 always 每条语句,同步执行持久化有强一致性的要求的场景。
2)、No 不进行持久化。
3、every second 每秒进行一次AOE持久化 (建议使用,均衡性场景)。
1、always一直触发aof 的持久化
2、everysecond 每秒触发一次持久化
3、no 不进行持久化
出现 在 1s 内执行20条语句
1、always: 每执行一条语句就出发一次aof持久化
2、everysecond:每秒出发执行一次aof持久化操作
3、no: 从不进行持久化
缺点
1、执行语句一致的情况下,aof备份的内容更大。因为RDB备份的是结果,而AOE备份的是语句。
2、AOF消耗性能更大,占用磁盘越来越大。(类似于mysql增量备份)
优点
1、支持秒级持久化、兼容性好。
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master),后者称为从节点(Slave);数据的复制是单向的,只能由主节点到从节点。
1、数据冗余:实现了数据的热备份,是持久化之外的一种数据冗余方式。
2、故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复。
3、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务,分担服务器负载,可以提高Redis服务器的并发量。
4、高可用基石:主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
(1)若启动一个Slave节点,则它会向Master节点发送sync命令,请求同步连接。
(2)收到连接后,Master节点都会启动一个后台进程,将数据快照保存到数据文件中(执行rdb操作),同时Master还会记录修改数据的所有命令并缓存在数据文件中。
(3)后台进程完成缓存操作之后,Master节点就会向Slave节点发送数据文件,Slave节点将数据文件保存到硬盘上,然后将其加载到内存中,接着Master节点就会将修改数据的所有操作一并发送给Slave端节点。
(4)复制完成之后,从节点会持续接收主节点发送的新的操作命令
总的来说 通过主从复制,redis 能够实现数据的备份 (master产生的数据能slave备份),负责均衡 (读操作可以分摊到slave上去) 和高可用 (maste宕机后,可以由slave进行故障切换)。
主节点
- vim /etc/redis/6379.conf
- bind 0.0.0.0 #70行,修改监听地址为0.0.0.0
- daemonize yes #137行,开启守护进程
- logfile /var/log/redis_6379.log #172行,指定日志文件目录
- dir /var/lib/redis/6379 #264行,指定工作目录
- appendonly yes #700行,开启AOF持久化功能
-
- /etc/init.d/redis_6379 restart
从节点
- vim /etc/redis/6379.conf
- bind 0.0.0.0 #70行,修改监听地址为0.0.0.0
- daemonize yes #137行,开启守护进程
- logfile /var/log/redis_6379.log #172行,指定日志文件目录
- dir /var/lib/redis/6379 #264行,指定工作目录
- replicaof 192.168.11.22 6379 #288行,指定要同步的Master节点IP和端口
- appendonly yes #700行,开启AOF持久化功能
-
- /etc/init.d/redis_6379 restart
- 在Master节点上验证从节点
- redis-cli info replication
哨兵是一个用于管理多个reids服务的系统,它提供监控、通知、自动故障转移、配置提供服务的功能,以实现redis高可用性。
在主从复制的基础上,哨兵引入了主节点的自动故障转移。
监控:哨兵会不断地检查主节点和从节点是否运作正常。
通知(提醒):某个redis实例有问题,哨兵可以通过API向管理员或者其他应用发信通知。
自动故障转移:当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其它从节点改为复制新的主节点。
配置提供服务:客户端可以使用哨兵来查询被认证的master节点及所有slave节点。
- vim /opt/redis-5.0.7/sentinel.conf
- protected-mode no #17行,关闭保护模式
- port 26379 #21行,Redis哨兵默认的监听端口
- daemonize yes #26行,指定sentinel为后台启动
- logfile "/var/log/sentinel.log" #36行,指定日志存放路径
- dir "/var/lib/redis/6379" #65行,指定数据库存放路径
- sentinel monitor mymaster 192.168.11.22 6379 2 #84行,修改 指定该哨兵节点监控192.168.10.22:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
- sentinel down-after-milliseconds mymaster 30000 #113行,判定服务器down掉的时间周期,默认30000毫秒(30秒)
- sentinel failover-timeout mymaster 180000 #146行,故障节点的最大超时时间为180000(180秒)
- cd /opt/redis-5.0.7/
- redis-sentinel sentinel.conf &
redis-cli -p 26379 info Sentinel
redis cluster 是一个分布式数据库解决方案,提供一组redis服务之间的网络接口。
redis 集群 是一个提供高性能、高可用、数据分片、故障转移特性的分布式数据解决方案。
数据分片:redis cluster 实现了数据自动分片,每个节点都会保存一份数据。Redis集群有16384个哈希槽(编号0-16383)
故障转移: 若个某个节点发生故障,cluster会自动将其上的分片迁移个其他节点。
高性能:由于数据分片和网络,redis cluster提供高性能的数据操作。
高可用:如果单个节点挂掉了,那么redis cluster 内部会自动进行故障恢复。
- cd /etc/redis/
- mkdir -p redis-cluster/redis600{1..6}
-
- for i in {1..6}
- do
- cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i
- cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis600$i
- done
- #其他5个文件夹的配置文件以此类推修改,注意6个端口都要不一样。
- cd /etc/redis/redis-cluster/redis6001
- vim redis.conf
- #bind 127.0.0.1 #69行,注释掉bind 项,默认监听所有网卡
- protected-mode no #88行,修改,关闭保护模式
- port 6001 #92行,修改,redis监听端口,
- daemonize yes #136行,开启守护进程,以独立进程启动
- cluster-enabled yes #832行,取消注释,开启群集功能
- cluster-config-file nodes-6001.conf #840行,取消注释,群集名称文件设置
- cluster-node-timeout 15000 #846行,取消注释群集超时时间设置
- appendonly yes #700行,修改,开启AOF持久化
- redis-server redis.conf
- 或
- for d in {1..6}
- do
- cd /etc/redis/redis-cluster/redis600$d
- redis-server redis.conf
- done
-
- ps -ef | grep redis
redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1
- redis-cli -p 6001 -c
- cluster slots #查看节点的哈希槽编号范围