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

Redis服务之常用配置(三)的更多相关文章

  1. 【centos6】安装redis + phpredis 以及 常用配置参数

    1.redis-server和redis-cli安装文章:http://www.cnblogs.com/skyessay/p/6429988.html 1.前置条件:查看是否安装gcc,命令:gcc ...

  2. redis配置文件中常用配置详解

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/suprezheng/article/de ...

  3. Mac--管理mysql、redis服务的常用命令

    ##启动MySQL服务 sudo /usr/local/MySQL/support-files/mysql.server start ##停止MySQL服务 sudo /usr/local/mysql ...

  4. Linux工具安装和常用配置

    1 常用开发工具安装 1 安装Mysql ①基本安装 wget http://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm: s ...

  5. 高级运维(六):源码安装Redis缓存服务、常用Redis数据库操作指令、配置Redis主从服务器

    一.源码安装Redis缓存服务 目标: 本案例要求先快速搭建好一台Redis服务器,并测试该缓存服务器: 1> 设置变量test,值为123 2> 查看变量test的值 3> 设置计 ...

  6. Redis常用配置和命令总结

    Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言 ...

  7. ASP.NET MVC配置Redis服务

    ===================== 1.下载并安装Redis.官网并未提供Windows安装版,所以去Github 下载 下载地址: https://github.com/MicrosoftA ...

  8. Ubuntu 17.10 用 apt 搭建 lamp 环境、安装 phpmyadmin、redis 服务+扩展、mysql 扩展、开启错误提示、配置虚拟主机

    2018-02-24 13:50:30 更新: 个人喜欢相对原生又不太麻烦,所以用 apt 构建环境.不过,最近使用到现在记得出现过了 3 次 apache 或 mysql 服务器无法启动或无法连接的 ...

  9. 阿里云服务器ecs配置之安装redis服务

    一.介绍 Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相对更多,包括st ...

  10. 三十九.NoSQL概述 部署Redis服务 、 部署LNMP+Redis

    1. 搭建Redis服务器 在主机 192.168.4.50 上安装并启用 redis 服务 设置变量test,值为123 查看变量test的值   1.1 搭建redis服务器 1.1.1 安装re ...

随机推荐

  1. 5.0 JS中引用类型介绍

    其实,在前面的"js的六大数据类型"文章中稍微说了一下引用类型.前面我们说到js中有六大数据类型(五种基本数据类型 + 一种引用类型).下面的章节中,我们将详细讲解引用类型. 1. ...

  2. FineUI第十六天---表格的排序和分页

    表格的排序和分页 1.表格的排序需要: AllowSorting:是否允许排序. SortColumn:当前排序的列ID,当然也可以不设置此属性,而是在后台初始化代码中直接指定默认排序字段. Sort ...

  3. iOS开发常用的第三方类库

    在iOS开发中不可避免的会用到一些第三方类库,它们提供了很多实用的功能,使我们的开发变得更有效率:同时,也可以从它们的源代码中学习到很多有用的东西. Reachability 检测网络连接 用来检查网 ...

  4. BIO与NIO、AIO的区别

    IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO      在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个Serve ...

  5. bzoj4487[Jsoi2015]染色问题 容斥+组合

    4487: [Jsoi2015]染色问题 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 211  Solved: 127[Submit][Status ...

  6. 前端笔记之Vue(二)组件&amp;案例&amp;props&amp;计算属性

    一.Vue组件(.vue文件) 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器 ...

  7. Unix环境高级编程-阻塞访问原理——等待队列

    有些时候,一个系统调用可能无法马上取到或者送出数据:一个温度采集器如果没有采用中断或者轮询的策略,而是在用户发出请求时才进行采集,并在一定的时间后返回结果.如果用户程序希望调用read或write并且 ...

  8. SkylineGlobe Android 开发 面积计算示例代码

    SkylineGlobe Android 开发 面积计算示例代码: 如果之前熟悉SkylineGlobe桌面端的二次开发,看这些代码应该不难理解. package com.skyline.terrae ...

  9. django-xadmin后台开发

    先通过pip命令行安装django<=1.9版本 示例:pip install django==1.9 从https://github.com/sshwsfc/xadmin下载xadmin源码解 ...

  10. QLabel 内容长度超过控件本身长度时超出的部分用省略号

    void JunEditableLabel::setText(const QString &string) { QFont font("Tahoma"); font.set ...