zoukankan      html  css  js  c++  java
  • Redis服务之常用配置(三)

      上一篇博客我们聊了下redis的rdb持久化、安全连接、资源限制相关配置;回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/13394411.html;今天我们来聊一聊redis主从复制、aof持久化、集群、慢日志相关配置;

       REPLICATION 相关配置

      slaveof <masterip> <masterport>:该指令用于指定redis主从复制中的master的ip地址和端口;

      示例:

      提示:redis默认工作在master模式,配置了这个指令以后,redis默认会从master自动降级为slave角色;

      提示:以上配置表示让本机redis从属于192.168.0.41 ;也就是说192.168.0.41是master,本节点为slave;

      masterauth <master-password>:该指令用于指定连接master的密码

      示例:

      提示:以上配置表示指定连接master认证密码为admin123.com;这个密码是我们在master上设置的requirepass 指令后面的密码;通常建议一个集群中的redis密码和版本都弄成相同的;

      验证:重启redis,连接redis看看是否自动降级为slave?

      查看同步日志

      主节点日志

      从节点日志

      提示:从上面的日志信息可以了解到,redis的主从复制主要经历了这几个操作,第一slave连接master,并发送sync命令;第二是master接收到slave的sync命令后,开始执行bgsave命令生成rdb快照文件,并使用缓冲区记录此后执行的所有命令;第三master执行完bgsave后,向所有的slave发送快照,并在发送期间继续记录被执行写操作的命令;第四是slave接收到master的快照后,slave会丢弃之前存在的所有旧数据,然后将接收到的快照文件加载到内存;第五master发送完快照文件后,开始向slave发送缓冲区接收到写操作命令;第六slave完成master发送过来的快照文件加载到内存后,开始接收master发送过来的缓冲区写操作命令,然后将这些命令在slave上执行;第七后期的同步操作,slave会发送自己的slave_repl_offset位置给master,master会根据从服务器发送过来的slave_repl_offset位置,把这之后的数据以rdb快照的方式发送给从服务器;

      验证:查看slave中的数据是否和master中的数据一样?

      提示:从上面的结果看,master和salve都是空的,没有数据

      验证:在master上写入数据,看看slave上是否能够及时的同步过来?

      提示:可以看到在主服务器上执行写操作,是能够及时的同步到从节点;

      slave/replica-serve-stale-data:该指令用于指定当主从复制失去连接,或者主从节点正在同步数据,是否从从节点响应客户端的读请求,默认是yes表示从库会继续响应客户端的读请求;如果设置的no,除去指定点命令之外的任何请求都会返回一个错误“sync with master in progress”

      示例:设置slave-serve-stale-data为no 重启redis ,然后将主库宕机,在从库执行读操作,看看是否可以读?

      重启redis,在从库上执行读操作

      提示:在主库正常的情况下,从库可以正常的执行读操作。

      把主库宕机,看看从库是否还可以执行读操作?

      提示:当主库宕机时,从库上执行读操作就报错了;

      slave/replica-read-only:该指令用于指定从库是否可以读;默认是从库只读,不可写;

      repl-diskless-sync:该指令用于指定否使用socket方式复制数据;redis同步数据的方式有两种,一种是socket方式,所谓socker方式复制数据是指master在做快照时,不将快照存入磁盘,直接将rdb文件通过网络发送给从节点;这种方式如果是在多个从节点上同步数据,它是串行复制,也就是说第一个slave同步完成后,再同步第二个slave;disk是指主节点将rdb保存到磁盘,然后在发送给从节点;disk方式同步数据在多个slave情景中,它可以共享rdb文件,主节点不用重复生成多个相同的rdb发送给slave;通常情况只有在磁盘速度缓慢但是网络相对较快的情况下才使用 socket 方式,否则都是用disk方式;

      repl-diskless-sync-delay:该指令用于指定disk方式同步数据的延迟时间,单位秒;设置为0 表示关闭延迟,关闭延迟则意味着一旦有同步请求,在同步开始到结束前,master不会再接收新的slave的同步请求,直到本次同步完成;

      repl-ping-slave-period:该指令用于指定slave根据master指定的时间进行周期性的 PING 监测,单位秒;

      repl-timeout:该指令用于指定复制链接超时时间,单位秒;通常这个超时时间要大于上面的repl-ping-slave-period指令指定的时间,否则会经常报同步连接超时;

      repl-disable-tcp-nodelay:该指令用于指定socket模式下是否在slave套接字发送sync之后禁用TCP-NODELAY,如果该指令的值为yes,则表示禁用TCP-NODELAY,这样设置后,redis会使用更少的TCP包和带宽向slave发送数据;但是这将使数据传输到 slave上有延迟,Linux 内核的默认配置会达到 40 毫秒;如果该指令的值为no,数据传输到 salve 的延迟将会减少但要使用更多的带宽;

      repl-backlog-size:该指令用于指定复制缓冲区大小,只有在 slave 连接之后才分配内存,默认是1MB;

      repl-backlog-ttl:该指令用于指定多少时间master没有slave连接,master就情况backlog缓冲区;默认是3600秒;

      replica-priority:该指令用于指定当master不可用时,sentinel会根据slave的优先级选举一个新master,最低的优先级的 slave,当选 master。而配置成 0,永远不会被选举。该选项默认是100

      min-slaves-to-write:该指令用于指定最少slave数量,如果启用这个选项,master检测从服务的数量小于我们指定数量,将拒绝写请求;

      示例:

      提示:在slave小于我们指定的最小slave数量时,master上执行写操作命令就提示我们没有足够的slave节点;

      min-slaves-max-lag:该指令用于指定slave的最大延迟时间;如果slave的延迟时间超出我们指定的时间,master就拒绝写操作;

      示例

      提示:可以看到延迟时间小于我们指定的时间,主服务器上可以正常执行写操作;通常用min-slaves-max-lag和min-slaves-to-write这两个选项来防止主库不安全时主库写操作的命令执行;这两个选项一起使用只要有一个不满足条件,主库将拒绝写操作;

      slave/replica-announce-ip:该指令用于指定当在端口转发或NAT网络环境中,slave有多个ip地址,可以使用该选项指定slave的ip地址;

      slave/replica-announce-port:该指令用于指定当在端口转发或NAT网络环境中,指定slave的端口;

      APPEND ONLY MODE相关配置

       appendonly:该指令 用于指定是否开启AOF日志记录,默认是no不开启; 默认 redis 使用的是 rdb 方式持久化,这种方式如果redis在做完快照后突然宕机,会导致做快照期间写的数据丢失(因为做快照期间的数据还在内存);AOF持久化是Redis 会把每次写入的数据在接收后都写入 appendonly.aof 文件(有点类似mysql中的binlog),每次启动时 Redis 都会先把这个文件的数据读入内存里,先忽略 RDB 文件(优先级高于RDB)。

      appendfilename:该指令用于指定AOF文件名称,默认是appendonly.aof;该文件存储在 dir 指令指定的目录下,同rdb文件在同一个目录下;

      示例:

      提示:以上配置表示开启AOF日志持久化,并保持为appendonly.aof

      验证:重启redis服务,看看对应目录是否有对应的aof文件生成?

      连接redis,执行写操作命令,看看appendonly.aof中是否记录?

    [root@node1 ~]# redis-cli -a admin123.com
    127.0.0.1:6379> KEYS *
    (empty list or set)
    127.0.0.1:6379> set k1 v1
    OK
    127.0.0.1:6379> set k2 v2
    OK
    127.0.0.1:6379> get k1
    "v1"
    127.0.0.1:6379> get k2
    "v2"
    127.0.0.1:6379> quit
    [root@node1 ~]# file /var/lib/redis/appendonly.aof 
    /var/lib/redis/appendonly.aof: ASCII text, with CRLF line terminators
    [root@node1 ~]# cat /var/lib/redis/appendonly.aof
    *2
    $6
    SELECT
    $1
    0
    *3
    $3
    set
    $2
    k1
    $2
    v1
    *3
    $3
    set
    $2
    k2
    $2
    v2
    [root@node1 ~]# 
    

      提示:可以看到AOF是一个文本文件,从AOF文件中可以清晰看到我们执行的set命令;

      appendfsync:该指令用于指定AOF持久化策略的配置;no表示不自信fsync,有操作系统同步数据到磁盘,always表示每次写入都执行fsync,以保证数据同步到磁盘,everysec表示每秒执行一次fsync同步数据到磁盘;默认是everysec;

      no-appendfsync-on-rewrite:该指令用于指定在 aof rewrite 期间,是否对 aof 新记录的 append 暂缓使用文件同步策略,主要考虑磁盘 IO 开支和请求阻塞时间。默认为 no,表示"不暂缓",新的 aof 记录仍然会被立即同步,Linux 的默认 fsync 策略是 30 秒,如果为 yes 可能丢失 30 秒数据,但由于 yes 性能较好而且会避免出现阻塞因此比较推荐。

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

      auto-aof-rewrite-min-size:该指令用于指定触发AOF重写的最小文件大小;

      aof-load-truncated:该指令用于指定是否加载由于其他原因导致的末尾异常的 AOF 文件;比如主进程被 kill/断电等原因造成的AOF文件异常;默认是yes表示加载;

      aof-use-rdb-preamble:redis4.0 新增 RDB-AOF 混合持久化格式,在开启了这个功能之后,AOF 重写产生的文件将同时包含 RDB 格式的内容和 AOF 格式的内容,其中 RDB 格式的内容用于记录已有的数据,而 AOF 格式的内存则用于记录最近发生了变化的数据,这样 Redis 就可以同时兼有 RDB 持久化和AOF 持久化的优点(既能够快速地生成重写文件,也能够在出现问题时,快速地载入数据)。

      aof-load-truncated:该指令用于指定是否开启AOF恢复数据时,清除不完整语句(由服务器掉电等因素造成语句不完整),默认yes表示加载清理不完整语句后的AOF文件;no表示不清除不完整语句,直接加载AOF文件(这样会导致AOF恢复数据失败);

      LUA SCRIPTING相关配置

      lua-time-limit:该指令用于指定lua脚本的最大执行时间,单位是毫秒;默认是5000毫秒;

      REDIS CLUSTER相关配置

      cluster-enabled:该指令用于指定是否开启集群模式,默认是单机模式;

      cluster-config-file:该指令用于指定由 node 节点自动生成的集群配置文件;

      cluster-node-timeout:该指令用于指定集群中 node 节点连接超时时间;

      cluster-replica-validity-factor:该指令用于指定集群有效因子,这个选项的值×cluster-node-timeout选项的值就等于节点当选master的有效时间;在执行故障转移的时候可能有些节点和 master 断开一段时间数据比较旧,这些节点就不适用于选举为 master,超过这个时间的就不会被进行故障转移;

      cluster-migration-barrier:该指令用于指定一个主节点拥有的至少正常工作的从节点,即如果主节点的 slave 节点故障后会将多余的从节点分配到当前主节点成为其新的从节点。默认是1;

      cluster-require-full-coverage:该指令用于指定集群槽位不全时,是否不再对外提供服务;当集群槽位覆盖,如果一个主库宕机且没有备库就会出现集群槽位不全,那么 yes 情况下 redis 集群槽位验证不全就不再对外提供服务,而 no 则可以继续使用但是会出现查询数据查不到的情况(因为有数据丢失)。

      SLOW LOG 相关配置

      slowlog-log-slower-than:该指令用于指定大于多少时间的命令执行时间为慢日志;单位微妙;该指令值为负数表示禁用慢日志,为 0 会记录每个命令操作。

      slowlog-max-len:该指令用于指定慢日志队列长度,超出该队列长度会覆盖最早的记录,以此滚动删除;

      示例

      提示:以上配置表示记录每个命令的操作为慢日志中,慢日志的最大队列长度为10;

      验证:重启redis,连接redis执行命令,看看是否都将执行的命令都记录为慢日志中?

    [root@node1 ~]# systemctl restart redis
    [root@node1 ~]# ss -tnl
    State       Recv-Q Send-Q   Local Address:Port                  Peer Address:Port              
    LISTEN      0      511       192.168.0.41:6379                             *:*                  
    LISTEN      0      511          127.0.0.1:6379                             *:*                  
    LISTEN      0      128                  *:22                               *:*                  
    LISTEN      0      100          127.0.0.1:25                               *:*                  
    LISTEN      0      128                 :::22                              :::*                  
    LISTEN      0      100                ::1:25                              :::*                  
    [root@node1 ~]# redis-cli -a admin123.com
    127.0.0.1:6379> KEYS *
    1) "k2"
    2) "k1"
    127.0.0.1:6379> get k1
    "v1"
    127.0.0.1:6379> get k2
    "v2"
    127.0.0.1:6379> set k3 v3
    OK
    127.0.0.1:6379> SLOWLOG len
    (integer) 10
    127.0.0.1:6379> SLOWLOG get
     1) 1) (integer) 78
        2) (integer) 1596294355
        3) (integer) 2
        4) 1) "REPLCONF"
           2) "ACK"
           3) "137"
     2) 1) (integer) 77
        2) (integer) 1596294354
        3) (integer) 2
        4) 1) "REPLCONF"
           2) "ACK"
           3) "137"
     3) 1) (integer) 76
        2) (integer) 1596294353
        3) (integer) 3
        4) 1) "REPLCONF"
           2) "ACK"
           3) "137"
     4) 1) (integer) 75
        2) (integer) 1596294352
        3) (integer) 88
        4) 1) "REPLCONF"
           2) "ACK"
           3) "137"
     5) 1) (integer) 74
        2) (integer) 1596294351
        3) (integer) 3
        4) 1) "REPLCONF"
           2) "ACK"
           3) "137"
     6) 1) (integer) 73
        2) (integer) 1596294350
        3) (integer) 2
        4) 1) "REPLCONF"
           2) "ACK"
           3) "137"
     7) 1) (integer) 72
        2) (integer) 1596294349
        3) (integer) 3
        4) 1) "REPLCONF"
           2) "ACK"
           3) "137"
     8) 1) (integer) 71
        2) (integer) 1596294348
        3) (integer) 2
        4) 1) "REPLCONF"
           2) "ACK"
           3) "137"
     9) 1) (integer) 70
        2) (integer) 1596294347
        3) (integer) 3
        4) 1) "REPLCONF"
           2) "ACK"
           3) "137"
    10) 1) (integer) 69
        2) (integer) 1596294346
        3) (integer) 3
        4) 1) "REPLCONF"
           2) "ACK"
           3) "123"
    127.0.0.1:6379> 
    

      提示:从上面的日志可以看到慢日志的对了长度只有10,但是我们执行的命令没有在里面看到,原因是我们开启了主从复制,后台一直在执行REPLCONF ACK命令,把我们执行的命令给覆盖了;

      验证:关闭主从复制,连接redis,再执行命令,看看是否记录我们执行的命令?

    [root@node1 ~]# systemctl restart redis
    [root@node1 ~]# ss -tnl
    State       Recv-Q Send-Q   Local Address:Port                  Peer Address:Port              
    LISTEN      0      511       192.168.0.41:6379                             *:*                  
    LISTEN      0      511          127.0.0.1:6379                             *:*                  
    LISTEN      0      128                  *:22                               *:*                  
    LISTEN      0      100          127.0.0.1:25                               *:*                  
    LISTEN      0      128                 :::22                              :::*                  
    LISTEN      0      100                ::1:25                              :::*                  
    [root@node1 ~]# redis-cli -a admin123.com
    127.0.0.1:6379> KEYS *
    1) "k1"
    2) "k3"
    3) "k5"
    4) "k2"
    5) "k4"
    127.0.0.1:6379> get k1
    "v1"
    127.0.0.1:6379> get k2
    "v2"
    127.0.0.1:6379> del k3
    (integer) 1
    127.0.0.1:6379> del k4
    (integer) 1
    127.0.0.1:6379> info replication
    # Replication
    role:master
    connected_slaves:0
    master_repl_offset:0
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    127.0.0.1:6379> SLOWLOG len
    (integer) 8
    127.0.0.1:6379> SLOWLOG get 3
    1) 1) (integer) 8
       2) (integer) 1596295476
       3) (integer) 4
       4) 1) "SLOWLOG"
          2) "len"
    2) 1) (integer) 7
       2) (integer) 1596295454
       3) (integer) 52
       4) 1) "info"
          2) "replication"
    3) 1) (integer) 6
       2) (integer) 1596295447
       3) (integer) 10
       4) 1) "del"
          2) "k4"
    127.0.0.1:6379> SLOWLOG get 
     1) 1) (integer) 9
        2) (integer) 1596295482
        3) (integer) 48
        4) 1) "SLOWLOG"
           2) "get"
           3) "3"
     2) 1) (integer) 8
        2) (integer) 1596295476
        3) (integer) 4
        4) 1) "SLOWLOG"
           2) "len"
     3) 1) (integer) 7
        2) (integer) 1596295454
        3) (integer) 52
        4) 1) "info"
           2) "replication"
     4) 1) (integer) 6
        2) (integer) 1596295447
        3) (integer) 10
        4) 1) "del"
           2) "k4"
     5) 1) (integer) 5
        2) (integer) 1596295442
        3) (integer) 8
        4) 1) "del"
           2) "k3"
     6) 1) (integer) 4
        2) (integer) 1596295439
        3) (integer) 7
        4) 1) "get"
           2) "k2"
     7) 1) (integer) 3
        2) (integer) 1596295437
        3) (integer) 7
        4) 1) "get"
           2) "k1"
     8) 1) (integer) 2
        2) (integer) 1596295412
        3) (integer) 31
        4) 1) "KEYS"
           2) "*"
     9) 1) (integer) 1
        2) (integer) 1596295408
        3) (integer) 1410
        4) 1) "COMMAND"
    10) 1) (integer) 0
        2) (integer) 1596295408
        3) (integer) 4
        4) 1) "AUTH"
           2) "admin123.com"
    127.0.0.1:6379> 
    

      提示:可以看到关闭主从复制以后,重启master后,再连接redis执行命令,在慢日志中就可以清楚看到我们执行的命令;slowlog len命令用于获取当前slowlog的对列长度;slowlog get命令用于获取指定个数的慢日志,如果没有指定慢日志条目数表示获取当前队列所有日志;

  • 相关阅读:
    【Win 10 应用开发】获取本机的IP地址
    【Win 10应用开发】延迟共享
    【Win 10 应用开发】共享目标(UWP)
    【Win 10应用开发】响应系统回退键的导航事件
    编写Windows服务疑问2:探索服务与安装器的关系
    编写Windows服务疑问1:操作过程
    服务器常见错误代码500、501、502、503、504、505
    git reset与git revert的区别
    Redis集群方案怎么做?
    ThinkPHP设计模式与Trait技术
  • 原文地址:https://www.cnblogs.com/qiuhom-1874/p/13416534.html
Copyright © 2011-2022 走看看