美文网首页我爱编程
二、Redis 配置文件详解

二、Redis 配置文件详解

作者: 037251a7c483 | 来源:发表于2017-08-22 09:36 被阅读125次

    http://www.jianshu.com/p/41f393f594e8
      redis-server 运行时,可以直接在命令行中指定参数,也可以在配置文件中写入参数。如果是使用了conf文件,则conf文件必须是redis-server的第一个参数。如:

    ./redis-server /usr/local/redis/redis.conf

    一、网络参数

    bind

    指定监听接口。redis默认监听所有可用接口。使用bind,可以监听指定的一个或多个接口,如:

    bind 192.168.1.100 10.0.0.1
    或者
    bind 127.0.0.1
    

    protected-mod

    保护模式是一层安全保护层,以避免Redis实例在internet上打开,被访问并且被利用。
      保护模式开启后,如果没有使用“bind”指令明确绑定到一组地址以及redis server没有配置密码。服务端只接受来自回环口127.0.0.1 和 Unix 域套接字的连接

    保护默认默认开启:

    protected-mode yes
    

    port

    指定端口,默认6379。如果值为0,则不在TCP Scoket上监听

    port 6379
    

    tcp-backlog

    ** TCP listen() backlog**

    TCP socket 服务开发的4个步骤 socket->bind->listen->accept。调用listen函数时,有一个backlog参数.

    int listen(int sockfd, int backlog);

    在Linux中backlog表示已完成(ESTABLISHED)且未accept的队列大小。

    每秒高并发的环境中,为了避免客户端连接慢的问题,需要一个较高的backlog 的值。注意,Linux 内核 默认将其截断为 /proc/sys/net/core/somaxconn 的值,确保提高somaxconn和tcp_max_syn_backlog的值以获得所需的效果。

    unixsocket

    指定Unix Socket路径。没有默认值,因此没有指定时,Redis不会在Unix Socket上监听

    unixsocket /tmp/redis.sock
    unixsocketperm 700    #socket文件权限
    

    timeout

    客户端空闲N秒后则关闭连接(0 表示禁用)

    timeout <Num>
    

    默认值:

    timeout 0
    

    tcp-keepalive

    TCP keepalive。如果非零,使用SO_KEEPALIVE在缺席的情况下向客户端发送TCP ACK。有两个好处:

    1. 检测 死亡的peer
    2. 从中间的网络设备的角度来看,保持连接存活

    默认值(以秒为单位):

    tcp-keepalive 300
    

    二、一般参数

    include

    包含其他配置文件。

    include /path/to/other.conf

    daemonize

    默认值:

    daemonize no
    

    是否作为后台进程启动。默认值为no不开启,如果需要开启则设置为yes。一般为yes。

    supervised

    supervised no
    

    pidfile

    作为后台进程启动时,将进程pid 写入文件。当redis作为后台进程启动时,如果没有明确指定pid file,则默认为 "/var/run/redis.pid"

    默认指定值:

    pidfile /var/run/redis_6379.pid
    

    loglevel notice

    日志等级

    logfile

    日志文件路径

    logfile "/var/log/redis.log"
    

    databases

    设置数据库的number。默认数据库是 DB 0,可以选择使用SELECT <dbid>在每个连接的基础上使用不同的 dbid是0和'数据库'-1之间的数字

    三、持久化

    snapshotting,快照、持久化。即将DB保存到磁盘上。开启持久化使用save命令

    save

    save <seconds> <changes>
    

    如果指定时间(秒为单位)内指定的写操作次数发生将会保存DB

    默认值:

    save 900 1 #表示900秒内少1个key有变动
    save 300 10 #表示300秒内至少10个key有变动
    save 60 10000 #表示60秒内至少10000个key有变动
    

    如果不需要启用持久化,则将"save"指令注释即可,或者用如下方式写:

    save ""
    

    stop-writes-on-bgsave-error

    默认情况下,如果启用了RDB快照,Redis将停止接受写入(至少一个保存点)并且最新的后台保存将失败。这将使得用户意识到数据不会正确的持久存在于磁盘上,否则有可能没有人会注意到一些,灾难就会发生。
      如果后台的save过程再次开始工作,Redis会再次自动允许写入。但是,如果您设置了对Redis服务器的正确监视和持久性,您可能需要禁用此功能,以便Redis即使有磁盘问题、权限等等仍然照常工作

    默认:

    stop-writes-on-bgsave-error yes
    

    rdbcompression

    转储 .rdb 文件时是否使用LZF进行压缩,默认值为yes。

    默认值:

    rdbcompression yes
    

    如果在保存子节点时需要节省CPU,将其设置为"no",但是如果有可压缩的值或者键,则数据集将越来越大。

    rdbchecksum

    当加载和存储RDB文件时进行校验。这使格式更能加强数据安全,但是会消耗一定性能(大约 10%),如果需要获取最大性能,则可以禁止此选项。

    默认值:

    rdbchecksum yes
    

    dbfilename

    指定rdb文件名

    dir

    rdb文件存放路径

    持久化示例

    save 900 1
    save 300 10
    save 60 10000
    stop-writes-on-bgsave-error yes
    rdbcompression yes
    rdbchecksum yes
    dbfilename "dump6379.rdb"
    dir "/usr/local/redis-3.2.9/data"
    

    四、复制

    开启复制使用的是 slaveof 命令。只在从机上才使用slaveof进行配置。

    slaveof

    slaveof <masterIP> <masterPort>
    

    masterauth

    如果master使用了 requirepass 指令,则client 连接 master时需要使用密码。在主从复制中,使用 masterauth 来进行认证,后面接的就是连接master 时需要的密码。

    masterauth master_password

    slave-serve-stale-data

    当从机与主机断开连接时,或者当复制仍在进行时,从机可以采取两种不同的方式:
    1)如果slave-serve-stale-data设置为“yes”(默认),则slave仍然会回复client请求, 尽管数据可能会出现过期或者如果这是第一次同步,数据集可能为空。
    2)如果slave-serve-stale-data设置为“no”,则从机将回复错误“SYNC with master in progress”到所有类型的命令,除了 INFO和SLAVEOF 命令。

    默认值:

    slave-serve-stale-data yes
    

    slave-read-only

    配置slave是否只读。

    默认值:

    slave-read-only yes
    

    如下是一个配置了slave 只读的实例,这种情况下插入数据就会有错误提示。

    [root@slave2 src]# /usr/local/redis-3.2.9/src/redis-cli -h 172.16.7.192 
    172.16.7.192:6379> append test 'test'
    (error) READONLY You can't write against a read only slave.
    

    repl-diskless-sync

    复制同步策略: disk 或者 soket
    注意: 磁盘复制还在试验阶段
      新的slave 和重新连接的slave不能继续复制过程,只是收到差异。需要做的就是"full synchronization",一个RDB 文件从master上传输到slave,
    这个传输通过两种不同的方式发生:
    1) Disk-backed:redis master 创建一个新的进程将RDB 文件写入磁盘,
    随后,这个文件被父进程按增量的方式传输到slave上。
    2) Diskless; redis master 创建了一个进程直接将写RDB 文件传给slave的socke,中间过程不需要接触到磁盘

    使用diskless复制时,开始传输之前会等待一段时间(该时间以秒为单文,可配置),希望多个slave主机到达并且传输可以并行化。

    使用慢磁盘和快速(大带宽)网络,无盘复制更好的工作。

    默认值

    repl-diskless-sync no 
    

    默认使用磁盘方式

    repl-diskless-sync-delay

    如果使用磁盘同步方式开启,可以配置同步延迟时间,以等待master产生子进程通过socket传输RDB数据给slave。默认值为5秒,设置为0秒则每次传输无延迟。

    默认值

    repl-diskless-sync-delay 5
    

    repl-ping-slave-period

    slave按照预定义时间间隔给master 发送 PINGs。通过repl-ping-slave-period 可以更改这个时间间隔。默认值为10s

    # repl-ping-slave-period 10
    

    repl-timeout

    三种情况认为复制超时:
    1)slave角度,如果在repl-timeout时间内没有收到master SYNC传输的rdb snapshot数据.
    2)slave角度,在repl-timeout没有收到master发送的数据包或者ping。
    3)master角度,在repl-timeout时间没有收到REPCONF ACK确认信息。
      当redis检测到repl-timeout超时(默认值60s),将会关闭主从之间的连接,redis slave发起重新建立主从连接的请求。对于内存数据集比较大的系统,可以增大repl-timeout参数。确保这个值大于指定的repl-ping-slave-period,否则在主从间流量不高时每次都会检测到超时。

    # repl-timeout 60
    

    repl-disable-tcp-nodelay

    是否在slave套接字发送SYNC之后禁用 TCP_NODELAY。如果选择yes,Redis将使用更少的TCP包和带宽来向slaves发送数据。但是这将使数据传输到slave上有延迟,Linux内核的默认配置会达到40毫秒。 如果选择no,数据传输到salve的延迟将会减少但要使用更多的带宽。默认我们会为低延迟做优化,但高流量情况或主从之间的跳数过多时,可以设置为“yes”。

    默认值

    repl-disable-tcp-nodelay no
    

    repl-backlog-size

    设置数据备份的backlog大小。backlog是一个slave在一段时间内断开连接时记录salve数据的缓冲,所以一个slave在重新连接时,不必要全量的同步,而是一个增量同步就足够了,将在断开连接的这段时间内把slave丢失的部分数据传送给它。同步的backlog越大,slave能够进行增量同步并且允许断开连接的时间就越长。backlog只分配一次并且至少需要一个slave连接。

    默认值

    # repl-backlog-size 1mb
    

    repl-backlog-ttl

    当master在一段时间内不再与任何slave连接,backlog将会释放。以下选项配置了从最后一个slave断开开始计时多少秒后,backlog缓冲将会释放。0表示永不释放backlog

    默认值

    # repl-backlog-ttl 3600
    
    • slave-priority
        slave的优先级是一个整数展示在Redis的Info输出中。如果master不再正常工作了,sentinel将用它来选择一个slave提升为master。优先级数字小的salve会优先考虑提升为master,所以例如有三个slave优先级分别为10,100,25,sentinel将挑选优先级最小数字为10的slave。0作为一个特殊的优先级,标识这个slave不能作为master,所以一个优先级为0的slave永远不会被sentinel挑选提升为master。默认优先级为100。

    默认值

    slave-priority 100
    

    min-slaves-to-write <N>

    min-slaves-max-lag <M>

    如果连接到master的 slave少于N个,延时小于等于M秒,master就可以停止接收写操作。N个slave需要是“oneline”状态,延时是以秒为单位,并且必须小于等于指定值,是从最后一个从slave接收到的ping(通常每秒发送)开始计数。该选项不保证N个slave正确同步写操作,但是限制数据丢失的窗口期。
    例如至少需要3个延时小于等于10秒的slave用下面的指令:

    默认值

    # min-slaves-to-write 3
    # min-slaves-max-lag 10
    

    这两个选项的意思是 只有当连接到master的slave数为3,且master与slave的延时小于等于10秒,master才会接受写。

    两者之一设置为0将禁用这个功能。默认 min-slaves-to-write 值是0(该功能禁用)并且 min-slaves-max-lag 值是10。

    slave-announce-ip

    slave-announce-port

    五、安全

    • requirepass

    设置客户端认证密码,即客户端连接时需要正确的密码才行。

    requirepass passwordhahah
    

    注意:因为redis处理的速度十分快,因此密码复杂度必须要高,否则极容易爆破

    • rename-command

    命令重命名。此举是为了安全性。

    如将CONFIG命令设置成十分复杂的字符串:

    rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
    

    注意:命令重命名将会记录到AOF文件(持久化相关,后续会提到)中或者是将其传输到slaave中而造成一些问题。

    六、限制

    maxclients

    作用:设置同一时间client的连接数,默认值为10000,但是如果Redis服务器不是能够配置进程文件限制以允许指定的限制将允许的客户端的最大数量设置为当前文件限制减32(因为Redis保留了一些内部使用的文件描述符)。
    一旦达到限制,Redis将关闭所有新连接并发送一个错误'max number of clients reached'。

    # maxclients 10000
    

    maxmemory

    设置可以使用的最大内存(单位字节)。当Redis使用内存超过限制值后,Redis将通过回收策略尝试移除key。(查看maxmemory-policy)
      如果redis根据回收策略不能移除key,或者策略设置为了 'noeviction',对于将会使用更多内存的命令,Redis 会开始返回错误,比如SET 、LPUSH等等操作;但是会继续响应只读命令的请求,比如GET
      当使用Redis作为LRU缓存或为实例设置硬盘内存限制(使用'noeviction'策略)时,此选项通常很有用。
      警告:当有多个slave连上达到内存上限时,master为同步slave的输出缓冲区所需内存不计算在使用内存中。这样当移除key时,就不会因网络问题 / 重新同步事件触发移除key的循环,反过来slaves的输出缓冲区充满了key被移除的DEL命令,这将触发删除更多的key,直到这个数据库完全被清空为止。
      总之,如果你需要附加多个slave,建议你设置一个稍小maxmemory限制,这样系统就会有空闲的内存作为slave的输出缓存区(但是如果最大内存策略设置为"noeviction"的话就没必要了)

    • 默认值
    # maxmemory <bytes>
    

    maxmemory-policy

    最大内存策略:如果达到内存限制了,Redis如何选择删除key。

    volatile-lru -> 根据LRU算法删除设置过期时间的key
    allkeys-lru -> 根据LRU算法删除任何key
    volatile-random -> 随机移除设置过过期时间的key
    allkeys-random -> 随机移除任何key
    volatile-ttl -> 移除即将过期的key(minor TTL)
    noeviction -> 不移除任何key,只返回一个写错误
      注意:对所有策略来说,如果Redis找不到合适的可以删除的key都会在写操作时返回一个错误。目前为止涉及的命令:set setnx setex append incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby getset mset msetnx exec sort

    • 默认值
    # maxmemory-policy noeviction
    

    maxmemory-samples

    LRU和最小TTL算法的实现都不是很精确,但是很接近(为了省内存),所以你可以用样本量做检测。 例如:默认Redis会检查3个key然后取最旧的那个,你可以通过下面的配置指令来设置样本的个数。

    默认值为5,数字越大结果越精确但是会消耗更多CPU。

    • 默认值
    # maxmemory-samples 5
    

    七、APPEND ONLY MODE

    Redis 持久化方式有两种,RDB和AOF。默认使用RDB
      Redis默认使用异步转储磁盘上的数据,这种模式在大多数应用程序中可以很好地工作,但是当redis进程或者电源 中断后,可能会导致几分钟的写入数据丢失(具体取决于 save point)
      Append Only File(AOF)提供了提供了持久性更强的模式,如使用默认数据fsync策略(参见后面的配置), 在遇到像服务器断电或单写情况下Redis自身进程出问题但操作系统仍正常运行等突发事件时,Redis可能只丢失1秒的数据。
      AOF和RDB可以同时使用,如果AOF也开启了,Redis将加载AOF,因为AOF文件提供了更好的持久性保证。

    appendonly

    是否开启AOF,AOF 默认关闭。

    • 默认值
    appendonly no
    

    appendfilename

    AOF 文件名

    • 默认值
    appendfilename "appendonly.aof"
    

    appendfilename 只接文件名,而不应该是全路径,AOF文件会默认在安装主目录。

    appendfsync

    fsync() 系统调用告诉操作系统把数据写到磁盘上,而不是等更多的数据进入输出缓冲区。有些操作系统会真的把数据马上刷到磁盘上;有些则会尽快去尝试这么做。

    Redis支持三种不同的模式:
    no:不要立刻刷,只有在操作系统需要刷的时候再刷。比较快。
    always:每次写操作都立刻写入到aof文件。慢,但是最安全。
    everysec:每秒写一次。折中方案。
    默认的everysec通常来说能在速度和数据安全性之间取得比较好的平衡。

    • 默认值
    appendfsync everysec
    

    no-appendfsync-on-rewrite

    如果AOF的同步策略设置成 "always" 或者 "everysec",并且后台的存储进程(后台存储或写入AOF 日志)会产生很多磁盘I/O开销。某些Linux的配置下会使Redis因为 fsync()系统调用而阻塞很久。
    注意,目前对这个情况还没有完美修正,甚至不同线程的 fsync() 会阻塞我们同步的write(2)调用。
    为了缓解这个问题,可以用下面这个选项。它可以在 BGSAVE 或BGREWRITEAOF 处理时阻止fsync()。这就意味着如果有子进程在进行保存操作,那么Redis就处于"不可同步"的状态。这实际上是说,在最差的情况下可能会丢掉30秒钟的日志数据。(默认Linux设定)
    如果把这个设置成"yes"带来了延迟问题,就保持"no",这是保存持久数据的最安全的方式。

    • 默认值
    no-appendfsync-on-rewrite no
    

    自动重写AOF文件

    如果AOF日志文件增大到指定百分比,Redis能够通过 BGREWRITEAOF 自动重写AOF日志文件。
    工作原理:Redis记住上次重写时AOF文件的大小(如果重启后还没有写操作,就直接用启动时的AOF大小)
    这个基准大小和当前大小做比较。如果当前大小超过指定比例,就会触发重写操作。你还需要指定被重写日志的最小尺寸,这样避免了达到指定百分比但尺寸仍然很小的情况还要重写。
    指定百分比为0会禁用AOF自动重写特性。

    • 默认值
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    

    aof-load-truncated

    如果设置为yes,如果一个因异常被截断的AOF文件被redis启动时加载进内存,redis将会发送日志通知用户。如果设置为no,erdis将会拒绝启动。此时需要用"redis-check-aof"工具修复文件。

    • 默认值
    aof-load-truncated yes
    

    相关文章

      网友评论

        本文标题:二、Redis 配置文件详解

        本文链接:https://www.haomeiwen.com/subject/tztccxtx.html