1. Redis环境准备与单机部署
1.1 系统环境检查与配置
在开始Redis部署前,我们需要确保Linux系统环境准备就绪。作为长期使用Redis的老手,我强烈建议先完成以下基础配置:
- 关闭防火墙(仅限内网测试环境):
bash复制systemctl stop firewalld.service
systemctl disable firewalld
生产环境注意事项:如果是线上环境,建议配置精确的防火墙规则而非完全关闭,例如只开放Redis服务端口(默认6379)和必要的管理端口。
- GCC环境检查:
bash复制gcc --version || yum install -y gcc make
Redis是用C语言编写的,编译需要GCC环境。这里有个实用技巧:使用||操作符可以在一行命令中实现"不存在则安装"的逻辑。
1.2 Redis源码编译安装
我习惯将第三方软件统一安装在/opt目录下,保持系统整洁:
bash复制mkdir -p /opt/software/redis
cd /opt/software/redis
wget https://download.redis.io/redis-stable.tar.gz
tar xzf redis-stable.tar.gz
cd redis-stable
make && make install
编译完成后,关键的可执行文件会自动安装到/usr/local/bin目录:
- redis-server:服务端程序
- redis-cli:命令行客户端
- redis-benchmark:性能测试工具
- redis-check-aof/rdb:数据文件修复工具
1.3 Redis基础配置优化
默认的redis.conf配置需要根据生产需求调整,以下是我的推荐配置:
bash复制vim redis.conf
关键配置项修改:
conf复制bind 0.0.0.0 # 允许所有IP连接(生产环境建议绑定具体IP)
protected-mode no # 关闭保护模式(有密码时可开启)
daemonize yes # 后台运行
requirepass yourStrongPassword # 设置访问密码
dir /opt/software/redis/data # 数据存储目录
logfile "/opt/software/redis/redis.log" # 日志文件路径
启动测试:
bash复制redis-server /opt/software/redis/redis-stable/redis.conf
redis-cli -a yourStrongPassword ping # 应返回PONG
1.4 系统服务化配置(可选)
为了方便管理,我们可以将Redis注册为系统服务:
bash复制cat > /etc/systemd/system/redis.service <<EOF
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /opt/software/redis/redis-stable/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start redis
2. Redis主从复制部署
2.1 主从架构原理详解
Redis主从复制采用异步复制机制,工作流程如下:
- 从节点连接主节点,发送SYNC命令
- 主节点执行BGSAVE生成RDB快照
- 主节点将RDB文件传输给从节点
- 从节点加载RDB文件
- 主节点将后续写命令通过缓冲区发送给从节点
重要特性:Redis 4.0后支持PSYNC2,解决了旧版在故障转移后需要全量同步的问题。
2.2 主从配置实战
主节点配置(192.168.1.100):
保持默认配置,只需确保:
conf复制requirepass masterPassword # 主节点密码
从节点配置(192.168.1.101):
conf复制replicaof 192.168.1.100 6379
masterauth masterPassword # 主节点密码
replica-read-only yes # 从节点只读
验证主从状态:
bash复制# 在主节点执行
redis-cli -a masterPassword info replication
输出应包含:
code复制connected_slaves:1
slave0:ip=192.168.1.101,port=6379,state=online,offset=1234,lag=0
2.3 主从复制问题排查指南
常见问题及解决方案:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 从节点显示为"disconnected" | 网络不通/密码错误 | 检查网络连接和masterauth配置 |
| 复制延迟大 | 主节点写入压力大/网络带宽不足 | 监控info replication的lag值,考虑升级网络或增加从节点 |
| 从节点数据不同步 | 主从maxmemory配置不一致 | 确保主从配置相同,特别是内存相关参数 |
3. Redis哨兵高可用部署
3.1 哨兵集群设计原则
哨兵部署的最佳实践:
- 至少3个哨兵节点(避免脑裂)
- 哨兵节点分散在不同物理机
- 配置
quorum值为哨兵数/2 +1(如3哨兵配2) - 合理设置
down-after-milliseconds(通常30秒)
3.2 哨兵配置示例
sentinel.conf关键配置:
conf复制port 26379
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel auth-pass mymaster masterPassword
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
启动哨兵:
bash复制redis-sentinel /path/to/sentinel.conf
3.3 故障转移演练
- 模拟主节点故障:
bash复制redis-cli -h 192.168.1.100 -a masterPassword DEBUG sleep 60
- 观察哨兵日志:
bash复制tail -f /var/log/redis/sentinel.log
- 验证新主节点:
bash复制redis-cli -h 192.168.1.101 -a masterPassword info replication
经验分享:故障转移后,应用端需要实现自动重连机制。推荐使用支持哨兵的Redis客户端(如Jedis、Lettuce)。
4. Redis Cluster集群部署
4.1 集群规划建议
三主三从集群的槽位分配:
- 节点A:0-5460
- 节点B:5461-10922
- 节点C:10923-16383
每个主节点对应一个从节点,实现高可用。
4.2 集群配置文件
redis_7000.conf示例:
conf复制port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
logfile "/var/log/redis/redis-7000.log"
dir "/data/redis/7000"
4.3 集群创建与管理
- 启动所有节点:
bash复制redis-server /path/to/redis_7000.conf
...
- 创建集群:
bash复制redis-cli --cluster create \
192.168.1.100:7000 192.168.1.100:7001 \
192.168.1.101:7000 192.168.1.101:7001 \
192.168.1.102:7000 192.168.1.102:7001 \
--cluster-replicas 1 -a masterPassword
- 集群检查:
bash复制redis-cli --cluster check 192.168.1.100:7000 -a masterPassword
4.4 集群运维技巧
- 节点扩容:
bash复制redis-cli --cluster add-node new_host:new_port existing_host:existing_port
redis-cli --cluster reshard existing_host:existing_port
- 槽位迁移:
bash复制redis-cli --cluster reshard 192.168.1.100:7000 \
--cluster-from node-id --cluster-to node-id --cluster-slots 1000
- 故障节点替换:
bash复制redis-cli --cluster call 192.168.1.100:7000 cluster failover
5. 生产环境优化建议
5.1 性能调优参数
conf复制# 网络相关
tcp-backlog 511
timeout 0
tcp-keepalive 300
# 内存管理
maxmemory 16gb
maxmemory-policy volatile-lru
# 持久化优化
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
5.2 监控指标关注点
关键监控指标:
- 内存使用率(used_memory)
- 命中率(keyspace_hits/keyspace_misses)
- 延迟(latency monitor)
- 连接数(connected_clients)
- 持久化状态(rdb_last_bgsave_status)
推荐监控工具:
- Redis自带的INFO命令
- Prometheus + Redis_exporter
- Grafana可视化
5.3 安全加固措施
- 启用ACL(Redis 6.0+):
bash复制acl setuser admin on >adminPassword ~* +@all
- 禁用危险命令:
conf复制rename-command FLUSHDB ""
rename-command CONFIG ""
- 网络隔离:
- 使用VPC或安全组限制访问IP
- 启用TLS加密(Redis 6.0+)
6. 常见问题解决方案
6.1 启动问题排查表
| 错误信息 | 原因分析 | 解决方案 |
|---|---|---|
| Can't bind to address | 端口被占用 | netstat -tulnp | grep 6379 |
| DENIED Redis is running in protected mode | 保护模式限制 | 配置bind或设置密码 |
| MISCONF Redis is configured to save RDB snapshots | 持久化失败 | 检查磁盘空间和权限 |
6.2 性能问题优化
- 内存碎片问题:
bash复制redis-cli info memory | grep ratio
当mem_fragmentation_ratio > 1.5时考虑重启
- 慢查询分析:
bash复制slowlog get 10 # 查看最近10条慢查询
- 连接池配置(客户端侧):
- 最大连接数:根据QPS设置(建议QPS/1000)
- 空闲连接超时:5-30秒
6.3 数据恢复策略
- RDB恢复:
bash复制redis-server --appendonly no --dbfilename dump.rdb
- AOF恢复:
bash复制redis-check-aof --fix appendonly.aof
redis-server --appendonly yes
- 混合持久化(Redis 4.0+):
conf复制aof-use-rdb-preamble yes