Redis 主从复制,哨兵模式,集群

目录

主从复制

主从复制

作用

缺陷

主从复制流程

实现Redis主从复制

哨兵模式

主从复制切换的缺点

哨兵的核心功能

哨兵模式原理

哨兵模式的作用

哨兵结构组成

故障转移机制

主节点的选举

实现哨兵模式

集群(Cluster)


redis群集有三种模式,主从复制,哨兵模式,集群(Cluster)

主从复制

主从复制

主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。

主从复制具体是指将一台redis服务器的数据,复制到其他的Redis服务器,前者称为主节点(master),后者称为从节点(slave),数据复制是单向的,只能由主节点到从节点。

默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

作用

数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式

故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复

负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,从节点提供读服务,分担服务器负载,尤其是在写少读多的情况下,通过多个从节点分担读负载,可以大大提高Redsi服务器的并发量

高可用基石:主从复制是哨兵和集群能够实施的基础,是Redis高可用的基础

缺陷

故障无法自动化,写操作无法负载均衡,存储能力受到单机限制

主从复制流程

如果启动一个slave进程,则他会向master机器发送一个"sync command"命令,请求同步链接

无论是第一次连接还是重新连接,master机器都会启动一个后台进程,将数据快照保存到数据文件中(执行rdb操作),同时master 还会记录修改数据的所有命令并缓存到数据文件中

后台进程完成缓存操作之后,master机器就会向slave机器发生数据文件,slave端机器将数据文件保存到硬盘上,然后将其加载到内存中,接着master机器会将修改数据的所有操作一并发给slave机器,若slave机器出现故障宕机,则恢复故障后重新连接

master机器收到slave端机器的连接后,将其完整的数据文件发送给slave机器,如果master同时收到多个slave发来的同步请求,则master会在后台启动一个进程保存数据文件,然后将其发送给所有的slave端机器,确保所有的slave机器都正常

实现Redis主从复制

master:192.168.94.7

slave1:192.168.94.8

slave2:192.168.94.9

主配置

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持久化功能
 

vim /etc/redis/6379.conf

/etc/init.d/redis_6379 restart

从配置

两台从配置一样
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.94.7 6379     288行,指定要同步的Master节点IP和端口
appendonly yes                          700行,开启AOF持久化功能
vim /etc/redis/6379.conf

查看主从状态

测试

哨兵模式

主从复制切换的缺点

当服务器宕机后,需要手动一台从机切换为主机,这需要人工干预,不仅费时费力而且还会造成一段时间内服务不可用。

为了解决主从复制的缺点,就有了哨兵机制。

哨兵的核心功能

在主从复制的基础上,哨兵引入了主节点的自动故障转移

哨兵模式原理

哨兵(sentinel):是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 Master并将所有slave连接到新的 Master。所以整个运行哨兵的集群的数量不得少于3个节点。

哨兵模式的作用

监控:哨兵会不断地检查主节点和从节点是否运作正常。

自动故障转移:当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其它从节点改为复制新的主节点。

通知(提醒):哨兵可以将故障转移的结果发送给客户端。


哨兵结构组成

哨兵节点和数据节点

哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据。

数据节点:主节点和从节点都是数据节点。


故障转移机制

1.由哨兵节点定期监控发现主节点是否出现了故障,每个哨兵节点每隔1秒会向主节点、从节点及其它哨兵节点发送一次ping命令做一次心跳检测。如果主节点在一定时间范围内不回复或者是回复一个错误消息,那么这个哨兵就会认为这个主节点主观下线了(单方面的)。当超过半数哨兵节点认为该主节点主观下线了,这样就客观下线了。

2.当主节点出现故障,此时哨兵节点会通过Raft算法(选举算法)实现选举机制共同选举出一个哨兵节点为leader,来负责处理主节点的故障转移和通知。所以整个运行哨兵的集群的数量不得少于3个节点

3.由leader哨兵节点执行故障转移,过程如下:
将某一个从节点升级为新的主节点,让其它从节点指向新的主节点;
若原主节点恢复也变成从节点,并指向新的主节点;
通知客户端主节点已经更换。

需要特别注意的是,客观下线是主节点才有的概念;如果从节点和哨兵节点发生故障,被哨兵主观下线后,不会再有后续的客观下线和故障转移操作。


主节点的选举

1.过滤掉不健康的(已下线的),没有回复哨兵 ping 响应的从节点。
2.选择配置文件中从节点优先级配置最高的。(replica-priority,默认值为100)
3.选择复制偏移量最大,也就是复制最完整的从节点。


哨兵的启动依赖于主从复制,所以须把主从复制部署好的情况下再去做哨兵模式

实现哨兵模式

修改配置文件(主从修改内容一致)

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.94.7 6379 2    

84行,修改 指定该哨兵节点监控192.168.94.7:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移


sentinel down-after-milliseconds mymaster 30000    113行,判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel failover-timeout mymaster 180000        146行,故障节点的最大超时时间为180000(180秒)
vim /opt/redis-5.0.7/sentinel.conf

下面亮相皆为默认,默认即可

启动哨兵模式

注意:先启动主进程,再启动从进程

redis-sentinel sentinel &  启动哨兵

redis-cli -p 26379 info sentinel  查看哨兵的详细信息

测试

tailf /var/log/sentinel.log

将192.168.94.7恢复,并恢复成从

