Redis 主从复制、哨兵模式、Cluster集群简介

149 阅读16分钟

Redis 主从复制

概述:什么是Redis主从复制,作用是什么

Redis主从复制是一种Redis数据库的复制方式,它通过将一个Redis实例(称为“主”)的数据复制到其他Redis实例(称为“从”)来实现数据的冗余备份和负载均衡。

主从复制的作用主要有以下几个方面:

  1. 数据冗余备份:通过主从复制,可以将主节点上的数据同步到多个从节点上,实现数据的冗余备份,提高数据的可用性和容错性。
  2. 负载均衡:通过将读请求分发到多个从节点上,可以减轻主节点的读取压力,实现负载均衡,提高系统的读取性能和并发能力。
  3. 高可用性:当主节点出现故障时,从节点可以接替主节点的工作,保证系统的可用性。
  4. 数据分析:通过将从节点设置为只读节点,可以将一些数据分析任务转移到从节点上,减少对主节点的影响,提高系统的稳定性和可靠性。

总的来说,Redis主从复制是一种重要的数据库复制方式,可以提高系统的可用性、可靠性和性能,广泛应用于各种互联网应用中。

实现原理:RDB和AOF两种同步方式

Redis主从复制的实现原理可以简单概括为以下几个步骤:

  1. 从服务器连接主服务器,发送 SYNC 命令
  2. 主服务器执行 BGSAVE 命令,生成 RDB 文件
  3. 主服务器将 RDB 文件发送给从服务器,并将之后的所有写命令缓存到内存中的“复制缓冲区”中
  4. 从服务器接收到 RDB 文件后,将其载入内存中,完成数据初始化
  5. 主服务器将内存中“复制缓冲区”中的写命令发送给从服务器,从服务器执行这些写命令,实现数据同步
  6. 当主服务器有新的写操作时,会将写操作记录到“复制缓冲区”中,并将该写操作发送给所有从服务器进行同步

通过这些步骤,Redis主从复制可以实现主服务器与从服务器之间的数据同步,从而提高了Redis的可用性和性能。 需要注意的是,Redis主从复制是异步复制,即主节点不会等待从节点完成复制操作,而是立即返回结果继续处理其他请求。因此,从节点可能会存在一定的数据延迟,但这通常不会对应用程序的正确性产生太大的影响。

另外,Redis主从复制还支持配置一主多从的复制模式,即一个主节点可以有多个从节点,从而实现更加灵活的负载均衡和容错备份。

配置和使用:如何配置主从复制,如何使用

