日志

Redis服务之常用配置(三)

 来源    2020-08-01    0  

  上一篇博客我们聊了下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文件通过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检测从服务的数量小于我们指定数量,将拒绝写请求;

  示例:

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

  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命令用于获取指定个数的慢日志,如果没有指定慢日志条目数表示获取当前队列所有日志;

centos6 安装redis + phpredis 以及 常用配置参数
日志1.redis-server和redis-cli安装文章:http://www.cnblogs.com/skyessay/p/6429988.html 1.前置条件:查看是否安装gcc,命令:gcc ...
1
puppet – Redis重新加载配置更改而不重新启动服务
问答当我通过puppet更改redis配置时,除了重新启动redis服务之外,还有更好的方法来加载配置吗?::是的,你可以做到,但它将涉及在Puppet中编写自己的客户提供商.这是非常重要的,但如果你愿意 ...
1
如何创建一个用户提供的redis服务,弹出自动配置云连接器选择?
问答我已经为redis创建了一个用户提供的服务,如下所示 cf cups p-redis -p "{\"host\":\"xx.xx.xxx.xxx\", ...
2
SuperSocket入门(三)-Telnet多服务实例和服务实例交互配置详解
日志    在SuperSocket入门(二)中我们已经简单了解了通过配置App.config文件使用BootStrap启动SuperSocket服务.我们先来看一下上个案例中的基本配置文件示例: < ...
Redis实战配置(三)
日志程序配置 我们安装好了Redis的系统服务,此时Redis服务已经运行. 现在我们需要让我们的程序能正确读取到Redis服务地址等一系列的配置信息,首先,需要在Web.config文件中添加如下信息: ...
1
NET CORE微服务一条龙应用 第三章 认证授权与动态权限配置
日志介绍 系列目录:[NET CORE微服务一条龙应用]开始篇与目录 在微服务的应用中,统一的认证授权是必不可少的组件,本文将介绍微服务中网关和子服务如何使用统一的权限认证 主要介绍内容为: 1.子服务如 ...
1
[redis] redis 存取键值对常用的三种使用方式 - Jedis、JedisPool、Jedis分布式
日志|-Jedis 普通方式 |-JedisPool 连接池方式(需要引入pool相关jar) |-Jedis 分布式 (需要引入pool相关jar) 引入jedis2.7.0和commons.pool2 ...
1
在CentOS上配置redis服务
日志#!/bin/sh # # redis Startup script for Redis Server # # chkconfig: - 80 12 # description: Redis is a ...
Redis源代码分析(三十五)--- redis.c服务端的实现分析(2)
日志       在Redis服务端的代码量真的是比較大,假设一个一个API的学习怎么实现,无疑是一种效率非常低的做法,所以我今天对服务端的实现代码的学习,重在他的运行流程上.而对于他的模块设计在上一篇中 ...
1
Window环境下配置Redis服务的方法及查看缓存数据的工具介绍
日志工具下载位置:http://pan.baidu.com/s/1hqVh1f2,包括服务端配置以及查看缓存的工具. 服务端是以服务的形式运行,将Redis服务端解压到某个目录,然后执行cmd执行命令: ...
Redis 服务端配置——Could not connect to Redis at 127.0.0.1:6379: Connection refused
日志[root@centoszang 桌面]# redis-cli Could not connect to Redis at 127.0.0.1:6379: Connection refused Cou ...
6
redis 常用配置
日志1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程     daemonize no 2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/va ...
1
logback logback.xml常用配置详解(三)
日志logback logback.xml常用配置详解 <filter> <filter>: 过滤器,执行一个过滤器会有返回个枚举值,即DENY,NEUTRAL,ACCEPT其中之 ...
1
第三百节,python操作redis缓存-其他常用操作,用于操作redis里的数据name,不论什么数据类型
日志python操作redis缓存-其他常用操作,用于操作redis里的数据name,不论什么数据类型 delete(*names)根据删除redis中的任意数据类型 #!/usr/bin/env pyt ...
1
Ubuntu 17.10 用 apt 搭建 lamp 环境、安装 phpmyadmin、redis 服务+扩展、mysql 扩展、开启错误提示、配置虚拟主机
日志2018-02-24 13:50:30 更新: 个人喜欢相对原生又不太麻烦,所以用 apt 构建环境.不过,最近使用到现在记得出现过了 3 次 apache 或 mysql 服务器无法启动或无法连接的 ...
1
阿里云服务器ecs配置之安装redis服务
日志一.介绍 Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相对更多,包括st ...
redis常用配置参数解析
日志本文主要总结一下redis常用的配置参数的用法: 以下参数决定redis运行方式,默认前台运行,修改为yes可以让redis以后台守护进程方式运行 daemonize no 以下参数指定redis的p ...
redis 3.0 集群__配置文件详解(常用配置)
日志参考文档 http://www.cnblogs.com/huangjacky/p/3700473.html http://www.cnblogs.com/cxd4321/archive/2012/12 ...
Redis /etc/redis.conf 常用配置
日志Redis 基础配置: daemonize yes // 设置以daemon方式启动 logfile "/var/log/redis.log" // 设置日志文件路径 dir /d ...
1
Spring Boot实战笔记(三)-- Spring常用配置(Bean的初始化和销毁、Profile)
日志一.Bean的初始化和销毁 在我们的实际开发的时候,经常会遇到Bean在使用之前或之后做些必要的操作,Spring对Bean的生命周期操作提供了支持.在使用Java配置和注解配置下提供如下两种方式: ...
1