文章目录

  • redis 的配置
  • 1.network部分
  • 2、GENERAL 通用部分
  • 3. SNAPSHOTTING 快照 相关设置
  • 4. REPLICATION 复制相关
  • 5. AOF 日志文件
  • 6.cluster集群部分
  • 7. 其他部分


redis 的配置

1.network部分

  • bind 0.0.0.0 #监听地址,可以用空格隔开后多个监听 IP
  • protected-mode yes #redis3.2 之后加入的新特性,在没有设置 bind IP 和密码的时候只允许访问
    127.0.0.1:6379
  • port 6379 #监听端口
  • tcp-backlog 511 #三次握手的时候 server 端收到 client ack 确认号之后的队列值。(一般情况511够用了)
  • timeout 0 #客户端和 Redis 服务端的连接超时时间,默认是 0,表示永不超时。
  • tcp-keepalive 600 #tcp 会话保持时间(服务器与客户端最长保持600秒,超时断开)

2、GENERAL 通用部分

  • daemonize yes #认情况下 redis 不是作为守护进程运行的,如果你想让它在后台运行,你就把它改成
    yes,当 redis 作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件里面
  • supervised no #和操作系统相关参数,可以设置通过 upstart 和 systemd 管理 Redis 守护进程,centos 7
    以后都使用 systemd
  • pidfile /var/run/redis_6379.pid #pid 文件路径
  • loglevel notice #日志级别 (默认的notice 已经够用,若为了排错,可以改为debug ,可以查看到更多日志)
  • logfile “/apps/redis/redis_6379.log” #日志路径
  • databases 16 #设置 db 库数量,默认 16 个库(select 可以选择 0-15)
  • always-show-logo no #在启动 redis 时是否显示 log(就是那个6边的图标,每次启动都有,没啥意义,,可以关了)

3. SNAPSHOTTING 快照 相关设置

  • save 900 1 #在 900 秒内有一个键内容发生更改就出就快照机制
    save 300 10 #在 300秒内有10个键内容发生更改就出就快照机制
    save 60 10000 #在 60 秒内有10000个键内容发生更改就出就快照机制
    这个是或的关系有一个条件满足就生成快照,redis 服务停止时也会自动做快照

2343:M 15 Feb 13:29:31.782 # User requested shutdown…
2343:M 15 Feb 13:29:31.782 * Saving the final RDB snapshot before exiting.

  • stop-writes-on-bgsave-error no #快照出错时(比如由于权限和磁盘满了的原因,导致无法写入快照)是否禁止 redis 写入操作
  • rdbcompression yes #持久化到 RDB 文件时,是否压缩,"yes"为压缩,"no"则反之。 压缩rdb 快照文件,但是会更消耗CPU
  • rdbchecksum yes #是否开启 RC64 校验,默认是开启(一般情况下都开启)
  • dbfilename dump.rdb #快照文件名
  • dir /apps/redis/data #快照文件保存路径

4. REPLICATION 复制相关

  • replica-serve-stale-data yes #当从库同主库失去连接或者复制正在进行,从机库有两种运行方式:
  1. 如果 replica-serve-stale-data 设置为 yes(默认设置),从库会继续响应客户端的读请求。
  2. 如果 replicaserve-stale-data 设置为 no,除去指定的命令之外的任何请求都会返回一个错误"SYNC with master in progress"。
  • replica-read-only yes #是否设置从库只读。(主从复制时,从库是否响应客户的请求)
  • repl-diskless-sync no #是否使用 socket 方式复制数据,目前 redis 复制提供两种方式,disk 和 socket,如果新的 slave 连上来或者重连的 slave 无法部分同步,就会执行全量同步,master 会生成 rdb 文件,有2 种方式:
  • disk 方式是 master 创建一个新的进程把 rdb 文件保存到磁盘,再把磁盘上的 rdb 文件传递给 slave,优点是是只需dump一次,可以把这个dump下来的rdb文件发送给多个slave,但是socket方式,若多个slave,则需要dump 多次
  • socket 是 master 创建一个新的进程,直接把 rdb 文件以 socket 的方式发给 slave,disk 方式
    的时候,当一个 rdb 保存的过程中,多个 slave 都能共享这个 rdb 文件,socket 的方式就是一个个 slave
    顺序复制,只有在磁盘速度缓慢但是网络相对较快的情况下才使用 socket 方式,否则使用默认的 disk
    方式。