主从搭建步骤

  1. 从Redis安装目录中拷贝一份redis.conf文件到自己的目录下(myRedis
  2. 创建redis6379.conf,并修改如下配置
# 此处最好绝对路径
include xxxxxx/myRedis/redis.conf 
# 进程pid文件
pidfile "/var/run/redis_6379.pid"
# 端口
port 6379
# RDB文件名称
dbfilename "dump6379.rdb"
# 日志目录
logfile "xxxxxxx/myRedis/log/redis_err_6379.log"

同样的配置创建redis6380.conf,redis6381.conf,记得修改对应端口号的配置。

  1. 启动6379,6380,6381 三个端口的redis实例,命令redis-server redis6379.conf,如下图
截屏2023-05-06 下午4.14.24.png
  1. 连接端口是6379的实例,redis-cli -h 192.168.0.84 -p 6379,使用命令info replication查看

截屏2023-04-29 下午4.22.11.png

同样的操作查看6380、6381端口实例

截屏2023-04-29 下午4.22.43.png

截屏2023-04-29 下午4.22.52.png

# 都有相同的这块信息,都是主节点,都没有从节点。
role:master # 主节点
connected_slaves:0 # 连接从节点数量

5.设置主库, SLAVEOF 是 Redis 命令之一,用于将一个 Redis 服务器设置为另一个 Redis 服务器的从库。在运行 SLAVEOF 命令之后,从库会开始持续地接收来自主库的数据同步更新。

SLAVEOF 命令的语法如下:

SLAVEOF host port

其中,host 和 port 是主库的地址和端口号。

在6380、6381实例中设置slaveof 192.168.0.84 6379,使用info replication查看

截屏2023-05-06 下午5.00.03.png

 #  从节点
 role:slave 
 
 # 主节点ip
 master_host:192.168.0.84

 # 主节点端口
 master_port:6379

 # 主节点状态
 master_link_status:up

 master_last_io_seconds_ago:5

 master_sync_in_progress:0

在6379实例上使用info replication查看,可以看到角色是主节点,有一个从节点。同样的方式将6381实例设置为从节点。

截屏2023-05-06 下午5.07.49.png

  1. 主从同步,读写分离(从节点只读)

在主节点6379,set chian bast

    192.168.0.84:6379> set china best
    OK
    192.168.0.84:6379>

在从节点6380 上查看,

    192.168.0.84:6380> get china
    "best"
    192.168.0.84:6380>

在从节点6380 上设置key

    192.168.0.84:6380> set beijing best

    (error) READONLY You can't write against a read only replica.

    192.168.0.84:6380>

7. 主库重启、从库重启、从库独立成为主库

主库重启还是主

我们在kill掉6379,kill -9 6379pid,然后在启动6379实例,使用info replication查看 还是主库

截屏2023-05-09 下午4.01.03.png

从库重启重启不是从

我们在kill掉6380,kill -9 6380pid,然后在启动6380实例,使用info replication查看 发现已经变成独立主库了

截屏2023-05-09 下午3.58.13.png

从库独立成为主库

可以使用 SLAVEOF no one 命令来取消从库并恢复为独立的主库。 执行 SLAVEOF NO ONE 命令后,从节点将不会再与主节点同步,因此这个从节点会变成一个独立的节点.

Redis 哨兵模式

概述:什么是Redis哨兵模式,作用是什么

Redis哨兵模式是一种高可用性的解决方案,旨在管理Redis集群中的故障转移和自动故障恢复。它由Redis Sentinel进程组成,可以检测到Redis主节点的故障,并将其替换为备份数节点中的一个。Redis Sentinel还可以监视Redis实例的运行状况,并在需要时进行重启、迁移等操作。

Redis Sentinel的作用是帮助维护Redis集群的可用性和稳定性。当主节点故障时,Redis Sentinel可以自动将备份数的节点选举为新的主节点,并更新客户端配置,使客户端重新路由到新的主节点。这可以使Redis集群在主节点故障的情况下继续运行,保证服务的可靠性和稳定性。

实现原理:哨兵节点的选举和切换

Redis 哨兵模式主要由哨兵节点、主节点、从节点组成,下面是 Redis 哨兵模式的工作原理:

  1. 在 Redis 哨兵模式下,哨兵节点通过 Sentinel 集群管理器监控主节点和从节点的健康状态。
  2. 哨兵节点向主节点和从节点发送心跳包(PING 命令),并检查节点是否正常响应。
  3. 如果节点无响应,哨兵节点会通过 SENTINEL is-master-down-by-addr 命令检查主节点是否已经挂掉。如果节点确认主节点故障,则会发起选举操作。
  4. 在选举过程中,哨兵节点会向其他从节点、主节点和哨兵节点发送 SENTINEL sentinel get-master-addr-by-name 命令,获取主节点的地址和端口。
  5. 如果有多个哨兵节点同时发起选举,那么哨兵节点采用分布式协议进行选举,在选举过程中哨兵节点会互相通信,进行投票,选出优先级最高的哨兵节点作为主节点的新监督者,并协调重新建立主从复制关系。
  6. 新的主节点被选举出来后,哨兵节点会将新的主节点信息广播给其他从节点和哨兵节点,以便它们可以更新连接到正确的主节点地址和端口。
  7. 当旧主节点故障恢复时,哨兵节点会检测其健康状态,如果恢复正常,哨兵节点会将其重新加入集群,作为从节点。

Redis 哨兵模式的工作原理解释了哨兵如何在主节点失效时发起选举、如何协调故障恢复和如何自动重连到新的主节点。哨兵模式对于一个高度可靠的 Redis 部署至关重要,它提供了高度可靠的自动故障检测和切换机制,以确保 Redis 集群无故障地运行。

配置和使用:如何配置哨兵模式,如何使用

在Redis哨兵模式中,通过sentinel monitor命令来配置需要监控的Redis主节点。该命令的语法如下:

sentinel monitor <master-group-name> <ip> <port> <quorum>

其中,各个参数的含义如下:

  • <master-group-name>:Redis主节点的名称,可以自定义,但要求在哨兵集群中唯一;
  • <ip>:Redis主节点的IP地址;
  • <port>:Redis主节点的端口号;
  • <quorum>:在哨兵节点发现主节点失效时,需要达成的主从节点数量最小要求,包括主节点和从节点。
  1. 首先我们启动三个redis实例。 截屏2023-05-16 下午4.52.18.png
  2. 设置好主从关系,查看主节点状态。截屏2023-05-16 下午5.02.03.png
  3. 根据配置文件,启动三个哨兵
port 26380
bind 192.168.0.84
daemonize yes
logfile "xxx/myRedis/log/sentinel_26380.log"

sentinel monitor mymaster 192.168.0.84 6380 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
  • sentinel down-after-milliseconds:在主节点失效后,哨兵节点等待多长时间将主节点标记为不可用。
  • sentinel failover-timeout:执行故障转移的超时时间。

哨兵实例启动:redis-sentinel sentinel26379.conf

截屏2023-05-16 下午5.05.57.png 4. 查看哨兵信息状态,哨兵日志

截屏2023-05-16 下午5.10.59.png

  1. 关闭主节点6379redis实例。 截屏2023-05-16 下午5.12.05.png

可以看到自动切6380 是主节点,6379转换为了从节点。

截屏2023-05-16 下午5.13.51.png

在6380 info replication,可以看到变成主了,只有一个从。

截屏2023-05-16 下午5.15.27.png

6.现在启动6379,现在是从了,6380 有两个从节点

截屏2023-05-16 下午5.17.09.png

截屏2023-05-16 下午5.17.35.png

新主机选择调节依次为:

1 优先级别配置默认  replica-priority 100,越小优先级越高

2 偏移量是指获取原主机数据最全的,选择偏移量大的

3 选择runid最小的服务,每个redis实例启动后都会随机生成一个40位的runid

Redis 集群

概述:什么是Redis集群,作用是什么

Redis 集群是一种分布式部署模式,用于在多个节点之间水平扩展 Redis 数据库,并提供高可用性和容错能力。Redis 集群将数据分片分布到多个节点上,使得每个节点只负责处理部分数据,从而提高整个系统的吞吐量和性能。

Redis 集群的主要作用包括:

  1. 水平扩展:通过将数据分布在多个节点上,Redis 集群可以实现水平扩展,增加存储容量和处理能力。每个节点只负责处理部分数据,从而使系统能够处理更多的请求和负载。
  2. 高可用性:Redis 集群提供了内置的故障转移和自动数据迁移机制,当节点发生故障或添加新节点时,集群会自动进行重新分片和重新分配数据,以保证系统的可用性。即使有部分节点发生故障,集群仍然可以继续正常运行。
  3. 容错能力:Redis 集群通过使用数据分片和复制机制来提供容错能力。每个数据分片都有多个复制节点,当主节点发生故障时,可以从复制节点中选举新的主节点,从而保证数据的可用性和持久性。
  4. 自动数据平衡:Redis 集群会自动进行数据分片和数据迁移,使每个节点上的数据量尽量平衡。当新增或移除节点时,集群会自动重新分配数据,以实现负载均衡和数据均衡。
  5. 简化管理和操作:Redis 集群提供了集中管理和操作多个节点的能力,可以通过一个统一的入口点来访问整个集群。集群会自动处理节点的发现和通信,简化了集群管理的复杂性。

总之,Redis 集群通过水平扩展、高可用性、容错能力和自动数据平衡等特性,为大规模的数据存储和高性能应用提供了解决方案。它允许将数据分布到多个节点上,实现数据的并行处理和快速访问,同时提供了故障转移和自动化的数据管理机制,以保证系统的可用性和稳定性。

实现原理:哈希槽的分配和迁移

在 Redis 集群中,使用哈希槽(Hash Slot)来分配和迁移数据。哈希槽是一个逻辑上的概念,将数据的键(key)划分到固定数量的槽中,通常是 16384 个槽。

以下是 Redis 集群中哈希槽的分配和迁移的工作原理:

  1. 哈希槽的分配:

    • 当集群启动时,每个节点都被分配一部分哈希槽,保证整个集群的所有槽被覆盖。
    • 哈希槽的分配是通过对键进行哈希运算得到的哈希值来决定的,然后根据哈希值与槽的数量进行取模运算来确定键所属的槽。
  2. 数据的分布:

    • 当客户端发送请求到 Redis 集群时,集群会根据请求的键对应的哈希值,确定键所属的槽。
    • 根据槽的分配信息,集群会将请求发送到负责该槽的节点上进行处理。
  3. 哈希槽的迁移:

    • 当需要添加或移除节点时,或者哈希槽的分布不均匀时,集群会进行哈希槽的迁移。
    • 哈希槽的迁移是自动进行的,集群会在节点之间传输数据,并将槽从一个节点移动到另一个节点。
    • 迁移过程中,源节点会将槽中的数据复制到目标节点,并在完成复制后删除源节点的数据。

哈希槽的分配和迁移过程在 Redis 集群中是自动进行的,并且是透明的,不需要用户手动干预。集群会根据节点的增减、故障恢复以及数据分布不均等情况,动态地进行槽的分配和迁移,以实现数据的负载均衡和高可用性。

配置和使用:如何配置Redis集群,如何使用

1 设置redis配置文件,启动六个redis实例,搭建一个三主三从的集群。

    cluster-enabled yes #设置集群模式
    cluster-config-file nodes-6381.conf #设置集群配置文件名
    cluster-node-timeout 15000 #在15秒内没有收到来自其他节点的有效回复,它将被视为不可用或下线,并触发故障转移机制。
    

依次使用redis-server redis6379.conf创建好六个实例

截屏2023-05-24 16.35.22.png

截屏2023-05-24 16.35.57.png

可以看到生成了对应集群配置文件`nodes-6381.conf`

截屏2023-05-24 16.37.18.png

2 启动redis集群

这里使用的是redis 7,已经有ruby环境,旧版本需要装ruby环境。使用如下命了

./redis-cli --cluster create <node1_host>:<node1_port> <node2_host>:<node2_port> ... <nodeN_host>:<nodeN_port> --cluster-replicas <num_replicas>

  • <nodeX_host> 替换为每个节点的主机名或 IP 地址,<nodeX_port> 替换为每个节点的端口号。 <num_replicas> 是每个主节点要创建的从节点数量。
  • 在确认提示时,输入 yes 确认创建集群。
redis-cli --cluster create --cluster-replicas 1 192.168.0.84:6379 192.168.0.84:6380 192.168.0.84:6381 192.168.0.84:6389 192.168.0.84:6390 192.168.0.84:6391

截屏2023-05-24 16.40.52.png

截屏2023-05-24 16.41.00.png

3 连接集群实例、查看相关信息、简单的操作命令

连接集群实例指令redis-cli -c -h 192.168.0.84 -p 6379

查看集群信息cluster nodes

截屏2023-05-24 16.49.37.png

批量set操作 mset rcc{user} lucy age{user} 20, 只能看自己实例插槽中的值,看不了别的实例插槽中的(如下图可以见连接的是6379,set后到了6380)。计算插槽key中有几个键cluster countkeysinslot 5474

截屏2023-05-24 16.52.25.png

4 cluster-require-full-coverage默认为yes,即是否集群中的所有节点都是在线状态且16384个槽都处于服务状态时,集群才会提供服务,集群中16384个槽全部处于服务状态,保证集群完整性,当某个节点故障或者正在故障转移时获取数据会提示:(error)CLUSTERDOWN The cluster is down,设置为no,就允许部分插槽处于不可服务状态。

5 关闭6380实例,shutdown,

截屏2023-05-24 17.05.40.png

连接一个可用实例,查看节点信息,可以看到6390已经替代6380成为了主节点 截屏2023-05-24 17.06.34.png

查看我们在6380 上添加的数据

截屏2023-05-24 17.10.41.png

重新启动6380的实例,将作为从节点加入集群

截屏2023-05-24 17.12.22.png

Redis主从复制、哨兵模式和集群的优缺点和适用场景

主从哨兵集群
优点1.可以提高Redis的可用性,实现读写分离,提高读取性能。
2.可以在从节点上执行备份、恢复等操作,不影响主节点的性能。
3.可以通过增加从节点的数量来提高系统的读取性能和负载均衡能力。
1.可以实现自动化的故障转移,提高了Redis的可用性。
2.可以自动检测主节点的状态,实现主从切换。
1.可以自动将数据分片存储,实现数据的水平扩展。
2.可以实现自动化的故障转移和节点的增加和删除。
缺点1.主节点故障时需要手动进行故障转移,不够自动化。
2.从节点的数据可能与主节点存在一定的延迟,不够实时。
1.对于哨兵节点的数量有一定的要求,过少的哨兵节点可能导致故障转移失败。
2.故障转移需要一定的时间,可能会影响系统的性能。
1.对于Redis命令的支持存在一定的限制,不是所有的命令都支持集群模式。
2.对于数据的访问和路由有一定的复杂度,需要对客户端进行特殊的支持。
适用场景1.适用于读多写少的场景,如缓存、计数器、排行榜等应用。
2.适用于数据备份、恢复等场景。
1.适用于需要高可用性、但对数据实时性要求不是很高的场景,如任务队列等应用。1.适用于需要大规模存储数据和实时访问数据的场景,如大型互联网应用等。

总的来说,Redis主从复制、哨兵模式和集群模式都有各自的适用场景,需要根据实际需求和业务场景进行选择和配置。