第十一周 redis作业

第十一周 redis作业

1、RDB和AOF的优缺点

RDB 的优点
1. RDB 保存了某个时间点的数据集,可通过脚本执行redis指令自定义时间点备份,可保留多个备份。出现问题可恢复到不同时间点的版本,非常适合数据集的备份
2. RDB 快照是一个紧凑的单一文件,非常方便传送,非常适用于灾难恢复
3. RDB 可最大化Redis 的性能,父进程在保存RDB文件时唯一要做的就是fork 出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘I/O 操作
4. 相比AOF,在恢复大的数据集的时候,RDB的速度相对比较快

RDB 的缺点
1. 不可控,丢失数据。即不能实时保存数据,可能会丢失自上一次执行RDB备份到当前的内存数据
2. 耗时、耗性能。当数据量非常大的时候,从父进程fork 子进程进行保存至RDB文件时需要一点时间,取决于磁盘IO性能


AOF 的优点
1. 数据安全性相对较高,根据所使用的的fsync策略,默认是appendfsync everysec,即每秒执行一次fsync。在这种配置下,redis 仍可以保持良好的性能,且就算发生故障停机,也最多只会丢失一秒钟的数据
2. 由于appendfsync everysec 该机制对日志文件的写入操作采用的是append 模式,因此在写入过程中不需要seek,即使由于某些原因(磁盘空间已满,写入过程宕机等)未执行完整的写入命令,也可使用redis-check-aof工具修复
3. redis 可在AOF 文件体积变得过大时,自动地在后台对AOF 进行重写,重写后的新AOF 文件包含了恢复当前数据集所需的最小命令集合。整个重写操作是绝对安全的。因为redis 在创建新AOF文件的过程中,append模式不断的将修改数据追加到现有AOF 文件里面,即使重写过程中发生停机,现有的AOF 文件也不会丢失,而一旦新AOF 文件创建完毕,redis 就会从旧AOF 文件切换到新AOF 文件,并开始对新AOF 文件进行追加操作。
4. AOF 包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,也可通过该文件完成数据的重建。

AOF 的缺点
1. 即使有些操作是重复的也会全部记录,AOF 的文件大小要大于RDB 格式的文件
2. AOF 在恢复大数据集时的速度比RDB 的恢复能力较慢
3. 根据fsync 策略不同,AOF 速度可能会慢于RDB
4. bug 出现的可能性更多


RDB 和AOF 的选择
如果主要充当缓存功能,或可以承受分钟数据的丢失,通常生产环境一般只需启用RDB 即可,此也是默认值。
如果数据需要持久保存,一点不能丢失,可选择同时开启RDB 和AOF,一般不建议只开启AOF

2、master和slave同步过程

具体主从同步过程如下:
1. 从服务器连接主服务器,发送PSYNC 命令
2. 主服务器接收到PSYNC 命令后,开始执行BGSAVE 命令生成RDB 快照文件并使用缓冲区记录此后执行的所有写命令
3. 主服务器BGSAVE 执行完后,向所有从服务器发送RDB 快照文件,并在发送期间继续记录被执行的写命令
4. 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照至内存
5. 主服务器快照发送完毕后,开始向从服务器发送缓冲区的写命令
6. 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令
7. 后期同步会先发送slave_repl_offset 位置,只同步新增的数据,不再全量同步
#主从服务器安装redis,并设置配置
[root@c8-8 ~]# yum install redis -y
[root@c8-8 ~]# systemctl enable --now redis
[root@c8-8 ~]# vim /etc/sysctl.conf
net.core.somaxconn = 1024
vm.overcommit_memory = 1

[root@c8-8 ~]# sysctl -p
[root@c8-8 ~]# echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local
[root@c8-8 ~]# chmod +x /etc/rc.d/rc.local

#主服务器redis 配置
[root@c8-8 ~]# vim /etc/redis.conf
...省略...
bind 0.0.0.0
requirepass 123456
...省略...
[root@c8-8 ~]# systemctl restart redis

#从服务器redis 配置
[root@c8-18 ~]# vim /etc/redis.conf
...省略...
bind 0.0.0.0
requirepass 123456
replicaof 10.0.0.8 6379
masterauth 123456
...省略...
[root@c8-18 ~]# systemctl restart redis

3、哨兵的使用和实现机制
在这里插入图片描述
在这里插入图片描述

Sentinel 进程是用于监控redis集群中Master主服务器工作的状态,在Master主服务器发生故障的时候,可以实现Master和Slave服务器的切换,保证系统的高可用,此功能在redis2.6+的版本已引用, Redis的哨兵模式到了2.8版本之后就稳定了下来。一般在生产环境也建议使用Redis的2.8版本的以后版本

哨兵(Sentinel) 是一个分布式系统,可以在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossip protocols)来接收关于Master主服务器是否下线的信息,并使用投票协议(Agreement Protocols)来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master

每个哨兵(Sentinel)进程会向其它哨兵(Sentinel)、Master、Slave定时发送消息,以确认对方是否”活”着,如果发现对方在指定配置时间(此项可配置)内未得到回应,则暂时认为对方已离线,也就是所谓的”主观认为宕机” (主观:是每个成员都具有的独自的而且可能相同也可能不同的意识),英文名称:Subjective Down,简称SDOWN

有主观宕机,对应的有客观宕机。当“哨兵群”中的多数Sentinel进程在对Master主服务器做出SDOWN 的判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,这种方式就是“客观宕机”(客观:是不依赖于某种意识而已经实际存在的一切事物),英文名称是:Objectively Down, 简称 ODOWN

通过一定的vote算法,从剩下的slave从服务器节点中,选一台提升为Master服务器节点,然后自动修改相关配置,并开启故障转移(failover)

Sentinel 机制可以解决master和slave角色的自动切换问题,但单个Master 的性能瓶颈问题无法解决,类似于MySQL中的MHA功能

Redis Sentinel中的Sentinel节点个数应该为大于等于3且最好为奇数

