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主节点再添加到集群

posted @   立勋  阅读(11)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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)
点击右上角即可分享
微信分享提示