Redis-12-开发运维的陷阱

Linux 配置优化

  1. vm.overcommit_memory
  2. swappiness
  3. THP(Transparent Huge Pages)
  4. OOM killer
  5. NTP(Network Time Protocol)
  6. ulimit
  7. TCP backlog

安全的 redis

  1. Redis 密码机制

    简单的密码机制

    • Redis 提供了 requirepass 配置为 Redis 提供密码功能:redis-server --requirepass <password>
    • Redis 提供了两种方式访问配置了密码的 Redis:
      • redis-cli -h <ip> -p <port> -a <password>
      • 通过 redis-cli 连接后,执行 auth <password> 命令
        运维建议
    • 密码要足够复杂
    • 如果是主从结构的 Redis,不要忘记在从节点的配置中加入 masterauth(master 的密码)配置,否则会造成主从节点同步失效
    • auth 是通过明文进行传输的,比较危险
  2. 伪装危险命令

    “危险”命令

    • keys:如果键值较多,存在阻塞 Redis 的可能性
    • flushall/flushdb:数据全部被清除
    • save:如果键值较多,存在阻塞 Redis 的可能性
    • debug:例如 debug reload 会重启Redis
    • config:config 应该交给管理员使用
    • shutdown:停止 Redis

    引入 rename-command 可以屏蔽危险命令,但可能会带来如下麻烦:

    • 管理员要对自己的客户端进行修改
    • rename-command 配置不支持 config set,所以在启动前一定要确定哪些命令需要使用 rename-command
    • 如果 AOF 和 RDB 文件包含了 rename-command 之前的命令,Redis 将无法启动,因为此时它识别不了 rename-command 之前的命令
    • Redis 源码中有一些命令是写死的,rename-command 可能造成 Redis 无法正常工作。例如Sentinel 节点在修改配置时直接使用了config命令,如果对 config 使用 rename-command,会造成 Redis Sentinel 无法正常工作

    实践建议

    • 对于一些危险的命令(例如flushall),不管是内网还是外网,一律使用 rename-command 配置
    • 建议第一次配置 Redis 时,就应该配置 rename-command,因为 rename-command 不支持 config set
    • 如果涉及主从关系,一定要保持主从节点配置的一致性,否则存在主从数据不一致的可能性
  3. 防火墙

    可以使用防火墙限制输入和输出的 IP 或者 IP 范围、端口或者端口范围

  4. bind

    bind 指定的是 Redis 和哪个网卡进行绑定,和客户端是什么网段没有关系

  5. 定期备份数据

  6. 不使用默认端口

  7. 使用非 root 用户启动

处理 bigkey

bigkey 是指 key 对应的 value 所占的内存空间比较大

bigkey 的危害

  1. 内存空间不均匀
  2. 超时阻塞
  3. 网络阻塞