客户端初始化时连接的是Sentinel节点集合,不再是具体的Redis节点,但Sentinel只是配置中心不是代理。

Redis Sentinel 节点与普通redis 没有区别,要实现读写分离依赖于客户端程序

redis 3.0 之前版本中,生产环境一般使用哨兵模式,但3.0后推出redis cluster功能后,可以支持更大规模的生产环境

sentinel 中的三个定时任务
1 每10秒每个sentinel对master和slave执行info,发现slave节点,确认主从关系
2 每2秒每个sentinel通过master节点的channel交换信息(pub/sub),通过sentinel__:hello频道交互,交互对节点的“看法”和自身信息
3 每1秒每个sentinel对其他sentinel和redis执行ping

实现哨兵
在这里插入图片描述

部署步骤

1、准备主从复制架构

#所有节点都安装redis在3台机器上
[root@c8-8 ~]# yum -y install redis

#更改配置文件在3台机器上
[root@c8-8 ~]# sed -i -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e 's/^# masterauth .*/masterauth 123456/' -e 's/^# requirepass .*/requirepass 123456/' /etc/redis.conf

#查看配置文件
[root@c8-8 ~]# grep  '^[^#]' /etc/redis.conf
bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
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
masterauth 123456
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
requirepass 123456
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@c8-18 ~]# echo "replicaof 10.0.0.8 6379" >> /etc/redis.conf
[root@c8-28 ~]# echo "replicaof 10.0.0.8 6379" >> /etc/redis.conf

#同时启动redis服务3台机器
[root@c8-8 ~]# systemctl enable --now redis

#主节点上查询
[root@c8-8 ~]# systemctl enable --now redis
[root@c8-8 ~]# redis-cli -a 123456 info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:master
connected_slaves:2
slave0:ip=10.0.0.28,port=6379,state=online,offset=112,lag=1
slave1:ip=10.0.0.18,port=6379,state=online,offset=112,lag=1
master_replid:e509c5612083760d3a2507bb0b3a944cbccbfb12
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:112
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:112

#在主节点验证同步
[root@c8-8 ~]# redis-cli -a 123456 set name lee
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
OK

#在从节点查看信息同步
[root@c8-18 ~]# redis-cli -a 123456 get name
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
"lee"

[root@c8-8 ~]# redis-cli -a 123456 info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:slave
master_host:10.0.0.8
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:534
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:e509c5612083760d3a2507bb0b3a944cbccbfb12
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:534
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:534
[root@centos8 ~]# redis-cli -a 123456 info keyspace
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Keyspace
db0:keys=1,expires=0,avg_ttl=0


#查看从节点信息18,28
[root@c8-18 ~]# redis-cli -a 123456 info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:slave
master_host:10.0.0.8
master_port:6379
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:408
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:e509c5612083760d3a2507bb0b3a944cbccbfb12
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:408
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:408


[root@c8-28 ~]# redis-cli -a 123456 info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:slave
master_host:10.0.0.8
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:534
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:e509c5612083760d3a2507bb0b3a944cbccbfb12
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:534
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:534

2、配置哨兵

# 3个哨兵服务器的配置都如下
[root@c8-8 ~]#grep -vE "^#|^$" /etc/redis-sentinel.conf 
port 26379
daemonize no
pidfile "/var/run/redis-sentinel.pid"
logfile "/var/log/redis/sentinel.log"
dir "/tmp"
sentinel monitor mymaster 10.0.0.8 6379 2   #修改此行
sentinel auth-pass mymaster 123456 #增加此行
sentinel down-after-milliseconds mymaster 3000   #修改此行
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
#以下内容自动生成,不需要修改
sentinel myid 50547f34ed71fd48c197924969937e738a39975b  #此行自动生成必须唯一,修改此值需重启redis和sentinel服务
.....
# Generated by CONFIG REWRITE
protected-mode no
supervised systemd
sentinel leader-epoch mymaster 0
sentinel known-replica mymaster 10.0.0.28 6379
sentinel known-replica mymaster 10.0.0.18 6379
sentinel current-epoch 0

[root@c8-8 ~]#scp /etc/redis-sentinel.conf redis-slave1:/etc/
[root@c8-8 ~]#scp /etc/redis-sentinel.conf redis-slave2:/etc/

3、启动哨兵

#确保每个哨兵主机myid 不同
[root@c8-18 ~]#vim /etc/redis-sentinel.conf
sentinel myid 50547f34ed71fd48c197924969937e738a39975c 
[root@c8-28 ~]#vim /etc/redis-sentinel.conf
sentinel myid 50547f34ed71fd48c197924969937e738a39975d 

[root@c8-8 ~]#systemctl enable --now redis-sentinel.service
[root@c8-18 ~]#systemctl enable --now redis-sentinel.service
[root@c8-28 ~]#systemctl enable --now redis-sentinel.service

4、验证哨兵端口

[root@redis-master ~]#ss -ntl
State   Recv-Q   Send-Q   Local Address:Port     Peer Address:Port 
LISTEN   0         128         0.0.0.0:22            0.0.0.0:*     
LISTEN   0         128         0.0.0.0:26379         0.0.0.0:*     
LISTEN   0         128         0.0.0.0:6379          0.0.0.0:*     
LISTEN   0         128           [::]:22               [::]:*     
LISTEN   0         128           [::]:26379            [::]:*     
LISTEN   0         128           [::]:6379             [::]:*

5、查看哨兵日志

