• redis.conf


    写在前面的话

      这边博客实际上是redis.conf(版本5.0.7)文件的翻译,配置没有做任何调整,有笔者自己加的一些东西,所有的配置以代码的形式出现。为什么写这个呢,这个文件以前也大致看过,了解其中一部分,所以这次也系统的学习下(笔者在下班后每天整理)。当然这个文档只能介绍redis都有些什么,具体怎么配置,如果想熟练掌握,还是要结合官方文档来学习https://redis.io/documentation以及实操,至于源码吗,我还是算了,基本都还给老师了。 还有两个部分没有写,一个是高级配置,一个是活动碎片整理(实验阶段)。
     

    Redis 配置文件 样例

    ###################################################################### 

    服务启动

    ./redis-server /usr/local/redis/redis.conf 
    #MAC redis 启动
    redis-server /usr/local/redis/redis.conf
    #MAC 客户端启动
    redis-cli
    单位:当使用内存时,需要指定单位,忽略大小写,所以1gb,1Gb,1GB是一样的。
    #1k => 1000 bytes 
    #1kb => 1024 bytes 
    #1m => 1000000 bytes 
    #1mb => 1024*1024 bytes 
    #1g => 1000000000 bytes 
    #1gb => 1024*1024*1024 bytes 

    INCLUDES

    ################################## ###################################
    引入其他的配置文件,如果你有标准化的模板对于redis服务但是又需要对一些服务做定制,这个是非常有用的。
    关键字"include" 不能被管理员或者哨兵使用'CONFIG REWRITE'命令重写。
    #include /path/to/local.conf 
    #include /path/to/other.conf

    MODULES

    ######################################################################
    在服务启动时加载模板,如果服务没有能力加载模板,启动会中断。可以使用多个加载模板 loadmodule 命令
     
    #loadmodule /path/to/my_module.so 
    #loadmodule /path/to/other_module.so

    NETWORK

    ######################################################################
    默认情况下,如果bind命令没有指定,redis 服务监听所有的与之相连的网络接口。可以使用bind命令只监听一个或者多个被选择的接口。
    bind 192.168.1.100 10.0.0.1 bind 127.0.0.1 ::1
    ⚠️ 如果运行redis的服务器直接暴露在网络上,绑定所有的接口是危险的,并且会将实例暴露给网络上的所有人。所以默认情况
    bind 127.0.0.1
    保护模式是安全层面的保护,为了防止redis实例被互联网访问使用。当保护模式打开并且如果下面的情况:
    • 服务没有明确指定绑定地址,使用bind 命令
    • 密码没有配置
    服务只接受ipv4 ipv6地址是127.0.0.1he ::1的客户端连接。
    保护模式默认是开启的,如果你确定想要其他主机的客户端连接客户端尽管没有授权配置,也不需要指定绑定的接口,那么可以关闭。
    protected-mode yes  
     
    指定端口,默认值是6379,如果port=0,将不会监听tcp 套接字。
    port 6379
    TCP 监听积压
    在高请求环境下,你需要高积压为了避免客户端慢连接问题。注意,linux内核会平静的清空/proc/sys/net/core/somaxconn,所以确保增加somaxconn 和 tcp_max_syn_backlog 以达到想要的效果。
    tcp-backlog 511
     
    unix 套接字
    unix套接字指定路径,监听连接。默认情况下,redis不会监听unix套接字,如果没有指定。
    #unixsocket /tmp/redis.sock 
    #unixsocketperm 700
     
    客户端空闲多少秒后关闭,0 是关闭。
    timeout 0
    TCP 存活
    如果非0,使用SO_KEEPALIVE在没有交流的情况下向客户端发送TCP ACKs 。这样做有两个好处:
    • 检测死亡节点
    • 从中间网络层视角看到连接存活
    在linux 系统中,指定的值(秒)是用来发送ack 的时间段。
    注意:关闭连接需要双倍的时间(600s)。在其他的内核上面,时间段有内核配置来决定。
    合理的值是300s,从redis v3.2.1开始作为默认值。
    tcp-keepalive 300

    GENERAL

    ######################################################################
    默认情况下,redis不会被作为守护进程运行,如果需要,设置为yes。注意:当守护进程时,会写pid到/var/run/redis.pid
    daemonize no
     
    如果使用upstart 或者systemd运行redis,redis可以和监督树进行交互。
    选项:
    • supervised no 没有监督交互
    • supervised upstart 示意upstart 将redis置于SIGSTOP模式
    • supervised systemd 示意systemd写ready=1到$NOTIFY_SOCKET
    • supervised auto -通过 UPSTART_JOB or NOTIFY_SOCKET环境变量检测upstart 或者systemd方法。
    提示:这些监督方法只是表示程序已经准备好,不能持续向监督者ping
    supervised no
     
    如果pid文件指定,redis在服务启动时写,在退出时清除。当服务不以守护者身份运行,如果pid不指定,pid文件不会被创建。如果以守护者身份运行,如果没有没有指定pid文件,使用默认值/var/run/redis.pid,
    pidfile /var/run/redis_6379.pid
    指定服务日志冗余层级,下列选项之一:
    • debug 大量的信息,适用于开发测试
    • verbose -许多稀少有用信息
    • notice -生产环境设定
    • warning -只有重要的或者错误信息被打印
    loglevel notice
     
    指定日志文件名,空值时,redis用标准流输出日志。注意:如果使用流输出日志并且以守护者的身份运行,日志会发送到 /dev/null(1>dev/null 黑洞)
    logfile ""
     
    开启系统日志
    # syslog-enabled no
     
    指定日志身份
    # syslog-ident redis
     
    指定日志工具,必须是 USER 或者 LOCAL0-LOCAL7
    # syslog-facility local0
    设置数据库的数量,默认数据库是db0,你可以为每个请求选择不同的bdid,值域[0,databases-1]
    databases 16
     
    打开logo
    always-show-logo yes
     

    SNAPSHOTTING (快照,RDB)

    ######################################################################
    保存数据到磁盘上:
    save <seconds> <changes>
    下面的例子行为会被保存:
    • 900s至少1key发生变化
    • 300s至少10key发生改变
    • 60s至少10000key被改变
    注意:如果你要关闭自动保存,注释下面的save行。当然也可以移除这个配置,使用save命令,使用空参数,如save ""
    save 900 1 
    save 300 10 
    save 60 10000
     
    默认情况下,如果RDB快照打开或者最新后台save失败,redis会停止接受写操作。将提醒用户数据可能没有持久化到磁盘上,否则没人会注意到变化并且一些灾难将会发生。如果redis后台保存程序再次开始工作,写操作将自动被允许。
    然而如果对redis服务和持久化设置合适的监控,你可能会想关闭此功能,因此redis像往常一样持续工作,尽管可能磁盘,权限出现问题等等
    stop-writes-on-bgsave-error yes
     
    在dump .rdb数据库,使用LZF 压缩字符串对象? 默认是是yes,如果你想保存CPU保存子集合,但是数据库会比压缩大。(这不废话吗?压缩当然小呀)。
    rdbcompression yes
     
    自从版本5,CRC64 校验和被放置在文件末尾。这种格式更持久,但是会降低10%性能,如果想最大化性能,关闭配置。
    关闭校验,rdb文件被创建,校验是0告诉加载码跳过校验。
    rdbchecksum yes
    rdb文件名称
    dbfilename dump.rdb
     
    工作文件路径,db写入文件内部,文件名使用 'dbfilename' 配置命令。Aof(Append only file)文件也写入这个文件内。请注意redis-server运行的文件路径,以redis服务命令运行的文件路径为当前路径。
    dir ./

    REPLICATION

    ######################################################################
    主从复制,一个redis实例从其他服务拷贝数据。
    # +------------------+ +---------------+
    # | Master | ---> | Replica |
    # | (receive writes) | | (exact copy) |
    # +------------------+ +---------------+
    ASAP:
    • 复制时异步的,但是你可以配置主节点停止接受写操作,如果出现和最新的复制节点断开连接。
    • 如果复制链在相对较短的时间内丢失,redis副本可以和主机执行部分重新同步。你可以配置合适的复制积压大小,依赖于你的需求。
    • 复制时自动的,不需要用户转换。在网络断开后,副本自动尝试重连主机并且重新同步数据。
    # replicaof <masterip> <masterport>
     
    如果主本有密码保护,在开始复制程序前,需要告诉副本先授权,否则主节点会拒绝复制请求。
    # masterauth <master-password>
     
    当副本和主节点断开连接或者复制仍在进行中,有两种不同的操作方式:
    • 如果 replica-serve-stale-data= yes(默认值),副本仍然回复客户端请求,可能是过期的数据,或者在第一次同步时,数据集可能是空的。
    • 如果replica-serve-stale-data=no,除了INFO, replicaOF, AUTH, PING, SHUTDOWN, REPLCONF, ROLE, CONFIG, SUBSCRIBE, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB, COMMAND, POST, HOST: and LATENCY命令的所有操作,副本回复一个错误”SYNC with master in progress“,
    备份节点对不新鲜数据的处理方式。
    replica-serve-stale-data yes
     
    可以配置副本实例是否支持写操作。副本实例可能存储临时数据是有好处的(因为副本写的数据会在和主节点重新同步删除),但是也可能导致问题,如果客户端错误配置。redis2.6版本后,默认副本只读。
    注意:只读副本节点不希望暴露给互联网上不可信的客户端,它只是一个保护层,防止错误使用实例。默认情况下,只读副本仍然导出所有管理命令,如CONFIG、DEBUG等。
    replica-read-only yes
     
    复制同步策略:磁盘或者套接字。
    警告⚠️:无磁盘复制目前在实验中。
    新副本和重连副本不能继续复制过程只能接受差异,需要做全量同步。rdb文件从主节点传送给复制节点。
    传输可能以两种不同的方式发生,:
    • 磁盘备份。redis主节点创建新的程序在磁盘上写rdb文件,之后父程递增传输给复制节点。
    • 无磁盘复制。redis主节点创建新程序,直接写rdb文件给副本的scoket,不用接触磁盘。
    使用磁盘备份复制,当rdb文件生成,更多的副本可以排队并且服务rdb文件,只要子集文件产生rdb文件完成。在无盘复制中,一旦传输开始,新的到达的副本将排队,当当前副本终止时,新的传输将开始。
    使用无磁盘复制方式,主节点在开始传输钱等待配置的时间(s),以希望更多的副本到达,并行传输。当磁盘慢并且网络时,无磁盘化表现更好。
    repl-diskless-sync no
    当无磁盘复制开启,可能需要配置服务延迟等待,为了生成通过套接字将rdb传输到副本的子项。一旦服务启动,这是非常重要的,不可能服务新到来的副本节点,将会排队等待下一个rbd传输,所以服务会延迟一会等待更多的副本。延迟时间单位是秒,默认是5s,为了完全关闭,将值设置为0,并且传送尽快的开始。
    repl-diskless-sync-delay 5
     
    副本发送心跳检测给服务在预定义的时间间隔。可能改变间隔通过repl_ping_replica_period 、默认值是10s.
    # repl-ping-replica-period 10
     
    下面的选项设置的复制超时
    • 从副本的角度看,同步期间的大容量传输I/O。
    • 从副本的角度看,主节点超时。(数据,ping)
    • 从主节点的角度看,副本超时。(复制配置 ack pings).
    指定repl-timeout的值大于repl-ping-replica-period 是非常重要的,否则当主节点和副本低频率交流,每次超时都会被检测到,
    # repl-timeout 60
     
    关闭同步后副本套接字tcp_nodelay?
    • yes,redis会发送小数量的tcp包并且小带宽发送数据给复制节点。但是这可能增加数据出现在副本一侧,大概40ms,使用linux内核设置。
    • no,数据出现到副本一侧会减少,但是更多宽带用于复制。
    默认情况下,我们选择低延迟,但是在高传输环境或者当主副节点多次跳开时,设置yes会是一个好的选择。
    repl-disable-tcp-nodelay no
     
    设置副本积压大小,积压是一个缓存用于积累副本数据,当副本和主节点断开一段时间,所以当副本想要重连,经常全量重新同步是没有必要的, 但是部分重新同步时足够的,只发送断开连接的这部分数据。副本积压越大,副本断开时间就可以越长,之后能够执行部分重新同步。
    只有当有副本连接时,积压才会被分配。
    # repl-backlog-size 1mb
     
    当主节点和最后一个副本不再连接时,积压缓存会释放,配置断开连接到释放缓存的时间。0代表永远不释放缓存。当副本晋升为主节点是不会释放积压缓存
    # repl-backlog-ttl 3600
     
    副本优先级是数字型数字,如果主节点不再正常工作,redis哨兵用于选择副本晋升为主节点,副本的优先级越低,也就越容易晋升,如果有三个副本,优先级是10,100,25,那么哨兵会选择优先级是10的副本。然而如果优先级是0,则不会晋升为主节点,哨兵不会永远不会选择优先级是0部分。默认值是100。
    replica-priority 100
     
    如果连接的副本数量少于N,延迟时间小于等于Ms,主节点停止写操作,N个副本需在出于’online‘状态,延迟单位是秒,必须<=指定值,从接收副本最后一次ping开始算起,ping 每秒一次(这不是常识吗),此选项不保证N个副本将接受写操作,但会将丢失写操作的曝光时间限制在指定的秒数(如果没有足够的副本可用)。设置一个或者另外一个值为0关闭这个功能,默认情况下,min-replicas-to-write =0 (功能关闭)并且min-replicas-max-log =10。
    # min-replicas-to-write 3 
    # min-replicas-max-lag 10
     
    主节点可以通过不同的方式列举出副本的地址和端口,例如,信息复制章节提供这部分信息,redis哨兵使用这部分信息发现副本实例;其他情况下可以使用 role命令 输出这部分信息。
    IP:副本和主节点连接的地址。
    Port: 监听连接,复制握手。
    然而,当使用端口调换或者network地址转换,副本可能实际可访问的,通过不同的地址端口对。下面两个选项可以被副本使用,报告主节点指定好的端口和ip,所以info,role都会输出这部分信息。
    # replica-announce-ip 5.5.5.5 
    # replica-announce-port 1234
     

    SECURITY

    #####################################################################
    密码,足够长。
    # requirepass foobared
     
    允许在开放性环境修改危险性命令名称。例子 修改变量名称,也可以移除命令。注意,修改命令操作会被记录在aof文件或者被传送到副本造成问题。最好别做这个事情。
    # rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 
    # rename-command CONFIG ""

    CLIENTS

    #######################################################################
    设置客户端最大的连接数,默认值是10k,一旦超过最大连接数,报错 'max number of clients reached'。
    # maxclients 10000

    MEMORY MANAGEMENT

    ##############################################################
    当内存达到设置的大小,redis会根据选择移除算法移除一些key。如果redis根据策略不能移除key或者如果策略是不移除,redis会对写操作报错,如set,lpush,但是支持读操作,如get。通常使用lru,lfu,或者使用不移除策略。
    # maxmemory <bytes>
     
    最大内存策略:当redis达到最大内存,选择那些key移除。可以从下面五种行为中选择:
    • volatile-lru ->使用lru算法移除已经过期的key。
    • allkeys-lru -> 使用lru算法移除任意key。
    • volatile-lfu -> 使用lfu算法移除已经过期的key。
    • allkeys-lfu -> 使用lfu算法移除任意key。
    • volatile-random -> 从过期的key随机移除key。
    • allkeys-random -> 随机移除key,任意key。
    • volatile-ttl -> 移除快要过期的key。
    • noeviction -> 不移除任何,只对写操作返回错误。
    lru least recently used 最近最少使用
    lfu least frequently used 最不常用
    lru,lfu和volatile-ttl的实现使用大约随机算法。注意:上面的任何算法,当没有可是的key被移除,redis对写操作返回错误信息。
    写操作: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
    lru ,lfu 和最小ttl算法都是大约算法不是精确算法(为了保存),所以你可以为了速度和准确性调整它。默认情况下,redis查询5个key,挑选出最近使用较少的key,你可以改变样本的大小。默认值是5可以产生足够好的结果,10 大约非常接近真实的Lru但是消耗更多的cpu.3足够快但是不够准确。
    # maxmemory-samples 5
    自动redis5版本后,默认情况下,副本会忽略最大内存设置(除非被晋升为主节点在失败或者手动之后)。这意味着发送key移除仅仅在主节点上处理,发送del命令给副本,移除那些被主节点移除的key。这种策略保证主节点和副本的一致性。然而如果你的副本有写权限,或者你想副本有不同的副本设置,你需要确保所有的写操作执行对于副本来说是幂等,你可以修改默认设置(但是必须明白你自己在做啥,what are you 弄啥咧)。
    注意:自从副本默认不移除key,它可能会用更多的内存(缓存需要更大的缓存,或者数据结果有时需要花费更多内存等)。所以确保监视副本并且副本要有足够的内存,避免在主节点达到最大内存时,副本出现oom。
    # replica-ignore-maxmemory yes

    LAZY FREEING 延迟释放

    #################################################################
    redis提供两种原语用于删除key。del操作,一种阻塞删除对象。这意味着服务停止处理新的命令,为了回收和对象关联的所有内存,以一种同步的方式。如果被删除的key关联小对象,和大多数时间复杂度o(1),o(logn)相比消耗的时间非常少。然而,如果关联的对象十分大,值包含百万级元素,服务端会阻塞很长时间(甚至很多秒)为了完成操作。
    因为上面的原因,redis也提供非阻塞删除原语如unlink(非阻塞删除),异步选项flushall ,flushdb命令,在后台回收内存,这些命令执行在固定的时间。另外在后台释放对象的线程尽可能快的增加。
    del,unlink和同步选项flushall,flushdb是用户控制的。这依赖应用设计理解使用哪种操作是正确的。然而redis服务有时必须删除key或者刷新整个数据库。下面的场景中,指定redis删除的对象依赖于用户的调用。
    • 移除操作,因为最大内存和最大内存的策略配置,为了给新数据提供空间,没有超出指定内存限制。
    • 因为过期:当key设置存活时间,必须被内存删除。
    • 因为命令的副作用,使用已经存在的key存储数据。如rename命令,可能删除删除老的内容,被另外的key取代。像SUNIONSTORE,SORT 和STORE 选项,删除已经存在的key。设置命令本身只移除指定key的老内容,取而代之的是新的内容。
    • 复制期间,当副本执行全量重新同步和主节点,完整数据库的内容会被移除,为了装载rdb文件只为了转换。
    在上面的场景中,默认的删除操作是以阻塞的方式,像del。然而你可以明确的配置每种场景为了释放内存以非阻塞的方式,像调用unlink操作,使用下面的配置命令:
    lazyfree-lazy-eviction no 
    lazyfree-lazy-expire no 
    lazyfree-lazy-server-del no 
    replica-lazy-flush no

    APPEND ONLY MODE

    #############################################################
    默认情况下,redis以异步方式产生在磁盘上产生快照文件。这中模式在大多数应用中是足够好的,但是在redis程序会出现问题或者断电会导致几分钟内写丢失(依赖配置文件的保存点)。
    aof是可选择维护模式提供更好的持久化。例如实例使用默认的fsync策略,在突然事件中像服务停电或者redis处理写操作发生错误但是操作系统运行正确,redis只会丢失一秒的。
    aof和rdb可以在同时开启不出现问题,如果redis在启动时,aof被开启,redis会加载aof文件,这种文件提供了更好的持久化保证。
    可以类比Mysql日志文件同步到磁盘(每秒,每个事物或者混合模式)。
    #https://redis.io/topics/persistence 官网地址 appendonly no
     
    aof文件名称
    appendfilename "appendonly.aof"
     
    fsync()函数告诉操作系统实际写数据到磁盘代替等待更多的数据输出的缓存。一些操作确实会刷新到磁盘。
    redis支持三种模式
    • NO:不调用fsync,仅仅是让操作系统在它想刷新的时候处理。最快。
    • always:每次写操作都会同步写到文件中。最安全最慢。(类比mysql)
    • everysec: 每秒同步一次。
    默认设置是"everysec",在速度和数据安全这种。如果设置为'NO',你需要懂得操作系统刷新缓存只是在操作想做这件事情的时候,获的更好的性能(但是如果是这种情况,您可以使用快照文件,允许数据的丢失),或者与之相反,使用"always",最慢但是比 everysec慢。
    # appendfsync always 
    appendfsync everysec 
    # appendfsync no
     
    如果aof文件刷新策略设置为'always'或者'everysec',后台保存程序会执行大量 I/O操作,在一些linux配置,redis在fsync()会阻塞很长时间。注意,目前还没有修复这个问题,甚至执行fsync()在不同的线程会阻塞同步write(2)调用。
    为了缓解这个问题,当bgsave或者bgwriteaof在进程中,避免fsync()被主进程处理。这意味着被其他子程序调用,redis的持久化和'appendfsync none'一样,实际上,这意味着在更坏的情况下可能丢失大约30s日志(使用默认的Linux配置)。如果有延迟问题把这个选项设置为'yes',否则设置为'no',是最安全的。
    no-appendfsync-on-rewrite no
    自动重写aof文件。当aof文件大小达到规定的百分比,redis自动重写日志文件暗中使用bgrewriteaof 文件。这是如何工作的呢,redis记录在最后一次写时记录aof文件大小(如果重写在服务重启没发生,aof在服务启动时被使用)。
    基础大小和当前大小做比较,如果currtent_size > 规定的百分比,重写被触发。当然你需要指定aof文件重写min_size,这可以避免出现重写aof文件,尽管已经达到设定的百分比但是文件还特别小。(疑问???)。规定百分比是0,关闭重写功能。
    auto-aof-rewrite-percentage 100 
    auto-aof-rewrite-min-size 64mb
     
    在Redis启动过程中,当AOF数据被加载回内存时,可能会发现AOF文件在末尾被截断。这个可能发生当redis运行的系统崩溃,特别当ex4文件系统被挂载,没有任何数据=有序的选项.(然而如果只是redis崩溃或者中断,但是操作系统正常工作,这种情况是不会发生的)。
    redis要么在出现异常会退出,要么在服务启动时发现aof文件被截断,尽可能多的加载数据。下面的选项可以控制这种行为:
    • 如果aof-load-truncated=yes,截断的aof文件被加载,服务启动发出日志提供用户这个事件、
    • 如果aof-load-truncated=no,服务中断并且拒绝启动,当设置为no,在服务重启前,要求修复aof文件使用redis-check-aof工具。
    注意:如果发现aof文件中间部分被破坏,服务仍然会退出。这个选项只适应当redis尝试着读取更多的数据但是发现没有足够的字节。
    aof-load-truncated yes
     
    当写aof文件,redis能够使用rdb序言在aof文件中,为了更快的重写和回复。当这个选项被打开,重写aof文件由两个不同的段组成
    [RDB file][AOF tail]
    加载Redis时,可以识别AOF文件以“Redis”开头字符串并加载前缀RDB文件,然后继续加载AOF尾巴。
    aof-use-rdb-preamble yes 

    LUA SCRIPTING

    ###############################################################
    lua脚本最长执行时间,单位ms。如果执行时间已经达到最大,redis在允许最大时间后记录脚本正在执行并且回复请求错误信息。
    当正在运行脚本时间超过最大执行时长,只能通过script kill 和 shutdown nosave命令。srcipt kill 用于通知脚本并且还没有调用write命令。shutdown nosave 是唯一的方式关闭服务以防脚本已经发出写命令,但是用户不想等待脚本自然中断。
    设置0或者负值,不限制执行,并且不会有警告信息⚠️。
    lua-time-limit 5000 

    REDIS CLUSTER

    ###############################################################
    启动redis实例作为集群的节点,打开注释
    # cluster-enabled yes
     
    每个集群实例都有集群配置文件,这个文件不能手动修改。redis节点创建和修改这个文件。每个redis集群要求不同集群配置文件。确保在同一个系统不同实例没有重叠集群配置文件名称。
    # cluster-config-file nodes-6379.conf
     
    集群节点超时是一定时间(ms),节点无法访问,被认为是失败状态。大多数其他内部时间限制是节点超时的倍数。
    # cluster-node-timeout 15000
     
    如果发生故障的主服务器的数据看起来太旧,则其副本将避免启动故障转移。对于副本来说精确测量数据年龄不是一件容易的事情,所以执行两个检查项
    1. 如果有多个副本能够进行故障切换,则它们会交换消息,以便尝试利用具有最佳复制偏移量的副本(来自已处理主服务器的更多数据)。副本将尝试按偏移量获取其列组,并在故障转移开始时应用与其列组成比例的延迟。
    # 1) If there are multiple replicas able to failover, they exchange messages in order to try to give an advantage to the replica with the best replication offset (more data from the master processed). Replicas will try to get their rank by offset, and apply to the start of the failover a delay proportional to their rank.
    1. 每一个单独副本计算最后一次和主节点的交互时间。交互可以是Ping 操作或者命令接受(如果主节点仍然处于连接状态),或者和节点断开的时长(如果复制链已经关闭)。如果最后一次交互太久,副本根本不会做故障转移。
    第2点可以被用户调整,明确规定副本不会执行故障转移,自从和主节点最后一次交互,逝去的时间大于: (node-timeout * replica-validity-factor) + repl-ping-replica-period。如果node-timeout=30s, replica-validity-factor = 10,repl-ping-replica-period=10s(默认值),如果副本和主节点未交互时间超过310s,那么副本不会执行故障转移。
    较大的replica-validity-factor可能允许复制太旧的数据,但是太小的值可能会阻止集群选举副本。
    设置 replica-validity-factor=0,副本永远会做故障转移不管和主节点和副本最后一次交互的时间。零是唯一能够保证当所有分区恢复时群集始终能够继续的值。
    # cluster-replica-validity-factor 10
    集群副本能够迁移孤立的主服务器,这些主节点没有工作副本。这能提高副本抵抗失败的能力,否则,如果没有工作副本,在失败的情况下,孤立的主节点不能故障转移。只有旧主节点仍然还存在至少给定数量的其他工作副本时,副本才会迁移到孤立的主节点。这个数量是'migration barrier'迁移屏障。migration barrier=1,意味着如果主节点还剩下一个工作副本a,b副本会迁移。默认值是1(副本迁移只有在其他的主节点还有一个副本活着)。为了关闭迁移只要把migration barrier的值设置的非常大(比如说值是100,每个主节点的副本不可能100个副本,好了,大家都不够100,谁也不会给其他人匀一个副本,达者兼济天下,穷着独善其身)。如果设置为0,只有debug模式才会有用,在生产环境会非常危险。
    # cluster-migration-barrier 1
     
    默认情况下,如果Redis集群节点检测到至少有一个未覆盖的哈希槽(没有可用的节点为其提供服务),那么它们将停止接受查询。这种方式如果集群部分挂了(例如一部分的hash槽不再未覆盖),集群最终变得不可信。只要所有的槽值可以覆盖时,集群自动可信赖。然而有时需要集群部分节点持续工作,继续接受查询,这部分key空间仍可以覆盖。为了支持这种情况,只需要打开cluster-require-full-coverage。
    # cluster-require-full-coverage yes
     
    这个选项,如果设置为yes,在主节点故障期间,阻止副本副本试图故障转移。然而主节点可以仍然执行手动故障转移,如果强制这么做。在不同的场景下是十分有用的,特别在多数据中心操作,我们希望一方永远不会被提升,如果不是在完全直流故障的情况下。
    https://redis.io/documentation
    # cluster-replica-no-failover no
     

    CLUSTER DOCKER/NAT support

    ##################################################
    部署中,redis集群地址发现失败,因为地址NAT-ted 或者端口转发(docker或者其他容器)。为确保在在这种环境下,静态配置需要知道每个节点的公网地址。
    # * cluster-announce-ip
    # * cluster-announce-port
    # * cluster-announce-bus-port
    每一个配置告诉节点关于它的地址,客户端口,集群消息总线端口。
    # cluster-announce-ip 10.1.1.5 
    # cluster-announce-port 6379 
    # cluster-announce-bus-port 6380
     

    SLOW LOG

    #####################################################################
    redis慢日志是系统日志,记录查询执行时间,执行时间不包括I/O操作,像和客户端通信,发送回复等。只是时间执行命令的时间。你可以配置两个参数:一个是执行时间(单位微妙),另外一个是slow log大小。
    注意:100*1000 microsecond = 1s.设置为负值关闭慢日志,设置0记录每一个命令。
    slowlog-log-slower-than 10000 #0.1s
    没有限制长度,但是要清除消耗的内存。你可以回收这部分内存,使用slowlog reset。
    slowlog-max-len 128
     

    延迟监听器 latency monitoring

    ##############################################################
    redis 延迟监听子系统运行时采样不同的操作,为了收集和redis实例可能延迟源相关的数据。通过 LATENCY 命令,这部分信息对用户是可见的,可以打印图表和获取报告。默认设置是0,关闭监控,大部分情况下是不需要的,如果没有延迟问题,收集数据是有性能影响的,尽管非常小,但是在大量加载的情况下,可以被测量的。latency monitoring 可以在运行时很容器开启,使用"CONFIG SET latency-monitor-threshold <milliseconds>" 命令。系统日志打印操作执行时间大于等于latency-monitor-threshold 规定的值。单位ms.
    latency-monitor-threshold 0
     

    EVENT NOTIFICATION

    ##########################################################
    redis可以通知 pub/sub客户端,关于发生在key空间的事件。例如如果keyspace事件通知被开启,客户端会执行删除操作,key =foo ,两条消息发布通过pub/sub。
    # PUBLISH __keyspace@0__:foo del
    # PUBLISH __keyevent@0__:del foo
    可以选择在class集合中选择事件通知,每一个class都有专门的字节:
    • K keyspace事件,以__keyspace@<db>__ 前缀 发布。
    • E keyevent事件,以__keyevent@<db>__前缀发布。
    • g 常规命令如DEL, EXPIRE, RENAME
    • $ 字符串命令(String)
    • l 链表命令(List)
    • s 集合命令(Set)
    • h Hash命令(Hash)
    • z 有序集合命令(zset)
    • x 过期事件(当key过期时事件产生)
    • e 移除事件(当key在最大内存中被移除,事件产生)
    • A g$lshzxe的别名,那么'AKE'指的是所有的事件。
    notify-keyspace-events 使用字符串作为参数,可以是一个或者多个字节组成。如果参数为空,关闭通知消息。
    例子1:如果开启列表,常规命令和事件名称,配置 notify-keyspace-events Elg。
    例子2:如果开启过期key,__keyevent@0__:expired,配置notify-keyspace-events Ex。
    默认关闭所有的通知,因为绝大数用户不需要这个功能并且这个功能有消耗。注意,必须制定K或者E,否则事件不会发送。
    notify-keyspace-events "" 
     

  • 相关阅读:
    Linux 之 编译器 gcc/g++参数详解
    linux下history命令显示历史指令记录的使用方法
    Linux 命令之 Navicat 连接 Linux 下的Mysql数据库
    Linux命令
    CentOS 下安装
    CMD命令之 :修改windows的CMD窗口输出编码格式为UTF-8
    CTO、技术总监、首席架构师的区别
    PHP ServerPush (推送) 技术的探讨
    一个公司的管理层级结构
    Table of Contents
  • 原文地址:https://www.cnblogs.com/--net/p/12727710.html
Copyright © 2020-2023  润新知