Redis 主从复制
概述:什么是Redis主从复制,作用是什么
Redis主从复制是一种Redis数据库的复制方式,它通过将一个Redis实例(称为“主”)的数据复制到其他Redis实例(称为“从”)来实现数据的冗余备份和负载均衡。
主从复制的作用主要有以下几个方面:
- 数据冗余备份:通过主从复制,可以将主节点上的数据同步到多个从节点上,实现数据的冗余备份,提高数据的可用性和容错性。
- 负载均衡:通过将读请求分发到多个从节点上,可以减轻主节点的读取压力,实现负载均衡,提高系统的读取性能和并发能力。
- 高可用性:当主节点出现故障时,从节点可以接替主节点的工作,保证系统的可用性。
- 数据分析:通过将从节点设置为只读节点,可以将一些数据分析任务转移到从节点上,减少对主节点的影响,提高系统的稳定性和可靠性。
总的来说,Redis主从复制是一种重要的数据库复制方式,可以提高系统的可用性、可靠性和性能,广泛应用于各种互联网应用中。
实现原理:RDB和AOF两种同步方式
Redis主从复制的实现原理可以简单概括为以下几个步骤:
- 从服务器连接主服务器,发送 SYNC 命令
- 主服务器执行 BGSAVE 命令,生成 RDB 文件
- 主服务器将 RDB 文件发送给从服务器,并将之后的所有写命令缓存到内存中的“复制缓冲区”中
- 从服务器接收到 RDB 文件后,将其载入内存中,完成数据初始化
- 主服务器将内存中“复制缓冲区”中的写命令发送给从服务器,从服务器执行这些写命令,实现数据同步
- 当主服务器有新的写操作时,会将写操作记录到“复制缓冲区”中,并将该写操作发送给所有从服务器进行同步
通过这些步骤,Redis主从复制可以实现主服务器与从服务器之间的数据同步,从而提高了Redis的可用性和性能。 需要注意的是,Redis主从复制是异步复制,即主节点不会等待从节点完成复制操作,而是立即返回结果继续处理其他请求。因此,从节点可能会存在一定的数据延迟,但这通常不会对应用程序的正确性产生太大的影响。
另外,Redis主从复制还支持配置一主多从的复制模式,即一个主节点可以有多个从节点,从而实现更加灵活的负载均衡和容错备份。
配置和使用:如何配置主从复制,如何使用
主从搭建步骤
- 从Redis安装目录中拷贝一份
redis.conf文件到自己的目录下(myRedis) - 创建
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,记得修改对应端口号的配置。
- 启动6379,6380,6381 三个端口的redis实例,命令
redis-server redis6379.conf,如下图
- 连接端口是6379的实例,
redis-cli -h 192.168.0.84 -p 6379,使用命令info replication查看
同样的操作查看6380、6381端口实例
# 都有相同的这块信息,都是主节点,都没有从节点。
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查看
# 从节点
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实例设置为从节点。
- 主从同步,读写分离(从节点只读)
在主节点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查看
还是主库
从库重启重启不是从
我们在kill掉6380,kill -9 6380pid,然后在启动6380实例,使用info replication查看
发现已经变成独立主库了
从库独立成为主库
可以使用 SLAVEOF no one 命令来取消从库并恢复为独立的主库。
执行 SLAVEOF NO ONE 命令后,从节点将不会再与主节点同步,因此这个从节点会变成一个独立的节点.
Redis 哨兵模式
概述:什么是Redis哨兵模式,作用是什么
Redis哨兵模式是一种高可用性的解决方案,旨在管理Redis集群中的故障转移和自动故障恢复。它由Redis Sentinel进程组成,可以检测到Redis主节点的故障,并将其替换为备份数节点中的一个。Redis Sentinel还可以监视Redis实例的运行状况,并在需要时进行重启、迁移等操作。
Redis Sentinel的作用是帮助维护Redis集群的可用性和稳定性。当主节点故障时,Redis Sentinel可以自动将备份数的节点选举为新的主节点,并更新客户端配置,使客户端重新路由到新的主节点。这可以使Redis集群在主节点故障的情况下继续运行,保证服务的可靠性和稳定性。
实现原理:哨兵节点的选举和切换
Redis 哨兵模式主要由哨兵节点、主节点、从节点组成,下面是 Redis 哨兵模式的工作原理:
- 在 Redis 哨兵模式下,哨兵节点通过 Sentinel 集群管理器监控主节点和从节点的健康状态。
- 哨兵节点向主节点和从节点发送心跳包(PING 命令),并检查节点是否正常响应。
- 如果节点无响应,哨兵节点会通过 SENTINEL is-master-down-by-addr 命令检查主节点是否已经挂掉。如果节点确认主节点故障,则会发起选举操作。
- 在选举过程中,哨兵节点会向其他从节点、主节点和哨兵节点发送 SENTINEL sentinel get-master-addr-by-name 命令,获取主节点的地址和端口。
- 如果有多个哨兵节点同时发起选举,那么哨兵节点采用分布式协议进行选举,在选举过程中哨兵节点会互相通信,进行投票,选出优先级最高的哨兵节点作为主节点的新监督者,并协调重新建立主从复制关系。
- 新的主节点被选举出来后,哨兵节点会将新的主节点信息广播给其他从节点和哨兵节点,以便它们可以更新连接到正确的主节点地址和端口。
- 当旧主节点故障恢复时,哨兵节点会检测其健康状态,如果恢复正常,哨兵节点会将其重新加入集群,作为从节点。
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>:在哨兵节点发现主节点失效时,需要达成的主从节点数量最小要求,包括主节点和从节点。
- 首先我们启动三个redis实例。
- 设置好主从关系,查看主节点状态。
- 根据配置文件,启动三个哨兵
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
4. 查看哨兵信息状态,哨兵日志
- 关闭主节点6379redis实例。
可以看到自动切6380 是主节点,6379转换为了从节点。
在6380 info replication,可以看到变成主了,只有一个从。
6.现在启动6379,现在是从了,6380 有两个从节点
新主机选择调节依次为:
1 优先级别配置默认 replica-priority 100,越小优先级越高
2 偏移量是指获取原主机数据最全的,选择偏移量大的
3 选择runid最小的服务,每个redis实例启动后都会随机生成一个40位的runid
Redis 集群
概述:什么是Redis集群,作用是什么
Redis 集群是一种分布式部署模式,用于在多个节点之间水平扩展 Redis 数据库,并提供高可用性和容错能力。Redis 集群将数据分片分布到多个节点上,使得每个节点只负责处理部分数据,从而提高整个系统的吞吐量和性能。
Redis 集群的主要作用包括:
- 水平扩展:通过将数据分布在多个节点上,Redis 集群可以实现水平扩展,增加存储容量和处理能力。每个节点只负责处理部分数据,从而使系统能够处理更多的请求和负载。
- 高可用性:Redis 集群提供了内置的故障转移和自动数据迁移机制,当节点发生故障或添加新节点时,集群会自动进行重新分片和重新分配数据,以保证系统的可用性。即使有部分节点发生故障,集群仍然可以继续正常运行。
- 容错能力:Redis 集群通过使用数据分片和复制机制来提供容错能力。每个数据分片都有多个复制节点,当主节点发生故障时,可以从复制节点中选举新的主节点,从而保证数据的可用性和持久性。
- 自动数据平衡:Redis 集群会自动进行数据分片和数据迁移,使每个节点上的数据量尽量平衡。当新增或移除节点时,集群会自动重新分配数据,以实现负载均衡和数据均衡。
- 简化管理和操作:Redis 集群提供了集中管理和操作多个节点的能力,可以通过一个统一的入口点来访问整个集群。集群会自动处理节点的发现和通信,简化了集群管理的复杂性。
总之,Redis 集群通过水平扩展、高可用性、容错能力和自动数据平衡等特性,为大规模的数据存储和高性能应用提供了解决方案。它允许将数据分布到多个节点上,实现数据的并行处理和快速访问,同时提供了故障转移和自动化的数据管理机制,以保证系统的可用性和稳定性。
实现原理:哈希槽的分配和迁移
在 Redis 集群中,使用哈希槽(Hash Slot)来分配和迁移数据。哈希槽是一个逻辑上的概念,将数据的键(key)划分到固定数量的槽中,通常是 16384 个槽。
以下是 Redis 集群中哈希槽的分配和迁移的工作原理:
-
哈希槽的分配:
- 当集群启动时,每个节点都被分配一部分哈希槽,保证整个集群的所有槽被覆盖。
- 哈希槽的分配是通过对键进行哈希运算得到的哈希值来决定的,然后根据哈希值与槽的数量进行取模运算来确定键所属的槽。
-
数据的分布:
- 当客户端发送请求到 Redis 集群时,集群会根据请求的键对应的哈希值,确定键所属的槽。
- 根据槽的分配信息,集群会将请求发送到负责该槽的节点上进行处理。
-
哈希槽的迁移:
- 当需要添加或移除节点时,或者哈希槽的分布不均匀时,集群会进行哈希槽的迁移。
- 哈希槽的迁移是自动进行的,集群会在节点之间传输数据,并将槽从一个节点移动到另一个节点。
- 迁移过程中,源节点会将槽中的数据复制到目标节点,并在完成复制后删除源节点的数据。
哈希槽的分配和迁移过程在 Redis 集群中是自动进行的,并且是透明的,不需要用户手动干预。集群会根据节点的增减、故障恢复以及数据分布不均等情况,动态地进行槽的分配和迁移,以实现数据的负载均衡和高可用性。
配置和使用:如何配置Redis集群,如何使用
1 设置redis配置文件,启动六个redis实例,搭建一个三主三从的集群。
cluster-enabled yes #设置集群模式
cluster-config-file nodes-6381.conf #设置集群配置文件名
cluster-node-timeout 15000 #在15秒内没有收到来自其他节点的有效回复,它将被视为不可用或下线,并触发故障转移机制。
依次使用redis-server redis6379.conf创建好六个实例
可以看到生成了对应集群配置文件`nodes-6381.conf`
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
3 连接集群实例、查看相关信息、简单的操作命令
连接集群实例指令redis-cli -c -h 192.168.0.84 -p 6379
查看集群信息cluster nodes
批量set操作 mset rcc{user} lucy age{user} 20,
只能看自己实例插槽中的值,看不了别的实例插槽中的(如下图可以见连接的是6379,set后到了6380)。计算插槽key中有几个键cluster countkeysinslot 5474
4 cluster-require-full-coverage默认为yes,即是否集群中的所有节点都是在线状态且16384个槽都处于服务状态时,集群才会提供服务,集群中16384个槽全部处于服务状态,保证集群完整性,当某个节点故障或者正在故障转移时获取数据会提示:(error)CLUSTERDOWN The cluster is down,设置为no,就允许部分插槽处于不可服务状态。
5 关闭6380实例,shutdown,
连接一个可用实例,查看节点信息,可以看到6390已经替代6380成为了主节点
查看我们在6380 上添加的数据
重新启动6380的实例,将作为从节点加入集群
Redis主从复制、哨兵模式和集群的优缺点和适用场景
| 主从 | 哨兵 | 集群 | |
|---|---|---|---|
| 优点 | 1.可以提高Redis的可用性,实现读写分离,提高读取性能。 2.可以在从节点上执行备份、恢复等操作,不影响主节点的性能。 3.可以通过增加从节点的数量来提高系统的读取性能和负载均衡能力。 | 1.可以实现自动化的故障转移,提高了Redis的可用性。 2.可以自动检测主节点的状态,实现主从切换。 | 1.可以自动将数据分片存储,实现数据的水平扩展。 2.可以实现自动化的故障转移和节点的增加和删除。 |
| 缺点 | 1.主节点故障时需要手动进行故障转移,不够自动化。 2.从节点的数据可能与主节点存在一定的延迟,不够实时。 | 1.对于哨兵节点的数量有一定的要求,过少的哨兵节点可能导致故障转移失败。 2.故障转移需要一定的时间,可能会影响系统的性能。 | 1.对于Redis命令的支持存在一定的限制,不是所有的命令都支持集群模式。 2.对于数据的访问和路由有一定的复杂度,需要对客户端进行特殊的支持。 |
| 适用场景 | 1.适用于读多写少的场景,如缓存、计数器、排行榜等应用。 2.适用于数据备份、恢复等场景。 | 1.适用于需要高可用性、但对数据实时性要求不是很高的场景,如任务队列等应用。 | 1.适用于需要大规模存储数据和实时访问数据的场景,如大型互联网应用等。 |
总的来说,Redis主从复制、哨兵模式和集群模式都有各自的适用场景,需要根据实际需求和业务场景进行选择和配置。