【Redis】集群-集群模式

时间:2024-11-01 07:17:37

1.1 概述

Redis 集群采用P2P模式,是完全去中心化的,不存在中心节点或者代理节点。

Redis 集群是没有统一的入口的,客户端(client)连接集群的时候连接集群中的任意节点(node)即可,集群内部的节点是相互通信的(PING-PONG机制),每个节点都是一个redis实例。

Redis 把所有的 Key 分成了 16384 个 slot,每个 Redis 实例负责其中一部分 slot 。集群中的所有信息(节点、端口、slot等),都通过节点之间定期的数据交换而更新。

1.2 部署单机伪集群

Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群。要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。

没有那么多服务器与虚拟机时,搭建伪分布式集群,即一台服务器虚拟运行6个redis实例,修改端口号为(7001-7006)

当然,部署在多台机器上操作是一致的。

???? 第一步:创建六个Redis实例

# 下载解压:https://blog.****.net/weixin_42364929/article/details/143316994

# 拷贝配置文件
[appuser&localhost ~]$ cd /app/redis/conf
[appuser&localhost conf]$ cp redis.conf 7001.conf

# 修改配置文件部分参数,其他参数不变
[appuser&localhost conf]$ vim 7001.conf
# 节点端口号
port 7001  
# 绑定当前机器 IP
bind 127.0.0.1  
# Redis后台运行
daemonize yes  
# 数据文件存放位置
dir /app/redis-cluster/data   
# pid 7001和port要对应
# pidfile:包含进程标识号(pid)的文件,该文件存储在文件系统定义明确的位置,因此允许其他程序找出正在运行的脚本的pid。
pidfile /var/run/redis_7001.pid  
# 日志文件
logfile "/app/redis-cluster/logs/7001.log"  
#  启动集群模式	
cluster-enabled yes
# 集群的配置  配置文件首次启动自动生成 7000,7001,7002
cluster-config-file  nodes_7001.conf  
# 请求超时  默认15秒,可自行设置
cluster-node-timeout 15000
# 是否需要每个节点都可用,集群才算可用,关闭
cluster-require-full-coverage no
# aof日志开启  有需要就开启,它会每次写操作都记录一条日志 
appendonly yes
# 密码详解:https://blog.****.net/damanchen/article/details/100584275
masterauth 123456@rds
requirepass 123456@rds


# 再拷贝五份配置文件
[appuser&localhost conf]$ echo "7002.conf 7003.conf 7004.conf 7005.conf 7006.conf" | xargs -n 1 cp 7001.conf

#用vim编辑器的全局替换命令(:%s/7001/7002/g)来替换节点信息
[appuser&localhost conf]$ vim 7002.conf


# 写个启动脚本用来启动Redis实例:
[appuser@localhost conf]$ cd ..
[appuser@localhost redis]$ vim start-cluster.sh
# 删除 data文件夹下的 appendonly.aof dump.rdb nodes-7005.conf
rm -rf /app/redis/data/*
# 启动服务
cd /app/redis/bin
./redis-server /app/redis/conf/7001.conf
./redis-server /app/redis/conf/7002.conf
./redis-server /app/redis/conf/7003.conf
./redis-server /app/redis/conf/7004.conf
./redis-server /app/redis/conf/7005.conf
./redis-server /app/redis/conf/7006.conf


# 写个关闭脚本用来关闭Redis实例:
[appuser@localhost redis]$ vim stop-cluster.sh
cd /app/redis/bin
./redis-cli -p 7001 SHUTDOWN
./redis-cli -p 7002 SHUTDOWN
./redis-cli -p 7003 SHUTDOWN
./redis-cli -p 7004 SHUTDOWN
./redis-cli -p 7005 SHUTDOWN
./redis-cli -p 7006 SHUTDOWN

# 修改脚本权限
[appuser@localhost redis]$ chmod 764 start-cluster.sh
[appuser@localhost redis]$ chmod 764 stop-cluster.sh

# 启动Redis实例
[appuser@localhost redis]$ ./start-cluster.sh


# 查看Redis服务
[appuser@localhost script]$ ps -ef |grep redis
appuser   42398      1  0 15:19 ?        00:00:00 ./redis-server 127.0.0.1:7001 [cluster]
appuser   42400      1  0 15:19 ?        00:00:00 ./redis-server 127.0.0.1:7002 [cluster]
appuser   42402      1  0 15:19 ?        00:00:00 ./redis-server 127.0.0.1:7003 [cluster]
appuser   42412      1  0 15:19 ?        00:00:00 ./redis-server 127.0.0.1:7004 [cluster]
appuser   42414      1  0 15:19 ?        00:00:00 ./redis-server 127.0.0.1:7005 [cluster]
appuser   42416      1  0 15:19 ?        00:00:00 ./redis-server 127.0.0.1:7006 [cluster]
appuser   42441  38082  0 15:19 pts/1    00:00:00 grep --color=auto redis

# 查看集群信息(此时集群处于失败状态,各节点互相直接发现不了,而且还没有可存储的位置,即slot(槽)没有分配)
[appuser@localhost scripts]$ ../bin/redis-cli -h 127.0.0.1 -p 7001 cluster info
127.0.0.1:7001> cluster info
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
cluster_current_epoch:0
cluster_my_epoch:0
cluster_stats_messages_sent:0
cluster_stats_messages_received:0
localhost:7001> keys *
(empty array)
localhost:7001> set name m
(error) CLUSTERDOWN Hash slot not served

???? 第二步:创建集群

创建Redis集群的方式有两种:redis-cli方式、redis-trib.rb工具

  • redis-cli 方式(推荐):
# 启动集群,前三台为主节点,后三台为从节点,1 表示我们希望为集群中的每个主节点创建一个从节点(可以将命令放在上边的启动脚本里边):
[appuser@localhost bin]$ ./redis-cli --cluster create --cluster-replicas 1 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 127.0.0.1:7006 
...
Can I set the above configuration? (type 'yes' to accept): 

# 输入 yes 回车 
yes

[WARNING] Some slaves are in the same host as their master --> 主从同一个机器,因为部署的伪集群在同一机器上,不必管

Can I set the above configuration? (type ‘yes’ to accept) --> 提示你是否接受上述的配置,填入yes

此时节点已经添加,并且槽位已经分配好了,集群也处于可用的状态,查看集群状态:

[appuser@localhost bin]$ ./redis-cli -p 7001 cluster info
  • redis-trib.rb工具

Ruby工具安装:https://blog.****.net/weixin_42364929/article/details/120576194?spm=1001.2014.3001.5501

redis-trib.rb脚本下载:https://blog.****.net/weixin_42364929/article/details/120578068?spm=1001.2014.3001.5502

[appuser@localhost ~]$ mv /app/redis/src/redis-trib.rb /app/redis-cluster/bin
[appuser@localhost bin]$ ./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004