x86麒麟系统安装Redis集群
一、介绍
1.1 Redis 主从架构与哨兵模式的局限性
Redis 主从(Master-Slave)复制和哨兵(Sentinel)监控机制在处理高可用性和故障转移方面存在一定的局限性:
1. 单一主节点写入瓶颈:在主从架构中,所有的写操作必须发生在主节点上,这可能导致主节点成为性能瓶颈。
2. 数据一致性问题:如果将从节点设置为可写,会引发数据不一致的问题。
3. 故障切换能力有限:虽然哨兵可以实现自动故障切换,但在某些情况下,如网络分区或脑裂现象,可能会导致集群分裂。
1.2 Redis 集群(Cluster)架构的优势
为了克服上述限制,Redis 3.0 引入了分布式集群概念——Redis Cluster。该架构具有以下特点和优势:
•真正的分布式数据存储:Redis Cluster 将数据分布到多个主节点上,而不是每个节点都保存所有数据副本,减轻了单个节点的数据压力。
•容错能力增强:通过选举机制,确保超过半数以上的节点正常运行时,集群仍能正常工作,避免了偶数节点可能引起的脑裂问题。
•读写性能提升:允许客户端直接连接到任意节点进行读取,并且写入操作可以在多个主节点上分散进行,提高了系统的并发处理能力。
1.3 Redis Cluster 的工作原理
•槽位分配:Redis Cluster 使用16384个哈希槽来分发数据,这些槽位大致平均地分布在各个主节点上。每个键值对根据其哈希值映射到一个特定的槽位,进而决定由哪个主节点负责存储。
•主从复制:为了保证高可用性,每个主节点都有一个或多个从节点作为备份。当某个主节点发生故障时,系统会自动选择一个对应的从节点晋升为主节点,继续提供服务。
•跨主机实例部署:建议不要在同一台物理机上部署互为主从关系的节点,以防止单点故障影响整个集群的可用性。
1.4 实现三主三从 Redis Cluster 架构步骤
环境准备
•版本一致性:确保所有参与集群构建的 Redis 实例版本相同。
•硬件配置均衡:尽量使集群内各节点的硬件配置保持一致,以避免因资源分配不均而导致的压力问题。
操作指南
•启动实例:在每台主机上启动两个 Redis 实例,确保它们监听不同的端口。
•配置文件调整:修改 Redis 配置文件,确保启用了集群模式及其他必要的参数。
•创建集群:使用 redis-cli --cluster create 命令创建并初始化集群,指定所有实例的地址和端口。
•验证集群状态:通过 redis-cli -c 连接到集群中的任一节点,检查集群健康状况和服务是否正常
二、部署
2.1 安装redis
下载地址:https://download.redis.io/releases/
2.1.1 下载
[root@redis111 data]# wget https://download.redis.io/releases/redis-5.0.5.tar.gz
[root@redis111 data]# tar xf redis-5.0.5.tar.gz
2.1.2 编译安装
[root@redis111 data]# cd redis-5.0.5/
[root@redis111 redis-5.0.5]# make PREFIX=/data/redis install
2.1.3 命令介绍
[root@redis111 redis-4.0.5]# ll /data/redis/bin/
total 9112
-rwxr-xr-x 1 root root 2258912 Dec 19 10:35 redis-benchmark
-rwxr-xr-x 1 root root 28864 Dec 19 10:35 redis-check-aof
-rwxr-xr-x 1 root root 60416 Dec 19 10:35 redis-check-dump
-rwxr-xr-x 1 root root 2377184 Dec 19 10:35 redis-cli
lrwxrwxrwx 1 root root 12 Dec 19 10:35 redis-sentinel -> redis-server
-rwxr-xr-x 1 root root 4594968 Dec 19 10:35 redis-server
# redis-cli* 是 客户端启动的命令
# redis-sentinel -> redis-server* 是哨兵的启动命令
# redis-server* 是单机和集群的启动命令
2.1.4 创建目录
只有启动命令 是不可以的 我们未来所需要 存储 redis 所生成的数据 ,所以需要一个数据目录
[root@redis111 data]# mkdir /data/redis/{data,etc,logs,run}
#需要的目录 自己创建
#需要存储redis 的数据 建一个data
#需要配置文件 etc 也可以叫conf 这个无所谓
#生成日志目录log
#未来运行所需要的pid文件目录 run
2.1.5 编辑配置文件
默认没有配置文件 我们需要给他提供一个配置文件,配置文件 在刚才下载的源码包里 有个配置文件
#源码包里面的redis.conf
#给他 复制到 /data/redis/etc/
[root@redis111 data]# cp /data/redis-5.0.5/redis.conf /data/redis/etc/redis-6379.conf
[root@redis111 redis]# vim /data/redis/etc/redis-6379.conf
#修改下面参数
bind 0.0.0.0
#这里是添加本机ip
daemonize yes
#改为后台启动
pidfile /data/redis/run/redis_6379.pid
#修改pid文件目录
logfile "/data/redis/logs/redis-6379.log"
#日志文件目录
dbfilename dump-6379.rdb
#自动化的存储 给他改个名
dir /data/redis/data
#指定一个目录
requirepass 123456
#redis 密码
最终效果
[root@redis111 ~]# egrep -v "^$|^#" /data/redis/etc/redis-6379.conf
daemonize yes
pidfile /data/redis/run/redis_6379.pid
port 6379
tcp-backlog 511
bind 127.0.0.1 192.168.1.111
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/data/redis/logs/redis-6379.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump-6379.rdb
dir /data/redis/data
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
requirepass 123456
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
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-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
2.2 启动redis
2.2.1 启动前配置 三台机器都要做
[root@redis111 redis]# vim /etc/sysctl.conf
#添加下面两条内容
net.core.somaxconn = 512
vm.overcommit_memory = 1
[root@redis111 redis]# sysctl -p
#立即生效
echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@redis111 redis]# vim /etc/rc.local
#加入下面这条
echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@redis111 redis]# chmod +x /etc/rc.local
#赋权
[root@redis111 redis]# systemctl start rc-local.service
#启动
#把 /data/redis/bin 加到 $PATH 变量里面
[root@redis111 ~]# vim /etc/profile
export PATH=/apps/redis/bin:$PATH
[root@redis111 ~]# source /etc/profile
2.2.2 启动测试
[root@redis111 redis]# /data/redis/bin/redis-server /data/redis/etc/redis-6379.conf
[root@redis111 redis]# ss -tnl | grep 6379
LISTEN 0 511 192.168.1.111:6379 0.0.0.0:*
LISTEN 0 511 127.0.0.1:6379 0.0.0.0:*
#登录
#直接输入密码方式
[root@redis111 redis]# /data/redis/bin/redis-cli -h 192.168.1.111 -p 6379 -a 123456
192.168.1.111:6379> set k1 v1
OK
192.168.1.111:6379> get k1
"v1"
#进入命令行输入密码方式
[root@redis111 redis]# /data/redis/bin/redis-cli -h 192.168.1.111 -p 6379
192.168.1.111:6379> auth 123456
OK
192.168.1.111:6379> get k1
"v1"
至此单节点redis就安装完成了,如果只是使用单节点的那么就可以正常使用了
三、持久化介绍
Redis持久化概述
Redis是一个内存数据库,这意味着它的数据主要存储在内存中。然而,为了数据的安全和持久性,Redis提供了两种主要的持久化机制:RDB持久化和AOF(Append Only File)持久化。
RDB持久化
RDB持久化是Redis默认提供的持久化方式。它将内存中的数据以快照的方式写入到二进制文件中,通常这个文件以.rdb
为后缀名。这种持久化方式会在满足特定条件时自动触发,也可以手动触发。
自动触发条件
在Redis的配置文件中(通常是redis.conf
),可以找到关于RDB持久化的配置。其中,snapshotting
部分定义了触发RDB持久化的条件。例如:
save 900 1
save 300 10
save 60 10000
这三行配置定义了三个自动触发RDB持久化的条件:
- 900秒内有1次写操作:如果Redis在900秒内(即15分钟)至少有一次写操作,那么会触发RDB持久化。
- 300秒内有10次写操作:如果Redis在300秒内(即5分钟)至少有10次写操作,那么会触发RDB持久化。
- 60秒内有10000次写操作:如果Redis在60秒内(即1分钟)至少有10000次写操作,那么会触发RDB持久化。
当满足上述任一条件时,Redis会执行BGSAVE
命令来创建RDB文件。BGSAVE
命令会在后台执行,因此不会阻塞Redis的主线程。
stop-writes-on-bgsave-error no
#这是 我在执行 写入的时候 如果出现错误了 会不会继续往下写 这个我们是忽略的
#我们把他设置为no
#改为no
rdbcompression yes
#这个rdbcompression 就是你的rdb 要回被开启压缩 我们通常会开启 开启压缩的话 会把我们的数据变的更小
rdbchecksum yes
#rdbchecksum 这个是检测 对这个文件做自动检测 他是个自动检测的一个机制 默认是打开的 检测下面生成的文件
dbfilename dump-6379.rdb
#这个方式完成后 你生成的文件名称是谁 dbfilename 以.rdb 结尾 这是一种快照方式
dir /data/redis/data
#上面生成的文件存放在这个目录
手动触发
除了自动触发外,还可以通过Redis的命令行或客户端手动触发RDB持久化。例如:
SAVE
命令:这是一个同步命令,会阻塞Redis的主线程直到RDB文件创建完成。因此,在生产环境中通常不推荐使用。BGSAVE
命令:这是一个异步命令,会在后台执行RDB文件的创建过程,不会阻塞Redis的主线程。
RDB文件的存储位置
RDB文件的存储位置可以在Redis的配置文件中进行配置。默认情况下,RDB文件会存储在Redis服务器的当前工作目录下,并且文件名通常为`dump.rdb`。但是,可以通过修改配置文件中的`dir`和`dbfilename`参数来更改RDB文件的存储位置和文件名。
RDB持久化通过创建内存数据的快照并将其写入到二进制文件中来确保数据的安全性和持久性。这种持久化方式的好处是速度快,因为它是在某个时间点对整个内存数据进行一次性复制。然而,正如您所提到的,RDB持久化不是实时的,这意味着在两次快照之间如果Redis服务器发生宕机,那么这段时间内的数据修改可能会丢失。
AOF持久化
为了弥补RDB持久化的不足,Redis提供了另一种持久化机制:AOF。AOF持久化默认是关闭的,但可以通过修改Redis的配置文件来启用。
AOF持久化的工作原理是将Redis服务器接收到的每一个写命令(如SET、DEL等)以文本形式追加到一个文件中(默认是`appendonly.aof`,但可以通过配置`appendfilename`参数来更改文件名)。当Redis服务器重启时,它会重新执行AOF文件中的命令来恢复数据。
由于AOF持久化记录了所有的写命令,因此它提供了比RDB更精细的数据恢复粒度。同时,AOF持久化还是实时的,因为每次写命令都会被立即追加到AOF文件中。
然而,AOF持久化也有一些缺点。首先,由于AOF文件会随着时间的推移而不断增长,因此它可能会占用大量的磁盘空间。为了解决这个问题,Redis提供了AOF重写(rewrite)机制,该机制可以在不丢失数据的情况下减小AOF文件的大小。其次,AOF持久化的恢复速度可能比RDB慢,因为Redis需要重新执行AOF文件中的每一条命令来恢复数据。
RDB持久化
特点:
- 快照方式:RDB持久化通过创建内存数据的快照来保存数据。这意味着在某个时间点,Redis会将内存中的数据复制到一个二进制文件中。
- 性能优越:由于RDB持久化是快照方式,因此它的写入性能非常高,几乎不会对Redis的性能产生显著影响。
- 文件紧凑:RDB文件通常比AOF文件小,因为它只包含数据而不包含命令。
缺点:
- 数据丢失风险:由于RDB持久化不是实时的,如果在两次快照之间Redis服务器发生宕机,那么这段时间内的数据修改可能会丢失。
- 恢复时间长:在大型数据集上,RDB文件的恢复时间可能会比较长,因为Redis需要加载整个RDB文件到内存中。
AOF持久化
特点:
- 实时性:AOF持久化是实时的,因为它会记录Redis服务器接收到的每一个写命令,并将其追加到AOF文件中。
- 数据完整性:由于AOF持久化记录了所有的写命令,因此它提供了比RDB更精细的数据恢复粒度。
- 可配置性:AOF持久化提供了多种配置选项,如同步策略(每秒同步、每次写命令同步等)和重写机制(用于减小AOF文件大小)。
缺点:
- 磁盘空间占用:AOF文件可能会随着时间的推移而不断增长,占用大量的磁盘空间。
- 恢复时间长:在大型数据集上,AOF文件的恢复时间可能会比较长,因为Redis需要重新执行AOF文件中的每一条命令来恢复数据。
- 性能影响:与RDB持久化相比,AOF持久化可能会对Redis的性能产生一定的影响,特别是当写命令频繁时。
选择持久化机制的建议
在实际应用中,选择哪种持久化机制取决于具体的需求和场景。以下是一些建议:
- 如果希望性能优先:可以选择RDB持久化,因为它对Redis的性能影响较小。
- 如果需要实时持久化:可以选择AOF持久化,因为它能够记录所有的写命令并实时写入到文件中。
- 如果希望数据恢复粒度更精细:也可以选择AOF持久化,因为它提供了比RDB更精细的数据恢复粒度。
- 如果磁盘空间充足且对恢复时间要求不高:可以同时使用RDB和AOF两种持久化机制来确保数据的安全性和持久性。在Redis重启时,可以先加载RDB文件以快速恢复大部分数据,然后再重放AOF文件中的命令以恢复最近的数据修改。
总之,RDB和AOF是Redis提供的两种主要持久化机制,它们各有优缺点。在实际应用中,需要根据具体的需求和场景来选择适合的持久化机制或同时使用这两种机制来确保数据的安全性和持久性。
四、开启持久化
4.1 开启持久化
[root@redis111 data]# vim /data/redis/etc/redis-6379.conf
stop-writes-on-bgsave-error no
#改为 no
#这是在执行写入的时候,如果出现错误了,会不会继续往下写,这个我们是忽略的
appendonly yes
#开启AOF持久化
#他的存储目录呢 会自动的帮我们存储到dir 那个目录下 也就是/data/redis/data/
appendfilename "appendonly-6379.aof"
#添加个端口号,因为可能在一台机器上运行多个redis 我们用端口号来区分 他产生的文件
这样的话 两种redis 的机制 都给开启了
4.2 验证持久化
4.2.1启动
[root@redis111 etc]# /data/redis/bin/redis-server /data/redis/etc/redis-6379.conf
[root@redis111 etc]# ll /data/redis/data
total 8
-rw-r--r-- 1 root root 0 Dec 19 14:36 appendonly-6379.aof #.aof 结尾的 这个就是 APPEND ONLY MODE 的方式
-rw-r--r-- 1 root root 43 Dec 19 14:07 dump-6379.rdb
-rw-r--r-- 1 root root 126 Dec 19 14:08 nodes-6379.conf
4.2.2 验证
#登录
[root@redis111 etc]# /data/redis/bin/redis-server /data/redis/etc/redis-6379.conf
[root@redis111 etc]# /data/redis/bin/redis-cli
127.0.0.1:6379> AUTH 123456
OK
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
同时再开一个终端 查看
[root@redis111 ~]# tail -f /data/redis/data/appendonly-6379.aof
*3
$3
set
$2
k1
$2
v1
*3
$3
set
$2
k2
$2
v2
#会发现他在写入
这样持久化就成功了
五、部署redis集群模式
5.1 机器规划
IP | 系统 | 主机名 |
192.168.1.111 | Kylin V10 x86 | redis111.guoguod.cn |
192.168.1.112 | Kylin V10 x86 | redis112.guoguod.cn |
192.168.1.113 | Kylin V10 x86 | redis113.guoguod.cn |
111 112 113 三台主机
111 的6379 和6380 不能作为一主一从,每个节点不能和当前主机上的其他实例作为一组 因为:他会考虑到一旦master宕机了 这个机器宕机了,这样就意味着一对主从都没有了,都出问题了,都丢失了,这样的话就没有副本了,这样就使简单的一个集群架构,
5.2 编辑配置文件
192.168.1.111
[root@redis111 redis]# vim /data/redis/etc/redis-6379.conf
masterauth 123456
#这个是指定主节点的密码 如果集群都设置密码为123456 那么都这样就可以
cluster-enabled yes
#启用Redis的集群模式
cluster-config-file nodes-6379.conf
#这个配置项指定了集群节点配置文件的名称
cluster-node-timeout 15000
# 设置节点超时时间,单位为毫秒 这个默认就是15s 一般不需要修改
5.3 启动前配置
然后把配置文件拷贝一份 6379 改为 6380
[root@redis111 etc]# cp /data/redis/etc/redis-6379.conf /data/redis/etc/redis-6380.conf
然后把6380 配置文件里面的所有 6379 改为6380
[root@redis111 etc]# sed -i 's/6379/6380/g' /data/redis/etc/redis-6380.conf
然后就可以启动 这两个节点了 如果配置前 已经运行中 需要关闭后再启动
[root@redis111 etc]# /data/redis/bin/redis-cli -p 6379 -a 123456 shutdown
然后我们需要把/apps/redis/data 里面的数据清空
做集群前 要求里面数据是空的
[root@redis111 etc]# rm -rf /data/redis/data/*
5.4 传给其他主机
[root@redis111 etc]# scp -r /data/redis root@192.168.1.112:/data/
[root@redis111 etc]# scp -r /data/redis root@192.168.1.113:/data/
5.5 三台主机同时启动redis
[root@redis111 etc]# /data/redis/bin/redis-server /data/redis/etc/redis-6379.conf
[root@redis111 etc]# /data/redis/bin/redis-server /data/redis/etc/redis-6380.conf
#三台主机执行同样命令
验证 三台主机都要验证
[root@redis111 etc]# ps axu | grep redis
root 6373 0.0 0.1 239708 3700 ? /data/redis/bin/redis-server 0.0.0.0:6379 [cluster]
root 6377 0.0 0.1 239708 3760 ? /data/redis/bin/redis-server 0.0.0.0:6380 [cluster]
root 6387 0.0 0.0 213088 940 pts/0 R+ 15:04 0:00 grep --color=auto redis
#只要我们以这种方式启动,它就会默认在这个进程后面加个[cluster]字样
#虽然cluster 加了 但不一定启动了
5.6 创建集群
redis-cli --cluster create 192.168.1.111:6379 192.168.1.111:6380 192.168.1.112:6379 192.168.1.112:6380 192.168.1.113:6379 192.168.1.113:6380 --cluster-replicas 1 -a 123456
#解释一下这条命令
只要指定这个副本的cluster --cluster-replicas 1 这个命令 写1的话 他就是一个节点
你当前如果是六个节点 他就是3主3从 如果你指定2的话 就是2主4从 这种方式他会给默认的主节点找一个从节点 通常情况下 他会跨主机给你找 他不会把同一个机器上的 节点作为一组的主从 因为这样的话 会有 数据丢失的风险 通过数据的存取 也可以看到 他会把数据在整个 集群内部做一个内部路由
[root@redis111 data]# redis-cli --cluster create 192.168.1.111:6379 192.168.1.111:6380 192.168.1.112:6379 192.168.1.112:6380 192.168.1.113:6379 192.168.1.113:6380 --cluster-replicas 1 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.1.112:6380 to 192.168.1.111:6379
Adding replica 192.168.1.113:6380 to 192.168.1.112:6379
Adding replica 192.168.1.111:6380 to 192.168.1.113:6379
M: b34329778e054d5c903d64f894ced965871c8409 192.168.1.111:6379
slots:[0-5460] (5461 slots) master
S: b62c45d0929b229b8af44ae04e3bc1e09496f76e 192.168.1.111:6380
replicates b3257e4719cf0e0b191960d91bbf439b87036e11
M: 9f9224602a8d411d96423821a5fac8bfeb78bd34 192.168.1.112:6379
slots:[5461-10922] (5462 slots) master
S: 6eab0e4f8e1ec9bc93e5af96e6e823e11886821a 192.168.1.112:6380
replicates b34329778e054d5c903d64f894ced965871c8409
M: b3257e4719cf0e0b191960d91bbf439b87036e11 192.168.1.113:6379
slots:[10923-16383] (5461 slots) master
S: ae98e1c0ae3dd958534cf40c4fae5a3bc9c24359 192.168.1.113:6380
replicates 9f9224602a8d411d96423821a5fac8bfeb78bd34
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 192.168.1.111:6379)
M: b34329778e054d5c903d64f894ced965871c8409 192.168.1.111:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: b3257e4719cf0e0b191960d91bbf439b87036e11 192.168.1.113:6379
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: ae98e1c0ae3dd958534cf40c4fae5a3bc9c24359 192.168.1.113:6380
slots: (0 slots) slave
replicates 9f9224602a8d411d96423821a5fac8bfeb78bd34
S: 6eab0e4f8e1ec9bc93e5af96e6e823e11886821a 192.168.1.112:6380
slots: (0 slots) slave
replicates b34329778e054d5c903d64f894ced965871c8409
M: 9f9224602a8d411d96423821a5fac8bfeb78bd34 192.168.1.112:6379
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: b62c45d0929b229b8af44ae04e3bc1e09496f76e 192.168.1.111:6380
slots: (0 slots) slave
replicates b3257e4719cf0e0b191960d91bbf439b87036e11
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
1. 节点分配
集群中总共有 6 个节点(3 个主节点和 3 个从节点),它们已经正确地分配了 16384 个哈希槽:
主节点:
192.168.1.111:6379:负责槽 0-5460
192.168.1.112:6379:负责槽 5461-10922
192.168.1.113:6379:负责槽 10923-16383
从节点:
192.168.1.111:6380:从属于 192.168.1.113:6379
192.168.1.112:6380:从属于 192.168.1.111:6379
192.168.1.113:6380:从属于 192.168.1.112:6379
5.7 查看集群状态
/data/redis/bin/redis-cli -c -a 123456 -h 192.168.1.111 -p 6379 cluster nodes
/data/redis/bin/redis-cli -c -a 123456 -h 192.168.1.111 -p 6379 cluster info
[root@redis111 data]# /data/redis/bin/redis-cli -c -a 123456 -h 192.168.1.111 -p 6379 cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
b3257e4719cf0e0b191960d91bbf439b87036e11 192.168.1.113:6379@16379 master - 0 1734598286295 5 connected 10923-16383
ae98e1c0ae3dd958534cf40c4fae5a3bc9c24359 192.168.1.113:6380@16380 slave 9f9224602a8d411d96423821a5fac8bfeb78bd34 0 1734598285000 6 connected
6eab0e4f8e1ec9bc93e5af96e6e823e11886821a 192.168.1.112:6380@16380 slave b34329778e054d5c903d64f894ced965871c8409 0 1734598284000 4 connected
b34329778e054d5c903d64f894ced965871c8409 192.168.1.111:6379@16379 myself,master - 0 1734598285000 1 connected 0-5460
9f9224602a8d411d96423821a5fac8bfeb78bd34 192.168.1.112:6379@16379 master - 0 1734598284000 3 connected 5461-10922
b62c45d0929b229b8af44ae04e3bc1e09496f76e 192.168.1.111:6380@16380 slave b3257e4719cf0e0b191960d91bbf439b87036e11 0 1734598285292 5 connected
[root@redis111 data]# /data/redis/bin/redis-cli -c -a 123456 -h 192.168.1.111 -p 6379 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:38
cluster_stats_messages_pong_sent:47
cluster_stats_messages_sent:85
cluster_stats_messages_ping_received:42
cluster_stats_messages_pong_received:38
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:85
连接任何一个节点查看下
[root@redis111 data]# /data/redis/bin/redis-cli -h 192.168.1.112 -p 6380 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.1.112:6380> info replication
# Replication
role:slave
master_host:192.168.1.111
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:434
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:d6b7922c8cc001e15047b9f7c51dab6b8af0ad3c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:434
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:434
192.168.1.112:6380>
192.168.1.112:6380>
192.168.1.112:6380> cluster nodes
9f9224602a8d411d96423821a5fac8bfeb78bd34 192.168.1.112:6379@16379 master - 0 1734598584000 3 connected 5461-10922
b62c45d0929b229b8af44ae04e3bc1e09496f76e 192.168.1.111:6380@16380 slave b3257e4719cf0e0b191960d91bbf439b87036e11 0 1734598584071 5 connected
6eab0e4f8e1ec9bc93e5af96e6e823e11886821a 192.168.1.112:6380@16380 myself,slave b34329778e054d5c903d64f894ced965871c8409 0 1734598582000 4 connected
b34329778e054d5c903d64f894ced965871c8409 192.168.1.111:6379@16379 master - 0 1734598583068 1 connected 0-5460
ae98e1c0ae3dd958534cf40c4fae5a3bc9c24359 192.168.1.113:6380@16380 slave 9f9224602a8d411d96423821a5fac8bfeb78bd34 0 1734598585075 6 connected
b3257e4719cf0e0b191960d91bbf439b87036e11 192.168.1.113:6379@16379 master - 0 1734598584000 5 connected 10923-16383
192.168.1.112:6380>
5.8 检测同步情况
连接个主节点
#-c 自动连接路由
[root@redis111 data]# /data/redis/bin/redis-cli -c -h 192.168.1.113 -p 6379 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.1.111:6379> set a1 b1
-> Redirected to slot [7785] located at 192.168.1.112:6379
OK #他说 这个槽位在7785 在112 6379 上
192.168.1.112:6379> get a1
"b1"
然后我们再切换一个主
[root@redis112 data]# /data/redis/bin/redis-cli -c -h 192.168.1.111 -p 6379 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.1.112:6379> set a2 b2
-> Redirected to slot [11786] located at 192.168.1.113:6379
OK #113:6379 槽位在111786
#多创建几个
192.168.1.113:6379> set a3 b3
OK
192.168.1.113:6379> set a4 b4
-> Redirected to slot [3788] located at 192.168.1.111:6379
OK
192.168.1.111:6379> set a5 b5
-> Redirected to slot [7917] located at 192.168.1.112:6379
OK
192.168.1.112:6379> set a6 b6
-> Redirected to slot [11918] located at 192.168.1.113:6379
OK
他会根据他内部的hash路由机制 把你对应的节点 你所要设置的数据 给你加载到对应的节点上 然后等你读取的时候也一样 他根据路由机制 直接给你转到对应的 节点上去
所以我们连集群的时候 用客户端的方式 通常要加-c 这个参数 这个-c 说明我连接的是集群 这个集群呢 通过这种方式 他可以 自动的 把我们这个 路由到指定的 节点上去
这种就是整个集群的共享方式
他会自动的把你整个集群 主从关系给你对应好
六、故障切换
6.1 停一个节点
数据平均分布 故障自动切换
如果我们把某一个节点 给宕机了,将192.168.1.112:6379 关闭
[root@redis111 data]# /data/redis/bin/redis-cli -h 192.168.1.112 -p 6379 -a 123456 shutdown
再连一个看看
[root@redis111 data]# /data/redis/bin/redis-cli -c -h 192.168.1.111 -p 6379 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.1.111:6379> cluster nodes
b3257e4719cf0e0b191960d91bbf439b87036e11 192.168.1.113:6379@16379 master - 0 1734601066648 5 connected 10923-16383
ae98e1c0ae3dd958534cf40c4fae5a3bc9c24359 192.168.1.113:6380@16380 master - 0 1734601068655 7 connected 5461-10922
6eab0e4f8e1ec9bc93e5af96e6e823e11886821a 192.168.1.112:6380@16380 slave b34329778e054d5c903d64f894ced965871c8409 0 1734601067652 4 connected
b34329778e054d5c903d64f894ced965871c8409 192.168.1.111:6379@16379 myself,master - 0 1734601067000 1 connected 0-5460
9f9224602a8d411d96423821a5fac8bfeb78bd34 192.168.1.112:6379@16379 master,fail - 1734601006253 1734601003000 3 disconnected #显示112:6379 断开连接
b62c45d0929b229b8af44ae04e3bc1e09496f76e 192.168.1.111:6380@16380 slave b3257e4719cf0e0b191960d91bbf439b87036e11 0 1734601066000 5 connected
192.168.1.111:6379>
#master,fail 主 失败 检测失败了已经
#disconnected 断开的意思
112:6379 已经断开了
#然后他已经做故障 切换了 已经变成了 3个主 2个从了
#他会自动把 之前宕机的112:6379 的槽位 自动移动到 111的6380上了
数据转移情况:
主节点 192.168.1.112:6379 失败后: 该节点的哈希槽会转移到其他主节点上,通常是与失败节点哈希槽相邻的主节点。其他的主节点会继续接管这些槽。
从节点 192.168.1.111:6380 成为新的主节点:在正常情况下,Redis 集群会通过选举机制将从节点 192.168.1.111:6380 提升为主节点,确保数据继续可用。该节点会接管原来主节点的数据并提供服务。
因此,当 192.168.1.112:6379 断开后,它的数据会自动转移给 192.168.1.111:6380(从节点),并且 Redis 集群会根据情况调整槽的分配和数据的同步,以确保高可用性。
恢复操作:
如果 192.168.1.112:6379 恢复连接并重新加入集群,它会作为一个新的主节点重新同步数据。
这个redis-cluster 和哨兵一样能够实现故障切换 而且不影响你当前机器的使用
6.2 恢复节点
6.2.1 查看宕机节点的id
[root@redis111 data]# /data/redis/bin/redis-cli -c -h 192.168.1.111 -p 6379 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.1.111:6379> cluster nodes
b3257e4719cf0e0b191960d91bbf439b87036e11 192.168.1.113:6379@16379 master - 0 1734601066648 5 connected 10923-16383
ae98e1c0ae3dd958534cf40c4fae5a3bc9c24359 192.168.1.113:6380@16380 master - 0 1734601068655 7 connected 5461-10922
6eab0e4f8e1ec9bc93e5af96e6e823e11886821a 192.168.1.112:6380@16380 slave b34329778e054d5c903d64f894ced965871c8409 0 1734601067652 4 connected
b34329778e054d5c903d64f894ced965871c8409 192.168.1.111:6379@16379 myself,master - 0 1734601067000 1 connected 0-5460
9f9224602a8d411d96423821a5fac8bfeb78bd34 192.168.1.112:6379@16379 master,fail - 1734601006253 1734601003000 3 disconnected #这个是宕机的节点 复制前面它的id
b62c45d0929b229b8af44ae04e3bc1e09496f76e 192.168.1.111:6380@16380 slave b3257e4719cf0e0b191960d91bbf439b87036e11 0 1734601066000 5 connected
192.168.1.111:6379>
6.2.2 删除宕机节点
redis-cli -h 192.168.1.111 -p 6379 -a 123456 cluster forget 9f9224602a8d411d96423821a5fac8bfeb78bd34
[root@redis111 data]# redis-cli -h 192.168.1.111 -p 6379 -a 123456 cluster forget 9f9224602a8d411d96423821a5fac8bfeb78bd34
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
OK
6.2.3 添加节点
先把112:6379启动
[root@redis112 data]# /data/redis/bin/redis-server /data/redis/etc/redis-6379.conf
添加
redis-cli -h 192.168.1.111 -p 6379 -a 123456 cluster meet 192.168.1.112 6379
[root@redis111 data]# redis-cli -h 192.168.1.111 -p 6379 -a 123456 cluster meet 192.168.1.112 6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
OK
查看一下
[root@redis111 data]# /data/redis/bin/redis-cli -c -h 192.168.1.111 -p 6379 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.1.111:6379> cluster nodes
b3257e4719cf0e0b191960d91bbf439b87036e11 192.168.1.113:6379@16379 master - 0 1734601805000 5 connected 10923-16383
ae98e1c0ae3dd958534cf40c4fae5a3bc9c24359 192.168.1.113:6380@16380 master - 0 1734601804000 7 connected 5461-10922
6eab0e4f8e1ec9bc93e5af96e6e823e11886821a 192.168.1.112:6380@16380 slave b34329778e054d5c903d64f894ced965871c8409 0 1734601806088 4 connected
b34329778e054d5c903d64f894ced965871c8409 192.168.1.111:6379@16379 myself,master - 0 1734601804000 1 connected 0-5460
9f9224602a8d411d96423821a5fac8bfeb78bd34 192.168.1.112:6379@16379 slave ae98e1c0ae3dd958534cf40c4fae5a3bc9c24359 0 1734601804082 7 connected #已经正常了 现在112:6379 是从节点
b62c45d0929b229b8af44ae04e3bc1e09496f76e 192.168.1.111:6380@16380 slave b3257e4719cf0e0b191960d91bbf439b87036e11 0 1734601805085 5 connected
####
####