努力
加油

Redis在CentOS和Ubuntu系统上的部署差异有哪些?

在 CentOS 和 Ubuntu 上部署 Redis,核心逻辑其实是一样的:都是基于 Linux 内核的进程管理、文件系统权限和网络栈。Redis 本身是跨平台的 C 语言程序,二进制包或源码编译后的行为几乎没有区别。

所谓的“差异”,主要集中在包管理器的命令习惯、默认配置文件的路径结构、以及 systemd 服务文件的初始化细节上。如果你习惯了其中一种环境,切换到另一种时容易因为“路径不对”或“命令忘了”而卡壳。下面从实战角度拆解几个关键点。

1. 安装方式与依赖管理的差异

这是最直观的区别。国内很多老运维或者服务器镜像依然偏爱 CentOS(尤其是 7/8 系列),而新的云主机默认镜像多为 Ubuntu(20.04/22.04 LTS)。

  • CentOS (yum/dnf):

    # CentOS 7
    sudo yum install epel-release
    sudo yum install redis
    
    # CentOS 8+ 通常直接包含在 BaseOS 或 AppStream 中,但版本可能较旧
    sudo dnf install redis

    注意:EPEL 源里的 Redis 版本往往滞后于官网最新稳定版。如果是生产环境,建议通过源码编译或使用官方提供的二进制包,而不是依赖系统包管理器。

  • Ubuntu (apt):

    sudo apt update
    sudo apt install redis-server

    Ubuntu 的 apt 更新机制更流畅,且 Canonical 对软件包的维护相对及时。同样,系统源中的版本也不是最新的。

真实痛点:在 CentOS 上装完 Redis 后,经常需要手动启动服务;而在 Ubuntu 上,apt install 之后服务通常会自动启动并设为开机自启。这一点在自动化脚本里要特别注意检查状态。

2. 配置文件路径与格式微调

虽然 Redis 配置指令通用,但两个发行版的默认存放位置不同,这直接影响你修改参数时的操作路径。

项目 CentOS/RHEL 系 Ubuntu/Debian 系
主配置文件 /etc/redis.conf /etc/redis/redis.conf
日志文件 通常由 systemd 接管,或位于 /var/log/redis/ /var/log/redis/redis-server.log
数据目录 /var/lib/redis /var/lib/redis
PID 文件 /var/run/redis.pid /run/redis.pid

关键差异点:

  • Ubuntu 倾向于将配置拆得更细,有时你会看到 /etc/redis/ 目录下有多个 .conf 片段,主文件会 include 其他文件。
  • CentOS 通常是单体大文件 /etc/redis.conf。
  • 注释风格:Ubuntu 的配置文件头部的注释非常详细,甚至包含了安全建议(如 protected-mode yes);CentOS 的注释相对简洁。

3. Systemd 服务文件的差异

现代 Linux 都使用 systemd 管理服务,但初始生成的 unit 文件略有不同。

  • CentOS:
    服务名通常是 redis.service。

    [Service]
    ExecStart=/usr/bin/redis-server /etc/redis.conf
    User=redis
    Group=redis

    在 CentOS 7 中,你可能还需要手动处理 SELinux 策略,否则 Redis 无法绑定非标准端口或写入特定目录。这是 CentOS 独有的坑。

  • Ubuntu:
    服务名也是 redis-server.service。

    [Service]
    ExecStart=/usr/bin/redis-server /etc/redis/redis.conf
    User=redis
    Group=redis

    Ubuntu 默认不启用 SELinux(使用的是 AppArmor),所以在安全模块上没有 CentOS 那么强的束缚感。

实操建议:无论哪个系统,修改了配置文件后,务必执行:

sudo systemctl daemon-reload
sudo systemctl restart redis-server

不要只重启服务而不 reload daemon,否则新加载的配置可能不会生效(特别是涉及 Listen IP 变更时)。

4. 防火墙与网络访问

  • CentOS:

    • CentOS 7: 使用 firewalld。
      sudo firewall-cmd --permanent --add-port=6379/tcp
      sudo firewall-cmd --reload
    • CentOS 8+: 同样使用 firewalld,但命令语法一致。
    • 重要提醒:CentOS 默认开启 firewalld,很多新手装完 Redis 发现本地能连,远程连不上,第一反应就是查 Redis 配置,其实是防火墙没开。
  • Ubuntu:

    • 默认使用 ufw (Uncomplicated Firewall)。
      sudo ufw allow 6379/tcp
      sudo ufw enable  # 如果之前未启用
    • 云厂商(如阿里云、腾讯云、AWS)的 Ubuntu 实例,通常在安全组层面已经放行了端口,本地 ufw 可能处于 inactive 状态。但务必确认!

5. 用户与权限模型

两者都推荐以独立用户运行 Redis,避免 root 风险。

  • CentOS: 安装后会自动创建 redis 用户和组。
  • Ubuntu: 同样自动创建 redis 用户和组。

常见陷阱:
在某些最小化安装的 CentOS 镜像中,如果没有正确初始化数据库目录权限,Redis 启动时会报错 Can't open the log file 或 Permission denied。解决方法:

sudo chown -R redis:redis /var/lib/redis
sudo chown -R redis:redis /var/log/redis

6. 性能调优与内核参数(共性大于差异)

这部分在两个系统上完全一致,但常被忽视。Redis 是高内存密集型应用,以下参数在 CentOS 和 Ubuntu 上都应检查:

# vm.overcommit_memory 必须设置为 1
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
sysctl vm.overcommit_memory=1

# 关闭透明大页(Transparent Huge Pages, THP)
# 这在两种系统中都会导致严重的延迟抖动
echo never > /sys/kernel/mm/transparent_hugepage/enabled

注意:Ubuntu 某些新版本内核可能对 THP 的处理更激进,务必在生产环境中永久禁用。

总结与建议

  1. 版本选择:不要依赖系统包管理器安装的 Redis 版本。对于生产环境,推荐使用 Redis Stack 或从 redis.io 下载最新稳定版源码编译,或使用 Docker/Kubernetes 部署,这样可消除 OS 差异带来的困扰。
  2. 配置一致性:无论在哪种系统上,确保 bind 127.0.0.1 改为你的内网 IP,并设置强密码 requirepass。这是比 OS 差异更重要的安全问题。
  3. 监控:使用 Prometheus + Grafana 监控 Redis,指标是跨平台的,无需因 OS 不同而改变监控方案。
  4. 备份策略:AOF 和 RDB 的持久化机制在两个系统上完全相同,定期备份到对象存储(如 OSS/S3)即可。

一句话结论:Redis 在 CentOS 和 Ubuntu 上的功能无异,差异仅在于“怎么装”、“配置文件在哪”、“防火墙怎么开”。掌握这三点,就能无缝切换。