Redis主从复制、哨兵模式和集群

前言

在生产环境中,除了采用持久化方式实现 Redis 的高可用性,还可以采用主从复制、哨兵模式和 Cluster 集群的方法确保数据的持久性和可靠性。

目录

一、主从复制

1. 概述

2. 作用

3. 主从复制流程

4. 部署

4.1 安装 redis

4.2 编辑 master 节点配置文件

4.3 编辑 slave 节点配置文件

4.4 验证主从效果

二、哨兵模式

1. 概述

2. 结构

2. 功能与原理

3. 作用

4. 故障转移机制

5. 主节点选举的过程 

6. 搭建 redis 哨兵模式 

6.1 所有节点修改哨兵模式配置文件

6.2 启动哨兵模式

6.3 查看哨兵信息

6.4 查看日志并模拟 master 故障

6.5 再次查看哨兵信息

三、集群

1. 集群相关概念

2. redis 集群

3. 作用

4. cluster 集群的工作模式 

5. 集群的数据分片 

6. 数据存储的方法与架构

7. 搭建 redis 群集模式

7.1 创建六个节点的文件夹

7.2 开启群集功能

7.3 启动 redis 节点

7.4 创建集群

7.5 测试群集

四、总结


一、主从复制

1. 概述

主从复制是高可用 Redis 的基础,将一台 Redis 服务器的数据复制到其它的 Redis 服务器。前者 为主 master,后者为 slave,单向从主到从;主可以有多个从,从只能有一个主。

2. 作用

① 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式

② 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余

③ 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量

④ 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础

3. 主从复制流程

① 启动一个 slave 机器进程,从 redis 会向主发送 sync 同步数据请求

② 主 redis 会 fork 一个子进程,会产生 rdb 文件(完全备份文件的过程)

③ rdb 文件的持久化完成后,主 redis 会将 rdb 文件和缓存起来的命令推送给从服务器

④ 复制、推送完后后,主 redis 会持续的同步操作命令,利用 aof(增备)持久化功能

⑤ 在下一台 redis 接入主从复制之前,会持续利用 aof 的方式同步数据给从服务器

4. 部署

环境准备:关闭防火墙与核心防护

  • master节点: 192.168.190.100
  • slave1节点: 192.168.190.101
  • slave2节点: 192.168.190.102

4.1 安装 redis

