1. 项目概述
Redis作为当前最流行的内存数据库之一,在缓存、消息队列、会话存储等场景中发挥着重要作用。虽然大多数Linux发行版都提供了Redis的预编译包,但在生产环境中,编译安装仍然是更推荐的方式。通过源码编译,我们可以获得以下优势:
- 获得最新版本特性(官方仓库的Redis版本往往较旧)
- 针对特定硬件进行优化编译
- 灵活定制安装路径和配置
- 避免系统包管理器的依赖冲突
本教程将详细演示在CentOS 7.5/RHEL 7.x系统上从源码编译安装Redis 6.0.1的全过程。这个版本发布于2019年,引入了诸多重要特性如ACL访问控制、客户端缓存、线程I/O等,至今仍被广泛使用。
2. 环境准备
2.1 系统要求确认
在开始前,请确保您的系统满足以下要求:
- CentOS 7.5/RHEL 7.x(内核版本3.10.0-862及以上)
- 至少1GB可用内存(编译过程需要约600MB)
- 2GB以上磁盘空间
- GCC 4.9或更高版本
可以通过以下命令检查系统信息:
cat /etc/redhat-release # 查看系统版本 uname -r # 查看内核版本 free -h # 查看内存 df -h # 查看磁盘空间 gcc --version # 查看GCC版本2.2 安装编译依赖
Redis是使用ANSI C编写的,因此需要安装GCC编译器及相关工具链:
yum install -y gcc gcc-c++ make tcl注意:如果是从最小化安装的系统开始,可能还需要安装基本开发工具组:
yum groupinstall -y "Development Tools"
tcl包是用于运行Redis测试套件的,虽然不是必须的,但强烈建议安装以便后续验证编译结果。
3. 源码获取与编译
3.1 下载Redis源码
建议从Redis官方或国内镜像站下载源码包:
wget http://download.redis.io/releases/redis-6.0.1.tar.gz或者使用清华大学镜像站:
wget https://mirrors.tuna.tsinghua.edu.cn/redis/redis-6.0.1.tar.gz下载完成后验证文件完整性:
sha1sum redis-6.0.1.tar.gz # 官方SHA1校验值:b8756e430479edc8dfb7d6d6cd3a402323eb437a3.2 解压与编译
解压源码包并进入目录:
tar xzf redis-6.0.1.tar.gz cd redis-6.0.1开始编译:
make编译过程通常需要5-15分钟,取决于系统性能。如果遇到编译错误,常见原因和解决方法包括:
GCC版本过低:
# 安装devtoolset-7(包含GCC 7.x) yum install -y centos-release-scl yum install -y devtoolset-7 # 临时启用新版本GCC scl enable devtoolset-7 bash内存不足:
- 添加swap空间
- 使用
make MALLOC=libc禁用jemalloc
依赖缺失:
- 确保安装了所有必需的开发包
3.3 验证编译结果
编译完成后,建议运行测试套件:
make test测试过程可能需要30分钟以上。如果看到\o/ All tests passed without errors!则表示一切正常。
4. 安装与配置
4.1 安装Redis
指定安装目录(建议使用/usr/local/redis):
make PREFIX=/usr/local/redis install这会将Redis可执行文件安装到/usr/local/redis/bin目录下。
4.2 创建配置文件目录
mkdir /usr/local/redis/etc cp redis.conf /usr/local/redis/etc/4.3 基本配置调整
编辑配置文件:
vim /usr/local/redis/etc/redis.conf建议修改以下关键参数:
daemonize yes # 以守护进程方式运行 bind 0.0.0.0 # 监听所有网络接口(生产环境应限制) protected-mode no # 关闭保护模式(如有防火墙可不关) requirepass yourpassword # 设置访问密码 maxmemory 2gb # 根据系统内存调整 maxmemory-policy allkeys-lru # 内存满时的淘汰策略 dir /var/lib/redis # 持久化文件存储目录重要安全提示:如果Redis需要暴露在公网,必须设置强密码并考虑启用ACL!
4.4 创建数据目录
mkdir -p /var/lib/redis chown -R redis:redis /var/lib/redis5. 系统集成
5.1 创建Redis用户
为安全起见,应使用专用用户运行Redis:
groupadd redis useradd -r -g redis -s /bin/false redis chown -R redis:redis /usr/local/redis5.2 配置环境变量
将Redis添加到系统PATH:
echo 'export PATH=$PATH:/usr/local/redis/bin' > /etc/profile.d/redis.sh source /etc/profile.d/redis.sh5.3 创建Systemd服务
创建服务文件/etc/systemd/system/redis.service:
[Unit] Description=Redis In-Memory Data Store After=network.target [Service] User=redis Group=redis ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf ExecStop=/usr/local/redis/bin/redis-cli shutdown Restart=always Type=notify [Install] WantedBy=multi-user.target启用并启动服务:
systemctl daemon-reload systemctl enable redis systemctl start redis检查服务状态:
systemctl status redis6. 验证与测试
6.1 基本功能测试
redis-cli 127.0.0.1:6379> AUTH yourpassword OK 127.0.0.1:6379> SET test "Hello Redis" OK 127.0.0.1:6379> GET test "Hello Redis" 127.0.0.1:6379> INFO Server # 查看服务器信息6.2 性能测试
redis-benchmark -h 127.0.0.1 -a yourpassword -q -n 1000007. 高级配置与优化
7.1 内存优化
在redis.conf中调整以下参数:
maxmemory 4gb # 根据可用内存设置 maxmemory-policy volatile-lru # 只淘汰有过期时间的key hash-max-ziplist-entries 512 # 小哈希使用更少内存7.2 持久化配置
根据需求选择RDB或AOF:
# RDB快照 save 900 1 # 15分钟内至少1个key变化 save 300 10 # 5分钟内至少10个key变化 # AOF日志 appendonly yes # 启用AOF appendfsync everysec # 每秒同步7.3 安全加固
启用ACL(Redis 6+):
redis-cli 127.0.0.1:6379> ACL SETUSER admin on >adminpassword ~* +@all限制危险命令:
rename-command FLUSHDB "" rename-command CONFIG ""
8. 常见问题解决
8.1 启动失败排查
检查日志:
journalctl -u redis -n 50 --no-pager常见错误:
- 地址已在使用:检查是否有其他Redis实例运行
- 权限问题:确保redis用户有访问权限
- 配置错误:使用
redis-server --test-memory 256测试内存
8.2 性能问题
延迟高:
- 检查
redis-cli --latency监控延迟 - 避免使用
KEYS *等阻塞命令
- 检查
内存不足:
- 调整
maxmemory和淘汰策略 - 考虑使用Redis集群
- 调整
8.3 升级注意事项
小版本升级:
# 停止旧实例 systemctl stop redis # 编译安装新版本 make && make install # 重启服务 systemctl start redis大版本升级:
- 先测试数据兼容性
- 考虑使用复制方式迁移
9. 维护与管理
9.1 日常监控
使用INFO命令:
redis-cli -a yourpassword INFO关键指标监控:
- 内存使用率
- 连接数
- 命中率
9.2 备份策略
RDB快照备份:
cp /var/lib/redis/dump.rdb /backup/redis-$(date +%F).rdbAOF备份:
redis-cli -a yourpassword BGREWRITEAOF
9.3 日志轮转
配置logrotate:
cat > /etc/logrotate.d/redis <<EOF /var/log/redis.log { daily rotate 30 compress delaycompress missingok notifempty create 644 redis redis } EOF10. 扩展与进阶
10.1 启用TLS加密
生成证书:
openssl genrsa -out redis.key 2048 openssl req -new -key redis.key -out redis.csr openssl x509 -req -days 365 -in redis.csr -signkey redis.key -out redis.crt配置Redis:
tls-port 6379 tls-cert-file /path/to/redis.crt tls-key-file /path/to/redis.key
10.2 构建Redis集群
- 准备多个节点
- 使用redis-cli创建集群:
redis-cli --cluster create \ 192.168.1.1:6379 \ 192.168.1.2:6379 \ 192.168.1.3:6379 \ --cluster-replicas 1
10.3 使用Redis模块
下载编译模块:
git clone https://github.com/RedisJSON/RedisJSON.git cd RedisJSON make加载模块:
loadmodule /path/to/rejson.so
11. 性能调优实战
11.1 内核参数优化
编辑/etc/sysctl.conf:
vm.overcommit_memory = 1 net.core.somaxconn = 65535应用设置:
sysctl -p11.2 Redis专用优化
透明大页禁用:
echo never > /sys/kernel/mm/transparent_hugepage/enabled内存分配策略:
# 在redis.conf中 maxmemory-policy allkeys-lru
11.3 网络优化
调整TCP参数:
# 在redis.conf中 tcp-backlog 65535 timeout 0使用Unix域套接字:
unixsocket /tmp/redis.sock unixsocketperm 770
12. 监控与告警
12.1 Prometheus监控
安装redis_exporter:
wget https://github.com/oliver006/redis_exporter/releases/download/v1.45.0/redis_exporter-v1.45.0.linux-amd64.tar.gz tar xzf redis_exporter*.tar.gz ./redis_exporter &Prometheus配置:
scrape_configs: - job_name: 'redis' static_configs: - targets: ['localhost:9121']
12.2 关键告警规则
示例告警规则:
groups: - name: redis rules: - alert: RedisDown expr: up{job="redis"} == 0 for: 1m - alert: RedisOutOfMemory expr: redis_memory_used_bytes / redis_memory_max_bytes > 0.9 for: 5m13. 安全加固进阶
13.1 网络层防护
防火墙规则:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="6379" protocol="tcp" accept' firewall-cmd --reload绑定特定IP:
bind 192.168.1.100
13.2 命令过滤
禁用危险命令:
rename-command FLUSHDB "" rename-command FLUSHALL "" rename-command CONFIG ""13.3 定期审计
检查异常连接:
redis-cli -a yourpassword CLIENT LIST监控慢查询:
slowlog-log-slower-than 10000 # 10毫秒 slowlog-max-len 128
14. 备份与恢复策略
14.1 自动化备份方案
创建备份脚本/usr/local/bin/redis-backup.sh:
#!/bin/bash DATE=$(date +%Y%m%d) BACKUP_DIR="/backup/redis" mkdir -p $BACKUP_DIR redis-cli -a yourpassword SAVE cp /var/lib/redis/dump.rdb $BACKUP_DIR/dump-$DATE.rdb find $BACKUP_DIR -name "*.rdb" -mtime +30 -delete添加到cron:
0 2 * * * /usr/local/bin/redis-backup.sh14.2 灾难恢复演练
模拟故障:
systemctl stop redis rm /var/lib/redis/dump.rdb恢复过程:
cp /backup/redis/dump-latest.rdb /var/lib/redis/dump.rdb chown redis:redis /var/lib/redis/dump.rdb systemctl start redis
15. 性能基准测试
15.1 定制化测试
模拟生产负载:
redis-benchmark -h 127.0.0.1 -a yourpassword \ -t set,get -n 1000000 -c 100 -d 256管道测试:
redis-benchmark -h 127.0.0.1 -a yourpassword \ -t set,get -n 1000000 -P 16
15.2 结果分析
关键指标解读:
- QPS:每秒查询数,反映吞吐量
- 延迟分布:P50/P95/P99延迟值
- 错误率:请求失败比例
16. 容器化部署方案
16.1 Docker部署
创建Dockerfile:
FROM centos:7 RUN yum install -y gcc make tcl COPY redis-6.0.1.tar.gz . RUN tar xzf redis-6.0.1.tar.gz && \ cd redis-6.0.1 && \ make && \ make PREFIX=/usr/local/redis install COPY redis.conf /usr/local/redis/etc/ EXPOSE 6379 CMD ["/usr/local/redis/bin/redis-server", "/usr/local/redis/etc/redis.conf"]构建并运行:
docker build -t redis-6.0.1 . docker run -d -p 6379:6379 --name myredis redis-6.0.116.2 Kubernetes部署
示例StatefulSet配置:
apiVersion: apps/v1 kind: StatefulSet metadata: name: redis spec: serviceName: redis replicas: 3 selector: matchLabels: app: redis template: metadata: labels: app: redis spec: containers: - name: redis image: redis:6.0.1 ports: - containerPort: 6379 volumeMounts: - name: redis-data mountPath: /data volumeClaimTemplates: - metadata: name: redis-data spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 1Gi17. 多实例部署模式
17.1 主从复制
配置从节点:
# 在从节点的redis.conf中 replicaof 192.168.1.100 6379 masterauth yourpassword验证复制状态:
redis-cli -a yourpassword INFO replication17.2 哨兵模式
哨兵配置示例sentinel.conf:
sentinel monitor mymaster 192.168.1.100 6379 2 sentinel auth-pass mymaster yourpassword sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000启动哨兵:
redis-sentinel /path/to/sentinel.conf18. 客户端连接管理
18.1 连接池配置
Java客户端示例(Jedis):
JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(128); poolConfig.setMaxIdle(32); poolConfig.setMinIdle(8); JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379, 2000, "yourpassword");18.2 连接限制
Redis服务端配置:
maxclients 10000 timeout 30019. 数据迁移策略
19.1 RDB文件迁移
在源Redis执行:
redis-cli -a yourpassword SAVE复制RDB文件到目标服务器:
scp /var/lib/redis/dump.rdb user@newserver:/var/lib/redis/确保文件权限正确后启动目标Redis
19.2 在线迁移工具
使用redis-cli:
redis-cli -h source_host -a source_password --rdb dump.rdb redis-cli -h target_host -a target_password --pipe < dump.rdb20. 版本升级指南
20.1 滚动升级步骤
- 升级从节点
- 故障转移
- 升级原主节点
- 恢复原主节点
20.2 兼容性检查
- 检查版本变更日志
- 测试关键命令
- 验证持久化文件兼容性
21. 生产环境检查清单
21.1 部署前检查
- [ ] 内存配置是否合理
- [ ] 持久化策略是否配置
- [ ] 监控系统是否就绪
- [ ] 备份方案是否测试
21.2 运行时检查
- [ ] 内存使用是否正常
- [ ] 是否有慢查询
- [ ] 连接数是否合理
- [ ] 复制延迟是否监控
22. 性能调优案例
22.1 高并发场景优化
- 现象:QPS达到瓶颈
- 解决方案:
- 启用管道
- 增加连接池大小
- 优化数据结构
22.2 大key问题处理
识别大key:
redis-cli -a yourpassword --bigkeys解决方案:
- 拆分大key
- 使用SCAN代替KEYS
- 调整数据结构
23. 故障处理手册
23.1 常见故障场景
内存溢出:
- 检查maxmemory配置
- 调整淘汰策略
主从不同步:
- 检查网络连接
- 验证密码配置
23.2 故障恢复流程
- 收集日志和指标
- 确定影响范围
- 实施恢复方案
- 验证数据完整性
24. 资源规划建议
24.1 硬件选型
- 内存:数据集大小的1.5倍
- CPU:4核以上
- 磁盘:SSD优先
24.2 容量规划
- 监控内存增长趋势
- 预留30%缓冲空间
- 考虑分片方案
25. 最佳实践总结
- 始终使用密码认证
- 定期备份持久化文件
- 监控关键性能指标
- 保持版本更新
- 遵循最小权限原则
在实际生产环境中,我发现以下几个经验特别有价值:
- 编译时使用
make MALLOC=libc可以避免jemalloc在某些环境下的问题 - 设置
vm.overcommit_memory=1能防止Redis在内存不足时被OOM killer终止 - 定期执行
redis-cli --bigkeys分析有助于发现潜在的性能瓶颈