开发者学堂课程【Redis 入门实战演练: 配置文件详解、RDB 及 AOF 备份机制(一)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/653/detail/10834
配置文件详解、RDB 及 AOF 备份机制(一)
一、主要配置
1.save9001
save 900 1#在900秒内有一个键内容发生更改就出就快照机制 save 30010
# Save the DBon disk :#
save<seconds> <changes>
Changes 是指 key 的值,也就是发生的变化
Save 5 10
save 10 30
save 3 8
Redis 启动之后,会把配置文件解析,三个是或的关系,会解析成 save 5 10 pr save 10 30 or save 3 8
这样的关系,只要满足任何一个条件就会做快照。
900秒做一次 RDB,或者300秒有10次就做一次RDB,或者60秒之内10000次就会发生一次快照。
will save the DB if both the given number of seconds and the given
number of write operations against the DB occurred.
Redis 的内存数据影响所用的秒数。比如给 Redis 配的内存是8个 G,现在已经写到6个 G 了,把6个 G 的数据写到磁盘上,需要关注磁盘的写入性有多高,通常情况下做 read5,read110等等,假如说写入性能是200兆,现在是6个 G,1秒写600兆,需要三十分钟才能写完。更多数据的话,用的时间会更长。通常情况下,三分钟或者五分钟一次就比较合适了。如果想让它更快一点,可以写成 save 1 1,1秒做一个快照。
2.save 60 10000
stop-writes-on-bgsave-error no
#快照出错时是否禁止 redis 写入操作
rdbcompression yes
#持久化到 RDB 文件时,是否压缩,"yes"为压缩,"no""则反之
压缩的话会降低文件的大小
rdbchecksum yes
#是否开启 RC64校验,默认是开启
dbfilename dump.rdb
#快照文件名
dir ./
#快照文件保存路径
快照保存在 /app/redis/data,因为这是自定义的目录。
[root@redis-server1 redis-4.0.14]# vim*/apps/redis/etc/redis.conf[root@redis-server1 redis-4.0.14]# systemctlrestart redis
[root@redis-server1 redis-4.0.14]# systemctlrestart redis
[root@redis-server1 redis-4.0.14]# vim /apps/redis/etc/redis.conf[root@redis-server1 redis-4.0.14j#
[root@redis-server1 redis-4.0.14]# systemctlrestart redis[root@redis-server1 redis-4.0.14]# systemctlrestart redis[root@redis-server1 redis-4.0.14]# systemctlrestart redis
[root@redis-server1 redis-4.0.14]# vim /apps/redis/etc/redis.conf[root@redis-server1 redis-4.0.14j# systemctlrestart redis
[root@redis-server1 redis-4.0.14]# vim /apps/redis/etc/redis.conf[root@redis-server1 redis-4.0.14]# systemctlrestart redis
按照如下脚本跑一下
import redisimporttime
pool = redis.ConnectionPool(host="172.31.7.101",prt=6379, db=49,password="")r = redis.Redis( connection_pool=pool)
for i in range ( 1000) :
r.set ( " k%d"% i, " v%d" % i)#time.sleep( 1)
data=r.get( " k%d" %i)print(data)
不管文件有多大,想要把文件往磁盘上保存,如果磁盘文件没有保存成功,这个文件假如说是6个G,磁盘此时是本地磁盘,把 RDB 放到 data 下面,把 RDB 文件保存到 /apps/redis/data。当磁盘空间满了,就会导致其保存不了,所以就会禁止写入 Redis。
当 rdb 快照出现错误时:
[root@redis-server1 redis-4.0.14]# ll /apps/redis/data/total 12
- rw-r--r-- 1 redis redis 10879 Feb7 23:57 dump_6379.rdb
[root@redis-server1 redis-4.0.14]# chmod root.root/apps/redis/data/ -Rchmod: invalid mode: ' root.root'
Try 'chmod --help' for more information .
[root@redis-server1 redis-4.0.14]# chownroot.root/apps/redis/data/ -R[root@redis-server1 redis-4.0.14j# vim /apps/redis/etc/redis.conf ^c
[root@redis-server1 redis-4.0.14]# tail -f /apps/redis/logs/redis_6379.log18355:M 07 Feb 23:57:44.197 * 5 changes in 3 seconds. Saving.. .
18355:M 07 Feb 23:57:44.197 *Background saving started by pid 1836018360:C 07 Feb 23:57:44.199* DB saved on disk
18360:C 07 Feb 23:57:44.200 * RDB: 0 MB of memory used by copy-on-write18355:M 07 Feb 23:57:44.298 * Background saving terminated with success18355:M 07 Feb 23:57:48.022* 5 changes in 3 seconds. Saving.. .
18355:M 07 Feb 23:57:48.022* Background saving started by pid 1836218362:C 07 Feb 23:57:48.025* DBsaved on disk
18362:C 07 Feb 23:57:48.025 * RDB: 0 NB of memory used by copy-on-write18355:M 07 Feb 23:57:48.123 * Background saving terminated with success
redis . except ions . ResponseError: MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persis
t on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors durin
g writes if RDB snapshotting fails
(stop writes -on bgsave-error option). Please check the Redis Logs for details about th |
e RDB error.
Redis 服务器一直在保存,
[ root@redis-serverl ~]# 11 /apps/ redis/ data/
total 12
-rw-r--- 1 redis redis 10879 Feb 7 23:57 dump_ 6379. rdb
[ root@redis-server1 ~]# redis-c Li
127.0.0.1:6379> AUTH linux39
(error) ERR Client sent AUTH, but no password is set
127,0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379>info
3. Keyspace
db49: keys-1000, expires=0, avg_ ttL=0
127.0.0.1:6379> SET key1 value1 [Ex seconds] [PX milliseconds] [NX|X]
会发现数据根本写不进去,无论是通过手动的方式插入数据,还是通过程序都写不进去。
如果内存足够,还是不能写进去数据的话,就把配置文件改成vim/apps/redis/etc/redis.conf。
Copy-on-write
:写时复制
replica-serve-stale-data yes
#当从库同主库失去连接或者复制正在进行,从机库有两种运行方式:
1)如果 replica-serve-stale-data
设置为 yes(默认设置),从库会继续响应客户端的读请求。2)如果 replica-serve-stale-data
设置为 no,除去指定的命令之外的任何请求都会返回一个错误 SYNC withmaster in progress"
.
Slaveof 是让当前的 Redis 作为哪台服务器的备份主机,如果没有密码,slaveof 172.31.4.1.6379
.如果有密码的话需要打开 masterauth 设置密码。
包括它本身都可以去 slave 读,slave 会同步数据给 master,这时候设置为 yes,slave 仍然可以向客户端返还数据。
replica-read-only yes
#是否设置从库只读
一般来说是设置为 yes,如果不这样可能导致存入 master 的数据存入 slave,会导致 master 和 slave 数据不一致,后面会读不出来。为了避免出现数据不一致的情况,所以设置为已读。
repl-diskless-sync no
#是否使用 socket 方式复制数据(无盘同步),新 slave 连接连接时候需要做数据的全量同步,redis server 就要从内存 dump 出新的 RDB 文件,然后从 master 传到 slave,有两种方式把 RDB 文件传输给客户端;
1)基于硬盘(disk-backed) : master 创建一个新进程 dump RDB,RDB完成之后由父进程(即主进程)传给 slaves。
2)基于socket (diskless) : master 创建一个新进程直接 dump RDB 到 slave 的 socket,不经过主进程,不经过硬盘。
两个各有利弊,基于硬盘的话,RDB 文件创建后,一旦创建完毕,可以同时服务更多的 slave,但是基于 socket 的话,新 slave 连接到 master 之后得逐个同步数据。
在较慢并且网络较快的时候,可以用 diskless(yes),否则使用磁盘(no),磁盘很慢的话,就会让4个 G 的文件 dump 很长时间。磁盘很快使用 no。