上一篇博客我们聊了下redis的rdb持久化、安全连接、资源限制相关配置;回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/13394411.html;今天我们来聊一聊redis主从复制、aof持久化、集群、慢日志相关配置;
REPLICATION 相关配置
slaveof
示例:
提示:redis默认工作在master模式,配置了这个指令以后,redis默认会从master自动降级为slave角色;
提示:以上配置表示让本机redis从属于192.168.0.41 ;也就是说192.168.0.41是master,本节点为slave;
masterauth
示例:
提示:以上配置表示指定连接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命令用于获取指定个数的慢日志,如果没有指定慢日志条目数表示获取当前队列所有日志;