以上2种方式只发生在第一次同步时,做完全部分。完全部分完成后,下一次才是增量备份。 一般情况下,我们使用 no,不使用无盘复制

  • repl-diskless-sync-delay 5 diskless 复制的延迟时间,设置 0 为关闭,一旦复制开始还没有结束之前,master 节点不会再接收新 slave 的复制请求,直到下一次开始。假若一共有3个slave需要同步,则当master dump完成时,但此时只有2个salve 加入到复制队列中,会等待5秒,若5内,第三个slave加入了队列,则同时把这个dump下的文件发送给这3个slave,如果5s内,没有加入,则第三个slave只能等待下个复制周期.
  • repl-ping-slave-period 10 #slave 根据 master 指定的时间进行周期性的 PING 监测
  • repl-timeout 60 #复制链接超时时间,需要大于 repl-ping-slave-period,否则会经常报超时。以上两条(period和timeout)的设置对结果没有什么太大影响,过一会仍然会请求同步
  • repl-disable-tcp-nodelay no #在 socket 模式下是否在 slave 套接字发送 SYNC 之后禁用 TCP_NODELAY,
    如果你选择“yes”Redis 将使用更少的 TCP 包和带宽来向 slaves 发送数据。但是这将使数据传输到 slave
    上有延迟,Linux 内核的默认配置会达到 40 毫秒,如果你选择了 “no” 数据传输到 salve 的延迟将会减
    少但要使用更多的带宽
  • repl-backlog-size 5mb #复制缓存区大小,只有在 slave 连接之后才分配内存(指的是master)。这项是为了允许slave断开master一段时间而不报错。通常在完成第一次复制后,以后发生的复制都是增量复制的。若此时有一个slave 断开了连接,此时master 会把增量复制的部分累积放到缓存中,当repl-backlog-ttl时间段内,slave又与master连接上了,就把缓存的数据发送给slave,而不需要完成备份发送给slave了。
  • repl-backlog-ttl 3600 #多次时间 master 没有 slave 连接,就清空 backlog 缓存。
  • replica-priority 100 #当 master 不可用,Sentinel 会根据 slave 的优先级选举一个 master。最低的优先级
    的 slave,当选 master。而配置成 0,永远不会被选举。

5. AOF 日志文件

appendonly no #是否开启 AOF 日志记录,默认 redis 使用的是 rdb 方式持久化,这种方式在许多应用中已
经足够用了。但是 redis 如果中途宕机,会导致可能有几分钟的数据丢失,根据 save 来策略进行持久化,
Append Only File 是另一种持久化方式,可以提供更好的持久化特性。Redis 会把每次写入的数据在接收后
都写入 appendonly.aof 文件,每次启动时 Redis 都会先把这个文件的数据读入内存里,先忽略 RDB 文件。

Redis默认采用异步的方式将数据存放到磁盘上,这个模式对大部份应用来说是足够好的,但是在Redis进程或电源发生故障的情况下,可能会造成小部份的数据丢失,这取决于配置的保存时间点。
Appendonly是一种能够提供非常好的持久化的模式,例如使用默认的Fsync方案,Redis能在发生服务器电源故障或操作系统仍然正常运行但Redis进程莫名挂掉的情况下,只丢失1秒的数据。
AOF与RDB模式可以同时启用,这并不冲突。如果AOF是可用的,那Redis启动时将自动加载AOF,这个文件能够提供更好的持久性保障。

  • appendfilename “appendonly.aof” #AOF 文件名
  • appendfsync everysec #aof 持久化策略的配置,no 表示不执行 fsync(FULL sync),由操作系统保证数据同步到磁盘,always 表示每次写入都执行 fsync,以保证数据同步到磁盘,everysec 表示每秒执行一次 fsync,可能会
    导致丢失这 1s 数据。

fsync()调用告诉操作系统将数据真实的写入磁盘而不是放到缓冲区中,一些操作系统会真实的执行请求,还有一些操作系统只会尽力的尝试。

Redis支持3种不同的模式:
no:不即时同步,由操作系统控制何时刷写到磁盘上,这种模式速度最快;
always:每次只写日志,速度较慢,但最安全;
everysec:每秒钟同步一次,折中的方案。

默认的模式是“everysec”,它通常是在速度和数据安全之间折中的方法。如果你可以控制操作系统在Redis需要的时候去刷写缓冲区那可以使用“no”模式,能够提供更好的性能(但如果你能接受一些数据丢失,可以考虑默认的持久化模式–快照方式),相反,使用“always”模式很慢,但是它比“everysec”模式要安全一点。

如果不确定,就使用“everysec”。

  • no-appendfsync-on-rewrite no 在 aof rewrite 期间,是否对 aof 新记录的 append数据。 暂缓使用文件同步策略,主要考虑磁盘 IO 开支和请求阻塞时间。默认为 no,表示"不暂缓",新的 aof 记录仍然会被立即同步,
    Linux 的默认 fsync 策略是 30 秒,如果为 yes 可能丢失 30 秒数据,但由于 yes 性能较好而且会避免出
    现阻塞因此比较推荐。考虑bgsave和fysnc同时进行时的可能的阻塞问题(此项和下面那2项都是为了优化AOF数据体积,当硬盘性能好时,这都不是事)

