Redis——运维篇
Redis安装
- redis本身并没有提供Windows系统的支持,且工作中redis一般都部署在Linux系统中,这里演示centos7安装redis
- 学习阶段推荐使用Windows下的Docker Desktop部署redis容器,提高学习效率
安装redis依赖
- 如果yum不超过,可能因为centos已经停止维护,需要先对yum换源,这里采用阿里云源
wget -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#或者
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
yum -y update
yum install -y gcc tcl
下载redis并解压
- 下载 - Redis ,推荐选择redis6
- 这里解压到
/usr/local/redis6
中方便管理,也有不指定安装目录,默认安装在/usr/local/redis/bin
tar -zxvf redis-6.2.14.tar.gz
mv redis-6.2.14.tar.gz /usr/local/redis6
安装redis
#在解压的安装文件下执行编译,假设安装包为/usr/local/redis6
make PREFIX=/usr/local/redis6 install
配置环境变量
- 如果使用默认安装位置则不用配置环境变量
vim /etc/profile
export REDIS_HOME=/user/local/redis6
export PATH=$PATH::$REDIS_HOME/bin
source /etc/profile
检查版本
redis-server -v
修改redis配置文件
- 位置:解压的redis安装包内
redis.conf
#进入redis安装包内,为了防止配置文件被改坏,建议先拷贝一份
cp redis.conf redis.conf.backup
#修改redis.conf
vim redis.conf
#设置远程连接,一般应设置为应用所在服务器的地址,这里0.0.0.0表示任意地址
bind 0.0.0.0
#开启保护模式,这样只有bind设置的客户端才可以连接
protected-mode no
#端口号默认6379,工作中建议修改端口号增加安全性
port 6379
#开启密码
requirepass 123456
#开启守护线程,即后台启动
daemonize yes
#指定工作目录,否则在哪里执行开启redis命令哪里就是工作目录
dir /usr/local/redis
#开启日志,地址前缀是redis工作目录
logfile /usr/local/redis6/redis.log
#数据库数量,redis不能主动创建库,但可以设置数据库的数量,默认16个库
databases 16
开放防火墙
firewall-cmd --zone=public --add-port=6379/tcp --permanentfirewall-cmd --reload
启动redis
#进入redis安装目录
cd /usr/local/redis6
#后台启动
redis-server redis.conf
#查看redis是否运行
ps -ef|grep redis
#强制停止redis
kill -9 查询的redis进程码
#进入服务端停止redis
redis-cli -a 密码 -h IP地址 -p 端口号
#停止redis
shutdown
#退出客户端
exit
Redis客户端
命令行客户端
- 安装redis完成后,redis就自带了一个命令行客户端redis-cli
- redis-cli可以连接其他主机的redis
- 进入命令行客户端后就可以进行redis相关操作
#测试客户端能否成功连接redis,成功会返回pong
redis-cli -h ip地址 -p 端口号 -a 连接密码 ping
#进入redis命令行客户端
redis-cli -h ip地址 -p 端口号 -a 连接密码
#不带密码也可以连接到redis,但没有操作权限
redis-cli -h ip地址 -p 端口号
#要操作再输入密码
auth 123456
#退出redis-cli
exit
#redis-cli操作数据示例
select 1
set name wyh
get name
flash all
图形化界面客户端
- redis6以前不支持多用户,redis6后可以设置多用户,如果不在redis.cnf中特意设置用户名则默认default
AnotherRedisDesktopManager 发行版 - Gitee.com
Java客户端
-
类似于JDBC,通过编程语言连接redis实现自动化数据操纵
- Jedis
- Lettuce
- Redisson
-
redis支持几乎市面上所有的编程语言,可以在官网 (连接 Redis 客户端 |文档 )查询到各种编程语言的连接和操作手册
Redis集群
- 目的:单点redis有性能瓶颈,redis集群架构可以更好的应对高并发环境
主从架构
-
原理
-
主从第一次连接会进行一次全量同步,原理是将master节点直接将RDB文件发送给slave节点实现全量同步
-
主从连接成功以后的同步方式都是增量同步,原理是master节点把命令日志发送给slave节点实现增量同步
-
-
常见主从架构
- 一主多从:适用于读多写少场景,从节点可级联复制
- 薪火相传:主节点 → 从节点1 → 从节点2(从节点作为其他从节点的主节点),减少主节点负载
主从部署
1.环境准备
- 一主一从:主节点6379,从节点6380
# 6379.conf
bind 0.0.0.0
protected-mode no
port 6379
# 启用持久化
appendonly yes
requirepass "123456"
# 以守护进程运行
daemonize yes
# 日志路径
logfile "/var/log/redis/redis-master.log"
# 6380.conf
bind 0.0.0.0
port 6380
# 指定同步主节点IP和端口
replicaof 127.0.0.1 6379
# 主节点如果有密码必须设置密码
masterauth "123456"
# 从节点只读(默认开启)
replica-read-only yes
# 启用持久化
appendonly yes
requirepass "123456"
# 优先使用磁盘进行全量同步(避免内存占用过高)
repl-diskless-sync no
2.启动节点
# 启动主节点
redis-server /path/to/6379.conf
# 启动从节点
redis-server /path/to/6380.conf
3.验证主从状态
# 主节点上查看同步状态
redis-cli -h 127.0.0.1 -p 6379 -a 123456 info replication
# 示例
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,...
# 从节点上查看同步状态
redis-cli -h 127.0.0.1 -p 6380 -a 123456 info replication
# 示例
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
4.数据操作
# 主节点添加数据
redis-cli -h 127.0.0.1 -p 6379 -a 123456 SET test_key "hello"
# 从节点查询数据
redis-cli -h 127.0.0.1 -p 6380 -a 123456 GET test_key # 应返回 "hello"
# 如果设置从节点只读,从节点添加数据会失败
redis-cli -h 127.0.0.1 -p 6380 -a 123456 SET test_key
# 示例
(error) READONLY You cant write against a read only replica.
哨兵机制
-
目的:解决redis主从架构中,主节点宕机的风险问题
-
原理
- 加入哨兵节点,负责监控节点状态,当主节点宕机时,哨兵可以“选举”出其他节点作为新的主节点
- 哨兵选出新的主节点后,从节点会自动重新配置,同步新的主节点
1.环境准备
- 一主二从二哨兵:主节点6379,从节点6380、6381,哨兵26379、26380
- 哨兵需要远程连接节点,节点配置bind要加入哨兵的地址,或者直接关闭保护模式
protected-mode no
# 6379.conf
bind 0.0.0.0
port 6379
requirepass 123456
# 开启AOF持久化
appendonly yes
daemonize yes
# 6380.conf
bind 0.0.0.0
port 6380
# 指定主节点地址和端口号
slaveof 127.0.0.1 6379
requirepass 123456
# 主节点密码
masterauth 123456
appendonly yes
daemonize yes
# 6381.conf
bind 0.0.0.0
port 6381
# 指定主节点地址和端口号
slaveof 127.0.0.1 6379
requirepass 123456
# 主节点密码
masterauth 123456
appendonly yes
daemonize yes
# 26379.conf
bind 0.0.0.0
port 26379
daemonize yes
# 监控主节点,mymaster为主节点名称,2表示当有2个哨兵认为主节点下线时,则认为主节点客观下线
sentinel monitor mymaster 127.0.0.1 6379 2
# 主节点密码
sentinel auth-pass mymaster 123456
# 主节点超时时间
sentinel down-after-milliseconds mymaster 5000
# 故障转移超时时间
sentinel failover-timeout mymaster 15000
# 26380.conf
bind 0.0.0.0
port 26380
daemonize yes
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 15000
2.启动节点
# 启动主节点
redis-server /path/to/6379.conf
# 启动从节点
redis-server /path/to/6380.conf
# 启动从节点
redis-server /path/to/6381.conf
# 启动哨兵
redis-sentinel /path/to/26379.conf
# 启动哨兵
redis-sentinel /path/to/26379.conf
3.验证哨兵模式状态
# 在任意哨兵节点上查看集群状态
redis-cli -p 26379
# 查看监控的主节点信息
SENTINEL masters
# 查看主节点mymaster下的所有从节点信息
SENTINEL slaves mymaster
# 查看监控主节点mymaster的其他哨兵节点信息
SENTINEL sentinels mymaster
4.故障转移
- 将主节点宕机,发现哨兵检测到了,并选举一个从节点成为新的主节点
# 模拟主节点下线
redis-cli -h 127.0.0.1 -p 6379 SHUTDOWN
# 哨兵会选择从节点会自动晋升为主节点
redis-cli -p 26379 SENTINEL masters
# 原主节点恢复后,不会恢复原本主节点的位置,而是成为新的从节点
redis-server 6379.conf
数据分片
-
Redis 分片架构原理
- 数据分片机制:Redis 集群采用 16384 个哈希槽(Hash Slot) 实现数据分片,每个节点负责一部分槽位
- 集群扩容:键通过
CRC16(key) % 16384
计算哈希槽位置,支持在线扩容/缩容(通过迁移哈希槽实现) - 节点通信机制:Gossip 协议,节点间每秒随机交换消息(PING/PONG),维护集群状态,收敛速度较慢但负载低
- 客户端路由:客户端直接与目标节点通信,缓存哈希槽-节点映射关系
-
数据分片(Redis Cluster)已经实现高可用,不建议再加入哨兵机制
分片部署
1. 环境准备
-
三主节点:6379、6380、6381,三从节点(一个主节点至少有一个从节点):6382、6383、6384
# 6379.conf为例 bind 0.0.0.0 port 6379 requirepass 123456 appendonly yes daemonize yes # 启用Redis集群模式 cluster-enabled yes # 指定Redis集群节点的配置文件(自动生成) cluster-config-file nodes.conf # 设置Redis集群中节点之间通信的超时时间 cluster-node-timeout 15000
# 从节点以6382.conf为例 bind 0.0.0.0 port 6380 daemonize yes # 持久化配置 appendonly yes # 必须启用集群模式,负责故障转移后新主节点无法处理原有槽位的请求,导致集群部分数据不可用 cluster-enabled yes # 集群节点配置文件 cluster-config-file "/opt/redis/6380/nodes-6380.conf" # 节点超时时间(毫秒) cluster-node-timeout 15000 # 主从配置(静态指定主节点) replicaof 127.0.0.1 6379
2. 启动节点
redis-server /path/to/6379.conf
redis-server /path/to/6380.conf
# 依次启动所有节点...
3. 创建集群
#-cluster-replicas 1 的含义:表示每个主节点分配 1 个从节点,因此前三个是主节点,后三个是从节点
#在任意一个主节点下执行
redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 \127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 \--cluster-replicas 1
4. 验证集群状态
# 连接任意主节点
CLUSTER NODES # 查看节点与槽分布
CLUSTER INFO # 查看集群整体状态
5.数据操作
# 写入数据(自动路由到对应节点)
redis-cli -c -h 127.0.0.1 -p 7000 SET user:1001 "Alice"
# 读取数据
redis-cli -c -h 127.0.0.1 -p 7000 GET user:1001
6.故障转移
# 模拟节点下线
redis-cli -h 127.0.0.1 -p 6379 SHUTDOWN
# Redis Cluster会自动选举一个从节点成为新的主节点
redis-cli -h 127.0.0.1 -p 6380 CLUSTER NODES
# 原主节点恢复后,不会恢复原本主节点的位置,而是成为新的从节点
redis-server 6379.conf
# 也可以手动指定原主节点成为哪一个节点的从节点
redis-cli -c -h 127.0.0.1 -p 6379 CLUSTER REPLICATE <新主节点ID>
集群扩容
-
启动新节点(如 7006)
redis-server 7006.conf
-
加入集群
# 127.0.0.1:7006是新的节点,127.0.0.1:6379是任意一个集群中的节点 redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:6379 # 如果希望新加入的节点是从节点 redis-cli -p 6385 CLUSTER REPLICATE <master-node-id>
-
分配哈希槽:如果新节点是主节点但无槽位,需通过从其他节点迁移部分槽到新节点
redis-cli --cluster reshard 127.0.0.1:6379
监控与维护
-
核心监控指标
- 节点状态:通过
redis-cli -c -p <port> cluster nodes
命令查看所有节点的状态信息 - 性能指标:
- QPS(每秒查询数):反映Redis集群的处理能力。
- 内存使用情况:包括
used_memory
(已分配内存)、used_memory_rss
(操作系统视角的已分配内存)、mem_fragmentation_ratio
(内存碎片率)等。监控内存使用情况,避免内存溢出或内存碎片过多导致性能下降 - 网络延迟:监控客户端与Redis集群之间的网络延迟,确保低延迟的数据传输
- 数据同步状态:
- 在Redis集群模式下,每个节点都需要进行数据同步以达到数据一致性。监控数据同步状态,确保数据同步正常进行
- 通过
cluster nodes
命令查看每个节点的复制状态,如master
、slave
以及复制偏移量等
- 节点状态:通过
-
常用监控工具
- Redis Insight:
- Redis Labs开发的一款免费开源的Redis集群监控工具,通过Web界面展示Redis集群的各种指标和状态信息
- 支持实时监控、历史数据分析、性能调优等功能
- Prometheus + Grafana:
- Prometheus是一个开源的监控和告警系统,可以采集Redis集群的监控数据
- Grafana是一个可视化工具,可以将Prometheus采集的数据以图表形式展示出来,便于直观分析
- 通过
redis_exporter
将Redis集群的监控数据暴露给Prometheus进行采集
- Zabbix:
- 一款企业级的开源监控解决方案,支持对Redis集群进行多维监控
- 通过配置Zbbix Agent或Zabbix Agent 2收集Redis集群的监控数据,并在Zabbix Server的Web界面进行展示和分析
- CacheCloud:
- 专为Redis设计的运维工具,提供了一系列便捷的管理和监控功能
- 支持应用统计信息查看、实例列表展示、慢查询分析、配置查询等功能
- Redis Insight:
Redis持久化
-
目的:redis虽然运行在内存中,但仍然具备持久化策略,当redis遭遇故障时可以最大程度恢复数据
-
原理
- RDB:数据备份,RDB是redis默认的持久化策略
- AOF:日志重放
RDB
-
描述:RDB是数据备份文件,redis会定时将内存中的数据保存到磁盘中,遇故障重启时,会根据RDB文件恢复数据
-
RDB持久化方式
- 同步持久化:由redis主进程执行持久化
- 异步持久化:redis会fork一个子进程进行数据备份,这时间主进程依然可以响应客户端,但此时数据可能不全
-
触发机制
-
手动触发:
SAVE
(阻塞主线程)或BGSAVE
(后台子进程生成)#由redis主线程执行一次RDB,此时会阻塞所有其他命令 save #开启一个子线程异步执行RDB bgsave
-
自动触发:配置文件redis.conf设置,自动触发
BGSAVE
异步备份数据# 3600秒内执行一次set操作则持久化1次、 300秒内执行10次set操作则持久化1次 、 60秒内执行10000次set操作,则持久化1次 save 3600 1 save 300 100 save 60 10000
-
-
特点
- RDB恢复数据较快
- RDB还是有数据丢失的风险(例如未来得及备份就宕机)
- 虽然RDB实现了copy-on-write技术,数据量庞大时RDB持久化还是比较耗时
AOF
-
描述:AOF是追加文件,也可以认为是日志文件,遇故障重启时,会根据日志文件的内容将重写指令,完成数据的恢复工作
-
AOF功能默认关闭,需要在配置文件中开启
# 1. 启用AOF持久化(默认关闭) appendonly yes# 2. 指定AOF文件名(默认即为appendonly.aof) # 设置工作目录(所有持久化文件,包括RDB和AOF,都会存储在此目录下) dir /path/to/your/data/directory appendfilename "appendonly.aof"# 3. 设置AOF同步策略(推荐everysec) # always: 每个写命令都同步到磁盘(最安全,性能最低) # everysec: 每秒同步一次(平衡安全与性能,默认值) # no: 由操作系统决定同步时机(性能最好,但可能丢失数据) appendfsync everysec# 4. AOF重写配置(自动压缩AOF文件) # 当AOF文件增长百分比超过设定值且文件大小超过最小值时触发重写 auto-aof-rewrite-percentage 100 # 相比上次重写后的增长比例 auto-aof-rewrite-min-size 64mb # 触发重写的最小文件大小# 5. 是否在AOF重写时继续执行写命令(默认yes) # 若为no,重写期间会阻塞所有请求 no-appendfsync-on-rewrite no# 6. AOF文件损坏时的修复策略 # 若AOF文件损坏,Redis启动时会报错,可通过以下命令修复: # redis-check-aof --fix appendonly.aof aof-load-truncated yes # 允许加载截断的AOF文件(避免启动失败)# 7. 启用RDB+AOF混合模式(Redis 4.0+) # 开启后,AOF重写时直接生成RDB格式数据,再追加增量AOF日志 aof-use-rdb-preamble yes
-
特点
- 虽然AOF采用的文件追加重写机制,但较于RDB,恢复数据速度还是较慢
- 数据不易丢失
- AOF本质上是日志文件,可以根据实际情况选择部分恢复
RDB + AOF 混合模式
-
描述:AOF 重写时生成 RDB 数据,直接将内存数据以 RDB 格式写入 AOF 文件开头,后续追加增量 AOF 日志
-
原理
- 先加载 RDB 部分快速恢复全量数据
- 再回放增量 AOF 日志修复到最新状态
-
配置文件
appendonly yes # 启用混合模式 aof-use-rdb-preamble yes # 推荐同步策略 appendfsync everysec
-
特点
- 恢复速度快:RDB 部分加速全量恢复,AOF 部分保证数据最新
- 安全性高:结合了 RDB 的紧凑性和 AOF 的低丢失率
- 注意,混合模式仅 Redis 4.0+ 支持:旧版本无法使用
RDB和AOF选择
场景 | 推荐方案 | 理由 |
---|---|---|
缓存,允许少量丢失 | 仅 RDB | 高性能,恢复快,适合非关键数据 |
数据不能丢失 | 仅 AOF(everysec)或混合模式 | 平衡安全性和性能,混合模式恢复更快 |
大规模数据 + 高安全 | RDB(定期) + AOF(everysec) | RDB 用于快速备份,AOF 防止数据丢失 |
极低延迟要求 | 禁用持久化 + 定期 BGSAVE 备份 | 牺牲安全性换取性能(需接受数据丢失风险) |