Redis持久化策略(看这篇,你肯定会有所获)
RDB:Redis DataBase , 记录快照RDB是redis 默认的持久化方案. RDB 是当满足一定条件时, 就会将redis内存中的数据写入磁盘,并生成一个快照文件dump.rdb 文件.Redis 重启会通过加载dump.rdb文件恢复数据.
一定条件分为以下几种情况: 1.自动触发 2. 手动触发 . 下面分开说明下:
a).redis.conf 中 SNAPSHOTTING 其中定义了触发把数据保存到磁盘的触发频率.
如果不需要rdb 方案, 注释save 或者配置成空字符串" ".
save 900 1 #900秒内至少有一个key被修改(包括添加)
save 300 10 #400秒内至少10个key被修改
save 10000 #60秒内至少有10000个key 被修改.
这三条配置不冲突, 只要满足一条就触发.
rdb 文件位置和目录 (默认在安装根目录下)
#文件路径
dir ./
#文件名称
dbfilename dump.rdb
#是否以LZY压缩rdb 文件
rdbcompression yes
#开启数据校验
rdbchecksum yes
b) shutdown触发 ,保证服务器正常关闭.
c) flushall , rdb文件是空的, 会生成一个空的文件,所以这种情况也没有什么意义.但需要知道,这种情况下
会触发生成rdb文件.
Redis 提供了两条命令: save 和 bgsave
a). save 命令
save 在生成快照的时候会阻塞当前Redis 服务器,Redis不能处理其他命令.如果内存数据较多,会造成
b).bgsave 命令
执行bgsave命令时, Redis会在后台进行异步快照操作,快照同时还可以响应客户端请求.
具体操作
具体操作:Redis进程会执行fork操作创建子进程(copy-on-write),RDB 持久化过程由子进程负载,完成后自动结束.它不会记录fork之后产生的记录.阻塞只发送在fork阶段,一般时间较短.
一.优势
1.RDB是一个非常紧凑的文件,它保存了Redis在某个时间点上的数据集.这种文件非常适合进行备份和
灾难恢复.
2.生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存的工作,主进程不需要进行任何
IO操作.
3.RDB在恢复大数据集时的速度比AOF的恢复速度要快
二.劣势
1).RDB 没办法做到实时持久化/妙级持久化.因为bgsave每次运行都要执行fork创建子进程,频繁执行成本过高.
2).在一定间隔时间做一次备份,所以如果Redis 以为down掉的话,就会丢失最后一次快照之后所有修改
(数据有丢失)
AOF:<Append Only File> , 记录日志
Redis 默认不开启.AOF采用日志的形式来记录每个写操作,并追加到文件中.开启后,执行更改Redis 命令时,就会把命令写入到AOF文件中.
Redis 重启时会根据日志文件的内容把写指令从前往后执行一次以完成数据的恢复工作.
#开关
appendonly no
#文件名
appendfilename "appendonly.aof"
由于操作系统缓存机制,AOF数据并没有真正地写入硬盘,而是进入了系统的硬盘缓存.什么时候
把缓冲区的内容写入到AOF文件中? 由下面参数决定
appendfsync : 值: no \ always \everysec
no: 表示不执行fync, 由操作系统保证数据同步到磁盘,速度最快,但是不安全.
always:表示每次写入都执行fync,以保证数据同步到磁盘,效率很低
everysec:表示每秒执行以fync ,可能会导致丢失1s数据.通常选择everysec,兼顾效率和安全性.
因为AOF文件只有一个, 随着redis 不断进行,AOF 的文件会越来越大,文件越大, 文件占用服务器内存
以及AOF恢复要求时间越长.
为了解决这个问题,可以使用bgwriteaof来重写.那什么时候重写? 又是怎样重写?
一. 什么时候重写?
#重写触发机制
auto-aof-rewrite-percentage 100 默认值是100. 当前aof 文件大小超过 上一次重写的aof文件大小百分之多少进行重写,即当aof文件增长到一定大小时,Redis能够调用bgwriteaof对日志文件进行重写.当前aof文件大小是上次日志重写得到aof文件大小的二倍时, 自动启动新的日志重写过程.
auto-aof-rewrite-min-size 默认是64M.设置允许重写的最小aof文件大小,避免达到了约定百分比 但尺寸
仍然很小的情况还要重写.
二. 怎样重写?
并不是对原文件进行重新整理,而是直接读取服务器上现有的键值对,然后用一条命令去代替之间记录这
个键值对的多条命令,生成一个新的文件后去替换原来的 AOF文件.
看下面这两个参数:
no-appendfsync-on-rewrite
aof-load-truncated
AOF 数据恢复
重启Redis之后就会进行AOF文件恢复.
AOF 的优势和劣势
优点:
1.AOF 持久化的方法提供了多种的同步频率,即使使用默认的同步频率每秒同步一次,Redis最多也就丢失
1秒的数据.
缺点:
1.对于具有相同数据的Redis, AOF文件通常比RDF文件体积更大(RDB存的是数据快照)
2.虽然AOF提供了多种同步的频率,默认的情况下,没秒同步一次的频率也具有较高的性能.在高并发的情况下,RDB比AOF具有更好的性能.
如果可以忍一小段时间数据的丢失,毫无疑问使用RDB 是最好的,定时生成RDB快照非常便于进行数据备份,而且RDB恢复数据集的速度也要比AOF恢复速度要快.
否则就要使用AOF重写.但是一般情况下建议不要单独使用某一种持久化机制,而是两种一起用.
本文内容来自咕泡学院-青山老师,感谢青山老师!!
绛旓細Redis瀹炵幇鏁版嵁鎸佷箙鍖栫殑涓ょ瀹炵幇鏂瑰紡锛歊DB锛氭寚瀹氱殑鏃堕棿闂撮殧鍐呬繚瀛樻暟鎹揩鐓OF锛氬厛鎶婂懡浠よ拷鍔犲埌鎿嶄綔鏃ュ織鐨勫熬閮紝淇濆瓨鎵鏈夌殑鍘嗗彶鎿嶄綔涓銆丷DB瀹炵幇Redis鏁版嵁鎸佷箙鍖栵紙榛樿鏂瑰紡锛1銆佺紪杈 redis.conf娉細浣跨敤whereis redis鍛戒护鏌ョ湅redis瀹夎鍦ㄥ摢涓綅缃紝鐒跺悗杩涘叆redis瀹夎鐩綍鐨別tc鐩綍涓嬶紝缂栬緫redis.conf銆2銆侀粯璁ゅ浠界殑...
绛旓細1.AOF 鎸佷箙鍖鐨勬柟娉曟彁渚涗簡澶氱鐨勫悓姝ラ鐜,鍗充娇浣跨敤榛樿鐨勫悓姝ラ鐜囨瘡绉掑悓姝ヤ竴娆,Redis鏈澶氫篃灏变涪澶 1绉掔殑鏁版嵁.缂虹偣:1.瀵逛簬鍏锋湁鐩稿悓鏁版嵁鐨Redis, AOF鏂囦欢閫氬父姣擱DF鏂囦欢浣撶Н鏇村ぇ(RDB瀛樼殑鏄暟鎹揩鐓)2.铏界劧AOF鎻愪緵浜嗗绉嶅悓姝ョ殑棰戠巼,榛樿鐨勬儏鍐典笅,娌$鍚屾涓娆$殑棰戠巼涔熷叿鏈夎緝楂樼殑鎬ц兘.鍦ㄩ珮骞跺彂鐨勬儏鍐典笅,R...
绛旓細1銆佸墠瑷Redis鏄竴绉嶉珮绾ey-value鏁版嵁搴撱傚畠璺焟emcached绫讳技锛屼笉杩囨暟鎹彲浠鎸佷箙鍖栵紝鑰屼笖鏀寔鐨勬暟鎹被鍨嬪緢涓板瘜銆傛湁瀛楃涓诧紝閾捐〃锛岄泦 鍚堝拰鏈夊簭闆嗗悎銆傛敮鎸佸湪鏈嶅姟鍣ㄧ璁$畻闆嗗悎鐨勫苟锛屼氦鍜岃ˉ闆(difference)绛夛紝杩樻敮鎸佸绉嶆帓搴忓姛鑳姐傛墍浠edis涔熷彲浠ヨ鐪嬫垚鏄竴涓暟鎹粨鏋勬湇鍔 鍣ㄣ傦紙鎺ㄨ崘锛redis瑙嗛鏁欑▼锛Redis鐨...
绛旓細Redis 鎻愪緵浜嗗绉嶄笉鍚岀骇鍒殑鎸佷箙鍖鏂瑰紡锛歊DB 鎸佷箙鍖栧彲浠ュ湪鎸囧畾鐨勬椂闂撮棿闅斿唴鐢熸垚鏁版嵁闆嗙殑鏃堕棿鐐瑰揩鐓(point-in-time snapshot)銆侫OF 鎸佷箙鍖栬褰曟湇鍔″櫒鎵ц鐨勬墍鏈夊啓鎿嶄綔鍛戒护锛屽苟鍦ㄦ湇鍔″櫒鍚姩鏃讹紝閫氳繃閲嶆柊鎵ц杩欎簺鍛戒护鏉ヨ繕鍘熸暟鎹泦銆 AOF 鏂囦欢涓殑鍛戒护鍏ㄩ儴浠 Redis 鍗忚鐨勬牸寮忔潵淇濆瓨锛屾柊鍛戒护浼氳杩藉姞鍒版枃浠...
绛旓細Redis锛岃繖涓楂樻晥鐨勬暟鎹瓨鍌ㄥ紩鎿庯紝鍏舵牳蹇冪壒鎬т究鏄瓨鍌ㄥ湪鍐呭瓨涓互瀹炵幇鏋佸揩鐨勮鍐欓熷害銆傜劧鑰岋紝涓轰簡鏁版嵁鐨勫畨鍏ㄦэ紝瀹冩彁渚涗簡涓ょ鍏抽敭鐨勬暟鎹鎸佷箙鍖栫瓥鐣锛歊DB鍜孉OF銆傝鎴戜滑娣卞叆鎺㈣杩欎袱绉嶆柟寮忥紝浠ュ強瀹冧滑鍦ㄥ疄闄呭簲鐢ㄤ腑鐨勯夋嫨鑰冮噺銆備竴銆丷DB涓嶢OF鐨勫紓鍚 RDB锛屽叏绉版槸Redis鐨浜岃繘鍒跺揩鐓э紝瀹冨畾鏈熷皢鍐呭瓨涓殑鏁版嵁闆嗕互浜岃繘鍒...
绛旓細Redis 鎸佷箙鍖涔熸槸 Redis?鍜 Memcached 鐨勪富瑕佸尯鍒箣涓,鍥犱负 Memcached?鏄笉鍏峰鎸佷箙鍖栧姛鑳界殑銆1.鎸佷箙鍖栫殑鍑犵鏂瑰紡Redis 鎸佷箙鍖栨嫢鏈変互涓嬩笁绉嶆柟寮:蹇収鏂瑰紡(RDB, Redis DataBase)灏嗘煇涓涓椂鍒荤殑鍐呭瓨鏁版嵁,浠ヤ簩杩涘埗鐨勬柟寮忓啓鍏ョ鐩;鏂囦欢杩藉姞鏂瑰紡(AOF, Append Only File),璁板綍鎵鏈夌殑鎿嶄綔鍛戒护,骞朵互鏂囨湰鐨勫舰寮忚拷鍔犲埌鏂囦欢涓...
绛旓細1.RDB 鎸佷箙鍖鏈哄埗 锛氭槸瀵 redis 鏁版嵁鎵ц鍛ㄦ湡鎬х殑鎸佷箙鍖栥傝繖绉嶆柟寮忓氨鏄皢鍐呭瓨涓暟鎹互蹇収鐨勬柟寮忓啓鍏ュ埌浜岃繘鍒舵枃浠朵腑锛岄粯璁ょ殑鏂囦欢鍚嶄负 dump.rdb銆傚鎴风涔熷彲浠ヤ娇鐢╯ave鎴栬卋gsave鍛戒护閫氱煡redis鍋氫竴娆″揩鐓ф寔涔呭寲銆俿ave鎿嶄綔鏄湪涓荤嚎绋嬩腑淇濆瓨蹇収鐨勶紝鐢变簬redis鏄敤涓涓富绾跨▼鏉ュ鐞嗘墍鏈夊鎴风鐨勮姹傦紝杩欑...
绛旓細Redis鎸佷箙鍖栵細AOF涓嶳DB鐨勫畧鎶や箣閬 Redis鐨勬寔涔呭寲绛栫暐鏃ㄥ湪纭繚鏁版嵁鍦ㄦ剰澶栧畷鏈哄悗鑳借繀閫熸仮澶嶏紝鍏朵腑AOF鍜孯DB鏄袱澶ф牳蹇冨伐鍏枫侫OF鏂瑰紡璁板綍姣忎竴娆″啓鍏ユ搷浣滐紝浠ユ棩蹇楀舰寮忎繚瀛橈紝閫氳繃閲嶅啓绛栫暐瀹炵幇鏂囦欢鐦﹁韩锛岃孯DB鍒欐彁渚涘畾鏈熷唴瀛樺揩鐓с侫OF鐨勬繁搴﹀墫鏋 AOF宸ヤ綔鍘熺悊濡傚悓COW锛圕opy-on-write锛夛紝鍦ㄥ苟鍙戣鍐欏満鏅笅锛岄氳繃澧為噺...
绛旓細Redis鏈変袱绉鎸佷箙鍖鐨勬柟寮忥紝涓绉嶆槸RDB锛屽彟澶栫鏄疉OF銆俁DB鏄皢Redis鍐呭瓨涓暟鎹殑蹇収瀛樺偍鍦ㄧ鐩樺唴锛屾槸Redis鐨榛樿鎸佷箙鍖栨柟妗堛俁DB鎸佷箙鍖栭粯璁ゆ湁涓夌绛栫暐 鍙湪redis.conf涓厤缃紝浼氫互涓娈垫椂闂村唴杈惧埌鎸囧畾淇敼鐨勬鏁颁负瑙勫垯鏉ヨЕ鍙戝揩鐓ф搷浣滐紝蹇収鏂囦欢鍚嶄负dump.rdb銆傛瘡褰揜edis鏈嶅姟閲嶅惎鐨勬椂鍊欓兘浼氫粠璇ユ枃浠朵腑鎶婃暟鎹姞杞...
绛旓細Redis浼氬崟鐙垱寤猴紙fork锛変竴涓瓙杩涚▼鏉ヨ繘琛鎸佷箙鍖栵紝浼氬厛灏嗘暟鎹啓鍏ュ埌涓涓复鏃舵枃浠朵腑锛屽緟鎸佷箙鍖栬繃绋嬮兘缁撴潫浜嗭紝鍐嶇敤杩欎釜涓存椂鏂囦欢鏇挎崲涓婃鎸佷箙鍖栧ソ鐨勬枃浠躲侳ork鐨勪綔鐢ㄦ槸澶嶅埗涓涓笌褰撳墠杩涚▼涓鏍风殑杩涚▼銆傛柊杩涚▼鐨勬墍鏈夋暟鎹紙鍙橀噺銆佺幆澧冨彉閲忋佺▼搴忚鏁板櫒绛夛級鏁板奸兘鍜屽師杩涚▼涓鑷达紝浣嗘槸鏄竴涓叏鏂扮殑杩涚▼锛屽苟浣滀负鍘...