集群(cluster)

集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。

集群由多个节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护;从节点只进行主节点数据和状态信息的复制

集群的作用

数据分区

数据分区(或称数据分片)是集群最核心的功能
集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力

Redis单机内存大小受限问题,在介绍持久化和主从复制时都有提及;例如,如果单机内存太大,bgsave和bgrewriteaof的fork操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出。

高可用

集群支持主从复制和主节点的自动故障转移,当任一节点故障时,集群仍然可以对外提供服务

redis集群的数据分区(数据分片)

Redis集群引入了哈希槽的概念,Redis集群有16384个哈希槽(编号0-16383),集群的每个节点负责一部分哈希槽

每个Key通过CRC16校验后对16384取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作

以3个节点组成的集群为例:

节点A包含0到5460号哈希槽
节点B包含5461到10922号哈希槽
节点C包含10923到16383号哈希槽

Redis集群的主从复制模型
集群中具有A、B、C三个节点,如果节点B失败了,整个集群就会因缺少5461-10922这个范围的槽而不可以用。

为每个节点添加一个从节点A1、B1、C1整个集群便有三个Master节点和三个slave节点组成,在节点B失败后,集群选举B1位为的主节点继续服务。当B和B1都失败后,集群将不可用。

实现集群

使用三台机器完成集群(也可以使用一台机器模拟集群,一台机器需要设置6个redis实例端口,且都不相同)

这里一台机器两个端口,端口不同

master端口slave端口
192.168.94.76001192.168.94.76002
192.168.94.86001192.168.94.86002
192.168.94.96001192.168.94.96002

前期准备

三台步骤相同,到步骤不同之处,会有提示

准备三台redis机器

关闭防火墙,核心防护

停止redis当前服务

搭建

每台服务器服务器创建实例并配置(三台配置相同,建议同时执行)

cd /etc/redis    //切换到 /etc/redis

mkdir  -p redis-cluster/redis600{1..2}  //创建 redis6001,redis6002

for i in {1..2}        //循环将你包内的原版配置文件,和两个命令 拷贝到6001和6002中

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

对配置文件进行修改(三台配置相同,建议同时执行)

cd /etc/redis/redis-cluster/redis6001   //切换到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持久化


cd /etc/redis/redis-cluster/redis6002   //切换到redis6002下
vim /redis.conf
#bind 127.0.0.1							#69行,注释掉bind 项,默认监听所有网卡
protected-mode no						#88行,修改,关闭保护模式
port 6002								#92行,修改,redis监听端口,
daemonize yes							#136行,开启守护进程,以独立进程启动
cluster-enabled yes						#832行,取消注释,开启群集功能
cluster-config-file nodes-6002.conf		#840行,取消注释,群集名称文件设置
cluster-node-timeout 15000				#846行,取消注释群集超时时间设置
appendonly yes							#700行,修改,开启AOF持久化

6002也是如此配置(便不在重复),请看前面详细配置

启动实例查看服务 (三台配置相同,建议同时执行)

for j in {1..2}    //遍历开启
do
cd /etc/redis/redis-cluster/redis600$j
redis-server redis.conf
done


ps -ef | grep redis  //查看状态是否开启

搭建完成,可以测试

三台机器上随便找一台进行测试

redis-cli --cluster create 192.168.94.7:6001 192.168.94.8:6001 192.168.94.9:6001 192.168.94.7:6002 192.168.94.8:6002 192.168.94.9:6002 --cluster-replicas 1

//启动集群   前3个ip是主,后3个ip为从,主从不是一一对应的,是根据算法的结果来匹配的

--cluster-replicas 1 表示每个主节点有1个从节点。

测试

redis-cli -p 6001 -c					加-c参数,节点之间就可以互相跳转
127.0.0.1:6001> cluster slots			查看节点的哈希槽编号范围

  • 27
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis是一个基于内存的高性能键值存储系统,支持多种数据结构。在实际应用中,为了保证Redis的高可用性,可以采用主从复制、哨兵和集群等方式。 1. 主从复制 主从复制的原理是将一台Redis服务器的数据复制到其他多个Redis服务器上,其中主节点是读写节点,从节点只能读取数据。主节点将自己的数据变化通过异步的方式发送给从节点,从而实现数据同步。主从复制可以提高Redis的可用性和性能,并且可以支持读写分离,从而减轻主节点的压力。 2. 哨兵 哨兵是一种特殊的Redis服务器,用于监控主从复制的状态,并在主节点故障时自动将从节点切换为主节点。哨兵可以自动发现Redis服务器,并监控它们的状态,当发现主节点宕机时,会通过投票的方式选举新的主节点,并将从节点切换为新的主节点的从节点。哨兵可以保证Redis的高可用性,并且可以自动完成主从切换,从而减少人工干预的工作量。 3. 集群 Redis集群是一种分布式的Redis系统,可以将多个Redis服务器组成一个逻辑上的整体,并支持横向扩展。Redis集群采用分片的方式存储数据,将数据分散到多个节点上,从而提高Redis的可用性和性能。Redis集群可以自动完成节点的发现和管理,并支持数据的备份和恢复,从而保证Redis的高可用性和数据的安全性。 总之,主从复制、哨兵和集群Redis实现高可用性的重要手段,可以提高Redis的可用性和性能,并保证数据的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值