redis集群

redis集群:
	主从模式:
		缺点:
			主节点出现故障后,需要手动将一个从节点晋升为主节点,并修改其它从节点的主从关系,同时需要修改应用方主节点地址的配置,无法实现redis的高可用。
			主节点的存储容量、写性能受到单机的限制。

		相比单机的优点:
			主节点故障后,可手动将从节点设置为主节点,保证数据尽量不丢失。
			从节点可以分担主节点读的压力。
				eg:客户端直接连接从节点来读取实时性不太敏感的数据。注意:若从节点晋升为主节点,则客户端需要修改从节点的地址。
		
					
		
	哨兵模式:
		概念:
			Redis Sentinel中包含若干个Sentinel节点和Redis数据节点(主节点和从节点),
			每个Sentinel节点会对数据节点和其余Sentinel节点进行监控,当它发现某个节点不可达时,会对节点做下线标识。
			如果被标识的是主节点,它还会和其他Sentinel节点进行“协商”,当大多数Sentinel节点都认为主节点不可达时,
			它们会选举出一个Sentinel节点(leader)来完成自动故障转移的工作,同时会将这个变化实时通知给客户端,整个过程都是自动完成的。

		缺点:主节点的存储容量、写性能受到单机的限制。
			
		优点:哨兵自动完成故障发现和故障转移并通知应用方,从而实现redis的高可用。
			故障发现:哨兵监控主数据库和从数据库是否运行正常
			故障转移:哨兵在主节点出现故障后自动将从节点库转化为主数据库。
			通知应用方:哨兵将故障转移的结果通知给应用方。
			说明:客户端在初始化的时候连接的是Sentinel节点集合,从中获取主节点信息。

		客户端:
			指定Sentinel节点的集合、主节点名称masterName即可连接上redis sentinel。
			为每一个Sentinel节点单独启动一个线程,利用Redis的发布订阅功能,每个线程订阅Sentinel节点上切换master的相关频道。
			
		原理:
			三个定时任务:
				每隔10秒,每个Sentinel节点会向主节点和从节点发送info命令获取最新的拓扑结构
				每隔2秒,每个Sentinel节点会向Redis数据节点和其它sentinel节点发送该Sentinel节点对于主节点的判断以及当前Sentinel节点的信息
				每隔1秒,每个Sentinel节点会向主节点、从节点、其余Sentinel节点发送一条ping命令做一次心跳检测,来确认这些节点当前是否可达。
				
			主观下线:
				sentinel节点通过心跳发现某个节点不可达,则判断该节点离线。
				
			客观下线:
				当Sentinel主观下线的节点是主节点时,该Sentinel节点会向其它Sentinel节点询问对主节点的判断,若max(quorum, num(sentinels)/2+1)个数的Sentinel节点认为主节点离线,则该Sentinel节点会做出客观下线的决定。
				说明:从节点、Sentinel节点在主观下线后,没有后续的故障转移操作。
			领导者选举:
				当某个sentinel节点做出客观下线的决定后,接着需要从sentinel集合中选出一个Sentinel节点作为领导者进行故障转移的工作。
				说明:选举的过程非常快,基本上谁先完成客观下线,谁就是领导者。
				
			故障转移:
				选取一个从节点(选取规则:健康的+优先级最高的+数据复制最完整的+runid最小的)作为主节点。
			
		说明:
			一套Sentinel集合可以监控多个主从结构。
		
		版本:
			支持版本:2.8及以上。
			使用版本:3.2.8
			
		两机房三哨兵部署:
			部署方案:master部署在A机房,slave部署在B机房,多数哨兵部署在B机房。
			优点:实现了多机房的高可用性,当一个机房故障时,仍然可以自动完成failover,并提供正常的服务。
			说明:
				当A机房故障时,多数哨兵仍然可以正常工作,故failover操作会成功,最后在B机房中选出master。注意:A机房恢复后,手动将A机房的机器设置为master,恢复到初始状态。
				当B机房故障时,因master没有受影响,故可以正常工作。
			举例:master部署在A机房,2个slave部署在B机房,部署3个哨兵,A机房部署1个哨兵,B机房部署2个哨兵。
		 
		
	集群模式:
		概念:Redis Cluster
		
		优点:集群容量伸缩、集群高可用。
		
		缺点:
			key批量操作支持有限
			不支持多数据库,只能使用db0
			key事务操作有限
			
		原理:
			集群伸缩:
				当加入1个节点来对集群进行扩容时,通过相关命令把一部分槽和数据迁移给新节点。
				
				Redis cluster采用虚拟槽分区的数据分区方案:
					redis cluster接收任何键相关命令时首先计算键对应的槽,再根据槽找出所对应的节点:
						若节点是自身,则处理键命令;
						若节点不是自身,则回复MOVED重定向错误,通知客户端请求正确的节点,这个过程称为MOVED重定向。
					槽的范围:
						虚拟槽的范围是0~16383
					计算槽:
						根据键计算出散列值,再取对16383的余数,使每个键都可以映射到0~16383槽范围内。
					槽节点查找:
						集群内通过消息交换每个节点都会知道所有节点的槽信息		
					优点:
						解耦数据和节点之间的关系,降低了节点扩容和收缩的难度。
						支持节点、槽、键之间的映射查询。
				
			高可用:
				主观下线:
					集群中任意一个节点通过心跳发现某个节点不可达,则判断该节点离线。
					
				客观下线:
					当半数以上持有槽的主节点认为该节点已经离线,则触发客观下线流程。
					说明:
						只有持有槽的主节点才负责读写请求和集群槽等关键信息维护,故只有持有槽的主节点参与故障发现的决策。
						参与投票的主节点最少为3个,且每个主节点最少有一个从节点(),故redis cluster最少需要6个节点才能保证集群的高可用性。
				领导者选举:
					故障节点变为客观下线后,若下线节点是持有槽的主节点,则需要从持有槽的主节点中选出一个节点作为领导者进行故障转移的工作。
					
				故障转移:
					选取一个从节点(选取规则:健康的+优先级最高的+数据复制最完整的+runid最小的)作为主节点。
			

		集群客户端:
			普通客户端:
				接收到MOVED重定向信息后再次发起请求。
			智能客户端:
				在内部维护slot与node的映射关系,本地就可实现键到节点的查找,从而保证IO效率的最大化,
				接收到MOVED重定向响应后,客户端更新slot与node的映射关系。
		

			
		

 