#查看哨兵日志master
[root@c8-8 ~]# tail -f /var/log/redis/sentinel.log
9876:X 25 Oct 2020 21:31:58.520 # Configuration loaded
9876:X 25 Oct 2020 21:31:58.520 * supervised by systemd, will signal readiness
9876:X 25 Oct 2020 21:31:58.521 * Running mode=sentinel, port=26379.
9876:X 25 Oct 2020 21:31:58.521 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
9876:X 25 Oct 2020 21:31:58.523 # Sentinel ID is 6bb1ddee9aa2c9c35dff1030cbc2bfb9b2361c26
9876:X 25 Oct 2020 21:31:58.523 # +monitor master mymaster 10.0.0.8 6379 quorum 2
9876:X 25 Oct 2020 21:31:58.524 * +slave slave 10.0.0.28:6379 10.0.0.28 6379 @ mymaster 10.0.0.8 6379
9876:X 25 Oct 2020 21:31:58.526 * +slave slave 10.0.0.18:6379 10.0.0.18 6379 @ mymaster 10.0.0.8 6379
9876:X 25 Oct 2020 21:32:14.053 * +sentinel sentinel 02874bd9b16e9b6adb7d46acb4409ca0a8c9ba4b 10.0.0.18 26379 @ mymaster 10.0.0.8 6379
9876:X 25 Oct 2020 21:32:14.070 * +sentinel sentinel 76b7e9e45ba309e9f1c4cf35bf087dbf03bbd5e7 10.0.0.28 26379 @ mymaster 10.0.0.8 6379

#查看哨兵日志slave
[root@c8-18 ~]# tail -f /var/log/redis/sentinel.log 
9870:X 25 Oct 2020 21:32:11.999 # Configuration loaded
9870:X 25 Oct 2020 21:32:11.999 * supervised by systemd, will signal readiness
9870:X 25 Oct 2020 21:32:12.000 * Running mode=sentinel, port=26379.
9870:X 25 Oct 2020 21:32:12.000 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
9870:X 25 Oct 2020 21:32:12.002 # Sentinel ID is 76b7e9e45ba309e9f1c4cf35bf087dbf03bbd5e7
9870:X 25 Oct 2020 21:32:12.002 # +monitor master mymaster 10.0.0.8 6379 quorum 2
9870:X 25 Oct 2020 21:32:12.004 * +slave slave 10.0.0.28:6379 10.0.0.28 6379 @ mymaster 10.0.0.8 6379
9870:X 25 Oct 2020 21:32:12.004 * +slave slave 10.0.0.18:6379 10.0.0.18 6379 @ mymaster 10.0.0.8 6379
9870:X 25 Oct 2020 21:32:12.878 * +sentinel sentinel 6bb1ddee9aa2c9c35dff1030cbc2bfb9b2361c26 10.0.0.8 26379 @ mymaster 10.0.0.8 6379
9870:X 25 Oct 2020 21:32:14.051 * +sentinel sentinel 02874bd9b16e9b6adb7d46acb4409ca0a8c9ba4b 10.0.0.18 26379 @ mymaster 10.0.0.8 6379

6、当前sentinel 状态

[root@c8-8 ~]# redis-cli -p 26379
127.0.0.1:26379> INFO sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
#两个slave,三个sentinel服务器,如果sentinels值不符合,检查myid可能冲突
master0:name=mymaster,status=ok,address=10.0.0.8:6379,slaves=2,sentinels=3 

4、redis cluster集群创建和使用

一、利用原生命令动手部署redis cluster

环境

集群节点
10.0.0.8
10.0.0.18
10.0.0.28
10.0.0.38
10.0.0.48
10.0.0.58

预备节点
10.0.0.68
10.0.0.78

1、在所有节点安装redis,并配置开启cluster 功能

[root@c8-8 ~]# yum install redis -y
[root@c8-8 ~]# sed -i.bak -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e '/masterauth/a masterauth 123456' -e '/# requirepass/a requirepass 123456' -e  '/# cluster-enabled yes/a cluster-enabled yes' -e '/# cluster-config-file nodes-6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-require-full-coverage yes/c cluster-require-full-coverage no' /etc/redis.conf
[root@c8-8 ~]# systemctl enable --now redis

2、各个节点执行meet,实现所有节点的相互通信

[root@c8-8 ~]# redis-cli -a 123456 --no-auth-warning cluster meet 10.0.0.18 6379
[root@c8-8 ~]# redis-cli -a 123456 --no-auth-warning cluster meet 10.0.0.28 6379
[root@c8-8 ~]# redis-cli -a 123456 --no-auth-warning cluster meet 10.0.0.38 6379
[root@c8-8 ~]# redis-cli -a 123456 --no-auth-warning cluster meet 10.0.0.48 6379
[root@c8-8 ~]# redis-cli -a 123456 --no-auth-warning cluster meet 10.0.0.58 6379

#查看各节点之间相互通信
[root@c8-8 ~]# redis-cli -a 123456 --no-auth-warning cluster nodes
e3670c5e6a86aa3af3b23864113868542828c0cc 10.0.0.58:6379@16379 master - 0 1603615221580 7 connected
fc1db3305b9c6aa1d63fc0f9464b91917ffe4256 10.0.0.48:6379@16379 master - 0 1603615220567 0 connected
17b4d754609ce2498597d1971e3272f8cca66c63 10.0.0.28:6379@16379 master - 0 1603615223605 2 connected
c4f4898a961eb7bb334b81f516b28c706940804b 10.0.0.38:6379@16379 master - 0 1603615221000 4 connected
a435aee2df4ba0c74e61d5db4caac7da7338f199 10.0.0.8:6379@16379 myself,master - 0 1603615220000 3 connected
98a0857729baabb3a6617c8d17609f759197cfe1 10.0.0.18:6379@16379 master - 0 1603615222592 1 connected


#查看节点当前状态
[root@c8-8 ~]# redis-cli -a 123456 --no-auth-warning cluster info
cluster_state:fail
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:0
cluster_current_epoch:7
cluster_my_epoch:3
cluster_stats_messages_ping_sent:249
cluster_stats_messages_pong_sent:266
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:520
cluster_stats_messages_ping_received:266
cluster_stats_messages_pong_received:254
cluster_stats_messages_received:520

3、为各个master 节点指派槽位范围

#节点指派槽位只能逐个指派
[root@c8-8 ~]# redis-cli -h 10.0.0.8 -p 6379 -a 123456 --no-auth-warning cluster addslots 0