yum install -y gcc gcc-c++ make
cd /opt/
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
tar zxvf redis-5.0.7.tar.gz
cd redis-5.0.7/
make -j 2 && make prefix=/usr/local/redis install
cd /opt/redis-5.0.7/utils
./install_server.sh
......
Please select the redis executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server	
ln -s /usr/local/redis/bin/* /usr/local/bin/

4.2 编辑 master 节点配置文件

[root@master ~]# vim /etc/redis/6379.conf
  70 bind 0.0.0.0                    # 修改监听地址为0.0.0.0
 137 daemonize yes                   # 开启守护进程
 172 logfile /var/log/redis_6379.log # 指定日志文件目录
 264 dir /var/lib/redis/6379         # 指定工作目录
 700 appendonly yes                  # 开启AOF持久化功能
[root@master ~]# /etc/init.d/redis_6379 restart

选择配置 systemd 管理服务:

[root@master ~]# vim /usr/lib/systemd/system/redis.service
[Unit]                          # 包含了关于服务单元的描述信息
Description=Redis Server        # 描述服务
After=network.target            # 指定了服务应该在网络服务启动后启动

[Service]                       # 包含了关于服务如何运行的配置信息
PIDFile=/var/run/redis_6379.pid # 方便使用pid号进行操作
ExecStart=/usr/local/redis/bin/redis-server /etc/redis/6379.conf # 指定了启动Redis服务时要执行的命令
ExecStop=/usr/local/redis/bin/redis-cli shutdown # 指定了停止Redis服务时要执行的命令,这里是使用redis-cli发送shutdown命令
Restart=always                  # 指定了服务在意外终止时应该自动重新启动

[Install]                       # 定义了如何安装这个服务
WantedBy=multi-user.target      # 安装字符界面,指定了在多用户模式下启用这个服务
[root@master ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start redis.service 
[root@localhost ~]# systemctl status redis.service 
● redis.service - Redis Server
   Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)
   Active: active (running) since 三 2024-04-03 17:56:18 CST; 6s ago
 Main PID: 5473 (redis-server)

4.3 编辑 slave 节点配置文件

[root@slave1 ~]# vim /etc/redis/6379.conf
  70 bind 0.0.0.0                    # 修改监听地址为0.0.0.0
 137 daemonize yes                   # 开启守护进程
 172 logfile /var/log/redis_6379.log # 指定日志文件目录
 264 dir /var/lib/redis/6379         # 指定工作目录
 288 replicaof 192.168.190.100 6379  # 指定要同步的Master节点IP和端口
 700 appendonly yes                  # 开启AOF持久化功能
[root@slave1 ~]# scp -p /etc/redis/6379.conf root@192.168.190.102:/etc/redis/
/etc/init.d/redis_6379 restart       # 两台从服务器均重启redis服务

4.4 验证主从效果

① 在 master 节点上验证从节点

[root@master ~]# redis-cli info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.190.101,port=6379,state=online,offset=98,lag=0
slave1:ip=192.168.190.102,port=6379,state=online,offset=98,lag=1
[root@master ~]# tail -f /var/log/redis_6379.log

② 在 master 数据库存放数据

[root@master ~]# redis-cli
127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> get a
"1"

③ 在 slave 数据库获取数据

[root@slave1 ~]# redis-cli
127.0.0.1:6379> get a
"1"

[root@slave2 ~]# redis-cli
127.0.0.1:6379> get a
"1"
# 至此实现主从复制

二、哨兵模式

1. 概述

主从切换需要人工干预,为了解决主从复制的缺点,在主从复制的基础上,哨兵引入了主节点的自动故障转移。

2. 结构

哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的 redis 节点,不存储数据

数据节点:主节点和从节点都是数据节点

2. 功能与原理

哨兵(sentinel)是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 Master 并将所有 slave 连接到新的 Master。所以整个运行哨兵的集群的数量不得少于3个节点。

3. 作用

监控:哨兵会不断地检查主节点和从节点是否运作正常(哨兵间也会监测)

自动故障转移:当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将其中一个从节点升级为新的主节点,并让其它从节点改为复制新的主节点

通知(提醒):哨兵可以将故障转移的结果发送给客户端

4. 故障转移机制

① 由哨兵节点定期监控发现主节点是否出现了故障,每个哨兵节点每隔1秒会向主节点、从节点及其它哨兵节点发送一次 ping 命令做一次心跳检测。如果主节点在一定时间范围内不回复或者是回复一个错误消息,那么这个哨兵就会认为这个主节点主观下线了(单方面的)。当超过半数哨兵节点认为该主节点主观下线了,这样就客观下线了。

② 当主节点出现故障,此时哨兵节点会通过 Raft 算法(选举算法)实现选举机制共同选举出一个哨兵节点为 leader,来负责处理主节点的故障转移和通知。所以整个运行哨兵的集群的数量不得少于3个节点。

③ 由 leader 哨兵节点执行故障转移,过程如下:

  • 将某一个从节点升级为新的主节点,让其它从节点指向新的主节点
  • 若原主节点恢复也变成从节点,并指向新的主节点
  • 通知客户端主节点已经更换

注意:客观下线是主节点才有的概念;如果从节点和哨兵节点发生故障,被哨兵主观下线后,不会再有后续的客观下线和故障转移操作。 

5. 主节点选举的过程 

监控对象:

  • 哨兵对主从复制集群进行监控:所有 redis 数据节点 
  • 哨兵与哨兵之间进行相互监控:哨兵彼此

监控目的:

  • 哨兵监控所有的 redis 数据库的目的:为了实现故障自动故障切
  • 哨兵与哨兵之间的监控目的:检测彼此的存活状态

故障切换过程:

① 当master 挂掉,哨兵会及时发现之后进行投票机制,选举出一个新的 master 服务器(一定是奇数)

切换分为主观和客观:

  • 主观:单个哨兵判断 master 是否健康,单方面决定切换
  • 客观:多个哨兵之间互相传递消息,投票选举新的 master

② 完成 salve 到 master 的切换

③ 完成其他的从服务器对新的 master 配置

6. 搭建 redis 哨兵模式 

6.1 所有节点修改哨兵模式配置文件

vim /opt/redis-5.0.7/sentinel.conf
 17 protected-mode no               # 关闭保护模式
 21 port 26379                      # Redis哨兵默认的监听端口
 26 daemonize yes                   # 指定sentinel为后台启动
 36 logfile "/var/log/sentinel.log" # 指定日志存放路径
 65 dir /var/lib/redis/6379         # 指定数据库存放路径
 84 sentinel monitor mymaster 192.168.190.100 6379 2  # 修改master ip
# 指定该哨兵节点监控192.168.190.100:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
113 sentinel down-after-milliseconds mymaster 30000 # 判定服务器down掉的时间周期,默认30000毫秒(30秒)
146 sentinel failover-timeout mymaster 180000 # 故障节点的最大超时时间为180000(180秒)

6.2 启动哨兵模式

注意:先启 master,再启 slave

[root@master ~]# cd /opt/redis-5.0.7/
[root@master redis-5.0.7]# redis-sentinel sentinel.conf &
[1] 6728

[root@slave1 ~]# cd /opt/redis-5.0.7/
[root@slave1 redis-5.0.7]# redis-sentinel sentinel.conf &
[1] 41954

[root@slave2 ~]# cd /opt/redis-5.0.7/
[root@slave2 redis-5.0.7]# redis-sentinel sentinel.conf &
[1] 8273

6.3 查看哨兵信息

[root@slave2 ~]# redis-cli -p 26379 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.190.100:6379,slaves=2,sentinels=3
# 名为 "mymaster" 的主节点的详细信息。它显示该主节点的状态正常(status=ok),地址为 192.168.190.100:6379,有 2 个从节点(slaves)和 3 个 Sentinel。

6.4 查看日志并模拟 master 故障

[root@master ~]# systemctl stop redis.service
[root@slave2 ~]# tail -f /var/log/sentinel.log
8261:X 03 Apr 2024 19:47:03.639 # +config-update-from sentinel f6084d790599b7c806cde643fcf083df6f782182 192.168.190.101 26379 @ mymaster 192.168.190.100 6379
# 表示一个 Sentinel 实例收到了来自另一个 Sentinel 实例的配置更新
8261:X 03 Apr 2024 19:47:03.639 # +switch-master mymaster 192.168.190.100 6379 192.168.190.102 6379
# 名为 "mymaster" 的主节点从地址 192.168.190.100:6379 切换到了新地址 192.168.190.102:6379。这通常代表着故障转移(failover)的发生,即主节点切换到了另一个地址上
8261:X 03 Apr 2024 19:47:03.640 * +slave slave 192.168.190.101:6379 192.168.190.101 6379 @ mymaster 192.168.190.102 6379
8261:X 03 Apr 2024 19:47:03.640 * +slave slave 192.168.190.100:6379 192.168.190.100 6379 @ mymaster 192.168.190.102 6379
# 表示两个从节点已经成功地重新连接到新的主节点地址 192.168.190.102:6379。
8261:X 03 Apr 2024 19:47:33.715 # +sdown slave 192.168.190.100:6379 192.168.190.100 6379 @ mymaster 192.168.190.102 6379

6.5 再次查看哨兵信息

[root@master ~]# redis-cli -p 26379 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.190.102:6379,slaves=2,sentinels=3

三、集群

1. 集群相关概念

为解决某个特定问题将多台计算机组合起来形成的单个系统,分为三个类型:

  • LB: Load Balancing,负载均衡,多个主机组成,每个主机只承担一部分访问请求
  • HA: High Availiablity,高可用,避免 SPOF 单点故障(single Point Of failure)
  • HPC: High-performance computing,高性能

2. redis 集群

集群是 redis 分布式存储方案,由多个节点(node)组成,节点分为主节点和从节点:

  • 主节点:负责读写请求和集群信息的维护
  • 从节点: 只进行主节点数据和状态信息的复制

3. 作用

① 数据分区(或称数据分片)

  • 集群将数据分散到多个节点,突破了 redis 单机内存限制,存储容量增大
  • 另一方面每个主节点都可以对外提供读写服务,提高了集群的响应能力

② 高可用

  • 集群支持主从复制和主节点的自动故障转移(与哨兵类似)
  • 当任一节点发生故障时,集群仍然可以对外提供服务

4. cluster 集群的工作模式 

redis cluster 提供自动故障转移功能,这些机制可以监测 redis 节点的健康状态,当 master 节点不可用时,自动升级一个 slave 为新的 master,然后重新分配槽位等操作以确保集群的正常运行。

心跳:在分布式系统中,心跳通常用于检测节点的存活状态。在 redis 集群中,master 节点之间会定期发送心跳消息以确认彼此的存活状态。这有助于及时发现节点失效或网络问题,并采取相应的措施来维护集群的稳定性。

同步:对于 redis 集群中的 master 节点,同步是指将数据从一个 master 节点复制到另一个 master 节点,以确保所有节点上的数据保持一致。当一个 master 节点接收到写入操作时,它会将这些更新通过复制机制传播到其他节点,以实现数据的同步。不过采用哈希数据分片的方式进行数据存储,每个键被映射到特定的分片上,而每个分片由一个主节点负责。因此,在标准的 redis 集群中,主节点之间不会直接同步数据。在一个 master 可以使用 “redis-cli -p 端口 -c”相关命令读取其他 master 写入的数据。

① 读写可以负载均衡

Redis Cluster 实现了读写请求的负载均衡,客户端可以根据数据分片情况将请求路由到不同的节点上,提高了系统的整体处理能力。

② 自动故障转移(高可用)

当主节点发生故障时,Redis Cluster 会自动进行故障转移,将一个从节点晋升为新的主节点,从而保证数据的可用性。

③ 突破了单机的存储限制

通过数据分片和分布式存储,Redis Cluster 可以突破单机存储容量的限制,将数据存储在多个节点上,实现了存储的水平扩展。

④ 数据分片

Redis Cluster 将数据分为多个槽(slot),每个槽对应一个数据分片。这些数据分片分布在不同的节点上,实现数据的分布式存储。

5. 集群的数据分片 

数据分片是指将数据分散存储在多个节点上的过程。Redis Cluster 将整个数据集分割成多个区间,每个区间称为一个槽(slot),默认共有16384个槽。每个 Key 通过 CRC16 校验后对 16384取余来决定放置哪个哈希槽。

以3个节点组成的集群为例:

Redis 集群的主从复制模型:

① 集群中具有 master 1、master 2、master 3 三个节点,如果节点 master 2 失败了,整个集群就会因缺少 5461-10922 这个范围的槽而不可以用

② 为每个节点添加一个从节点 slave1、slave 2、slave 3 整个集群便有三个 master 节点和三个 slave 节点组成

③ 在主节点 master 2 失败后,集群选举从节点 slave 2 为主节点继续服务;当 master 2 和 slave 2 都失败后,集群将不可用

6. 数据存储的方法与架构

Redis 使用一种称为一致性哈希(Consistent Hashing)的算法来决定数据在集群中的存储位置,它共有 16384 个,每个 hash 槽位为 512 字节。

一般情况下,可用有以下几种架构情况:

① 仅一台节点

对于只有一台节点部署:所有的数据将被存储在这台节点上,哈希算法会将所有的键映射到这台节点上进行存储和处理。

② 三台节点

每个节点部署一主一从,每个主节点都有一个对应的从节点,从节点负责复制主节点的数据,用于故障转移和数据备份。

③ 六台节点

六台节点分为三组,每组包含一个主节点和一个从节点,共计三组,每组一个主节点负责写操作,一个从节点负责数据备份和读操作。

7. 搭建 redis 群集模式

redis 的集群一般需要 6 个节点,3 主 3 从。方便起见,这里所有节点在同一台服务器上模拟:

  • 以端口号进行区分,3 个主节点端口号分别为:6001/6002/6003
  • 对应的从节点端口号为:6004/6005/6006

redis 部署这里就不过多赘述,可以参考上文“4.1 安装 redis”

7.1 创建六个节点的文件夹

在同一台服务器上模拟一个包含三个主节点和三个从节点的 redis 集群,在 /etc/redis/redis-cluster/ 目录下创建名为 redis6001 到 redis6006 的六个文件夹,分别对应六个节点的配置。

[root@localhost ~]# cd /etc/redis/
[root@localhost redis]# mkdir -p redis-cluster/redis600{1..6}
[root@localhost redis]# cd redis-cluster/
[root@localhost redis-cluster]# ls
redis6001  redis6002  redis6003  redis6004  redis6005  redis6006
[root@localhost redis-cluster]# for i in {1..6}
> do
> cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i
> cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis600$i
> done
# 利用 for 循环语句分别将 Redis 的配置文件、 Redis 的命令行工具、Redis 服务器的可执行文件拷贝到六个节点文件夹内
[root@localhost redis-cluster]# ls redis6001
redis-cli  redis.conf  redis-server
[root@localhost redis-cluster]# ls redis6006
redis-cli  redis.conf  redis-server

7.2 开启群集功能

以 redis6001 为例,其他 5 个文件夹的配置文件按照对应端口就行配置修改

[root@localhost redis-cluster]# cd redis6001/
[root@localhost redis6001]# ls
redis-cli  redis.conf  redis-server
[root@localhost redis6001]# vim redis.conf
  69 #bind 127.0.0.1      # 注释掉 bind 项,默认监听所有网卡
  88 protected-mode no    # 关闭保护模式,允许集群内部的节点相互通信
  92 port 6001            # 修改 redis 监听端口
 136 daemonize yes        # 开启守护进程,以独立进程启动,可以让 Redis 以服务方式在后台运行,提高系统稳定性和可靠性
 699 appendonly yes       # 开启 AOF 持久化
 832 cluster-enabled yes  # 取消注释,开启集群功能
 840 cluster-config-file nodes-6001.conf # 取消注释,集群名称文件设置
 846 cluster-node-timeout 15000          # 取消注释,集群超时时间设置

可以将修改好的 redis6001/redis.conf 覆盖其他 5 个文件夹内容,分别修改对应端口号和集群文件名称

[root@localhost redis6001]# cp redis.conf ../redis6002/
[root@localhost redis6001]# sed -i 's/port 6001/port 6002/' ../redis6002/redis.conf
[root@localhost redis6001]# sed -i 's/cluster-config-file nodes-6001.conf/cluster-config-file nodes-6002.conf/' ../redis6002/redis.conf
[root@localhost redis6001]# cat ../redis6002/redis.conf | grep 'port 6002'
port 6002
[root@localhost redis6001]# cat ../redis6002/redis.conf | grep 'cluster-config-file nodes-6002.conf'
cluster-config-file nodes-6002.conf

[root@localhost redis6001]# cp redis.conf ../redis6003/
cp:是否覆盖"../redis6003/redis.conf"? yes
[root@localhost redis6001]# sed -i 's/port 6001/port 6003/' ../redis6003/redis.conf
[root@localhost redis6001]# sed -i 's/cluster-config-file nodes-6001.conf/cluster-config-file nodes-6003.conf/' ../redis6003/redis.conf
[root@localhost redis6001]# cp redis.conf ../redis6004/
cp:是否覆盖"../redis6004/redis.conf"? yes 
[root@localhost redis6001]# sed -i 's/port 6001/port 6004/' ../redis6004/redis.conf
[root@localhost redis6001]# sed -i 's/cluster-config-file nodes-6001.conf/cluster-config-file nodes-6004.conf/' ../redis6004/redis.conf
[root@localhost redis6001]# cp redis.conf ../redis6005/
cp:是否覆盖"../redis6005/redis.conf"? yes
[root@localhost redis6001]# sed -i 's/port 6001/port 6005/' ../redis6005/redis.conf
[root@localhost redis6001]# sed -i 's/cluster-config-file nodes-6001.conf/cluster-config-file nodes-6005.conf/' ../redis6005/redis.conf
[root@localhost redis6001]# cp redis.conf ../redis6006/
cp:是否覆盖"../redis6006/redis.conf"? yes
[root@localhost redis6001]# sed -i 's/port 6001/port 6006/' ../redis6006/redis.conf
[root@localhost redis6001]# sed -i 's/cluster-config-file nodes-6001.conf/cluster-config-file nodes-6006.conf/' ../redis6006/redis.conf

7.3 启动 redis 节点

分别进入六个模拟节点文件夹,执行命令:redis-server redis.conf ,来启动redis节点

[root@localhost redis6001]# for d in {1..6}
> do
> cd /etc/redis/redis-cluster/redis600$d
> redis-server redis.conf
> done

[root@localhost redis6006]# ps -ef | grep redis | grep -v grep
# 列出当前系统上所有与 Redis 相关的进程
root       1166      1  0 15:15 ?        00:00:08 /usr/local/bin/redis-server 127.0.0.1:6379
root       2449      1  0 16:03 ?        00:00:00 redis-server *:6001 [cluster]
root       2451      1  0 16:03 ?        00:00:00 redis-server *:6002 [cluster]
root       2459      1  0 16:03 ?        00:00:00 redis-server *:6003 [cluster]
root       2464      1  0 16:03 ?        00:00:00 redis-server *:6004 [cluster]
root       2469      1  0 16:03 ?        00:00:00 redis-server *:6005 [cluster]
root       2474      1  0 16:03 ?        00:00:00 redis-server *:6006 [cluster]

7.4 创建集群

六个实例分为三组,每组一主一从,前面的做主节点,后面的做从节点:
[root@localhost redis6006]# redis-cli --cluster create 192.168.190.100:6001 192.168.190.100:6002 192.168.190.100:6003 192.168.190.100:6004 192.168.190.100:6005 192.168.190.100:6006 --cluster-replicas 1
Can I set the above configuration? (type 'yes' to accept): yes  # 输入 yes
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
# redis-cli:这是 Redis 命令行工具,用于与 Redis 服务器进行交互。
# --cluster create:这是 redis-cli 的参数,表示创建一个 Redis 集群
# --cluster-replicas 1:这个参数指定了每个主节点应该有多少个从节点。在这种情况下,每个主节点都有一个从节点

7.5 测试群集

① 查看节点的哈希槽编号范围

[root@localhost redis6006]# redis-cli -p 6001 -c    
# 加-c参数,节点之间就可以互相跳转,redis-cli 会自动进行集群的路由和数据分片,以便与 Redis 集群进行交互
127.0.0.1:6001> cluster slots
1) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "192.168.190.100"
      2) (integer) 6003
      3) "1b5d7df1e6df03740c66e885bd69583b3f67555a"
   4) 1) "192.168.190.100"
      2) (integer) 6005
      3) "c8f3ba98df67eb7abcab7e2fa02b83eea9cd8c0c"
2) 1) (integer) 0
   2) (integer) 5460
   3) 1) "192.168.190.100"
      2) (integer) 6001
      3) "be17548e7ec8ec1940c90dc238420772277f8c2d"
   4) 1) "192.168.190.100"
      2) (integer) 6006
      3) "4a09d3ddb1d5852c8a3ff163de56784f2b0293f1"
3) 1) (integer) 5461
   2) (integer) 10922
   3) 1) "192.168.190.100"
      2) (integer) 6002
      3) "75f0ea0e82577ed89258956a9e2f55ec75a4fba0"
   4) 1) "192.168.190.100"
      2) (integer) 6004
      3) "a126fc631148f7a9eae34355dff50c3d9147e618"

② 存放数据

127.0.0.1:6001> set name zhangsan
-> Redirected to slot [5798] located at 192.168.190.100:6002
# 写入请求被重定向到了负责槽位 5798 的节点 192.168.190.100:6002 上进行处理
OK
192.168.190.100:6002> cluster keyslot name   # 查看 name 键的槽编号
(integer) 5798

为什么会从6001节点切换到6002节点?

当执行 set name zhangsan 命令时,数据被分配到了槽位 5798 上,而这个槽位可能被分配到了位于 192.168.190.100:6002 的节点上。因此,Redis 集群会自动将请求重定向到正确的节点上,也就是 192.168.190.100:6002,以确保数据被正确存储。槽位号 5798 是根据键 name 计算哈希值得到的结果。

③ 查看对应节点该数据

[root@localhost redis6006]# redis-cli -p 6004 -c # 主节点 6002 对应的从节点是 6004
127.0.0.1:6004> keys *
1) "name"
对应的 slave 节点会有这条数据,但别的节点没有:
[root@localhost redis6006]# redis-cli -p 6005 -c  
127.0.0.1:6005> keys *
(empty list or set)
[root@localhost redis6006]# redis-cli -p 6006 -c
127.0.0.1:6006> keys *
(empty list or set)
# 由于集群中设置了数据分片,在一个 master 上执行的 set 操作会落在特定的分片上,而非所有的 slave 节点都半酣该分片的数据

四、总结

redis 主从复制:
主从复制是一种单向的同步机制,主服务器数据的修改更新会实时同步到从服务器上,实现数据备份和读写分离。
作用:
① 数据冗余
② 故障恢复
③ 负载均衡
④ 高可用

redis 哨兵:
在主从复制的基础上,引入主节点的自动故障转移。
作用:
① 监控:监控主节点和从节点(哨兵间也会监测)
② 自动故障转移
③ 通知提醒:发送给客户端

redis 集群:
集群是一个提供高性能、高可用、数据分片、故障转移特性的分布式分数据库模式,由多个节点(node)组成。
作用:
① 数据分片
② 故障转移
③ 高性能
④ 高可用

  • 34
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值