Redis Cluster分布式
本课程将深入讲解集群模式的核心概念和实践应用。主要内容包括:哈希槽、节点通信、扩容缩容。
Redis的集群模式是非常重要的功能模块,在实际开发中有广泛的应用。通过本课程的学习,你将全面掌握集群模式的使用技巧。
Redis Cluster是Redis官方提供的分布式解决方案,用于解决单节点Redis的容量和性能瓶颈问题。
Redis Cluster使用哈希槽来分配和管理数据:
Redis Cluster推荐的拓扑结构:
# redis.conf中的集群配置
# 开启集群模式
cluster-enabled yes
# 集群配置文件路径(自动生成和更新)
cluster-config-file nodes-6379.conf
# 集群节点超时时间(毫秒)
cluster-node-timeout 15000
# 集群从节点选举超时时间
cluster-slave-validity-factor 10
# 集群最大重定向次数
cluster-max-reredirects 10
# 实际应用:生产环境配置
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 30000
cluster-slave-validity-factor 5
cluster-max-reredirects 5
# 步骤1: 准备6个Redis实例(3主3从)
# 创建6个配置文件,端口分别为7000-7005
# 步骤2: 启动所有Redis实例
redis-server redis-7000.conf
redis-server redis-7001.conf
redis-server redis-7002.conf
redis-server redis-7003.conf
redis-server redis-7004.conf
redis-server redis-7005.conf
# 步骤3: 创建集群
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
# 步骤4: 验证集群状态
redis-cli -c -p 7000 cluster info
redis-cli -c -p 7000 cluster nodes
# 步骤5: 测试集群
redis-cli -c -p 7000 set foo bar
redis-cli -c -p 7001 get foo
redis-cli -c -p 7002 keys *
# 实际应用:使用redis-trib.rb(旧版本)
# redis-trib.rb create --replicas 1 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 INFO
# 查看集群节点信息
CLUSTER NODES
# 查看键所属的哈希槽
CLUSTER KEYSLOT key
# 查看节点负责的哈希槽
CLUSTER SLOTS
# 添加节点到集群
redis-cli --cluster add-node new_node_ip:new_node_port existing_node_ip:existing_node_port
# 添加从节点到集群
redis-cli --cluster add-node --cluster-slave --cluster-master-id master_node_id new_node_ip:new_node_port existing_node_ip:existing_node_port
# 删除节点
redis-cli --cluster del-node existing_node_ip:existing_node_port node_id
# 重新平衡哈希槽
redis-cli --cluster rebalance existing_node_ip:existing_node_port
# 检查集群
redis-cli --cluster check existing_node_ip:existing_node_port
# 修复集群
redis-cli --cluster fix existing_node_ip:existing_node_port
Redis Cluster的数据路由机制:
Redis Cluster使用Gossip协议进行故障检测:
当主节点故障时,Redis Cluster会自动执行故障转移:
# 步骤1: 启动新的Redis实例(主节点)
redis-server redis-7006.conf
# 步骤2: 将新节点添加到集群
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
# 步骤3: 为新节点分配哈希槽
redis-cli --cluster reshard 127.0.0.1:7000
# 步骤4: 启动新的Redis实例(从节点)
redis-server redis-7007.conf
# 步骤5: 将从节点添加到集群,并指定主节点
redis-cli --cluster add-node --cluster-slave --cluster-master-id new_master_node_id 127.0.0.1:7007 127.0.0.1:7000
# 步骤6: 验证集群状态
redis-cli -c -p 7000 cluster info
redis-cli -c -p 7000 cluster nodes
# 步骤1: 将待删除主节点的哈希槽迁移到其他主节点
redis-cli --cluster reshard 127.0.0.1:7000
# 选择待删除的主节点作为源节点,将其所有哈希槽迁移到其他主节点
# 步骤2: 删除从节点
redis-cli --cluster del-node 127.0.0.1:7000 slave_node_id
# 步骤3: 删除主节点(此时已无哈希槽)
redis-cli --cluster del-node 127.0.0.1:7000 master_node_id
# 步骤4: 验证集群状态
redis-cli -c -p 7000 cluster info
redis-cli -c -p 7000 cluster nodes
# 使用-c参数连接集群
redis-cli -c -h 127.0.0.1 -p 7000
# 示例操作
127.0.0.1:7000> set foo bar
-> Redirected to slot [12182] located at 127.0.0.1:7002
OK
127.0.0.1:7002> get foo
"bar"
127.0.0.1:7002> keys *
1) "foo"
# 查看集群信息
127.0.0.1:7000> cluster info
127.0.0.1:7000> cluster nodes
# 示例:Java客户端连接Redis Cluster
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("127.0.0.1", 7000));
nodes.add(new HostAndPort("127.0.0.1", 7001));
nodes.add(new HostAndPort("127.0.0.1", 7002));
JedisCluster jedisCluster = new JedisCluster(nodes, 10000, 5000, 5, "password", new JedisPoolConfig());
// 操作示例
jedisCluster.set("user:1001:name", "zhangsan");
String name = jedisCluster.get("user:1001:name");
jedisCluster.hset("user:1001", "age", "25");
Map<String, String> user = jedisCluster.hgetAll("user:1001");
// 关闭连接
jedisCluster.close();
# 实际应用:使用支持Redis Cluster的客户端库
# 如JedisCluster、Lettuce、Redisson等
# 架构:6节点集群(3主3从)
# 特点:数据量大,并发高
# 优化措施:
# 1. 合理分配哈希槽,确保各节点负载均衡
# 2. 使用读写分离,读操作分散到从节点
# 3. 定期进行数据备份
# 4. 使用监控工具实时监控集群状态
# 应用场景:
# - 商品信息存储
# - 用户会话管理
# - 购物车数据
# - 订单缓存
# 架构:9节点集群(6主3从)
# 特点:高并发,数据增长快
# 优化措施:
# 1. 使用更大的内存配置
# 2. 优化网络连接,使用万兆网络
# 3. 定期清理过期数据
# 4. 实现智能数据分片策略
# 应用场景:
# - 玩家数据存储
# - 游戏排行榜
# - 实时在线状态
# - 游戏内货币管理
# 架构:9节点集群(3主6从)
# 特点:高可用性,数据一致性要求高
# 优化措施:
# 1. 每个主节点配置2个从节点,提高可用性
# 2. 严格的监控和告警机制
# 3. 定期测试故障转移
# 4. 实现多级备份策略
# 应用场景:
# - 交易缓存
# - 用户账户信息
# - 风控数据
# - 会话管理
| 命令 | 功能说明 | 使用场景 |
|---|---|---|
| CLUSTER INFO | 查看集群信息 | 监控集群状态 |
| CLUSTER NODES | 查看集群节点信息 | 监控节点状态 |
| CLUSTER KEYSLOT | 计算键的哈希槽 | 调试数据路由 |
| CLUSTER SLOTS | 查看哈希槽分配 | 监控哈希槽分布 |
| CLUSTER MEET | 添加节点到集群 | 集群扩容 |
| CLUSTER FORGET | 移除节点 | 集群缩容 |
| CLUSTER REPLICATE | 设置从节点 | 集群配置 |
| CLUSTER FAILOVER | 手动触发故障转移 | 测试故障转移 |
| redis-cli --cluster | 集群管理工具 | 集群搭建和管理 |
通过本课程的学习,你应该已经掌握了Redis Cluster的核心概念和使用方法。以下是本课程的主要内容总结:
Redis Cluster是Redis官方提供的分布式解决方案,通过哈希槽分片和自动故障转移,实现了高可用性和水平扩展性。掌握Redis Cluster的使用和管理,对于构建大规模、高可用的Redis系统至关重要。
继续深入学习和实践,你将能够更好地运用Redis Cluster解决实际问题,为企业级应用提供可靠的数据存储和缓存服务。