#编写指派槽位节点脚本
[root@c8-8 ~]# cat addslot.sh 
#!/bin/bash
#
#*************************************************
#Author:     dawn
#Date:       2020-10-25
#FileName:   addslot.sh
#URL:        https://blog.csdn.net/xiao_dan_
#Desc:       The test script
#Copyright (C):2020 All rights reserved
#*************************************************

host=$1
port=$2
start=$3
end=$4
pass=123456

for slot in `seq ${start} ${end}`;do
	echo slot:${slot}
	redis-cli -h ${host} -p ${port} -a ${pass} --no-auth-warning cluster addslots ${slot}
done

#为三个master分配槽位,共16364/3=5,461.333333333333,平均每个master分配5,461个槽位
[root@centos8 ~]# bash addslot.sh 10.0.0.8 6379 0 5461
[root@centos8 ~]# bash addslot.sh 10.0.0.18 6379 5462 10922
[root@centos8 ~]# bash addslot.sh 10.0.0.28 6379 10923 16383

#槽位分配完毕,查看节点状态
[root@c8-8 ~]# redis-cli -a 123456 --no-auth-warning cluster nodes
9995234554ce8dfa2b15352283a3e1fbbbb67882 10.0.0.38:6379@16379 master - 0 1603608115383 3 connected
7f627a2b90d0e573f030c010b0cf66663a1c2e0b 10.0.0.28:6379@16379 master - 0 1603608114375 2 connected
e3670c5e6a86aa3af3b23864113868542828c0cc 10.0.0.58:6379@16379 master - 0 1603608117405 0 connected
a17c59072597665ed51f92665fabb210d0044c09 10.0.0.18:6379@16379 master - 0 1603608112348 5 connected 5462-16383
4bd85545cd9bce4b01acf75f2cbbbf133a23a66c 10.0.0.48:6379@16379 master - 0 1603608116395 4 connected
9110b68a952eba1d7907cc230e5311ebc4612ef3 10.0.0.8:6379@16379 myself,master - 0 1603552880000 1 connected 0-5461

#槽位分配完毕,查看节点信息
[root@c8-8 ~]# redis-cli -a 123456 --no-auth-warning cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:2
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1696
cluster_stats_messages_pong_sent:1724
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:3425
cluster_stats_messages_ping_received:1724
cluster_stats_messages_pong_received:1701
cluster_stats_messages_received:3425

4、指定各个节点的主从关系

[root@c8-8 ~]# redis-cli -h 10.0.0.38 -a 123456 --no-auth-warning cluster replicate a435aee2df4ba0c74e61d5db4caac7da7338f199
[root@c8-8 ~]# redis-cli -h 10.0.0.48 -a 123456 --no-auth-warning cluster replicate 98a0857729baabb3a6617c8d17609f759197cfe1
[root@c8-8 ~]# redis-cli -h 10.0.0.58 -a 123456 --no-auth-warning cluster replicate 17b4d754609ce2498597d1971e3272f8cca66c63

#查看节点主从信息
[root@c8-8 ~]# redis-cli -a 123456 --no-auth-warning cluster nodes
e3670c5e6a86aa3af3b23864113868542828c0cc 10.0.0.58:6379@16379 slave 17b4d754609ce2498597d1971e3272f8cca66c63 0 1603615993154 7 connected
fc1db3305b9c6aa1d63fc0f9464b91917ffe4256 10.0.0.48:6379@16379 slave 98a0857729baabb3a6617c8d17609f759197cfe1 0 1603615996182 1 connected
17b4d754609ce2498597d1971e3272f8cca66c63 10.0.0.28:6379@16379 master - 0 1603615994163 2 connected 10923-16383
c4f4898a961eb7bb334b81f516b28c706940804b 10.0.0.38:6379@16379 slave a435aee2df4ba0c74e61d5db4caac7da7338f199 0 1603615995171 4 connected
a435aee2df4ba0c74e61d5db4caac7da7338f199 10.0.0.8:6379@16379 myself,master - 0 1603615989000 3 connected 0-5461
98a0857729baabb3a6617c8d17609f759197cfe1 10.0.0.18:6379@16379 master - 0 1603615992143 1 connected 5462-10922

[root@c8-8 ~]# redis-cli -a 123456 --no-auth-warning cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:7
cluster_my_epoch:3
cluster_stats_messages_ping_sent:1231
cluster_stats_messages_pong_sent:1279
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:2515
cluster_stats_messages_ping_received:1279
cluster_stats_messages_pong_received:1236
cluster_stats_messages_update_received:372
cluster_stats_messages_received:2887

# 主:10.0.0.8 从:10.0.0.38
[root@c8-8 ~]# redis-cli -h 10.0.0.8 -a 123456 --no-auth-warning info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.0.38,port=6379,state=online,offset=378,lag=1
master_replid:55e74fa653973fa49da834838f9b6eb54a1e88e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:378
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:378

# 主:10.0.0.18 从:10.0.0.48
[root@c8-8 ~]# redis-cli -h 10.0.0.18 -a 123456 --no-auth-warning info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.0.48,port=6379,state=online,offset=336,lag=1
master_replid:b461dad8e094dcf0755712a4058bcfebe431bb5a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:336
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:336

# 主:10.0.0.28 从:10.0.0.58
[root@c8-8 ~]# redis-cli -h 10.0.0.28 -a 123456 --no-auth-warning info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.0.58,port=6379,state=online,offset=294,lag=1
master_replid:986e5006a49e61da133ccb2a4287519e7b490914
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:294
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:294

# 查看主从关系及槽位信息
[root@c8-8 ~]# redis-cli -h 10.0.0.8 -a 123456 --no-auth-warning cluster slots
1) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "10.0.0.28"
      2) (integer) 6379
      3) "17b4d754609ce2498597d1971e3272f8cca66c63"
   4) 1) "10.0.0.58"
      2) (integer) 6379
      3) "e3670c5e6a86aa3af3b23864113868542828c0cc"
