一、环境规划

主机名 IP地址 端口 描述
redis-master 192.168.166.9 6379 redis-master01
6381 redis-master02
6383 redis-master03
redis-slave 192.168.166.9 6380 redis-slave01
6382 redis-slave02
6384 redis-slave03

二、基础环境

1、创建配置目录

mkdir /etc/redis

mv /etc/redis.conf  /etc/redis/6379.conf

cd /etc/redis
cat 6379.com
bind 192.168.166.9
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised systemd
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis.log
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir /var/lib/redis
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes

2、生成配置文件

[root@localhost redis]# for i in {6380..6384};do cp ./6379.conf ${i}.conf ;done
[root@localhost redis]# ls
6379.conf  6380.conf  6381.conf  6382.conf  6383.conf  6384.conf

3、修改监听端口

[root@localhost redis]# for i in {6380..6384};do sed -i "s/port 6379/port ${i}/" ./${i}.conf;done
[root@localhost redis]# for i in {6380..6384};do grep "^port" ./${i}.conf;done
port 6380
port 6381
port 6382
port 6383
port 6384

4、修改数据目录

[root@localhost redis]# for i in {6379..6384};do sed -i "s#dir /var/lib/redis#dir /var/lib/redis/${i}#" ./${i}.conf;done
[root@localhost redis]# for i in {6379..6384};do grep "^di" ./${i}.conf;done
dir /var/lib/redis/6379
dir /var/lib/redis/6380
dir /var/lib/redis/6381
dir /var/lib/redis/6382
dir /var/lib/redis/6383
dir /var/lib/redis/6384

5、修改日志目录

[root@localhost redis]# for i in {6379..6384};do sed -i "s#logfile /var/log/redis/redis.log#logfile /var/log/redis/${i}.log#" ./${i}.conf;done
[root@localhost redis]# for i in {6379..6384};do grep "^logfile" ./${i}.conf;done
logfile /var/log/redis/6379.log
logfile /var/log/redis/6380.log
logfile /var/log/redis/6381.log
logfile /var/log/redis/6382.log
logfile /var/log/redis/6383.log
logfile /var/log/redis/6384.log

6、修改PID文件目录

[root@localhost redis]# for i in {6379..6384};do sed -i "s#pidfile /var/run/redis_6379.pid#pidfile /var/run/redis/${i}.pid#" ${i}.conf;done
[root@localhost redis]# for i in {6379..6384};do grep "^pidfile" ${i}.conf;done
pidfile /var/run/redis/6379.pid
pidfile /var/run/redis/6380.pid
pidfile /var/run/redis/6381.pid
pidfile /var/run/redis/6382.pid
pidfile /var/run/redis/6383.pid
pidfile /var/run/redis/6384.pid

7、修改保护模式

[root@localhost redis]# for i in {6379..6384};do sed -i "s#protected-mode yes#protected-mode no#" ${i}.conf;done
[root@localhost redis]# for i in {6379..6384};do grep "^protected-mode" ${i}.conf;done
protected-mode no
protected-mode no
protected-mode no
protected-mode no
protected-mode no
protected-mode no

8、修改进程运行模式

[root@localhost redis]# for i in {6379..6384};do sed -i "s#daemonize no#daemonize yes#" ${i}.conf;done
[root@localhost redis]# for i in {6379..6384};do grep "^daemonize" ${i}.conf;done
daemonize yes
daemonize yes
daemonize yes
daemonize yes
daemonize yes
daemonize yes

9、修改监听地址

[root@localhost redis]# for i in {6379..6384};do sed -i "s#bind 127.0.0.1#bind 192.168.166.9#" ${i}.conf;done
[root@localhost redis]# for i in {6379..6384};do grep "^bind" ${i}.conf;done
bind 192.168.166.9
bind 192.168.166.9
bind 192.168.166.9
bind 192.168.166.9
bind 192.168.166.9
bind 192.168.166.9

10、生成集群配置

