基本配置

  1. # 指定接受的IP请求,不配置表示接受所有请求
  2. # 内网可以不配置,外网建议配置接受IP,多个IP使用空格分隔
  3. # bind 0.0.0.0 表示接受所有请求
  4. bind 127.0.0.1
  5. # redis3.2 之后加入的新特性,是否开启保护模式,默认开启(yes),关闭(no)
  6. # 在没有设置bind、IP和密码的时候只允许访问127.0.0.1(即本地访问)
  7. protected-mode yes
  8. # redis监听的端口号
  9. port 6379
  10. # TCP监听的最大容纳数量,在高并发的环境下,需要把这个值调高以避免客户端连接缓慢的问题
  11. # Linux 内核会把这个值缩小成 /proc/sys/net/core/somaxconn 对应的值(默认128),要提升并发量需要修改这tcp_max_syn_backlog和somaxconn两个值才能达到目的
  12. # 对于负载很大的服务程序一般会将它修改为2048或更大
  13. tcp-backlog 511
  14. # 客户端和Redis服务端的连接超时时间,默认为0,表示永不超时
  15. timeout 0
  16. # tcp会话保持时间
  17. tcp-keepalive 300
  18. # 是否在后台执行,yes:后台运行,守护线程;no:不是后台运行(默认)
  19. daemonize yes
  20. # redis的进程文件
  21. pidfile /var/run/redis/redis.pid
  22. # 操作系统相关参数可以设置通过upstart和systemd管理Redis守护进程,centos7以后都使用systemd
  23. supervised systemd
  24. # 指定了服务端日志的级别
  25. # 级别说明:debug(开发、测试),verbose(比debug信息略少),notice(生产环境),warn(只有非常重要的信息)
  26. loglevel notice
  27. # 指定了记录日志的文件
  28. # logfile "" :空字符串的话,日志会打印到标准输出设备;后台运行的redis标准输出是/dev/null
  29. logfile /usr/redis/var/redis.log
  30. # 数据库数量
  31. databases 16

somaxconn和tcp_max_syn_backlog参数解释:

tcp基础:对于一个TCP连接,Server和Client需要通过三次握手来建立网络连接,当三次握手成功后,就可以看到端口的状态由Listen变成了Established,接着这条链路上就可以开始传递数据了 对于服务器而言,一个完整的连接建立过程,服务器会经历2中TCP状态:SYN_READ和ESTABLISHED,对应也会维护两个队列:

  • 一个存放SYN的队列(半连接队列)
  • 一个存放已经完成连接的队列(全连接队列)

当一个连接的状态是 SYN RECEIVED 时,它会被放在 SYN 队列中。当它的状态变为 ESTABLISHED 时,它会被转移到另一个队列。所以后端的应用程序只从已完成的连接的队列中获取请求。 如果一个服务器要处理大量网络连接,且并发性比较高,那么这两个队列长度就非常重要了。因为,即使服务器的硬件配置非常高,服务器端程序性能很好,但是这两个队列非常小,那么经常会出现客户端连接不上的现象,因为这两个队列一旦满了后,很容易丢包,或者连接被复位。所以,如果服务器并发访问量非常高,那么这两个队列的设置就非常重要了。

  • tcp_max_syn_backlog:指定所能接受SYN同步包的最大客户端数量,即半连接上限,默认值是128,即SYN_REVD状态的连接数
  • net.core.somaxconn:内核参数,指服务端所能accept即处理数据的最大客户端数量,即完成连接上限,默认128

参数设置:

  • net.core.somaxconn:
    • 临时改动:sysctl -w net.core.somaxconn=32768 ,立即生效,重启后恢复默认值
    • 永久改动:在配置文件 /etc/sysctl.conf 最后添加一行 net.core.somaxconn=4000,再刷新配置文件 sysctl -p