当使用AOF的fsync方案设置为“always”或“everysec”时,后台的存储进程会执行大量的磁盘I/O操作,在一些Linux架构中,Redis在fsync()调用时可能会阻塞很久。这个问题当前并没有修复,即使是在一个不同的线程执行fsync也将会阻塞我们的同步写调用。

为了缓解这个问题,可以使用以下选项,它将会在有一个BGSAVE或BGREWRITEAOF正在运行时,阻止主进程调用fsync()。

这意味着有另一个子进程在存储时,Redis的持久性等同于“appendfsync none”。在实践中,意味着在最坏的情况下它可能丢失多达30秒的日志(默认的Linux设置)。

如果你有潜在的问题需要更改它为“yes”。否则从持久性的观点来看“no”是最安全的选择

  • auto-aof-rewrite-percentage 100 # 当 Aof log 增长超过指定百分比例时,重写 log file, 设置为 0 表示
    不自动重写 Aof 日志,重写是为了使 aof 体积保持最小,而确保保存最完整的数据。

自动重写append only文件。(原因是为了减小AOF 体积,当你重复修改同一个数据时,会产生多条AOF的记录。但是变化的最后结果是确定的,可以把抵消的操作记录删除)
当AOF日志的大小根据指定的百分比增长时,Redis会暗中调用BGREWRITEAOF去自动重写日志文件。

工作原理:Redis记忆AOF文件最后一次重写的大小(如果重启后没有重写发生,AOF的大小在启动时会被使用)。

基本大小对比当前大小。如果当前大小比指定的百分比大,触发重写。并且你要为AOF文件指定一个最小的尺寸去重写,这对于避免重写AOF文件是有用的,即使达到了百分比增长率但它仍然是非常小的。

指定百分比为0以便禁用自动AOF重写。

  • auto-aof-rewrite-min-size 64mb #触发 aof rewrite 的最小文件大小。(当为128M时才重写)
  • aof-load-truncated yes #是否加载由于其他原因导致的末尾异常的 AOF 文件(主进程被 kill/断电等)
  • aof-use-rdb-preamble yes #redis4.0 新增 RDB-AOF 混合持久化格式,在开启了这个功能之后,AOF 重写
    产生的文件将同时包含 RDB 格式的内容和 AOF 格式的内容,其中 RDB 格式的内容用于记录已有的数
    据,而 AOF 格式的内存则用于记录最近发生了变化的数据,这样 Redis 就可以同时兼有 RDB 持久化和
    AOF 持久化的优点(既能够快速地生成重写文件,也能够在出现问题时,快速地载入数据)。

6.cluster集群部分

  • cluster-enabled yes #是否开启集群模式,默认是单机模式
  • cluster-config-file nodes-6379.conf #由 node 节点自动生成的集群配置文件
  • cluster-node-timeout 15000 #集群中 node 节点连接超时时间
  • cluster-replica-validity-factor 10 #在执行故障转移的时候可能有些节点和 master 断开一段时间数据比较
    久,这些节点就不适用于选举为 master,超过这个时间的就不会被进行故障转移
  • cluster-migration-barrier 1#一个主节点拥有的至少正常工作的从节点,即如果主节点的 slave 节点故障后会将多余的从节点分配到当前主节点成为其新的从节点.
  • cluster-require-full-coverage no #集群槽位覆盖,如果一个主库宕机且没有备库就会出现集群槽位不
    全,那么 yes 情况下 redis 集群槽位验证不全就不再对外提供服务,而 no 则可以继续使用但是会出现
    查询数据查不到的情况(因为有数据丢失)。如:当集群中有3台master,有一台master无法工作,另外2台master 还要为你提供服务吗?

7. 其他部分

  • SECURITY
  • requirepass foobared #设置 redis 连接密码
  • rename-command #重命名一些高危命令
  • CLIENTS
maxclients 10000 #最大连接客户端
  • MEMORY MANAGEMENT
    maxmemory #最大内存,单位为 bytes 字节,8G 内存的计算方式 8(G)*1024(MB)*1024(KB)*1024(Kbyte),
    需要注意的是 slave 的输出缓冲区是不计算在 maxmemory 内。
  • LUA SCRIPTING
    lua-time-limit 5000 #lua 脚本的最大执行时间,单位为毫秒
  • SLOW LOG

Slow log 是 Redis 用来记录查询执行时间的日志系统,slow log 保存在内存里面,读写速度非常快,因此你可以放心地使用它,不必担心因为开启 slow log 而损害 Redis 的速度。

  • slowlog-log-slower-than 10000 #以微秒为单位的慢日志记录,为负数会禁用慢日志,为 0 会记录每个命
    令操作。
  • slowlog-max-len 128 #记录多少条慢日志保存在队列,超出后会删除最早的,以此滚动删除
  • 哨兵的部分,看我下一篇部署文档。。