redis群集模式
redis群集有三种模式,redis群集有三种模式,分别是主从同步/复制、哨兵模式、Cluster,可以提高redis的高可用,高性能。
目录
一、redis群集模式
二、主从复制
三、哨兵
四、集群
五、总结
一、redis群集模式
1.redis群集模式
(1)主从复制:主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。
(2)哨兵:在主从复制的基础上,哨兵实现了自动化的故障恢复。
(3)集群:通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。
2.redis群集背景
(1)在传统的单机系统中,数据存储在单个节点上,当节点出现故障时会导致系统不可用。而在分布式系统中,数据存储在多个节点上,可以提高系统的可用性和容错能力。但是,分布式系统也面临着一些挑战,如数据一致性、负载均衡、故障转移等问题。
(2)为了解决这些问题,出现了一些分布式技术,如主从复制、哨兵、Redis集群等。主从复制可以提高系统的可用性和性能,同时还可以用于数据备份和读写分离等场景。哨兵可以实现自动故障转移、日志记录、通知等功能,提高了系统的可用性和可靠性。Redis集群则可以将数据分散存储到多个Redis实例中,以提高系统的处理能力和容错能力。
二、主从复制
1.主从复制概述
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master),后者称为从节点(Slave);数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
2.主从复制的作用
(1)数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
(2)故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
(3)负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
(4)高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
3.主从复制流程
(1)若启动一个Slave机器进程,则它会向Master机器发送一个“sync command”命令,请求同步连接。
(2)无论是第一次连接还是重新连接,Master机器都会启动一个后台进程,将数据快照保存到数据文件中(执行rdb操作),同时M缓存aster还会记录修改数据的所有命令并在数据文件中。
(3)后台进程完成缓存操作之后,Master机器就会向Slave机器发送数据文件,Slave端机器将数据文件保存到硬盘上,然后将其加载到内存中,接着Master机器就会将修改数据的所有操作一并发送给Slave端机器。若Slave出现故障导致宕机,则恢复正常后会自动重新连接。
(4)Master机器收到Slave端机器的连接后,将其完整的数据文件发送给Slave端机器,如果Mater同时收到多个Slave发来的同步请求,则Master会在后台启动一个进程以保存数据文件,然后将其发送给所有的Slave端机器,确保所有的Slave端机器都正常。
4.搭建redis主从复制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | ---------------------- 搭建Redis 主从复制 ---------------------------------------- Master节点: 192.168.140.111 Slave1节点: 192.168.140.222 Slave2节点: 192.168.140.223 systemctl stop firewalld setenforce 0 -----安装 Redis----- yum install -y gcc gcc-c++ make tar zxvf redis-5.0.7.tar.gz -C /opt/ wget -p /opt http://download.redis.io/releases/redis-5.0.9.tar.gz cd /opt/redis-5.0.7/ make make PREFIX=/usr/ local /redis install cd /opt/redis-5.0.7/utils ./install_server.sh ...... Please select the redis executable path [/usr/ local /bin/redis-server] /usr/ local /redis/bin/redis-server ln -s /usr/ local /redis/bin/* /usr/ local /bin/ -----修改 Redis 配置文件(Master节点操作)----- vim /etc/redis/6379.conf redis.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 -----修改 Redis 配置文件(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行,指定工作目录 #288行,指定要同步的Master节点IP和端口 replicaof 192.168.10.22 6379 appendonly yes #700行,开启AOF持久化功能 /etc/init.d/redis_6379 restart -----验证主从效果----- 在Master节点上看日志: tail -f /var/log/redis_6379.log在Master节点上验证从节点: redis-cli info replication |
三、哨兵
1.哨兵概述
主从切换技术的方法是:当服务器宕机后,需要手动一台从机切换为主机,这需要人工干预,不仅费时费力而且还会造成一段时间内服务不可用。为了解决主从复制的缺点,就有了哨兵机制。
2.哨兵功能
哨兵的核心功能:在主从复制的基础上,哨兵引入了主节点的自动故障转移。
3.哨兵模式原理
哨兵(sentinel):是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 Master并将所有slave连接到新的 Master。所以整个运行哨兵的集群的数量不得少于3个节点。
4.哨兵模式的作用
(1)监控:哨兵会不断地检查主节点和从节点是否运作正常。
(2)自动故障转移:当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其它从节点改为复制新的主节点。
(3)通知(提醒):哨兵可以将故障转移的结果发送给客户端。
5.哨兵结构组成
(1)哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据。
(2)数据节点:主节点和从节点都是数据节点。
6.故障转移机制
(1)由哨兵节点定期监控发现主节点是否出现了故障
每个哨兵节点每隔1秒会向主节点、从节点及其它哨兵节点发送一次ping命令做一次心跳检测。如果主节点在一定时间范围内不回复或者是回复一个错误消息,那 么这个哨兵就会认为这个主节点主观下线了(单方面的)。当超过半数哨兵节点认为该主节点主观下线了,这样就客观下线了。
(2)当主节点出现故障,此时哨兵节点会通过Raft算法(选举算法)实现选举机制共同选举出一个哨兵节点为leader,来负责处理主节点的故障转移和通知。所以整个运行哨兵的集群的数量不得少于3个节点。
(3)由leader哨兵节点执行故障转移,过程如下:
●将某一个从节点升级为新的主节点,让其它从节点指向新的主节点;
●若原主节点恢复也变成从节点,并指向新的主节点;
●通知客户端主节点已经更换。
需要特别注意的是,客观下线是主节点才有的概念;如果从节点和哨兵节点发生故障,被哨兵主观下线后,不会再有后续的客观下线和故障转移操作。
7.主节点的选举
1.过滤掉不健康的(已下线的),没有回复哨兵 ping 响应的从节点。
2.选择配置文件中从节点优先级配置最高的。(replica-priority,默认值为100)
3.选择复制偏移量最大,也就是复制最完整的从节点。
8.搭建哨兵
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | ---------------------- 搭建Redis 哨兵模式 ---------------------------------------- Master节点:192.168.140.111 Slave1节点:192.168.140.222 Slave2节点:192.168.140.223 systemctl stop firewalld setenforce 0 -----修改 Redis 哨兵模式的配置文件(所有节点操作)----- 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.140.111 6379 2 #84行,修改 指定该哨兵节点监控192.168.140.111:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移 sentinel down- after -milliseconds mymaster 30000 #113行,判定服务器down掉的时间周期,默认30000毫秒(30秒) sentinel failover-timeout mymaster 180000 #146行,故障节点的最大超时时间为180000(180秒) -----启动哨兵模式----- 先启master,再启slave cd /opt/redis-5.0.7/ redis-sentinel sentinel.conf & -----查看哨兵信息----- redis-cli -p 26379 info Sentinel -----故障模拟----- #查看redis-server进程号: ps -ef | grep redis#杀死 Master 节点上redis-server的进程号 kill -9 57031 #Master节点上redis-server的进程号 #验证结果 tail -f /var/log/sentinel.log2.redis-cli -p 26379 INFO Sentinel |
四、集群
1.集群概述
集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。集群由多个节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护;从节点只进行主节点数据和状态信息的复制。
2.集群的作用
(1)数据分区:数据分区(或称数据分片)是集群最核心的功能。
集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。
Redis单机内存大小受限问题,在介绍持久化和主从复制时都有提及;例如,如果单机内存太大,bgsave和bgrewriteaof的fork操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出。
(2)高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似);当任一节点发生故障时,集群仍然可以对外提供服务。
3.Redis集群的数据分片
Redis集群引入了哈希槽的概念
Redis集群有16384个哈希槽(编号0-16383)
集群的每个节点负责一部分哈希槽
每个Key通过CRC16校验后对16384取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作
#以3个节点组成的集群为例:
节点A包含0到5460号哈希槽
节点B包含5461到10922号哈希槽
节点C包含10923到16383号哈希槽
例如:#Redis集群的主从复制模型
1 2 | 集群中具有A、B、C三个节点,如果节点B失败了,整个集群就会因缺少5461-10922这个范围的槽而不可以用。 为每个节点添加一个从节点A1、B1、C1整个集群便有三个Master节点和三个slave节点组成,在节点B失败后,集群选举B1位为的主节点继续服务。<br>当B和B1都失败后,集群将不可用。 |
4. 搭建Redis 群集模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | redis的集群一般需要6个节点,3主3从。方便起见,这里所有节点在同一台服务器上模拟: 以端口号进行区分:3个主节点端口号:6001/6002/6003,对应的从节点端口号:6004/6005/6006。 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节点 分别进入那六个文件夹,执行命令:redis-server redis.conf ,来启动redis节点 cd /etc/redis/redis-cluster/redis6001 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 <br>--cluster-replicas 1 #六个实例分为三组,每组一主一从,前面的做主节点,后面的做从节点。下面交互的时候 需要输入 yes 才可以创建。 --replicas 1 表示每个主节点有1个从节点。 #测试群集 redis-cli -p 6001 -c #加-c参数,节点之间就可以互相跳转 127.0.0.1:6001> cluster slots #查看节点的哈希槽编号范围 1) 1) ( integer ) 5461 2) ( integer ) 10922 #哈希槽编号范围 3) 1) "127.0.0.1" 2) ( integer ) 6003 #主节点IP和端口号 3) "fdca661922216dd69a63a7c9d3c4540cd6baef44" 4) 1) "127.0.0.1" 2) ( integer ) 6004 #从节点IP和端口号 3) "a2c0c32aff0f38980accd2b63d6d952812e44740" 2) 1) ( integer ) 0 2) ( integer ) 5460 3) 1) "127.0.0.1" 2) ( integer ) 6001 3) "0e5873747a2e26bdc935bc76c2bafb19d0a54b11" 4) 1) "127.0.0.1" 2) ( integer ) 6006 3) "8842ef5584a85005e135fd0ee59e5a0d67b0cf8e" 3) 1) ( integer ) 10923 2) ( integer ) 16383 3) 1) "127.0.0.1" 2) ( integer ) 6002 3) "816ddaa3d1469540b2ffbcaaf9aa867646846b30" 4) 1) "127.0.0.1" 2) ( integer ) 6005 3) "f847077bfe6722466e96178ae8cbb09dc8b4d5eb" 127.0.0.1:6001> set name zhangsan -> Redirected to slot [5798] located at 127.0.0.1:6003 OK 127.0.0.1:6001> cluster keyslot name #查看 name 键的槽编号 redis-cli -p 6004 -c 127.0.0.1:6004> keys * #对应的slave节点也有这条数据,但是别的节点没有 1) "name" |
可以看到6002也有同样数据
五、总结
redis主从复制、哨兵、集群都是为了完成高性能和高可用采取的技术。
Redis主从复制:通过将一个Redis实例作为主节点,将数据同步到一个或多个从节点,实现数据的备份和读取负载均衡。
Redis哨兵:通过监控Redis集群中的主节点状态,当主节点发生故障时,自动将某个从节点升级为新的主节点,确保集群高可用性。
Redis集群:将Redis数据分片存储在多个节点上,实现数据的分布式存储和负载均衡,并提供自动分片和故障转移等功能,支持大规模高并发的应用场景。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?