前置内容:使用docker安装redis、常用五大基本数据类型、Jedis操作Redis、Spring整合Redis
一、使用docker安装redis :
先查看端口是否被占用:lsof -i:6379
docker run --name some-redis -d -it -p 6379:6379 redis --requirepass "密码" --appendonly yes
之后使用docker ps
命令查看redis容器是否成功运行。
记得在云服务器防火墙处开放端口6379
二、非docker安装redis
使用su -
切换到root用户,然后依次执行以下命令:
1.安装依赖项
apt -y install curl gpg lsb-release
2.添加商店凭据
curl -fsSL https://packages.redis.io/gpg | gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main"| tee /etc/apt/sources.list.d/redis.list
3.更新apt然后安装redis
apt update
apt -y install redis
如何证明安装成功
cd /etc/redis
ls
# 如果ls的结果中有一个文件叫redis.conf, 表示安装成功
关闭自动启动的redis
安装完成后 会以默认配置文件的方式启动
如何证明redis已经启动了, ps -ef | grep redis
默认的方式不可用 所以需要先停止一下redis程序
默认的安装方式, redis是失败重启, redis会自动的启动起来, 需要先关闭一下redis。
linux中查看redis是否正在运行 ps -ef | grep redis
, 如果有显示结果, 表示redis服务正在运行
如果结果如下,表明没有redis服务正在启动, 3718是当前查询redis的进程id
root@VM-24-6-ubuntu:/etc/redis# ps -ef | grep redis
root 3718 513 0 01:06 pts/1 00:00:00 grep --color=auto redis
如果有redis相关的程序, 使用kill -9 进程id
关闭
如果kill -9 命令没有关闭这个服务,后续发现这个服务仍然存在, 使用下面的命令关闭redis 关闭自动启动功能
/etc/init.d/redis-server stop
编辑配置文件redis.conf
编辑配置文件进行修改vi /etc/redis/redis.conf
使用“/
”进行查找操作,然后修改相关配置
- 修改端口
port 后面的值改成 26379 - 修改密码
requirepass 后面的值即为redis密码
密码设置一定要简单, 推荐用同一个密码,方便后续集群搭建 - 注释bind,即在这行最前面加上“
#
”
bind命令,默认是存在的, 会强行要求,只有本机能访问redis服务 - 随后保存并退出这个配置文件
启动redis服务
启动redis服务之前先确保当前没有已启动的redis服务 ps -ef | grep redis
启动redis服务(启动完后需要ps命令再查看一次确保成功启动)
redis-server /etc/redis/redis.conf
输入命令连接redis
redis-cli -p 26379
# 显示如下内容,表示连接成功,也表明redis彻底安装成功
127.0.0.1:26379>
auth 密码
输入密码认证
auth 密码密码
set name zhangsan
get name
使用exit
命令退出出来
后续需要ps命令再查看一次
三、redis中主从、哨兵和集群这三个有什么区别
Redis 中的主从复制、哨兵(Sentinel)和集群(Cluster)是用于构建高可用和扩展性的不同技术和架构。它们有以下主要区别:
- 主从复制(Replication):
- 主从复制是 Redis 最基本的高可用技术,它用于创建多个 Redis 服务器的副本,其中一个服务器是主服务器,其余是从服务器。
- 主服务器负责处理写操作,从服务器负责复制主服务器的数据,从而实现数据备份和读取负载均衡。
- 主从复制适用于读多写少的应用场景,但不具备自动故障切换功能。
- 哨兵(Sentinel):
- 哨兵是 Redis 提供的一种用于监控和自动故障恢复的服务。它可以监控多个 Redis 主从复制架构的节点。
- 哨兵集群通常由多个哨兵节点和多个主从复制节点组成。哨兵负责监控主服务器的状态,当主服务器发生故障时,哨兵会选举一个从服务器升级为主服务器。
- 哨兵提供了自动故障切换和故障恢复的能力,增加了系统的可用性。
- 集群(Cluster):
- 集群是 Redis 提供的一种用于分布式存储和高可用的解决方案。它可以将数据分布在多个节点上,实现水平扩展。
- Redis 集群通常包括多个节点,每个节点可以容纳数据的一部分。集群使用分区机制将数据分散存储在不同节点上。
- 集群提供了自动数据分片和负载均衡的功能,支持故障转移和自动恢复,具有很高的可用性和可伸缩性。
综上所述,主从复制适用于单一节点的备份和读取负载均衡,哨兵用于监控和自动故障切换,而集群适用于大规模分布式存储和高可用性需求。在选择使用哪种技术和架构时,需要根据应用的需求和规模来决定。
四、集群 非docker方式
容量不够,redis 如何进行扩容?
并发写操作, redis 如何分摊?
主从模式,薪火相传模式,主机宕机,导致 ip 地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息。
1、在一台服务器上搭建 Redis 集群
注意: 之前开启的redis服务记得都关闭
注意: 在root用户下执行
在/etc/redis/
目录下创建cluster
文件夹, 在cluster文件夹
- 创建1份配置文件, 起名为
redis26383.conf
在这个配置文件中, 粘贴如下配置
# 以redis26383.conf为例
include /etc/redis/redis.conf
pidfile /var/run/redis_26383.pid
# 更改
port 26383
# 更改
dbfilename dump26383.rdb
# 更改
masterauth 密码密码
cluster-enabled yes
# 打开集群模式
cluster-config-file nodes-26383.conf
# 设置节点配置文件名称,需要更改
cluster-node-timeout 15000
# 设置节点失联时间,超过该时间(ms),集群自动进行主从切换
注意 : 主配置文件密码需要也修改对应的密码,保证一样
然后复制刚刚的 配置, 复制出来五份,别名为redis26384.conf、redis26385.conf、redis26386.conf、redis26387.conf、redis26388.conf
cp redis26383.conf redis26384.conf
cp redis26383.conf redis26385.conf
cp redis26383.conf redis26386.conf
......
将配置文件中的“26386”修改为对应的文件名称,比如说: redis26384.conf
文件应修改为如下代码
# 以redis26384.conf为例
include /etc/redis/redis.conf
pidfile /var/run/redis_26384.pid
# 更改
port 26384
# 更改
dbfilename dump26384.rdb
# 更改
masterauth 密码密码
cluster-enabled yes
# 打开集群模式
cluster-config-file nodes-26384.conf
# 设置节点配置文件名称,需要更改
cluster-node-timeout 15000
# 设置节点失联事件,超过该时间(ms),集群自动进行主从切换
记得暴露相应端口号
然后根据六个配置文件启动六个redis
redis-server redis26383.conf
redis-server redis26384.conf
......
redis-server redis26388.conf
每个服务启动后, 必须使用ps -ef | grep redis
命令确保成功启动
redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口,所以防火墙至少开放12个端口
集群总线端口为redis客户端连接的端口 + 10000 :如redis端口为26383,则集群总线端口为36383
故所有服务器的点需要开通redis的客户端连接端口和集群总线端口,具体情况如下:
启动6个redis 其中三个是主节点 另外三个是备胎
redis-cli -a 密码密码 --cluster create --cluster-replicas 1 服务器IP地址:26383 服务器IP地址:26384 服务器IP地址:26385 服务器IP地址:26386 服务器IP地址:26387 服务器IP地址:26388
- 采用集群策略连接
注意: 一定要使用集群策略链接, redis-cli -c连接, 旧的方式连接后输入命令会报错
redis-cli -c -p 26383
进入到集群之后输入cluster nodes
命令查看集群信息
2、在不同的服务器上搭建 Redis 集群
与在同一台服务器上搭建集群的步骤基本相同,只不过需要分别在三台服务器上进行conf文件配置并且启动redis服务。
本次我们选取三台服务器,每台服务器上启动两个redis,然后在任意一台机器上执行创建建 Redis 集群的命令
要在三个不同的服务器上搭建 Redis 集群,需要确保每个服务器上都已经正确安装和配置了 Redis,并且它们可以相互通信。
- 准备三台服务器: 准备三台服务器,每台服务器上都安装了 Redis,并且服务器之间可以互相通信。确保服务器之间的防火墙和网络配置允许 Redis 节点之间的通信。
- 配置 Redis 节点: 在每台服务器上,编辑 Redis 配置文件以指定节点的端口号和集群配置。配置文件通常位于 Redis 安装目录的
redis.conf
文件。确保在配置文件中设置了以下选项:
port 26383 # 每个节点的端口号需要不同
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-require-full-coverage no
cluster-migration-barrier 1
详细配置文件见本文【1、在一台服务器上搭建 Redis 集群】
请注意,每个节点的端口号需要不同。你可以在不同服务器上创建相应数量的节点。
- 启动 Redis 节点: 在每台服务器上启动 Redis 节点,使用以下命令:
redis-server redis26383.conf
请在每台服务器上使用不同的配置文件路径。
- 创建 Redis 集群: 现在,你可以使用
redis-cli
工具创建 Redis 集群。在其中一台服务器上执行以下命令,指定所有节点的 IP 地址和端口号:
redis-cli -a 密码密码 --cluster create --cluster-replicas 1 服务器A:26383 服务器A:26384 服务器B:26385 服务器B:26386 服务器C:26387 服务器C:26388
确保所有节点的 IP 地址和端口号正确。
- 等待集群创建完成: 集群创建过程可能需要一些时间。请等待集群创建完成,并确保没有出现错误消息。
- 验证集群状态: 使用以下命令来验证 Redis 集群的状态:
redis-cli -c -a 密码
cluster nodes
这将显示集群中的节点信息,以确保集群已正确创建。
一旦完成以上步骤,就在三台不同的服务器上成功搭建了 Redis 集群。确保维护好集群的健康状态,包括监控和备份,以确保数据的安全和可用性。
五、集群启动失败恢复方式
- 关闭所有已启动的redis节点
使用kill命令杀掉相应进程即可 - 删除集群相关文件
位于/var/lib/redis
里面的所有文件都要删除掉 - 自行 检查六份配置文件有没有 改错地方 , 12个端口是否开放, 启动所有Redis节点
启动命令:redis-server redis.conf
- 重新启动集群
六、集群的一些概念
slots(槽)
在 Redis 集群中,slots(槽)是用于分区数据的单位。Redis 集群将整个数据集分为 16384 个槽,每个槽可以存储一个键值对。槽的编号从 0 到 16383。
下面是有关 Redis 集群中 slots 的一些关键信息:
- 数据分片:Redis 集群使用数据分片来分布数据,每个节点负责管理其中的一部分槽和数据。槽的分配在集群启动时由一个或多个节点共同协商完成。
- 槽的分配:在创建 Redis 集群时,您可以手动指定槽的分配,或者让集群根据节点数量进行均匀分配。在您的命令中,使用
--cluster-create
标志和--cluster-replicas
指定槽的分配和副本。 - 录入值:要在集群中录入值,首先需要确定键属于哪个槽。然后,将键值对发送到管理该槽的节点。您可以使用
redis-cli
连接到集群并执行以下命令:
redis-cli -c -h <cluster-node-host> -p <cluster-node-port>
然后使用 SET
命令录入值:
SET key value
Redis 集群会自动将键值对存储在正确的槽上。
- 查询值:与录入值类似,要查询集群中的值,您需要连接到集群的某个节点,然后执行
GET
等命令。 - 故障恢复:Redis 集群具有自动故障恢复的功能。
当某个节点发生故障时,集群会自动将槽迁移到其他可用节点,并选举新的主节点。这确保了高可用性。
故障恢复
在 Redis 集群中,如果一个主节点下线,Redis 的故障恢复机制会自动选择一个从节点升级为主节点,以确保集群的高可用性。以下是 Redis 集群中主节点下线时的故障恢复过程:
- 主节点下线检测: Redis 集群会定期检测各个节点的可用性。如果一个主节点在一定时间内没有响应,集群将认为该主节点下线。
- 选举从节点: 一旦主节点下线,集群将从当前的从节点中选择一个作为新的主节点。选举过程中,Redis 集群会考虑各个从节点的复制偏移量(replication offset)以及其他因素来选择新的主节点。通常情况下,复制偏移量更接近主节点的从节点将被选举为新的主节点。
- 配置更新: 一旦新的主节点选举完成,Redis 集群将更新集群配置,将新的主节点添加到配置中,并将原来的主节点标记为下线状态。这个过程会导致集群的配置文件
nodes.conf
发生变化。 - 通知其他节点: 新的主节点会通知其他节点关于配置的变化,以确保集群中的所有节点都知道主节点的更改。
- 数据同步: 新的主节点会开始与其他从节点进行数据同步,以确保它们的数据与新的主节点一致。这个过程可能需要一些时间,具体取决于数据量和网络速度。
- 故障恢复完成: 一旦数据同步完成,新的主节点将对外提供服务,故障恢复过程完成。
需要注意的是,整个故障恢复过程通常在几秒到十几秒之间完成,但这取决于集群的配置和负载情况。在 Redis 集群中,故障恢复是自动进行的,无需手动干预。
我们在配置文件中设置的节点失联时间为15秒,超过15秒,集群自动进行主从切换
cluster-node-timeout 15000
# 设置节点失联时间,超过该时间(ms),集群自动进行主从切换
配置哨兵来实现自动故障转移的优点
在 Redis 集群中,还可以配置哨兵(Sentinel)来进一步监控和管理主节点和从节点,以提高故障恢复的可靠性和自动化程度。哨兵可以在主节点下线时自动进行故障转移。
之前的疑惑:集群不是可以在超过节点失联时间时自动实现主从切换吗,为什么这段话还提出集群要配置哨兵来实现自动故障转移呢?
==========
在 Redis 集群中,当主节点失联时,集群本身是能够自动进行故障转移的,从而选择一个从节点升级为新的主节点。这是因为 Redis 集群具备自动发现、故障检测和故障转移的机制。然而,虽然 Redis 集群能够处理主节点的故障转移,但是这个过程可能会有一些延迟。当主节点失联时,Redis集群需要一些时间来检测主节点的失联情况,然后选举一个新的主节点,这个过程可能需要数秒到数十秒不等的时间。在这段时间内,客户端可能无法连接到一个可用的主节点,从而导致一段时间的不可用。
为了进一步提高 Redis 集群的可靠性和自动化程度,以及减小故障发生时的延迟,可以配置哨兵(Sentinel)。哨兵是一个独立的Redis 进程,它的作用是监控 Redis集群中的主节点和从节点的健康状态。当哨兵检测到主节点失联时,它可以立即进行故障转移,选择一个可用的从节点升级为新的主节点。这可以减小故障发生时的停机时间,并提供更快速的故障转移。
因此,尽管 Redis 集群本身可以自动进行故障转移,但配置哨兵可以增加故障转移的自动性和速度,以提高集群的可靠性和可用性。哨兵可以监控Redis 集群中的多个主节点,并在需要时触发故障转移,以确保集群在主节点失联时能够快速恢复。这是为了提供额外的保障,以防止在某些情况下Redis 集群的自动故障转移不够及时或无法满足特定要求。因此,建议在关键生产环境中使用 Redis集群时,配置哨兵以提高可靠性和自动化程度。
Redis 集群的高可用性、分布式和分区策略是 Redis 集群架构中的重要概念。
1. 高可用性(High Availability):
高可用性是指系统在面对硬件故障或其他异常情况时,能够继续提供可用的服务而不中断。在 Redis 集群中,高可用性通常通过以下方式实现:
- 主从复制(Master-Slave Replication):每个主节点都有零个或多个从节点。从节点会复制主节点的数据,当主节点出现故障时,可以自动将一个从节点提升为主节点,以确保系统的可用性。
- 哨兵(Sentinel):哨兵是一组特殊的节点,它们监控 Redis 集群中的主节点和从节点的健康状态。当主节点出现故障时,哨兵可以自动协调将一个从节点提升为新的主节点。
- 自动故障迁移:Redis 集群支持自动故障迁移,当主节点失效时,集群会自动选举一个新的主节点。
2. 分布式(Distribution):
分布式是指 Redis 集群可以水平扩展,将数据分布在多个节点上,以处理大量数据和请求。在 Redis 集群中,分布式通常表现在以下方面:
- 数据分片(Data Sharding):Redis 将数据分成多个数据槽(slots),每个节点负责一部分槽的数据。这种方式允许数据和请求在多个节点之间分布,从而提高了系统的容量和性能。
- 节点间通信:Redis 集群中的节点之间需要进行通信,以便处理请求和同步数据。集群使用 Gossip 协议和其他机制来确保节点之间的通信。
3. 分区策略(Partitioning):
分区策略决定了如何将数据分布在不同的节点上。在 Redis 集群中,有两种常见的分区策略:
- 哈希分区(Hash Partitioning):这是 Redis 集群默认的分区策略。它使用 CRC16 哈希算法将键映射到数据槽(slots),每个节点负责一部分槽的数据。这种策略可以确保相同的键总是映射到相同的节点上。
- 自定义分区策略:有时候,根据业务需求,可以自定义分区策略,将数据分布到不同的节点上。这需要在应用层实现,并使用 Redis 集群提供的命令来管理数据。
Redis 集群通过高可用性、分布式和分区策略来实现数据的可靠存储和高性能处理。了解这些概念对于设计和管理 Redis 集群非常重要,以确保系统的稳定性和性能。
优缺点
关于 Redis 集群的优点和缺点的简要总结:
优点:
- 实现扩容:Redis 集群允许在需要时动态添加新的节点,从而实现水平扩展,以应对数据量和负载的增长。适用于大规模数据。
- 分摊压力:数据和请求可以分布在多个节点上,从而分摊了单个节点的读写压力,提高了系统的整体性能和容量。
- 无中心配置相对简单:相对于一些集中式的分布式存储方案,Redis 集群的配置相对简单,不需要集中式的中心节点来进行管理和配置。
- 高可用性:Redis 集群具有自动故障转移和恢复功能,节点出现故障时可以保持服务可用。
缺点:
- 多键操作受限:Redis 集群不支持多键操作,这意味着无法在不同的键之间执行事务或批量操作。
- 事务限制:多键的 Redis 事务在集群中不受支持,也不能使用 Lua 脚本进行复杂操作。
- 迁移复杂性:配置和维护 Redis 集群相对复杂,需要管理节点和槽的分配。对于已经采用了其他分布式方案的公司,将代理或客户端分片迁移到 Redis 集群可能需要整体迁移,而不是逐步过渡,这可能会增加复杂性。
- 内存消耗:每个节点需要维护集群的视图,可能会占用较多内存。
- 需要较新的 Redis 版本:Redis 集群需要使用较新的版本才能支持,旧版 Redis 不支持集群功能。
总结
总之,Redis 集群是为了实现高可用性、扩展性和数据分布而设计的,槽是用于数据分区的基本单位,通过合理分配槽,可以充分利用集群的性能和容量。
需要注意的是,尽管 Redis 集群具有一些限制和缺点,但它仍然是一个高性能、高可用性的分布式存储解决方案,适用于许多应用场景。选择是否使用 Redis 集群应该根据特定的需求和架构来决定。