[root@localhost ~]# cd /var/lib/redis/
[root@localhost redis]# mkdir {6379..6384}
[root@localhost redis]# ls
6379  6380  6381  6382  6383  6384

[root@localhost ~]# cd /var/run/
[root@localhost run]# mkdir redis
[root@localhost run]# cd /etc/redis
[root@localhost redis]# for i in {6379..6384};do echo -e "cluster-enabled yes\ncluster-config-file nodes-${i}.conf\ncluster-node-timeout 15000" >> ${i}.conf;done
[root@localhost redis]# for i in {6379..6384};do tail -3 ${i}.conf;done
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
cluster-enabled yes
cluster-config-file nodes-6380.conf
cluster-node-timeout 15000
cluster-enabled yes
cluster-config-file nodes-6381.conf
cluster-node-timeout 15000
cluster-enabled yes
cluster-config-file nodes-6382.conf
cluster-node-timeout 15000
cluster-enabled yes
cluster-config-file nodes-6383.conf
cluster-node-timeout 15000
cluster-enabled yes
cluster-config-file nodes-6384.conf
cluster-node-timeout 15000

11、启动服务

[root@localhost redis]# for((i=6379;i<=6384;i++));do redis-server /etc/redis/${i}.conf;done
[root@localhost redis]# netstat -anptu | grep redis
tcp        0      0 192.168.166.9:16380   0.0.0.0:*               LISTEN      3154/redis-server 1 
tcp        0      0 192.168.166.9:16381   0.0.0.0:*               LISTEN      3156/redis-server 1 
tcp        0      0 192.168.166.9:16382   0.0.0.0:*               LISTEN      3160/redis-server 1 
tcp        0      0 192.168.166.9:16383   0.0.0.0:*               LISTEN      3166/redis-server 1 
tcp        0      0 192.168.166.9:16384   0.0.0.0:*               LISTEN      3170/redis-server 1 
tcp        0      0 192.168.166.9:6379    0.0.0.0:*               LISTEN      3150/redis-server 1 
tcp        0      0 192.168.166.9:6380    0.0.0.0:*               LISTEN      3154/redis-server 1 
tcp        0      0 192.168.166.9:6381    0.0.0.0:*               LISTEN      3156/redis-server 1 
tcp        0      0 192.168.166.9:6382    0.0.0.0:*               LISTEN      3160/redis-server 1 
tcp        0      0 192.168.166.9:6383    0.0.0.0:*               LISTEN      3166/redis-server 1 
tcp        0      0 192.168.166.9:6384    0.0.0.0:*               LISTEN      3170/redis-server 1 
tcp        0      0 192.168.166.9:16379   0.0.0.0:*               LISTEN      3150/redis-server 1 

三、构建集群

以下操作需要登录某个节点的redis数据库

1、将其他节点加入集群

[root@localhost redis]# redis-cli  -h 192.168.166.9

192.168.166.9:6379> CLUSTER MEET 192.168.166.9 6380
OK
192.168.166.9:6379> CLUSTER MEET 192.168.166.9 6381
OK
192.168.166.9:6379> CLUSTER MEET 192.168.166.9 6382
OK
192.168.166.9:6379> CLUSTER MEET 192.168.166.9 6383
OK
192.168.166.9:6379> CLUSTER MEET 192.168.166.9 6384
OK

########或者终端执行如下指令#####
for i in {6380..6384};do redis-cli -h 192.168.166.9 -p 6379 cluster meet 192.168.166.9 $i;done

2、分配slot

也是在规划谁是master节点

[root@localhost redis]# redis-cli -h 192.168.166.9 -p 6379 cluster addslots {0..5461}
OK
[root@localhost redis]# redis-cli -h 192.168.166.9 -p 6381 cluster addslots {5462..10922}
OK
[root@localhost redis]# redis-cli -h 192.168.166.9 -p 6383 cluster addslots {10923..16383}
OK

3、建立主从关系

查看所有群集节点