2) 1) (integer) 0
   2) (integer) 5461
   3) 1) "10.0.0.8"
      2) (integer) 6379
      3) "a435aee2df4ba0c74e61d5db4caac7da7338f199"
   4) 1) "10.0.0.38"
      2) (integer) 6379
      3) "c4f4898a961eb7bb334b81f516b28c706940804b"
3) 1) (integer) 5462
   2) (integer) 10922
   3) 1) "10.0.0.18"
      2) (integer) 6379
      3) "98a0857729baabb3a6617c8d17609f759197cfe1"
   4) 1) "10.0.0.48"
      2) (integer) 6379
      3) "fc1db3305b9c6aa1d63fc0f9464b91917ffe4256"

5、验证redis cluster 访问

# -c 以集群的方式访问
[root@c8-8 ~]# redis-cli -c 10.0.0.8 -a 123456 --no-auth-warning set name lee
[root@c8-8 ~]# redis-cli -c 10.0.0.18 -a 123456 --no-auth-warning get name
"lee"
[root@c8-8 ~]# redis-cli -c 10.0.0.48 -a 123456 --no-auth-warning set name
"lee"


[root@c8-8 ~]# redis-cli -h 10.0.0.8 -a 123456 --no-auth-warning get name
(error) MOVED 5798 10.0.0.18:6379
[root@c8-8 ~]# redis-cli -h 10.0.0.18 -a 123456 --no-auth-warning get name
"lee"
[root@c8-8 ~]# redis-cli -h 10.0.0.28 -a 123456 --no-auth-warning get name
(error) MOVED 5798 10.0.0.18:6379

二、基于redis 5的redis cluster 部署

环境准备

1. 每个redis 节点采用相同的硬件配置、相同的密码、相同的redis 版本
2. 所有redis 服务器必须没有任何数据
3. 主机6 台,IP 地址如下:
10.0.0.8
10.0.0.18
10.0.0.28
10.0.0.38
10.0.0.48
10.0.0.58

部署步骤

1、给所有的主机安装redis 并修改redis 配置,必须开启cluster 功能的参数

[root@c8-8 ~]# yum install redis -y

#可手动修改配置文件
[root@redis-node1 ~]vim /etc/redis.conf
bind 0.0.0.0
masterauth 123456      #建议配置,否则后期的master 和slave 主从复制无法成功,还需再配置
requirepass 123456
cluster-enabled yes    #取消此行注释,必须开启集群,开启后redis 进程会有cluster 显示
cluster-config-file nodes-6379.conf    #取消此行注释,此为集群状态文件,记录主从关系及slot 范围信息,由redis cluster 集群自动创建和维护
cluster-require-full-coverage no    #默认值为yes,设为no 可以防止一个节点不可用导致整个cluster不可用

#也可同过命令sed 命令,批量修改配置文件
[root@c8-8 ~]# sed -i.bak -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e '/masterauth/a masterauth 123456' -e '/# requirepass/a requirepass 123456' -e '/# cluster-enabled yes/a cluster-enabled yes' -e '/# cluster-config-file nodes-6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-require-full-coverage yes/c cluster-require-full-coverage no' /etc/redis.conf

#启动redis 服务
[root@c8-8 ~]# systemctl enable --now redis

2、 验证所有主机redis 服务状态

#开启了16379 的cluster 的端口,实际的端口=redis port + 10000
[root@c8-8 ~]#  ss -ntl
State   Recv-Q   Send-Q     Local Address:Port      Peer Address:Port  
LISTEN  0        128              0.0.0.0:16379          0.0.0.0:*     
LISTEN  0        128              0.0.0.0:6379           0.0.0.0:*     
LISTEN  0        128              0.0.0.0:111            0.0.0.0:*     
LISTEN  0        128              0.0.0.0:22             0.0.0.0:*     
LISTEN  0        128                 [::]:111               [::]:*     
LISTEN  0        128                 [::]:22                [::]:* 

#注意:进程必须有[cluster]状态
[root@c8-8 ~]# ps -ef|grep redis
redis       1526       1  0 19:32 ?        00:00:00 /usr/bin/redis-server 0.0.0.0:6379 [cluster]
root        1539    1034  0 19:35 pts/0    00:00:00 grep --color=auto redis

3、 创建集群

#redis-cli --cluster-replicas 1 表示每个master 对应一个slave 节点
[root@c8-8 ~]# redis-cli -a 123456 --cluster create 10.0.0.8:6379 10.0.0.18:6379 10.0.0.28:6379 10.0.0.38:6379 10.0.0.48:6379 10.0.0.58:6379 --cluster-replicas 1
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# 在6 个节点中分配槽位
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460			#master[0] 分配到的槽位
Master[1] -> Slots 5461 - 10922		#master[0] 分配到的槽位
Master[2] -> Slots 10923 - 16383	#master[0] 分配到的槽位
#将10.0.0.38:6379 设置为10.0.0.8:6379 的从节点
Adding replica 10.0.0.38:6379 to 10.0.0.8:6379
Adding replica 10.0.0.48:6379 to 10.0.0.18:6379
Adding replica 10.0.0.58:6379 to 10.0.0.28:6379
M: 4f194e94c78ee1e8a07421961cef91eab0ab3174 10.0.0.8:6379 #M:master
   slots:[0-5460] (5461 slots) master	#当前master槽位起始位和结束位
M: 2e3f19dec75081754424e53c33ac95803510070b 10.0.0.18:6379
   slots:[5461-10922] (5462 slots) master
M: c3af6cd77c72e5d2fecb2ecba9b49fd669c2de33 10.0.0.28:6379
   slots:[10923-16383] (5461 slots) master
S: e1281e6cd1551b66253aae46e1d6ee5a70a49ab8 10.0.0.38:6379 #S:slave
   replicates 4f194e94c78ee1e8a07421961cef91eab0ab3174
S: 1bb63f3c4e40d3f31ad99d18cbc168850082dcef 10.0.0.48:6379
   replicates 2e3f19dec75081754424e53c33ac95803510070b
