Redis进阶/集群管理Cluster/哨兵模式

本文深入探讨Redis集群和哨兵模式的工作原理,包括读/写分离、主从同步、哨兵配置及Cluster模式搭建步骤,阐述了高可用集群的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis集群

读/写分离

什么是读/写分离

在用户量非常庞大的时候,单台redis肯定是完全不够用的。因此更多的时候我们更希望可以读/写分离,读/写分离的前提就是读操作比写操作频繁的多,将数据放在多台服务器上那么久可以消除单台服务器的压力。

Redis主从同步
主从同步的过程

1.保证主服务器(Master)的启动
2.当从服务器启动时,发送SYNC命令给主服务器。主服务器接受到同步命令时,就是执行bgsave命令备份数据,但是主服务器并不会拒绝客户端的写操作,而是将来自客户端的写命令写入缓冲区。从服务器在未收到主服务器的备份快照文件之前,会根据配置决定使用现有数据响应客户端还是返回错误
3.当bgsave命令被主服务器执行完后,开始向从服务器发送备份文件,这个时候从服务器就会丢弃现有的所有数据,开始载入发送过来的快照文件
4.当主服务器发送完备份文件后,会将bgsave执行之后的缓存区内的写命令也发送给从服务器,从服务器完成备份文件解析后,就开始等待主服务器的后续命令
5.同步完成以后,每次主服务器完成一次写入命令,都会同时往从服务器发送同步写入命令,主从同步就完成了

配置主从同步

从机配置:
slaveof server port 设置Master的ip和端口
masterauth root 设置Master的密码

Redis哨兵模式(sentinel)
什么是哨兵模式?

主从同步有一个问题就是:当Master宕机以后需要手动的把一台Slave切换为Master,这种方式需要人工干预,费时费力。因此哨兵模式可以帮助我们解决这个问题

哨兵模式概述

哨兵是一个独立的进程
哨兵会检测多个redis服务器,包括Master和Slave。通过发送命令,让redis服务器响应,检测其运行状态。
当哨兵检测到master宕机,就会自动将slave切换成master,然后通过发布订阅模式通知其他slave修改配置文件,切换主机
为了实现哨兵的高可用,可以配置成多哨兵模式,即多个哨兵进程运行在不同的服务器上检测各个redis服务器,哨兵两两之间也会互相监控
多哨兵模式时,Master一旦宕机,哨兵1检测到这个结果,并不会马上进行故障切换,而仅仅是哨兵1主管的认为Master不可用。当其他哨兵也检测到Master不可用时,并且有一定的数量后,那么哨兵之间就会形成一次投票,投票的结果由一个哨兵发起,进行切换操作,切换完成后,就会通过发布订阅方式让各个哨兵把自己监控的服务器实现切换主机。

哨兵模式配置

配置哨兵配置文件:
redis/src/sentinel.conf
默认端口:
port 26379
内容如下:
禁止保护模式
protected-mode no
配置监听的主服务, 最后的2表示当2个或2个以上的哨兵认为主服务不可用才会进行故障切换
sentinel monitor 服务器名称(自定义) 主服务ip 端口 2
定义服务密码
sentinel auth-pass 服务器名称(和上面相同) 密码
打开服务端口:哨兵之间两两监控
vim /etc/sysconfig/iptables
service iptables restart

启动哨兵

./redis-sentinel sentinel.conf

哨兵的其他配置

sentinel down-after-milliseconds
- 指定哨兵在检测redis服务时,当redis服务在一个毫秒数内都无法回答时,单个哨兵认为的主观下线时间,默认为30秒
sentinel failover-timeout
- 指定故障切换运行的毫秒数,当超过这个毫秒数时,就认为切换故障失败,默认3分钟
sentinel notification-script
- 指定哨兵检测到redis实例异常时,调用的报警脚本

Spring中启动哨兵
<!-- 哨兵配置 -->
<bean id="sentinelConfig" 
	class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
<!-- 配置master主服务的名称 -->
	<property name="master">
	   <bean class="org.springframework.data.redis.connection.RedisNode">
	    	<property name="name" value="mymaster"/>
	    </bean>
		</property>
		    <!-- 配置哨兵服务 -->
		    <property name="sentinels">
		    	<set>
		    		<bean 
		    		class="org.springframework.data.redis.connection.RedisNode">
		    			<constructor-arg name="host" value="192.168.101.153"/>
		    			<constructor-arg name="port" value="26379"/>
		    		</bean>
			    	<bean 
			    	class="org.springframework.data.redis.connection.RedisNode">
			    		<constructor-arg name="host" value="192.168.101.153"/>
			    		<constructor-arg name="port" value="26380"/>
			    	</bean>
			    	<bean 
			    	class="org.springframework.data.redis.connection.RedisNode">
			    		<constructor-arg name="host" value="192.168.101.153"/>
			    		<constructor-arg name="port" value="26381"/>
			    	</bean>
		     </set>
	</property>
</bean>
SpringBoot中启动哨兵
spring:
  redis:
    sentinel:
      master: myMaster
      nodes: 
        - 192.168.184.130:26379
        - 192.168.184.131:26379
        - 192.168.184.132:26379

Cluster模式

Cluster集群的特点

