Redis服务之常用配置(三)

栏目: IT技术 · 发布时间: 5年前

内容简介:上一篇博客我们聊了下redis的rdb持久化、安全连接、资源限制相关配置;回顾请参考:REPLICATION 相关配置slaveof <masterip> <masterport>:该指令用于指定redis主从复制中的master的ip地址和端口;

上一篇博客我们聊了下 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命令用于获取指定个数的慢日志,如果没有指定慢日志条目数表示获取当前队列所有日志;


以上所述就是小编给大家介绍的《Redis服务之常用配置(三)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

An Introduction to Genetic Algorithms

An Introduction to Genetic Algorithms

Melanie Mitchell / MIT Press / 1998-2-6 / USD 45.00

Genetic algorithms have been used in science and engineering as adaptive algorithms for solving practical problems and as computational models of natural evolutionary systems. This brief, accessible i......一起来看看 《An Introduction to Genetic Algorithms》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具