S: 4aeb22f9a381f06e5361bc8b9be4f7e7f486e6d6 10.0.0.58:6379
   replicates c3af6cd77c72e5d2fecb2ecba9b49fd669c2de33
Can I set the above configuration? (type 'yes' to accept): yes #输入yes自动创建集群
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.....
>>> Performing Cluster Check (using node 10.0.0.8:6379)
M: 4f194e94c78ee1e8a07421961cef91eab0ab3174 10.0.0.8:6379
   slots:[0-5460] (5461 slots) master	#已经分配的槽位
   1 additional replica(s)	#分配了一个slave
S: 4aeb22f9a381f06e5361bc8b9be4f7e7f486e6d6 10.0.0.58:6379
   slots: (0 slots) slave	#slave 没有分配槽位
   replicates c3af6cd77c72e5d2fecb2ecba9b49fd669c2de33
S: e1281e6cd1551b66253aae46e1d6ee5a70a49ab8 10.0.0.38:6379
   slots: (0 slots) slave
   replicates 4f194e94c78ee1e8a07421961cef91eab0ab3174
M: c3af6cd77c72e5d2fecb2ecba9b49fd669c2de33 10.0.0.28:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 1bb63f3c4e40d3f31ad99d18cbc168850082dcef 10.0.0.48:6379
   slots: (0 slots) slave
   replicates 2e3f19dec75081754424e53c33ac95803510070b
M: 2e3f19dec75081754424e53c33ac95803510070b 10.0.0.18:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.	#所有节点槽位分配完成
>>> Check for open slots...	#检查打开的槽位
>>> Check slots coverage...	#检查插槽覆盖范围
[OK] All 16384 slots covered.	#所有槽位(16384个)分配完成

#系统自动分配3组master/slave
master:10.0.0.8 <---> slave:10.0.0.38
master:10.0.0.18 <---> slave:10.0.0.48
master:10.0.0.28 <---> slave:10.0.0.58

4、查看主从状态

[root@c8-8 ~]# redis-cli -a 123456 -c info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.0.38,port=6379,state=online,offset=1666,lag=0
master_replid:1149d9fbe504d8de70437b7d78353de81bd90a25
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1666
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1666

[root@c8-18 ~]# redis-cli -a 123456 -c info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.0.48,port=6379,state=online,offset=1666,lag=0
master_replid:2defc8b8f71593b1653f08c514c46e0c25f25fde
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1666
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1666

[root@c8-28 ~]# redis-cli -a 123456 -c info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.0.58,port=6379,state=online,offset=1666,lag=0
master_replid:f6b5051f437afde5a2fc0981974a246965cf1c01
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1666
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1666

[root@c8-38 ~]# redis-cli -a 123456 -c info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:slave
master_host:10.0.0.8
master_port:6379
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:1666
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:1149d9fbe504d8de70437b7d78353de81bd90a25
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1666
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1666

[root@c8-48 ~]# redis-cli -a 123456 -c info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:slave
master_host:10.0.0.18
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:1666
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:2defc8b8f71593b1653f08c514c46e0c25f25fde
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1666
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1666

[root@c8-58 ~]# redis-cli -a 123456 -c info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:slave
master_host:10.0.0.28
master_port:6379
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:1666
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:f6b5051f437afde5a2fc0981974a246965cf1c01
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1666
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1666

[root@c8-8 ~]# redis-cli -a 123456 cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
4aeb22f9a381f06e5361bc8b9be4f7e7f486e6d6 10.0.0.58:6379@16379 slave c3af6cd77c72e5d2fecb2ecba9b49fd669c2de33 0 1603627468756 6 connected
e1281e6cd1551b66253aae46e1d6ee5a70a49ab8 10.0.0.38:6379@16379 slave 4f194e94c78ee1e8a07421961cef91eab0ab3174 0 1603627465732 4 connected
c3af6cd77c72e5d2fecb2ecba9b49fd669c2de33 10.0.0.28:6379@16379 master - 0 1603627466000 3 connected 10923-16383
1bb63f3c4e40d3f31ad99d18cbc168850082dcef 10.0.0.48:6379@16379 slave 2e3f19dec75081754424e53c33ac95803510070b 0 1603627466000 5 connected
2e3f19dec75081754424e53c33ac95803510070b 10.0.0.18:6379@16379 master - 0 1603627466741 2 connected 5461-10922
4f194e94c78ee1e8a07421961cef91eab0ab3174 10.0.0.8:6379@16379 myself,master - 0 1603627467000 1 connected 0-5460

5、验证集群状态

[root@c8-8 ~]# redis-cli -a 123456 cluster info
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:3718
cluster_stats_messages_pong_sent:3476
cluster_stats_messages_sent:7194
cluster_stats_messages_ping_received:3471
cluster_stats_messages_pong_received:3718
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:7194

