Redis05-redis集群
hash slots(槽) 个数 16384
hash slots(槽) 范围 0~16383
所有主库平分hash槽,从库没有hash槽
主库之间的数据是独立的,不一样的
集群不能用的情况:
(1)有半数或者半数以上的主库机器down掉
(2)没有从库,集群不能用
一个主库挂掉,它的从库自动顶替为主库,此时主库的hash槽也给了从库,正常使用,挂掉的主库修复好后,会成为从库,不会抢占为主,而且在挂掉期间主库上存储的数据,也会自动同步到从库
部署redis集群
主机名 | IP地址 | 端口号 |
---|---|---|
redisA | 192.168.4.51 | 6351 |
redisB | 192.168.4.52 | 6352 |
redisC | 192.168.4.53 | 6353 |
redisD | 192.168.4.54 | 6354 |
redisE | 192.168.4.55 | 6355 |
redisF | 192.168.4.56 | 6356 |
环境准备
1、按表配置主机名,ip地址。六台服务器同样操作(以51为例)
yum -y install gcc gcc-c++ make
tar -xf redis-4.0.8.tar.gz
cd redis-4.0.8/
make && make install
./utils/install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server]
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful! //安装成功
ss -antlp | grep 6379 //查看时有端口
LISTEN 0 128 127.0.0.1:6379 *:* users:(("redis-server",pid=10788,fd=6))
2、修改配置文件,6台redis服务器都要修改(以51为例子)
停止已经开启的redis服务
/etc/init.d/redis_6379 stop
编辑配置文件
vim /etc/redis/6379.conf
...
bind 192.168.4.51 //修改ip
port 6351 //不使用默认的端口号
daemonize yes //以守护进程方式运行
pidfile /var/run/redis_6351.pid //指定pid文件
cluster-enabled yes //是否启用集群,前提是以守护进程方式运行
cluster-config-file nodes-6351.conf //存储集群信息的配置文件,自动生成,不允许相同
cluster-node-timeout 5000 //集群节点通信超时时间(毫秒)
...
启动服务
/etc/init.d/redis_6379 start
ss -antlp | grep 6351
# 其他几台主机在修改时请注意ip,端口等的修改,不要和51主机的一样
3、关闭防火墙和selinux(以51为例子)
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
4、查看集群信息
redis-cli -h 192.168.4.51 -p 6351
192.168.4.51:6351> ping
PONG
192.168.4.51:6351> cluster info
目前还没有创建集群,所以显示fail
cluster_state:fail
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:1
cluster_size:0
...
5、查看集群节点信息
192.168.4.51:6351> cluster nodes
f81f997d5ed988ec1587558e78d5f7dbc96abcbf :6351@16351 myself,master - 0 0 0 connected
/var/lib/redis/6379/nodes-6351.conf
创建集群
在任意一台上执行创建集群的脚本都可以,这里在51上面执行
1、部署ruby脚本运行环境(在51上面执行)
yum -y install ruby
rpm -ivh ruby-devel-2.0.0.648-30.el7.x86_64.rpm
which gem
/usr/bin/gem
gem install redis.gem
生成创建集群的脚本
cd /root/redis/redis-4.0.8/src/
从源码目录拷贝到系统目录
cp redis-trib.rb /usr/local/bin/
chmod 755 /usr/local/bin/redis-trib.rb
2、创建和管理集群 51 52 53 为主
./redis-trib.rb create --replicas 1 \
192.168.4.51:6351 192.168.4.52:6352 \
192.168.4.53:6353 192.168.4.54:6354 \
192.168.4.55:6355 192.168.4.56:6356
查看集群信息,任意一台主机访问本机的redis服务查看即可
cluster info # 查看集群信息
cluster nodes # 查看集群节点信息
测试集群,客户端访问任意一台master主机,存放数据,在其他服务器上查看
redis-cli -c -h ip地址 -p 端口
# -c是访问集群模式
# 主库提供读写服务,从库提供只读服务
查看库在集群中的角色
info relpication
集群节点选举策略(三主,三从)
停止某个主库的redis服务,对应的从库会自动升级为主库,包括原主库的hash槽也会直接给从库,当之前的主库恢复时,自动成为当前主库的从库,且在它坏掉期间,主库上新存的数据,会自动同步到主库上
管理redis集群
redis-trib.rb脚本
命令格式:redis-trib.rb 选项 参数
选项:
add-node # 添加master主机
add-node --slave # 添加slave主机
reshard # 重新分配hash槽,以及分片对应的数据
del-node # 删除主机(master或slave)
check # 检测集群主机
参数:
主库ip:服务器端口号
添加master主机步骤
添加master主机
redis-trib.rb add-node 新主机IP:端口 集群任意一台master的IP:端口
检测新添加的master主机,用于获取状态,hash槽分布,ID等信息
redis-trib.rb check 新主机IP:端口
重新分片,需要指定移出hash槽个数、接收hash槽主机ID、移除hash槽主机ID(设置为all表示平均分配)
redis-trib.rb reshard 集群任意master的IP:端口
添加slave主机,不指定master,默认给slave最少的master添加
redis-trib.rb add-node --slave [--master-id id值] 从库IP:端口 集群任意一台master的IP:端口
删除master主机的步骤
检查主节点是否有从节点,有要先删除从节点
redis-trib.rb del-node 从节点IP:端口 从节点ID
redis-trib.rb del-node 192.168.4.51:6351 f6649ea99b2f01faca26217691222c17a3854381
删除主机占用的hash槽
执行hash槽的命令
redis-trib.rb reshard 192.168.4.58:6358
指定移除hash槽的数量为4096
How many slots do you want to move (from 1 to 16384)? 4096
指定接收hash槽的主机的id(这里指定给了随意一台master主机)
What is the receiving node ID? bc5c4e082a5a3391b634cf433a6486c867cfc44b
指定被移除hash槽的主机的id
Source node #1: c5e0da48f335c46a2ec199faa99b830f537dd8a0
删除主机
redis-trib.rb del-node 主节点IP:端口 主节点ID
redis-trib.rb del-node 192.168.4.51:6351 f6649ea99b2f01faca26217691222c17a3854381
把修复的redis主节点再添加到集群
要求:添加的主节点服务要开启,主节点的配置文件为空
重新启动服务
/etc/init.d/redis_6358 start
重置节点信息
redis-cli -h 192.168.4.58 -p 6358
192.168.4.57:6357>cluster reset
rm -rf /var/lib/redis/6358/nodes-6358.conf
重新启动服务,重新加载/var/lib/redis/6358/nodes-6358.conf配置文件
/etc/init.d/redis_6358 stop
/etc/init.d/redis_6358 start
检查配置文件,重启之后中间这个值就变为0了
cat /var/lib/redis/6358/nodes-6358.conf
c48b34a7b4a67cba3c220f8550ceaf23cf34e024 :0@0 myself,master - 0 0 0 connected
vars currentEpoch 0 lastVoteEpoch 0
添加命令,分配hash槽,添加主机
redis-trib.rb add-node 192.168.4.57:6357 192.168.4.51:6351
把修复的redis从节点再添加到集群
注意:之前添加过此从库,所以想要再此添加此节点也必须将此服务器的cluster nodes清掉,具体步骤可参考把修复的redis主节点再添加到集群
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)