Security
redis期望是在一个安全的网络环境中,不提供过多的ACL。
可以设定只绑定来自某几个IP的客户端,在redis.config中配置:
bind 127.0.0.1
也可以在redis.config中设置一个密码auth,客户端需要密码才能连上。在redis.config中配置
requirepass "hello world"
密码是明文的,如果你还想更安全些,那就用SSL吧。
也可以禁用哪些命令,只需要rename它们到一个猜不到的名字即可。
rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
如果你要完全禁用它,就把它remame为空的字符串
rename-command CONFIG ""
Replication
实现replication,只需要在slave的redis.config文件中加上一行:
slaveof 192.168.1.1 6379
后面的IP和端口指向master。
slave也可以接自己的slave,master和slave的结构可以像树一下。
slave是否第一次连上master都没关系,
是第1次的话,master会先传database file给它,slave会保存到硬盘,然后再把文件读入内存。
之后,master再把缓存的那些命令(database file更新之后接收到的命令)发给slave,slave执行后就与master一致了。
以上用的是 SYNC命令。
如果是重连 ,默认也会跟第1次连一样,重走整个过程。即也执行SYNC命令。
但从2.8版本起,也支持部分同步了。执行的是PSYNC命令。
2.6起,slave默认都是只读的,即拒绝写操作。
在redis.config中可以配置:
slave-read-only true
但不表示slave就可以暴露在不安全的环境中了,因为虽然不可写,但还是可以执行管理命令,诸如DEBUG、CONFIG等命令。所以为了安全起见,可以禁用这些命令(改名)。
如果master要验证密码,则slave要在redis.config中加上密码:
masterauth <password>
从2.8开始,支持以下特性:
有至少N个slave连上时,master才接受写操作。
slave每秒都会ping master一次,可以设置M秒内ping过master,就表示它连着。
在redis.config中设置:
min-slaves-to-write <number of slaves>
min-slaves-max-lag <number of seconds>
Persistence
redis存储有两种方式:RDB( RDB 文件)和AOF(appendOnly file)。
RDB是每隔一段时间就把整个内存的数据的快照dump到文件。
AOF是每隔一段时间就把命令列表append到aof文件里。
RDB是全部数据生成一个快照文件,简单,还原快,但频次不能太大,免得影响性能。遇到突发情况,会丢掉最近的数据。
AOF是一个命令一个命令的append到aof文件里,频次可以很大,默认是1秒1次,遇到突发情况,丢失的数据少,但还原较慢。
可以两个结合起来用。
要开启RDB,在redis.config里配置:
save 60 1000
after 60 sec if at least 1000 keys changed
表示60秒后,如果有1000个key更新了,就把快照写到文件。
如果要禁用RDB,在redis.config里配置:
save ""
要开启AOF,
appendonly yes
在禁用AOF,
appendonly no
AOF可以是每执行一个写命令就同步一次(append到aof),也可以每秒同步一次,或者不同步。默认是每秒同步一次,兼顾了性能和减少数据丢失的情况。
# If unsure, use "everysec".
# appendfsync always
appendfsync everysec
# appendfsync no
随之着执行的命令越来越多,aof也被append得越来越大,如果一个key被set 100次,就存100条语句在aof里面,显然还原时,只执行最后一个命令就行了,其他99条是多余的。
要做这样的优化和瘦身,就要用到BGREWITEAOF。
BGREWITEAOF的过程是:
1.子线程先复制目前的aof一份,然后在一边慢慢优化。
2.与此同时,主线程仍然向外提供服务,接收新的命令并append到目前的aof,并将命令缓存。
3.子线程优化完后,会向主线程发一个信号,然后主线程再把缓存里的命令也append到新aof文件里。
4.完后再以新aof替旧aof。
因为新命令一直有append到目前的aof文件,所以就算rewrite失败,数据也不会丢失。
如果开启了AOF,在append 命令到aof文件的过程中突然停电,aof文件损坏,可按以下步骤恢复:
备份下aof,存到其他电脑上;
执行命令:
$ redis-check-aof --fix
使用修复好的aof文件,重启redis。
redis已经在运行,并且使用RDB,可转成AOF,步骤如下:
1.备份最新的dump.rdb到安全的地方;
2.执行:
redis-cli config set appendonly yes
redis-cli config set save ""
在执行第1个命令时,redis会阻塞以生成一个最新的dump,然后生成一个aof,接收命令并append。
第2个命令不执行也行,不执行就同时使用RDB和AOF了。
slave priority
设置如果master停止服务后,slave提升为master的优先级。
为整数,数值越小,优先级越高。
如3个slave, 优先级分别是 priority 10, 100, 25,最后优先选为master的是10。
如果设为0,表示不能选作master。
# By default the priority is 100.
slave-priority 100