#查看任意节点的集群状态
[root@c8-8 ~]# redis-cli -a 123456 --cluster info 10.0.0.38:6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
10.0.0.18:6379 (2e3f19de...) -> 0 keys | 5462 slots | 1 slaves.
10.0.0.8:6379 (4f194e94...) -> 0 keys | 5461 slots | 1 slaves.
10.0.0.28:6379 (c3af6cd7...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.

5、查看集群node 对应关系

[root@c8-8 ~]# redis-cli -a 123456 cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
4aeb22f9a381f06e5361bc8b9be4f7e7f486e6d6 10.0.0.58:6379@16379 slave c3af6cd77c72e5d2fecb2ecba9b49fd669c2de33 0 1603629952699 6 connected
e1281e6cd1551b66253aae46e1d6ee5a70a49ab8 10.0.0.38:6379@16379 slave 4f194e94c78ee1e8a07421961cef91eab0ab3174 0 1603629952000 4 connected
c3af6cd77c72e5d2fecb2ecba9b49fd669c2de33 10.0.0.28:6379@16379 master - 0 1603629954000 3 connected 10923-16383
1bb63f3c4e40d3f31ad99d18cbc168850082dcef 10.0.0.48:6379@16379 slave 2e3f19dec75081754424e53c33ac95803510070b 0 1603629955000 5 connected
2e3f19dec75081754424e53c33ac95803510070b 10.0.0.18:6379@16379 master - 0 1603629955733 2 connected 5461-10922
4f194e94c78ee1e8a07421961cef91eab0ab3174 10.0.0.8:6379@16379 myself,master - 0 1603629953000 1 connected 0-5460

[root@c8-8 ~]# redis-cli -a 123456 --cluster check 10.0.0.8:6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
10.0.0.8:6379 (4f194e94...) -> 0 keys | 5461 slots | 1 slaves.
10.0.0.28:6379 (c3af6cd7...) -> 0 keys | 5461 slots | 1 slaves.
10.0.0.18:6379 (2e3f19de...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 10.0.0.8:6379)
M: 4f194e94c78ee1e8a07421961cef91eab0ab3174 10.0.0.8:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 4aeb22f9a381f06e5361bc8b9be4f7e7f486e6d6 10.0.0.58:6379
   slots: (0 slots) slave
   replicates c3af6cd77c72e5d2fecb2ecba9b49fd669c2de33
S: e1281e6cd1551b66253aae46e1d6ee5a70a49ab8 10.0.0.38:6379
   slots: (0 slots) slave
   replicates 4f194e94c78ee1e8a07421961cef91eab0ab3174
M: c3af6cd77c72e5d2fecb2ecba9b49fd669c2de33 10.0.0.28:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 1bb63f3c4e40d3f31ad99d18cbc168850082dcef 10.0.0.48:6379
   slots: (0 slots) slave
   replicates 2e3f19dec75081754424e53c33ac95803510070b
M: 2e3f19dec75081754424e53c33ac95803510070b 10.0.0.18:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

7.1验证集群写入key

[root@c8-8 ~]# redis-cli -a 123456 -h 10.0.0.8 set name lee
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
(error) MOVED 5798 10.0.0.18:6379
[root@c8-8 ~]# redis-cli -a 123456 -h 10.0.0.18 set name lee
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
OK
[root@c8-8 ~]# redis-cli -a 123456 -h 10.0.0.18 get name
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
"lee"
[root@c8-8 ~]# redis-cli -a 123456 -h 10.0.0.48 keys "*"
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
1) "name"
[root@c8-8 ~]# redis-cli -a 123456 -h 10.0.0.48 get name
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
(error) MOVED 5798 10.0.0.18:6379

7.2redis cluster 计算key 所属的slot

[root@c8-8 ~]# redis-cli -a 123456 --no-auth-warning cluster nodes
4aeb22f9a381f06e5361bc8b9be4f7e7f486e6d6 10.0.0.58:6379@16379 slave c3af6cd77c72e5d2fecb2ecba9b49fd669c2de33 0 1603630976000 6 connected
e1281e6cd1551b66253aae46e1d6ee5a70a49ab8 10.0.0.38:6379@16379 slave 4f194e94c78ee1e8a07421961cef91eab0ab3174 0 1603630975000 4 connected
c3af6cd77c72e5d2fecb2ecba9b49fd669c2de33 10.0.0.28:6379@16379 master - 0 1603630977002 3 connected 10923-16383
1bb63f3c4e40d3f31ad99d18cbc168850082dcef 10.0.0.48:6379@16379 slave 2e3f19dec75081754424e53c33ac95803510070b 0 1603630978011 5 connected
2e3f19dec75081754424e53c33ac95803510070b 10.0.0.18:6379@16379 master - 0 1603630976000 2 connected 5461-10922
4f194e94c78ee1e8a07421961cef91eab0ab3174 10.0.0.8:6379@16379 myself,master - 0 1603630973000 1 connected 0-5460

#计算得到hello 对应的slot
[root@c8-8 ~]# redis-cli -h 10.0.0.8 -a 123456 --no-auth-warning cluster keyslot hello
(integer) 866
[root@c8-8 ~]# redis-cli -h 10.0.0.8 -a 123456 --no-auth-warning cluster set hello lee
(error) ERR Unknown subcommand or wrong number of arguments for 'set'. Try CLUSTER HELP.
[root@c8-8 ~]# redis-cli -h 10.0.0.8 -a 123456 --no-auth-warning set hello lee
OK
[root@c8-8 ~]# redis-cli -h 10.0.0.8 -a 123456 --no-auth-warning cluster keyslot name
(integer) 5798
[root@c8-8 ~]# redis-cli -h 10.0.0.8 -a 123456 --no-auth-warning set name dawn
(error) MOVED 5798 10.0.0.18:6379
[root@c8-8 ~]# redis-cli -h 10.0.0.18 -a 123456 --no-auth-warning set name dawn
OK
[root@c8-8 ~]# redis-cli -h 10.0.0.18 -a 123456 --no-auth-warning get name
"dawn"

#使用选项-c 以集群模式连接
[root@c8-8 ~]# redis-cli -c -h 10.0.0.8 -a 123456 --no-auth-warning
10.0.0.8:6379> cluster keyslot linux
(integer) 12299
10.0.0.8:6379> set linux love
-> Redirected to slot [12299] located at 10.0.0.28:6379
OK
10.0.0.28:6379> get linux
"love"
10.0.0.28:6379> exit
[root@c8-8 ~]# redis-cli -h 10.0.0.28 -a 123456 --no-auth-warning get linux
"love"

8、使用python脚本实现RedisCluster集群写入

[root@c8-8 ~]# yum install python3 -y
[root@c8-8 ~]# pip3 install redis-py-cluster
[root@c8-8 ~]# vim redis_cluster_test.py
[root@c8-8 ~]# cat redis_cluster_test.py 
#!/usr/bin/env python3
from rediscluster import RedisCluster
startup_nodes = [
    {"host":"10.0.0.8", "port":6379},
    {"host":"10.0.0.18", "port":6379},
    {"host":"10.0.0.28", "port":6379},
    {"host":"10.0.0.38", "port":6379},
    {"host":"10.0.0.48", "port":6379},
    {"host":"10.0.0.58", "port":6379}
]