1、Client与redis节点直接连接,不需要中间proxy层.
2、redis-cluster把所有的物理节点映射到[0-16383]slot(插槽)上,cluster 负责维护
3、所有的redis节点彼此互联(PING-PONG机制),内部使用gossip二进制协议优化传输数据
4、节点的失效检测是通过集群中超过半数的节点检测失效时才生效.
问题:Redis 集群中内置了 16384 个哈希槽,那他是如何决定将key放入哪个插槽的?
- 当Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点

Cluster集群搭建步骤

前置条件:删除redis/src下的appendonly.aof,dump.rdb,nodes-6379.conf 3个文件
1.
修改redis.conf,配置集群信息
开启集群,cluster-enabled yes
指定集群的配置文件,cluster-config-file nodes-端口.conf
2、用redis-trib.rb搭建集群
因为redis-trib.rb是用Ruby实现的Redis集群管理工具,所以我们需要先安装ruby的环境
2.1、安装ruby
yum -y install zlib ruby rubygems
2.2、安装rubygems的redis依赖
gem install -l redis-3.3.0.gem
3、安装好依赖的环境之后,我们就可以来使用脚本命令了
注意:此脚本文件在我们的解压缩目录src下
执行命令:
./redis-trib.rb create --replicas 0 192.168.10.167:6379 192.168.10.167:6380 192.168.10.167:6381 开放16379 redis端口+1W
–replicas 0:指定了从数据的数量为0
4、查看集群状态
通过客户端输入以下命令:
cluster nodes:这个命令可以查看插槽的分配情况
整个Redis提供了16384个插槽,./redis-trib.rb 脚本实现了是将16384个插槽平均分配给了N个节点。

Cluster高可用集群的搭建步骤

问题:集群中的故障检查机制
1、当集群中的节点超过半数认为该目标节点疑似下线,那么该节点就会被标记为下线;
2、当集群中的任何一个节点下线,就会导致插槽区有空档,不完整,那么该集群将不可用;
解决方案
- 在Redis集群中可以使用主从模式实现某一个节点的高可用
创建新集群,且设置为一主一备
./redis-trib.rb create --replicas 1 192.168.10.167:6379 192.168.10.167:6380 192.168.10.167:6381 192.168.10.167:6382 192.168.10.167:6383 192.168.10.167:6384

spring:
    redis:
    cluster:
      max-redirects: 0
      nodes:
        - 192.168.184.130:26379
        - 192.168.184.131:26379
        - 192.168.184.132:26379
### 部署 Redis Sentinel 哨兵模式 Redis Sentinel 是用于监控 Redis 实例并实现高可用性的工具。以下是关于其部署和配置的关键点: #### 启动 Redis 主从节点 为了使 Redis Sentinel 正常工作,需要先设置好主从复制结构。可以通过以下方式启动多个 Redis 实例作为主服务器和从服务器。 ```bash ./redis-server /path/to/redis_master.conf --port 6379 ./redis-server /path/to/redis_slave1.conf --port 6380 --slaveof 127.0.0.1 6379 ./redis-server /path/to/redis_slave2.conf --port 6381 --slaveof 127.0.0.1 6379 ``` 上述命令分别启动了一个主实例(端口 `6379`)和两个从实例(端口分别为 `6380` 和 `6381`),其中从实例通过参数 `--slaveof` 设置为主实例的副本[^4]。 #### 配置 Redis Sentinel 文件 创建一个名为 `sentinel.conf` 的配置文件,并添加如下内容来定义哨兵的行为: ```conf # 定义监听端口 port 26379 # 指定被监视的主数据库名称、IP地址及端口号 sentinel monitor mymaster 127.0.0.1 6379 2 # 当前 quorum 参数表示至少有 2 台哨兵同意才能判定主库失效 quorum 表示多少台哨兵认为 master 不可用时触发 failover 流程 # 自动发现其他哨兵节点 sentinel down-after-milliseconds mymaster 5000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 60000 ``` 此部分设置了哨兵去监测名为 `mymaster` 的主数据库及其关联的从属者们的状态变化情况[^3]。 #### 启动 Redis Sentinel 利用之前准备好的配置文件运行哨兵进程: ```bash ./redis-sentinel /path/to/sentinel.conf ``` 这一步会依据指定路径下的配置文件初始化相应的哨兵服务。 --- ### 部署 Redis Cluster 集群环境 对于更复杂的场景,则可以考虑构建完整的 Redis Cluster 来提供分布式存储能力。下面介绍基本步骤: #### 准备多份独立的 Redis 配置文件 每一份都需要单独设定不同的 TCP 端口以便区分各个成员之间的通信渠道。例如: ```conf port 7000 cluster-enabled yes cluster-config-file nodes-7000.conf cluster-node-timeout 5000 appendonly yes ``` 这里启用了集群支持 (`cluster-enabled`) 并指定了持久化选项(`appendonly`) ,同时允许自动生成节点间关系描述文档(nodes-*.conf)[^2]。 #### 开始各组件的服务 按照预先规划的数量逐一激活这些预设完毕后的个体单元体: ```bash for port in {7000..7005}; do ./redis-server /path/to/redis_$port.conf; done ``` 这样就拥有了六个处于待命状态中的候选参与者可供后续操作调配使用了。 #### 创建实际意义上的逻辑上的整体集合体系 借助官方提供的脚本完成最后组装动作: ```bash yes | redis-cli --cluster create \ 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 \ 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \ --cluster-replicas 1 ``` 该指令将把前面提到过的那些零散部件组合成具有冗余备份特性的正式生产级别规模大小不一但相互协作配合默契的整体解决方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流放Oo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值