### Redis 集群的搭建与配置 #### 一、Redis 集群简介 Redis 是一种高性能的键值存储系统,支持多种数据结构操作。通过集群模式可以实现分布式存储和高可用性。Redis 集群允许多个 Redis 实例协同工作,提供更高的吞吐量和更强的数据持久化能力。 --- #### 二、环境准备 在开始之前,需确认以下条件已满足: - 所有服务器的操作系统版本一致(如 CentOS 7 或 Windows),并安装了相同版本的 Redis 软件。 - 已关闭防火墙或开放必要的端口(默认 Redis 使用 6379 及其衍生端口)。 - 每台服务器上至少有两个 Redis 实例运行,分别作为主节点和从节点[^1]。 --- #### 三、具体步骤 ##### 1. 下载并解压 Redis 文件 下载指定版本的 Redis 压缩包(如 Redis 6.2.5 或更高版本),将其解压到目标路径下。例如,在 Linux 中执行以下命令: ```bash wget http://download.redis.io/releases/redis-6.2.5.tar.gz tar -zxvf redis-6.2.5.tar.gz cd redis-6.2.5 make ``` ##### 2. 创建多个实例目录 为每个 Redis 实例创建独立的工作目录,并复制 `redis.conf` 至对应文件夹中。例如: ```bash mkdir -p /service/redis/{6379,6380} cp redis.conf /service/redis/6379/ cp redis.conf /service/redis/6380/ ``` ##### 3. 修改配置文件 编辑每个实例下的 `redis.conf` 文件,设置不同的监听端口号和其他必要参数。以下是关键配置项: - 设置绑定 IP 地址:`bind 0.0.0.0` - 关闭保护模式:`protected-mode no` - 开启集群功能:`cluster-enabled yes` - 指定集群配置文件位置:`cluster-config-file nodes-{port}.conf` - 设定日志级别:`loglevel notice` ##### 4. 启动 Redis 实例 依次启动各个 Redis 实例。例如: ```bash redis-server /service/redis/6379/redis.conf redis-server /service/redis/6380/redis.conf ``` 如果是在多台物理机上部署,则需要远程登录每台机器重复上述过程[^2]。 ##### 5. 构建集群拓扑 利用 `redis-cli` 的集群管理工具完成初始化操作。假设当前存在六个节点分布在三台主机上,则可输入如下指令构建集群关系: ```bash redis-cli --cluster create \ 192.168.x.y:6379 192.168.x.z:6379 ... \ --replicas 1 ``` 其中 `--replicas` 参数表示每个主节点分配几个副本[^4]。 ##### 6. 验证集群状态 最后可以通过以下方式验证集群是否正常运作: ```bash redis-cli -c -h {任意IP} -p {任一口号} CLUSTER INFO CLUSTER NODES PING SET key value GET key ``` --- #### 四、注意事项 - 如果使用 Docker 容器来部署 Redis 集群,请确保容器间网络互通良好。 - 对于 Windows 平台上的开发测试场景,可通过批处理脚本来简化服务启动流程[^3]。 --- #### 五、示例代码片段 下面展示了一个简单的 Python 程序用于连接至 Redis 集群并向其中写入一条记录: ```python import redis r = redis.StrictRedisCluster(startup_nodes=[{"host": "127.0.0.1", "port": "6379"}], decode_responses=True) r.set('foo', 'bar') print(r.get('foo')) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值