Redis单机部署看似只是装个包跑起来,实则涉及操作系统调优、数据可靠性保障和服务进程管理多个层面。很多线上事故并不是Redis本身崩溃,而是部署阶段留下的隐患在流量高峰时集中爆发。下面从实际工程角度拆解单机部署的核心环节。

一、安装与系统基础调优
在单机部署Redis时,第一步不是急着执行apt install redis,而是先确认系统层面的资源限制是否放开。Linux默认的最大文件描述符数和内存分配策略,往往无法满足Redis高并发连接和写时复制的需求。例如,当客户端连接数超过1024时,如果ulimit -n仍是默认值,Redis就会拒绝新连接,错误日志里出现max number of clients reached。
另一个关键是透明大页(THP)应该关闭。Redis官方明确建议禁用THP,因为在写时复制(fork子进程做持久化)过程中,THP会导致延迟陡增甚至卡顿。可以通过echo never > /sys/kernel/mm/transparent_hugepage/enabled临时关闭,并在开机脚本里固化。此外,建议将Redis安装在独立目录如/opt/redis,数据目录单独挂载到/data/redis,避免系统盘满导致持久化失败。
内存分配策略也要调整,执行sysctl vm.overcommit_memory=1让内核允许Redis在fork时顺利分配内存。如果保持默认的0,在物理内存紧张时fork可能失败,进而RDB或AOF重写无法进行。以下是一段简单的系统调优脚本示例:
# 关闭透明大页 echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag # 调整overcommit sysctl -w vm.overcommit_memory=1 # 提高文件描述符限制 ulimit -n 65535
二、持久化策略的选择与配置
Redis单机部署最纠结的点通常是RDB和AOF用哪个。RDB是定点快照,体积小、恢复快,但会丢两次快照之间的数据;AOF记录每条写命令,数据更安全,却带来额外磁盘IO和文件膨胀。生产环境的最佳实践是两者同时开启:用RDB做周期性全量备份,用AOF保证秒级数据不丢。
在redis.conf中,设置save 900 1、save 300 10等规则让Redis在变更较少时也落盘,同时appendonly yes打开AOF,并选用appendfsync everysec平衡性能与安全。每隔一秒刷盘一次,即便宕机也只丢一秒数据,而性能损耗大多数场景可忽略。需要留意AOF重写机制,配置auto-aof-rewrite-percentage 100和auto-aof-rewrite-min-size 64mb,避免文件无限增长。
如果磁盘是普通SSD,AOF的everysec通常毫无压力;若是机械盘且写吞吐高,可以评估改用no由系统刷盘,但要接受丢数据风险。下面给出典型持久化配置片段:
save 900 1 save 300 10 save 60 10000 appendonly yes appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
恢复时Redis会优先加载AOF,因为AOF被认为更完整;若AOF文件损坏,可用redis-check-aof工具修复。RDB则通过redis-check-rdb校验。两者结合,单机节点重启后基本能做到业务无感知。
三、使用systemd托管与日常运维
直接命令行跑redis-server在前台,终端一关进程就没了,这绝对不是生产做法。用systemd托管可以统一日志、自动拉起和限制资源。创建/etc/systemd/system/redis.service,指定ExecStart指向二进制并加载配置文件,同时配上Restart=always应对意外退出。
在服务文件里,建议加上User=redis和Group=redis降权运行,别用root跑数据库进程。通过LimitNOFILE=65535把文件描述符限制透传给服务,配合前面的系统调优。内存方面可用MemoryLimit防止Redis吃光整机内存把系统拖死。以下为参考单元文件:
[Unit] Description=Redis In-Memory Data Store After=network.target [Service] User=redis Group=redis ExecStart=/opt/redis/bin/redis-server /opt/redis/redis.conf Restart=always LimitNOFILE=65535 MemoryLimit=4G [Install] WantedBy=multi-user.target
日常运维上,单机Redis也要配监控,比如用redis-cli info抓内存与命中率,发现used_memory持续上涨就查大key。另外定期把RDB备份到异地,防止单机磁盘损坏全盘皆输。这样一套部署下来,单节点也能稳稳撑住中小业务流量。