• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

Redis服务之常用配置(三)

开发技术 开发技术 6天前 13次浏览

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

   REPLICATION 相关配置

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

  示例:

Redis服务之常用配置(三)

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

Redis服务之常用配置(三)

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

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

  示例:

Redis服务之常用配置(三)

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

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

Redis服务之常用配置(三)

  查看同步日志

  主节点日志

Redis服务之常用配置(三)

  从节点日志

Redis服务之常用配置(三)

  提示:从上面的日志信息可以了解到,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中的数据一样?

Redis服务之常用配置(三)

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

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

Redis服务之常用配置(三)

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

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

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

Redis服务之常用配置(三)

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

Redis服务之常用配置(三)

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

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

Redis服务之常用配置(三)

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

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

Redis服务之常用配置(三)

  repl-diskless-sync:该指令用于指定否使用socket方式复制数据;redis同步数据的方式有两种,一种是socket方式,所谓socker方式复制数据是指在复制数据是master在做快照时,不将快照存入磁盘,直接将rdb文件通过socket方式发送给从节点;这种方式如果是在多个从节点上同步数据,它是串行复制,也就是说第一个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检测从服务的数量小于我们指定数量,将拒绝写请求;

  示例:

Redis服务之常用配置(三)

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

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

  示例

Redis服务之常用配置(三)

  提示:可以看到延迟时间小于我们指定的时间,主服务器上可以正常执行写操作;通常用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文件在同一个目录下;

  示例:

Redis服务之常用配置(三)

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

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

Redis服务之常用配置(三)

  连接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 持久化的优点(既能够快速地生成重写文件,也能够在出现问题时,快速地载入数据)。

  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:该指令用于指定慢日志队列长度,超出该队列长度会覆盖最早的记录,以此滚动删除;

  示例

Redis服务之常用配置(三)

 

  提示:以上配置表示记录每个命令的操作为慢日志中,慢日志的最大队列长度为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命令用于获取指定个数的慢日志,如果没有指定慢日志条目数表示获取当前队列所有日志;


喜欢 (0)