redis总结3-持久化rdb,aof,运维命令,Sentinel监控
2017-09-29 23:49
696 查看
redis总结1-Redis简介、安装、集群
redis总结2-Redis六种数据类型命令总结(附命令实例)
redis总结3-持久化rdb,aof,运维命令,Sentinel监控
redis总结4-KEY设计技巧,常见问题
常见的持久化方式:
主从:通过从服务器保存和持久化,如mongoDB的replication sets配置
日志记录:操作生成相关日志,并通过日志来恢复数据;
日志本身:couchDB对于数据内容,不修改,只追加,则文件本身就是日志,不会丢失数据.
1: 快照RDB (Redis DataBase)
2: 日志AOF (Append-only file)
Redis在早起的版本还存在虚拟内存的方法,现在已经被废弃
缺点:RDB是间隔一段时间进行持久化,如果持久化之间redis发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候.(如:在2个保存点之间,断电,将会丢失1-N分钟的数据)
出于对持久化的更精细要求,redis增添了aof方式 append only file
(已经写入到文件或者即将写入),才进行实际的数据变更,“日志文件”保存了历史所有的操作过程;当server需要数据恢复时,可以直接replay此日志文件,即可还原所有的操作过程。AOF相对可靠,它和MySQL中bin.log、apache.log、zookeeper中txn-log简直异曲同工。AOF文件内容是字符串,非常容易阅读和解析。
我们可以简单的认为AOF就是日志文件,此文件只会记录“变更操作”(例如:set/del等),如果server中持续的大量变更操作,将会导致AOF文件非常的庞大,意味着server失效后,数据恢复的过程将会很长;事实上,一条数据经过多次变更,将会产生多条AOF记录,其实只要保存当前的状态,历史的操作记录是可以抛弃的;因为AOF持久化模式还伴生了“AOF rewrite”。
AOF的特性决定了它相对比较安全,如果你期望数据更少的丢失,那么可以采用AOF模式。如果AOF文件正在被写入时突然server失效,有可能导致文件的最后一次记录是不完整,你可以通过手工或者程序的方式去检测并修正不完整的记录,以便通过aof文件恢复能够正常;同时需要提醒,如果你的redis持久化手段中有aof,那么在server故障失效后再次启动前,需要检测aof文件的完整性。
缺点:AOF文件比RDB文件大,且恢复速度慢。
触发rewrite的时机可以通过conf配置文件来声明,同时redis中可以通过bgrewriteaof指令人工干预。
因为rewrite操作/aof记录同步/snapshot都消耗磁盘IO,redis采取了“schedule”策略:无论是“人工干预”还是系统触发,snapshot和rewrite需要逐个被执行。
AOF rewrite过程并不阻塞客户端请求。系统会开启一个子进程来完成。
1) AOF更加安全,可以将数据更加及时的同步到文件中,但是AOF需要较多的磁盘IO开支,AOF文件尺寸较大,文件内容恢复数度相对较慢。
2) RDB,安全性较差,它是“正常时期”数据备份以及master-slave数据同步的最佳手段,文件尺寸较小,恢复数度较快。
b). 但是如果你的redis运行在网络稳定性差/物理环境糟糕情况下,建议你master和slave均采取AOF,这个在master和slave角色切换时,可以减少“人工数据备份”/“人工引导数据恢复”的时间成本;
c).如果你的环境一切非常良好,且服务需要接收密集性的write操作,那么建议master采取rdb,而slave采用AOF。
答: 不会,所有的操作缓存在内存的队列里, dump完成后,统一操作.
注: AOF重写是指什么?
答: AOF重写是指把内存中的数据,逆化成命令,写入到.aof日志里.
以解决 aof日志过大的问题.
问: 如果RDB文件,和AOF文件都存在,优先用谁来恢复数据?
答: AOF
问: 2种是否可以同时用?
答: 可以,而且推荐这么做
问: 恢复时RDB和AOF哪个恢复的快
答: RDB快,因为其是数据的内存映射,直接载入到内存,而AOF是命令,需要逐条执行
1) 命令该服务不做其他redis服务的slave
命令: slaveof no one
2) 修改其readonly为yes
其他的slave再指向new master A
1) 命令该服务为new master A的slave
命令格式 slaveof IP port
Memory
used_memory:859192 数据结构的空间
used_memory_rss:7634944 实占空间
2: 主从复制
Replication
role:slave
master_host:192.168.1.128
master_port:6379
master_link_status:up
3:持久化
Persistence
rdb_changes_since_last_save:0
rdb_last_save_time:1375224063
4: fork耗时
Status
latest_fork_usec:936 上次导出rdb快照,持久化花费微秒
注意: 如果某实例有10G内容,导出需要2分钟,
每分钟写入10000次,导致不断的rdb导出,磁盘始处于高IO状态.
5: 慢日志
config get/set slowlog-log-slower-than
CONFIG get/SET slowlog-max-len
slowlog get N 获取慢日志
Config set 配置项 值 |设置配置项|(特殊的选项,不允许用此命令设置,如slave-of, 需要用单独的slaveof命令来设置)
配置也在conf中存在如下:
注意: 命令设置的参数,在服务重启后重新以conf配置为准.
如果发现某个redis节点运行出现状况,能够通知另外一个进程(例如它的客户端);
能够进行自动切换。当一个master节点不可用时,能够选举出master的多个slave(如果有超过一个slave的话)中的一个来作为新的master,其它的slave节点会将它所追随的master的地址改为被提升为master的slave的新地址。
监听master与slave的状态
如果某slave失效,直接通知master去除该slave.
如果master失效,,是按照slave优先级(可配置), 选取1个slave做 new master
,把其他slave–> new master
注意:sentinel没有独立的进程,功能是在和redis-server中启动的.
然后6379down掉,然后6380变为master,6381变为6380的slave
这么操作,但是需要人操作,Sentinel实现的就是自动完成这个过程.
sentinel启动模式
配置解释:
疑问: sentinel与master通信,如果某次因为master IO操作频繁,导致超时,此时,认为master失效,很武断.
解决: sentnel允许多个实例看守1个master, 当N台(N可设置)sentinel都认为master失效,才正式失效.
参考文章(包含sentinel集群)
redis总结2-Redis六种数据类型命令总结(附命令实例)
redis总结3-持久化rdb,aof,运维命令,Sentinel监控
redis总结4-KEY设计技巧,常见问题
一.简介
1.1 NoSQL简介
1.1.2 NoSQL特点
1.1.3 NoSQL适用场景
1.2 Redis简介
1.2.1 简介
1.2.2 Redis具体适用场合
1.2.3 redis和memcached相比
1.2.4 redis,mysql,mongodb对比
二.安装
2.1 单机安装
2.2 设值环境变量及服务
2.3 安装后的目录结构
2.4 配置详解
2.5 集群
三 Redis命令
3.1 连接命令
3.1 Redis通用命令
3.2 Redis字符串操作
3.4 set集合相关命令
3.5 order set 有序集合
3.6 Hash哈希
四 Redis的持久化-RDB,AOF
4.1 持久化
持久化: 即把数据存储于断电后不会丢失的设备中,通常是硬盘.常见的持久化方式:
主从:通过从服务器保存和持久化,如mongoDB的replication sets配置
日志记录:操作生成相关日志,并通过日志来恢复数据;
日志本身:couchDB对于数据内容,不修改,只追加,则文件本身就是日志,不会丢失数据.
4.2 redis持久化
Redis的持久化有2种方式:1: 快照RDB (Redis DataBase)
2: 日志AOF (Append-only file)
Redis在早起的版本还存在虚拟内存的方法,现在已经被废弃
4.2.1 快照RDB
RDB 是在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。(内存数据映像到硬盘上,持久化方法也通常叫做snapshots) .4.2.1.1 RDB工作原理:
snapshot触发的时机,是有“间隔时间”和“变更次数”共同决定,同时符合时间和次数2个条件(每隔N分钟或N次写操作后)才会触发snapshot,否则“变更次数”会被继续累加到下一个“间隔时间”上。snapshot过程中并不阻塞客户端请求。从内存dump数据形成rdb文件(压缩与否),snapshot首先将数据写入临时文件,当成功结束后,将临时文件重名为dump.rdb,并放在备份目录。4.2.1.2 优缺点
优点:使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证了redis的高性能.缺点:RDB是间隔一段时间进行持久化,如果持久化之间redis发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候.(如:在2个保存点之间,断电,将会丢失1-N分钟的数据)
4.2.1.3 RDB快照的配置选项(conf中)
//可以查看redis总结1中的conf配置 ##snapshot触发的时机,save <seconds> <changes> save 900 1 // 900内,有1条写入,则产生快照 save 300 1000 // 如果300秒内有1000次写入,则产生快照 save 60 10000 // 如果60秒内有10000次写入,则产生快照 (这3个选项都屏蔽,则rdb禁用) dbfilename dump.rdb //导出来的rdb文件名 dir ./ //rdb的放置路径 rdbcompression yes // 导出的rdb文件是否压缩,默认为“yes”,压缩往往意味着“额外的cpu消耗”,同时也意味这较小的文件尺寸以及较短的网络传输时间 //后台备份进程出错时,主进程停不停止写入;当snapshot时出现错误无法继续时,是否阻塞客户端“变更操作”,“错误”可能因为磁盘已满/磁盘故障/OS级别异常等 stop-writes-on-bgsave-error yes Rdbchecksum yes // 导入rbd恢复时数据时,要不要检验rdb的完整性
4.2.1.4 RDB客户端命令:
//前台进行存储, ./redis-cli -h ip -p port save ./redis-cli save //本机操作 //后台进行存储, ./redis-cli -h ip -p port bgsave ./redis-cli bgsave //本机操作 //由于redis是用一个主线程来处理所有client的请求,这种方式会阻塞所有client请求。所以不推荐使用。另一点需要注意的是,每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步脏数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能。
出于对持久化的更精细要求,redis增添了aof方式 append only file
4.2.2 AOF
4.2.2.1 AOF工作原理
Append-only file: 将“操作 + 数据”以格式化指令的方式追加到操作日志文件的尾部,在append操作返回后(已经写入到文件或者即将写入),才进行实际的数据变更,“日志文件”保存了历史所有的操作过程;当server需要数据恢复时,可以直接replay此日志文件,即可还原所有的操作过程。AOF相对可靠,它和MySQL中bin.log、apache.log、zookeeper中txn-log简直异曲同工。AOF文件内容是字符串,非常容易阅读和解析。
我们可以简单的认为AOF就是日志文件,此文件只会记录“变更操作”(例如:set/del等),如果server中持续的大量变更操作,将会导致AOF文件非常的庞大,意味着server失效后,数据恢复的过程将会很长;事实上,一条数据经过多次变更,将会产生多条AOF记录,其实只要保存当前的状态,历史的操作记录是可以抛弃的;因为AOF持久化模式还伴生了“AOF rewrite”。
AOF的特性决定了它相对比较安全,如果你期望数据更少的丢失,那么可以采用AOF模式。如果AOF文件正在被写入时突然server失效,有可能导致文件的最后一次记录是不完整,你可以通过手工或者程序的方式去检测并修正不完整的记录,以便通过aof文件恢复能够正常;同时需要提醒,如果你的redis持久化手段中有aof,那么在server故障失效后再次启动前,需要检测aof文件的完整性。
4.2.2.2 AOF优缺点
优点:可以保持更高的数据完整性,如果设置追加file的时间是1s,如果redis发生故障,最多会丢失1s的数据;且如果日志写入不完整支持redis-check-aof来进行日志修复;AOF文件没被rewrite之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的flushall)。缺点:AOF文件比RDB文件大,且恢复速度慢。
4.2.2.3 AOF的配置选项(conf中)
##是否打开 aof日志功能;##只有在“yes”下,aof重写/文件同步等特性才会生效 appendonly no ##指定aof文件名称 appendfilename appendonly.aof ##同步策略-三种 ##指定aof操作中文件同步策略,有三个合法值:always everysec no,默认为everysec ##同步策略1-每1个命令,都立即同步到aof. 安全,速度慢 #每一条aof记录都立即同步到文件,这是最安全的方式,也以为更多的磁盘操作和阻塞延迟,是IO开支较大。 appendfsync always ##同步策略2-每秒同步一次,性能和安全都比较中庸的方式,也是redis推荐的方式。如果遇到物理服务器故障,有可能导致最近一秒内aof记录丢失(可能为部分丢失)。 # 折衷方案,每秒写1次 appendfsync everysec ##同步测了3-redis并不直接调用文件同步,而是交给操作系统来处理,操作系统可以根据buffer填充情况/通道空闲时间等择机触发同步;这是一种普通的文件操作方式。性能较好,在物理服务器故障时,数据丢失量会因OS配置有关。 # 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof. 同步频率低,速度快, appendfsync no ##在aof-rewrite期间,appendfsync是否暂缓文件同步,"no"表示“不暂缓”,“yes”表示“暂缓”,默认为“no” no-appendfsync-on-rewrite yes: ##aof文件rewrite触发的最小文件尺寸(mb,gb),只有大于此aof文件大于此尺寸是才会触发rewrite,默认“64mb”,建议“512mb”(aof文件,至少超过64M时,重写) auto-aof-rewrite-min-size 64mb ##相对于“上一次”rewrite,本次rewrite触发时aof文件应该增长的百分比。 #aof文件大小比起上次重写时的大小,增长率100%时,重写 ##每一次rewrite之后,redis都会记录下此时“新aof”文件的大小(例如A),那么当aof文件增长到A*(1 + p)之后 ##触发下一次rewrite,每一次aof记录的添加,都会检测当前aof文件的尺寸。 auto-aof-rewrite-percentage 100
4.2.2.5 AOF rewrite
AOF rewrite 操作就是“压缩”AOF文件的过程,当然redis并没有采用“基于原aof文件”来重写的方式,而是采取了类似snapshot的方式:基于copy-on-write,全量遍历内存中数据,然后逐个序列到aof文件中。因此AOF rewrite能够正确反应当前内存数据的状态,这正是我们所需要的;rewrite过程中,对于新的变更操作将仍然被写入到原AOF文件中,同时这些新的变更操作也会被redis收集起来(buffer,copy-on-write方式下,最极端的可能是所有的key都在此期间被修改,将会耗费2倍内存),当内存数据被全部写入到新的aof文件之后,收集的新的变更操作也将会一并追加到新的aof文件中,此后将会重命名新的aof文件为appendonly.aof,此后所有的操作都将被写入新的aof文件。如果在rewrite过程中,出现故障,将不会影响原AOF文件的正常工作,只有当rewrite完成之后才会切换文件,因为rewrite过程是比较可靠的。触发rewrite的时机可以通过conf配置文件来声明,同时redis中可以通过bgrewriteaof指令人工干预。
redis-cli -h ip -p port bgrewriteaof
因为rewrite操作/aof记录同步/snapshot都消耗磁盘IO,redis采取了“schedule”策略:无论是“人工干预”还是系统触发,snapshot和rewrite需要逐个被执行。
AOF rewrite过程并不阻塞客户端请求。系统会开启一个子进程来完成。
4.2.3 总结及常见问题
4.2.3.1 优缺点总结
AOF和RDB各有优缺点,这是有它们各自的特点所决定:1) AOF更加安全,可以将数据更加及时的同步到文件中,但是AOF需要较多的磁盘IO开支,AOF文件尺寸较大,文件内容恢复数度相对较慢。
2) RDB,安全性较差,它是“正常时期”数据备份以及master-slave数据同步的最佳手段,文件尺寸较小,恢复数度较快。
4.2.3.2 使用建议
a). 可以通过配置文件来指定它们中的一种,或者同时使用它们(不建议同时使用),或者全部禁用,在架构良好的环境中,master通常使用AOF,slave使用rdb,主要原因是master需要首先确保数据完整性,它作为数据备份的第一选择slave提供只读服务(目前slave只能提供读取服务),它的主要目的就是快速响应客户端read请求;b). 但是如果你的redis运行在网络稳定性差/物理环境糟糕情况下,建议你master和slave均采取AOF,这个在master和slave角色切换时,可以减少“人工数据备份”/“人工引导数据恢复”的时间成本;
c).如果你的环境一切非常良好,且服务需要接收密集性的write操作,那么建议master采取rdb,而slave采用AOF。
4.2.3.2 常见问题
注: 在dump RDB,AOF如果停止同步,会不会丢失?答: 不会,所有的操作缓存在内存的队列里, dump完成后,统一操作.
注: AOF重写是指什么?
答: AOF重写是指把内存中的数据,逆化成命令,写入到.aof日志里.
以解决 aof日志过大的问题.
问: 如果RDB文件,和AOF文件都存在,优先用谁来恢复数据?
答: AOF
问: 2种是否可以同时用?
答: 可以,而且推荐这么做
问: 恢复时RDB和AOF哪个恢复的快
答: RDB快,因为其是数据的内存映射,直接载入到内存,而AOF是命令,需要逐条执行
五.redis运维命令
5.1 常用命令
命令 | 说明 | 备注 |
---|---|---|
time | 服务器端命令 | 显示服务器时间:第一行时间戳(秒),第二行是该秒经过了的微秒数 |
dbsize | 当前数据库的key的数量 | |
LASTSAVE | 上次保存时间 | |
BGREWRITEAOF | 后台进程重写AOF | |
BGSAVE | 后台保存rdb快照 | |
SAVE | 保存rdb快照 | |
Flushall | 清空所有库所有键 | |
Flushdb | 清空当前库所有键 | |
Showdown | [save/nosave] | |
Info [Replication/CPU/Memory..] | 查看redis服务器的信息 | |
Config get 配置项 | 获取配置项 | 如:slowlog-log-slower-than |
Config set 配置项 值 | 设置配置项 | (特殊的选项,不允许用此命令设置,如slave-of, 需要用单独的slaveof命令来设置) |
Slaveof master-Host port | 把当前实例设为master的slave | |
SLOWLOG | 显示服务器信息 | |
MONITOR | 打开控制台 | |
SYNC | 主从同步 | |
CLIENT LIST | 客户端列表 | |
CLIENT KILL | 关闭某个客户端 | |
CLIENT SETNAME | 为客户端设置名字 | |
CLIENT GETNAME | 获取客户端名字 |
5.2 注意事项及重要参数说明
5.2.1 如果不小心运行了flushall, 怎么办?
立即 shutdown nosave ,关闭服务器, 然后 手工编辑aof文件, 去掉文件中的 “flushall ”相关行, 然后开启服务器,就可以导入回原来数据. 如果,flushall之后,系统恰好bgrewriteaof了,那么aof就清空了,数据丢失.5.2.2 怎么显示慢查询,多慢才叫慢?
答: Slowlog 显示慢查询,慢查询由slowlog-log-slower-than 10000 ,来指定,(单位是微秒)5.2.3 服务器储存多少条慢查询的记录?
答: 由 slowlog-max-len 128 ,来做限制5.2.4 通过命令设置的参数服务重启后还会生效吗?
答:不会,如果配置参数在conf中存在,然后通过config set 又重新设置了.如果redis服务重启,会使用conf配置文件中的配置. 不会使用config set的参数.5.2.5 运行时更改master-slave
修改一台slave(设为A)为new master1) 命令该服务不做其他redis服务的slave
命令: slaveof no one
2) 修改其readonly为yes
其他的slave再指向new master A
1) 命令该服务为new master A的slave
命令格式 slaveof IP port
5.2.6 Redis运维时需要注意的参数
1: 内存Memory
used_memory:859192 数据结构的空间
used_memory_rss:7634944 实占空间
2: 主从复制
Replication
role:slave
master_host:192.168.1.128
master_port:6379
master_link_status:up
3:持久化
Persistence
rdb_changes_since_last_save:0
rdb_last_save_time:1375224063
4: fork耗时
Status
latest_fork_usec:936 上次导出rdb快照,持久化花费微秒
注意: 如果某实例有10G内容,导出需要2分钟,
每分钟写入10000次,导致不断的rdb导出,磁盘始处于高IO状态.
5: 慢日志
config get/set slowlog-log-slower-than
CONFIG get/SET slowlog-max-len
slowlog get N 获取慢日志
5.3 命令总结:
[root@bogon bin]# ./redis-cli 127.0.0.1:6379> time 1) "1504193711" //第一个字符串是当前时间(以 UNIX 时间戳格式表示) 2) "215301" //而第二个字符串是当前这一秒钟已经逝去的微秒数。 127.0.0.1:6379> 127.0.0.1:6379> dbsize (integer) 4 127.0.0.1:6379> lastsave (integer) 1503825557 127.0.0.1:6379> BGREWRITEAOF Background append only file rewriting started 127.0.0.1:6379> BGSAVE Background saving started 127.0.0.1:6379> 127.0.0.1:6379> flushdb OK 127.0.0.1:6379> flushall OK 127.0.0.1:6379> 127.0.0.1:6379> shutdown not connected> info [section] [root@bogon bin]# ./redis-cli Could not connect to Redis at 127.0.0.1:6379: Connection refused Could not connect to Redis at 127.0.0.1:6379: Connection refused not connected> [root@bogon bin]# ./redis-cli 127.0.0.1:6379> info default //返回默认选择的信息 //注意info all 会多列出Commandstats,而info不会列出Commandstats信息 127.0.0.1:6379> info all 127.0.0.1:6379> info # Server redis_version:4.0.1 // Redis 服务器版本 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:4eb7abcd4e2d679 redis_mode:standalone os:Linux 2.6.32-642.3.1.el6.x86_64 x86_64 // Redis 服务器的宿主操作系统 arch_bits:64 // 架构(32 或 64 位) multiplexing_api:epoll // Redis 所使用的事件处理机制 atomicvar_api:sync-builtin gcc_version:4.4.7 //编译 Redis 时所使用的 GCC 版本 process_id:8723 //服务器进程的 PID run_id:4679c264bd6214e740403ead64136ac725f49912 // Redis 服务器的随机标识符(用于 Sentinel 和集群) tcp_port:6379 //TCP/IP 监听端口 uptime_in_seconds:390661 //自 Redis 服务器启动以来,经过的秒数 uptime_in_days:4 //自Redis 服务器启动以来,经过的天数 hz:10 lru_clock:11021702 //以分钟为单位进行自增的时钟,用于 LRU 管理 executable:/usr/local/redis/bin/redis-server config_file:/usr/local/redis/conf/6379.conf # Clients connected_clients:1 //已连接客户端的数量(不包括通过从属服务器连接的客户端) client_longest_output_list:0 // 当前连接的客户端当中,最长的输出列表 client_biggest_input_buf:0 //当前连接的客户端当中,最大输入缓存 blocked_clients:0 //正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量 # Memory used_memory:827824 //由Redis 分配器分配的内存总量,以字节(byte)为单位 used_memory_human:808.42K //以人类可读的格式返回 Redis 分配的内存总量 used_memory_rss:5861376 //从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps 等命令的输出一致。 used_memory_rss_human:5.59M //人类刻度常驻内存大小 used_memory_peak:889912 //Redis 的内存消耗峰值(以字节为单位) used_memory_peak_human:869.05K //人类可读峰值 used_memory_peak_perc:93.02% used_memory_overhead:815246 used_memory_startup:765616 used_memory_dataset:12578 used_memory_dataset_perc:20.22% total_system_memory:1036374016 total_system_memory_human:988.36M used_memory_lua:37888 //Lua 引擎所使用的内存大小(以字节为单位) used_memory_lua_human:37.00K//人类可读lua maxmemory:0 maxmemory_human:0B maxmemory_policy:noeviction mem_fragmentation_ratio:7.08 //used_memory_rss 和 used_memory 之间的比率 mem_allocator:jemalloc-4.0.3// 在编译时指定的, Redis 所使用的内存分配器。可以是 libc 、 jemalloc 或者 tcmalloc 。 active_defrag_running:0 lazyfree_pending_objects:0 ### 注意: used_memory_rss 的值应该只比 used_memory 稍微高一点儿。 当 rss > used ,且两者的值相差较大时,表示存在(内部或外部的)内存碎片。 内存碎片的比率可以通过 mem_fragmentation_ratio 的值看出。 当 used > rss 时,表示 Redis 的部分内存被操作系统换出到交换空间了,在这种情况下,操作可能会产生明显的延迟。 当 Redis 释放内存时,分配器可能会,也可能不会,将内存返还给操作系统。 如果 Redis 释放了内存,却没有将内存返还给操作系统,那么 used_memory 的值可能和操作系统显示的 Redis 内存占用并不一致。 查看 used_memory_peak 的值可以验证这种情况是否发生。 ### # Persistence //RDB 和 AOF 的相关信息 loading:0 rdb_changes_since_last_save:5 //上次rdb之后修改了几条信息 rdb_bgsave_in_progress:0 rdb_last_save_time:1504193912 //上次rdb的时间 rdb_last_bgsave_status:ok rdb_last_bgsave_time_sec:0 rdb_current_bgsave_time_sec:-1 rdb_last_cow_size:4370432 aof_enabled:0 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:0 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok aof_last_cow_size:4300800 # Stats//一般统计信息 total_connections_received:10 total_commands_processed:76 instantaneous_ops_per_sec:0 total_net_input_bytes:2593 total_net_output_bytes:103047 instantaneous_input_kbps:0.01 instantaneous_output_kbps:6.20 rejected_connections:0 sync_full:0 sync_partial_ok:0 sync_partial_err:0 expired_keys:0 evicted_keys:0 keyspace_hits:16 keyspace_misses:5 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:1589 //上次导出rdb快照,持久化花费微秒 migrate_cached_sockets:0 slave_expires_tracked_keys:0 active_defrag_hits:0 active_defrag_misses:0 active_defrag_key_hits:0 active_defrag_key_misses:0 # Replication // 主/从复制信息 role:master connected_slaves:0 master_replid:81d07a765e5767c47c10c21014e88f9d01d7dbfe master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 # CPU // CPU 计算量统计信息 used_cpu_sys:11.99 used_cpu_user:5.32 used_cpu_sys_children:0.21 used_cpu_user_children:0.02 # Commandstats cmdstat_set:calls=1,usec=20,usec_per_call=20.00 cmdstat_keys:calls=1,usec=15,usec_per_call=15.00 cmdstat_auth:calls=4,usec=12,usec_per_call=3.00 cmdstat_psync:calls=2,usec=1583,usec_per_call=791.50 cmdstat_replconf:calls=1903323,usec=3283980,usec_per_call=1.73 cmdstat_info:calls=5,usec=17552,usec_per_call=3510.40 cmdstat_config:calls=1,usec=42,usec_per_call=42.00 cmdstat_time:calls=1,usec=3,usec_per_call=3.00 # Cluster //Redis 集群信息 cluster_enabled:0 # Keyspace //数据库相关的统计信息 127.0.0.1:6379> ///查看设置值,配置参数值 127.0.0.1:6379> config get slowlog-log-slower-than 1) "slowlog-log-slower-than" 2) "10000" 127.0.0.1:6379> config set slowlog-log-slower-than 15000 OK 127.0.0.1:6379> 127.0.0.1:6379> config get slowlog (empty list or set) 127.0.0.1:6379> slowlog get 10 (empty list or set) 127.0.0.1:6379> config get slowlog-max-len 1) "slowlog-max-len" 2) "128" 127.0.0.1:6379> config set slowlog-max-len 256 OK 127.0.0.1:6379> config get slowlog-max-len //注,这样配置在conf中也存在 1) "slowlog-max-len" 2) "256" 127.0.0.1:6379> config get slowlog-max-len //注,这样配置在conf中也存在 1) "slowlog-max-len" 2) "256" 127.0.0.1:6379> config get appendaof (empty list or set) 127.0.0.1:6379> config get timeout 1) "timeout" 2) "0"
5.4 config配置列表
Config get 配置项|获取配置项|如:slowlog-log-slower-thanConfig set 配置项 值 |设置配置项|(特殊的选项,不允许用此命令设置,如slave-of, 需要用单独的slaveof命令来设置)
配置也在conf中存在如下:
# There is no limit to this length. Just be aware that it will consume memory. # You can reclaim memory used by the slow log with SLOWLOG RESET. slowlog-max-len 128
注意: 命令设置的参数,在服务重启后重新以conf配置为准.
[root@bogon bin]# ./redis-cli 127.0.0.1:6379> config get * 1) "dbfilename" 2) "dump.rdb" 3) "requirepass" 4) "" 5) "masterauth" 6) "" 7) "cluster-announce-ip" 8) "" 9) "unixsocket" 10) "" 11) "logfile" 12) "" 13) "pidfile" 14) "" 15) "slave-announce-ip" 16) "" 17) "maxmemory" 18) "0" 19) "maxmemory-samples" 20) "5" 21) "timeout" 22) "0" 23) "active-defrag-threshold-lower" 24) "10" 25) "active-defrag-threshold-upper" 26) "100" 27) "active-defrag-ignore-bytes" 28) "104857600" 29) "active-defrag-cycle-min" 30) "25" 31) "active-defrag-cycle-max" 32) "75" 33) "auto-aof-rewrite-percentage" 34) "100" 35) "auto-aof-rewrite-min-size" 36) "67108864" 37) "hash-max-ziplist-entries" 38) "512" 39) "hash-max-ziplist-value" 40) "64" 41) "list-max-ziplist-size" 42) "-2" 43) "list-compress-depth" 44) "0" 45) "set-max-intset-entries" 46) "512" 47) "zset-max-ziplist-entries" 48) "128" 49) "zset-max-ziplist-value" 50) "64" 51) "hll-sparse-max-bytes" 52) "3000" 53) "lua-time-limit" 54) "5000" 55) "slowlog-log-slower-than" 56) "10000" 57) "latency-monitor-threshold" 58) "0" 59) "slowlog-max-len" 60) "128" 61) "port" 62) "6379" 63) "cluster-announce-port" 64) "0" 65) "cluster-announce-bus-port" 66) "0" 67) "tcp-backlog" 68) "511" 69) "databases" 70) "16" 71) "repl-ping-slave-period" 72) "10" 73) "repl-timeout" 74) "60" 75) "repl-backlog-size" 76) "1048576" 77) "repl-backlog-ttl" 78) "3600" 79) "maxclients" 80) "10000" 81) "watchdog-period" 82) "0" 83) "slave-priority" 84) "100" 85) "slave-announce-port" 86) "0" 87) "min-slaves-to-write" 88) "0" 89) "min-slaves-max-lag" 90) "10" 91) "hz" 92) "10" 93) "cluster-node-timeout" 94) "15000" 95) "cluster-migration-barrier" 96) "1" 97) "cluster-slave-validity-factor" 98) "10" 99) "repl-diskless-sync-delay" 100) "5" 101) "tcp-keepalive" 102) "300" 103) "cluster-require-full-coverage" 104) "yes" 105) "no-appendfsync-on-rewrite" 106) "no" 107) "slave-serve-stale-data" 108) "yes" 109) "slave-read-only" 110) "yes" 111) "stop-writes-on-bgsave-error" 112) "yes" 113) "daemonize" 114) "no" 115) "rdbcompression" 116) "yes" 117) "rdbchecksum" 118) "yes" 119) "activerehashing" 120) "yes" 121) "activedefrag" 122) "no" 123) "protected-mode" 124) "yes" 125) "repl-disable-tcp-nodelay" 126) "no" 127) "repl-diskless-sync" 128) "no" 129) "aof-rewrite-incremental-fsync" 130) "yes" 131) "aof-load-truncated" 132) "yes" 133) "aof-use-rdb-preamble" 134) "no" 135) "lazyfree-lazy-eviction" 136) "no" 137) "lazyfree-lazy-expire" 138) "no" 139) "lazyfree-lazy-server-del" 140) "no" 141) "slave-lazy-flush" 142) "no" 143) "maxmemory-policy" 144) "noeviction" 145) "loglevel" 146) "notice" 147) "supervised" 148) "no" 149) "appendfsync" 150) "everysec" 151) "syslog-facility" 152) "local0" 153) "appendonly" 154) "no" 155) "dir" 156) "/usr/local/redis/bin" 157) "save" 158) "3600 1 300 100 60 10000" 159) "client-output-buffer-limit" 160) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60" 161) "unixsocketperm" 162) "0" 163) "slaveof" 164) "" 165) "notify-keyspace-events" 166) "" 167) "bind" 168) "" 127.0.0.1:6379> //查看集群信息 127.0.0.1:6379> info replication #Replication role:master connected slaves:0
六. 运维监控 sentinel
6.1 概述
Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自懂切换。6.1.1 功能特点
不时地监控redis是否按照预期良好地运行;如果发现某个redis节点运行出现状况,能够通知另外一个进程(例如它的客户端);
能够进行自动切换。当一个master节点不可用时,能够选举出master的多个slave(如果有超过一个slave的话)中的一个来作为新的master,其它的slave节点会将它所追随的master的地址改为被提升为master的slave的新地址。
6.1.2 原理
sentinel不断与master通信,获取master的slave信息.监听master与slave的状态
如果某slave失效,直接通知master去除该slave.
如果master失效,,是按照slave优先级(可配置), 选取1个slave做 new master
,把其他slave–> new master
注意:sentinel没有独立的进程,功能是在和redis-server中启动的.
6.2 操作步骤
原本6379master;6380和6381都是6379的slave.然后6379down掉,然后6380变为master,6381变为6380的slave
6.2.1 手工操作步骤
#如何从slave变为maseter #1.从slave变为不是slave 127.0.0.1:6379>slaveof no one OK ##2.1查看slave的读功能 127.0.0.1:6379>config get slave-read-only 1) "slave-read-only" 2) "yes" ##2.2修改readonly为no 127.0.0.1:6379>config set slave-read-only no OK ##2.3查看确认 127.0.0.1:6379>config get slave-read-only 1) "slave-read-only" 2) "no" ## 2其它slave再指向新的master(new master A) ## 在其它slave上执行 >slaveof localhsot 6380
这么操作,但是需要人操作,Sentinel实现的就是自动完成这个过程.
6.2.2 Sentinel操作配置
////sentinel在slave中来监控master的.所以可以有一个权限 ////配置entinel can-failover def_master的值为yes //监控配置,监视127.0.0.1的6379端口. //2和下面的30秒配合使用,如果2次发现30秒还连接失效才算失效. //注意:def_master是为127.0.0.1 6379起的别名,后面的配置都会用到该别名. sentinel monitor def_master 127.0.0.1 6379 2 sentinel auth-pass def_master 012_345^678-90 ##master被当前sentinel实例认定为“失效”的间隔时间 ##如果当前sentinel与master直接的通讯中,在指定时间内没有响应或者响应错误代码,那么 ##当前sentinel就认为master失效(SDOWN,“主观”失效) ##<mastername> <millseconds> ##默认为30秒 sentinel down-after-milliseconds def_master 30000 ##当前sentinel实例是否允许实施“failover”(故障转移) ##no表示当前sentinel为“观察者”(只参与"投票".不参与实施failover), ##全局中至少有一个为yes sentinel can-failover def_master yes #如果master挂了.然后会选择一个slave为master.如果其它(多个)slave同时指向新的master, #那么新的master会负载过高,压力过大.该配置为执行同时几台slave来指向新的master, #该配置为1,则为1台1台的来指向新的master sentinel parallel-syncs mymas1ter 1 #做完这些事情的时间,如果不行,则执行脚本(脚本可以告警短信或邮件等通知). sentinel failover-timeout mymaster 180000 ##sentinel notification-script mymaster /var/redis/notify.sh #多个slave时优先哪个为master挂了之后的心的maseter #配置redis.conf(不是sentinel.conf配置) #slave-priority 越小越优先,默认100 slave-priority 10
sentinel启动模式
##以哨兵模式启动redis服务.用sentinel.conf的哨兵配置 ./bin/redis-server ./sentinel.conf --sentinel
配置解释:
port 26379 # 端口 sentinel monitor mymaster 127.0.0.1 6379 2 , 给主机起的名字(不重即可), 当2个sentinel实例都认为master失效时,正式失效 sentinel down-after-milliseconds mymaster 30000 多少毫秒后连接不到master认为断开 sentinel can-failover mymaster yes #是否允许sentinel修改slave->master. 如为no,则只能监控,无权修改./ sentinel parallel-syncs mymaster 1 , 一次性修改几个slave指向新的new master. sentinel client-reconfig-script mymaster /var/redis/reconfig.sh ,# 在重新配置new master,new slave过程,可以触发的脚本
6.2.3 配置实例
sentinel.conf疑问: sentinel与master通信,如果某次因为master IO操作频繁,导致超时,此时,认为master失效,很武断.
解决: sentnel允许多个实例看守1个master, 当N台(N可设置)sentinel都认为master失效,才正式失效.
参考文章(包含sentinel集群)
相关文章推荐
- JAVAWEB开发之redis学习(十一)——redis运维相关(主从复制以及AOF、RDB的配置、后台运维命令)
- redis持久化RDB和AOF
- Redis两种持久化方案RDB和AOF详解
- redis 笔记03 RDB 持久化、AOF持久化、事件、客户端
- Redis——持久化方式RDB和AOF的区别
- redis 的 RDB 和 AOF 持久化的区别
- redis持久化RDB和AOF
- Redis详解之-事件订阅和持久化存储方式(RDB和AOF)(二)
- Redis持久化方式AOF和RDB
- redis持久化AOF与RDB
- redis持久化RDB和AOF
- redis的持久化方式:RDB和AOF
- Redis持久化存储(AOF与RDB两种模式)
- Redis持久化,RDB和AOF
- Redis持久化--RDB+AOF
- redis的持久化RDB和AOF
- redis的 rdb 和 aof 持久化的区别
- Redis的持久化(RDB&&AOF)
- Redis持久化存储(AOF与RDB两种模式)
- redis持久化AOF与RDB