[root@localhost redis]# redis-cli -h 192.168.166.9 -p 6379 cluster nodes
69ed2c9d99ac83e52851d67e2597927142f47ebf 192.168.166.9:6381 master - 0 1709263044558 5 connected 5462-10922
c3f6d16785ab3de1b88f8ddb8e5bea3e7c6de5d4 192.168.166.9:6382 master - 0 1709263043555 0 connected
a8b96d687e681dd4c606e6959468b2bc1a5b0b1f 192.168.166.9:6379 myself,master - 0 0 2 connected 0-5461
bbdc8d353e2afa87d3d1430eecbbe436206fd213 192.168.166.9:6384 master - 0 1709263042550 4 connected
20a5e5bb03ab273fea553b3ccafeba01e83a6eb2 192.168.166.9:6380 master - 0 1709263043052 1 connected
98fe02fecd9f99d2d220cbf3de921063a9413428 192.168.166.9:6383 master - 0 1709263045565 3 connected 10923-16383

查看master节点ID

 [root@localhost redis]# redis-cli -h 192.168.166.9 -p 6380 cluster replicate a8b96d687e681dd4c606e6959468b2bc1a5b0b1f
OK
[root@localhost redis]# redis-cli -h 192.168.166.9 -p 6382 cluster replicate 69ed2c9d99ac83e52851d67e2597927142f47ebf
OK
[root@localhost redis]# redis-cli -h 192.168.166.9 -p 6384 cluster replicate 98fe02fecd9f99d2d220cbf3de921063a9413428
OK

4、集群操作命令

命令 作用
cluster info 打印集群的信息
cluster nodes 列出集群当前已知的所有节点( node),以及这些节点的相关信息。
cluster meet <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget <node_id> 从集群中移除 node_id 指定的节点。
cluster replicate <master_node_id> 将当前从节点设置为 node_id 指定的master节点的slave节点。只能针对slave节点操作。
cluster saveconfig 将节点的配置文件保存到硬盘里面。
cluster addslots <slot> [slot ...] 将一个或多个槽( slot)指派( assign)给当前节点。
cluster delslots <slot> [slot ...] 移除一个或多个槽对当前节点的指派。
cluster flushslots 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot <slot> node <node_id> 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot <slot> migrating <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot <slot> importing <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。
cluster setslot <slot> stable 取消对槽 slot 的导入( import)或者迁移( migrate)。
cluster keyslot <key> 计算键 key 应该被放置在哪个槽上。
cluster countkeysinslot <slot> 返回槽 slot 目前包含的键值对数量。
cluster getkeysinslot <slot> <count> 返回 count 个 slot 槽中的键 。
cluster reset 重置集群命令

四、故障恢复

1、模式故障

kill -9  PID #杀死其中一个redis进程

2、故障恢复

  1. 启动杀死的redis进程

  2. 通过 cluster nodes查看节点状态

  3. 通过 cluster info 查看集群状态

  4. 登录所有从节点

3、cluster failover命令

Redis Cluster模式下的cluster failover(集群故障转移)的作用是确保Redis集群在主节点(Master)发生故障或不可用的情况下,能够自动将主节点的工作负载转移到备用节点(Slave)上,并使备用节点成为新的主节点,保证Redis集群的高可用性和持续可用性。

当主节点发生故障时,Redis Cluster会自动检测到主节点的不可用,并从备用节点中选出一个合适的备用节点作为新的主节点。该备用节点经过选举后,会接管原主节点的数据和工作负载,并开始对外提供服务。集群的其它节点也会更新集群拓扑信息,以便客户端能够正确地路由请求到新的主节点。

cluster failover的作用主要包括:

  1. 高可用性:当主节点发生故障时,能够及时切换到备用节点,保证Redis集群的继续正常运行,避免因单点故障而导致服务不可用。

  2. 数据保护:在主节点发生故障时,能够将数据从主节点复制到备用节点,并在故障转移时将备用节点提升为新的主节点,从而保证数据的持久性和一致性。

  3. 自动化管理:集群故障转移是自动化过程,无需人工干预,减少了对系统运维的依赖,并提高了系统的可靠性和可维护性。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