快照配置

  1. # 在启动redis时是否显示logo
  2. always-show-logo yes
  3. # 在900秒内有一个键内容发生更改触发快照机制
  4. save 900 1
  5. # 在300秒内有10个键内容发生更改触发快照机制
  6. save 300 10
  7. # 在60秒内有10000个键内容发生更改触发快照机制
  8. save 60 10000
  9. #快照出错时,是否禁止redis写入操作
  10. stop-writes-on-bgsave-error no
  11. # 持久化到 RDB 文件时,是否压缩,"yes" 为压缩,“no” 则反之
  12. rdbcompression yes
  13. # 是否开启RC64校验,默认是开启
  14. rdbchecksum yes
  15. # 快照文件名
  16. dbfilename dump.rdb
  17. # 快照文件保存路径
  18. dir /usr/redis/var

复制选项

  1. #配置master的密码,这样可以在连上master后进行认证
  2. masterauth <master-password>
  3. # 当从库同主库失去连接或者复制正在进行,从机库有两种运行方式:
  4. 1) 如果replica-serve-stale-data设置为yes(默认设置),从库会继续响应客户端的读请求。
  5. 2) 如果replica-serve-stale-data设置为no,除去指定的命令之外的任何请求都会返回一个错误"SYNC with master in progress"
  6. replica-serve-stale-data yes
  7. # 是否设置从库只读
  8. replica-read-only yes
  9. # 是否使用socket方式复制数据, 目前redis复制提供两种方式,disk和socket。如果新的slave连上来或者重连的slave无法部分同步,就会执行全量同步,master会生成rdb文件,有2种方式:
  10. #1)disk是master创建一个新的进程把rdb文件保存到磁盘,再把磁盘上的rdb文件传递给slave
  11. #2)socket是master创建一个新的进程,直接把rdb文件以socket的方式发给slave
  12. #3)disk方式的时候,当一个rdb保存的过程中,多个slave都能共享这个rdb文件。
  13. #4)socket的方式就是一个个slave顺序复制, 只有在磁盘速度缓慢但是网络相对较快的情况下才使用socket方式,否则使用默认的disk方式
  14. repl-diskless-sync no
  15. # diskless复制的延迟时间,设置0为关闭。一旦复制开始还没有结束之前,master节点不会再接收新slave的复制请求,直到下一次开始。
  16. repl-diskless-sync-delay 30
  17. # slave根据master指定的时间进行周期性的PING监测
  18. repl-ping-slave-period 10
  19. # 复制链接超时时间,需要大于 repl ping slave period 否则会经常报超时
  20. repl-timeout 60
  21. # 在socket模式下是否在slave套接字发送SYNC之后禁用TCP_NODELAY
  22. # 如果你选择"yes",Redis将使用更少的TCP包和带宽来向slaves发送数据。但是这将使数据传输到slave上有延迟,Linux内核的默认配置会达到40毫秒
  23. # 如果你选择了"no",数据传输到salve的延迟将会减少但要使用更多的带宽
  24. repl-disable-tcp-nodelay no
  25. # 复制缓冲区大小,只有在slave连接之后才分配内存
  26. repl-backlog-size 1mb
  27. # 多次时间master没有slave连接,就清空backlog缓冲区
  28. repl-backlog-ttl 3600
  29. # 当master不可用,Sentinel会根据slave的优先级选举一个master。最低的优先级的slave,当选master。而配置成0,永远不会被选举
  30. replica-priority 100

安全

  1. # requirepass配置可以让用户使用AUTH命令来认证密码,才能使用其他命令。这让redis可以使用在不受信任的网络中
  2. # 为了保持向后的兼容性,可以注释该命令,因为大部分用户也不需要认证
  3. # 使用requirepass的时候需要注意,因为redis太快了,每秒可以认证15w次密码,简单的密码很容易被攻破,所以最好使用一个更复杂的密码
  4. requirepass foobared
  5. #把危险的命令给修改成其他名称。比如CONFIG命令可以重命名为一个很难被猜到的命令,这样用户不能使用,而内部工具还能接着使用
  6. rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
  7. #设置成一个空的值,可以禁止一个命令
  8. rename-command CONFIG ""