redis_conn = RedisCluster(startup_nodes=startup_nodes,password='123456',decode_responses=True)

for i in range(0,10000):
    redis_conn.set('key'+str(i),'value'+str(i))
    print('key'+str(i)+':',redis_conn.get('key'+str(i)))


[root@c8-8 ~]# chmod +x redis_cluster_test.py
[root@c8-8 ~]# ./redis_cluster_test.py
[root@c8-8 ~]#redis-cli -a 123456 -h 10.0.0.8
Warning: Using a password with '-a' or '-u' option on the command line interface
may not be safe.
10.0.0.8:6379> DBSIZE
(integer) 3331
10.0.0.8:6379> GET key1
(error) MOVED 9189 10.0.0.18:6379
10.0.0.8:6379> GET key2
"value2"
10.0.0.8:6379> GET key3
"value3"
10.0.0.8:6379> KEYS *
...省略...
3330) "key2491"
3331) "key4496"
3332) "key156"
10.0.0.8:6379> exit

9、模拟master 故障,对应的slave 节点自动提升为新master

#模拟c8-18 节点出故障,需要对应的数秒故障转移时间
[root@c8-18 ~]# redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> shutdown
not connected> exit
[root@c8-18 ~]# ss -ntl
State    Recv-Q   Send-Q     Local Address:Port     Peer Address:Port  
LISTEN   0        128              0.0.0.0:111           0.0.0.0:*     
LISTEN   0        128              0.0.0.0:22            0.0.0.0:*     
LISTEN   0        128                 [::]:111              [::]:*     
LISTEN   0        128                 [::]:22               [::]:* 

[root@c8-18 ~]# redis-cli -a 123456 --cluster info 10.0.0.8:6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
Could not connect to Redis at 10.0.0.18:6379: Connection refused
10.0.0.8:6379 (4f194e94...) -> 3332 keys | 5461 slots | 1 slaves.
10.0.0.28:6379 (c3af6cd7...) -> 3330 keys | 5461 slots | 1 slaves.
10.0.0.48:6379 (1bb63f3c...) -> 3341 keys | 5462 slots | 0 slaves.
[OK] 10003 keys in 3 masters.
0.61 keys per slot on average.
[root@c8-18 ~]# redis-cli -a 123456 --cluster check 10.0.0.8:6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
Could not connect to Redis at 10.0.0.18:6379: Connection refused
10.0.0.8:6379 (4f194e94...) -> 3332 keys | 5461 slots | 1 slaves.
10.0.0.28:6379 (c3af6cd7...) -> 3330 keys | 5461 slots | 1 slaves.
10.0.0.48:6379 (1bb63f3c...) -> 3341 keys | 5462 slots | 0 slaves.
[OK] 10003 keys in 3 masters.
0.61 keys per slot on average.
>>> Performing Cluster Check (using node 10.0.0.8:6379)
M: 4f194e94c78ee1e8a07421961cef91eab0ab3174 10.0.0.8:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 4aeb22f9a381f06e5361bc8b9be4f7e7f486e6d6 10.0.0.58:6379
   slots: (0 slots) slave
   replicates c3af6cd77c72e5d2fecb2ecba9b49fd669c2de33
S: e1281e6cd1551b66253aae46e1d6ee5a70a49ab8 10.0.0.38:6379
   slots: (0 slots) slave
   replicates 4f194e94c78ee1e8a07421961cef91eab0ab3174
M: c3af6cd77c72e5d2fecb2ecba9b49fd669c2de33 10.0.0.28:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 1bb63f3c4e40d3f31ad99d18cbc168850082dcef 10.0.0.48:6379
   slots:[5461-10922] (5462 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

[root@c8-18 ~]# redis-cli -a 123456 -h 10.0.0.48
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
10.0.0.48:6379> info replication
# Replication
role:master
connected_slaves:0
master_replid:755732d8184e0d9675930a7e06157fc8f1fb8db5
master_replid2:2defc8b8f71593b1653f08c514c46e0c25f25fde
master_repl_offset:145326
second_repl_offset:145327
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:145326
10.0.0.48:6379> 

#恢复故障节点c8-18
[root@c8-18 ~]# systemctl start redis

#查看自动生成的配置文件,c8-18 自动成为slave 节点
[root@c8-18 ~]# cat /var/lib/redis/nodes-6379.conf 
4f194e94c78ee1e8a07421961cef91eab0ab3174 10.0.0.8:6379@16379 master - 0 1603632897115 1 connected 0-5460
1bb63f3c4e40d3f31ad99d18cbc168850082dcef 10.0.0.48:6379@16379 master - 0 1603632897115 7 connected 5461-10922
c3af6cd77c72e5d2fecb2ecba9b49fd669c2de33 10.0.0.28:6379@16379 master - 0 1603632897115 3 connected 10923-16383
4aeb22f9a381f06e5361bc8b9be4f7e7f486e6d6 10.0.0.58:6379@16379 slave c3af6cd77c72e5d2fecb2ecba9b49fd669c2de33 0 1603632897115 6 connected
2e3f19dec75081754424e53c33ac95803510070b 10.0.0.18:6379@16379 myself,slave 1bb63f3c4e40d3f31ad99d18cbc168850082dcef 0 1603632897108 2 connected
e1281e6cd1551b66253aae46e1d6ee5a70a49ab8 10.0.0.38:6379@16379 slave 4f194e94c78ee1e8a07421961cef91eab0ab3174 0 1603632897115 1 connected
vars currentEpoch 7 lastVoteEpoch 0

[root@c8-18 ~]# redis-cli -a 123456 -h 10.0.0.48
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
10.0.0.48:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.0.18,port=6379,state=online,offset=145536,lag=1
master_replid:755732d8184e0d9675930a7e06157fc8f1fb8db5
master_replid2:2defc8b8f71593b1653f08c514c46e0c25f25fde
master_repl_offset:145536
second_repl_offset:145327
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:145536
10.0.0.48:6379> 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值