首页 > 技术文章 > Redis安全与持久化(适合小白阅读)

miaoshiqian 2015-09-12 00:51 原文

前言:Redis的使用越来越重要、以下仅为个人学习的点点记录、仅供参考。

一、简单的redis安全性设置

1. 生产环境的redis最好建议在redis配置文件中设置bind。配置允许指定的ip登陆redis。

//下面ip仅供参考、具体根据您个人的生产环境进行配置
bind   127.0.0.1

2. 在redis.conf或者命令行中给redis设置密码(建议密码尽量设置复杂一些)

//redis.conf中添加配置
requirepass   "your password"

//或者执行命令
redis> CONFIG set requirepass "your password"

//重启完redis后使用 redis-cli -a your password 应该就可以成功使用密码登陆redis

一、redis持久化说明

1. RDB方式持久化方式 (save 和 bgsave方式)

  • save为同步的方式保存内存中的数据快照到磁盘。由于redis是单进程的。因此这种方式阻塞了redis client对redis的访问。
  • bgsave方式、redis会fork出一个子进程来处理快照保存。
  • RDB持久化方式都是将内存数据完整的写入磁盘上一个临时RDB文件中。通常为 dump.rdb文件(保存着二进制数据),使用locate dump.rdb找到这个文件可以使用以下命令查看文件内容。或者通过redis.conf中的dir xxxxx配置也可以查看你的rdb文件保存位置。
  • localhost:redis miaoshiqian [master] $ od -c dump.rdb
    0000000    R   E   D   I   S   0   0   0   6 376  \0  \0 004   m   i   a
    0000020    o  \a   s   h   i   q   i   a   n 377   C 355   N   z 264 226
    0000040  243   a                                                        
    0000042
  • dump.rdb是经过压缩的二进制文件、它占用的空间小于数据在内存中占用空间。
  • 以下简单介绍下和RDB持久化方式关系较大的几个配置项:
  • //dir配置rdb二进制文件保存再磁盘的那个位置
    dir /usr/local/var/db/redis/
    
    //dbfilename配置保存的文件名
    dbfilename dump.rdb
    
    //rdbcompression 配置是否使用压缩来保存二进制文件 默认yes
    rdbcompress  yes
    
    //save配置(最重要)
    save 900 1 //900秒之内如果有1个键被修改的话进行快照
    save 300 10 //300秒之内如果有10个键被修改的话进行快照
    save 60 10000 //60秒之内如果有10000个键被修改的话进行快照

    由于redis在启动的时候会读入磁盘上面的rdb文件、以达到数据恢复。从而达到持久化的目的,因此像RDB这种从内存问磁盘dump快照的方式有几个缺点:

  • 如果当redis异常死掉时,最近的数据会丢失(最后一次保存快照以后的所有数据修改会丢失、丢失数据的多少视你save策略的配置),所以这是它最大的缺点,当业务量很大时,丢失的数据是很多的。
  • 快照每次都是将内存中的全部数据dump到磁盘上面。势必导致磁盘大量的IO开销。数据量越大越明显。

2. AOF持久化方式

  • 说白了其实aof方式就是一个xxx.aof文件保存下了所以redis执行的写命令。因此在redis启动的时候、只需要按顺序执行该文件中保存的全部写命令就可以实现数据持久化。
  • aof的实现分为 “命令追加”、“文件写入”、“文件同步” 三个步骤。
  • 命令追加:redis再执行一条写命令后,会以协议格式写入redis在内存中开辟的一块aof_buf缓冲区的末尾。
  • 命令写入与同步:服务器结束一个事件循环之前调用flushAppendOnlyFile函数、考虑是否将aof_buf内的内容写入保存到aof文件里面。此函数的行为由redis.conf中的appendfsync 的配置项来决定的。
  • appendfsync的配置项的值说明如下:
  • //将aof_buf中的所有内容写入并同步到aof
    appendfsync  always
    
    //将aof_buf中所有内容写入aof文件、是否同步取决于上次同步到当前的时间是否超过1s。超过则同步。且同步是由一个专门的线程来完成的。
    appendfsync  everysec
    
    //讲所有aof_buf缓冲区中的内容写入aof文件。但是不进行同步操作。
    appendfsync  no

    AOF持久化相关的redis配置项除了上面的appendfsync以外还有以下几个:

  • //决定是否开启aof持久化。默认为no。redis默认使用rdb实现持久化。
    appendonly no
    
    //同rdb种的dir配置一样、决定了aof文件存放再哪里。
    dir /usr/local/opt/redis/
    
    //aof的文件名
    appendfilename   appendonly.aof
    
    //再aof文件的大小超过上次重写时aof文件的大小的 百分之多少时会进行重写。
    auto-aof-rewrite-percentage  100
    
    //当aof文件至少达到多大时才进行重写
    auto-aof-rewrite-min-size  64mb
    
    //重写概念的简单解释如下:
    //由于aof文件中保存各种写命令、而会导致文件迅速膨胀。其实很多写命令可以整理为少数几条写命令而达到一样的效果。重写简单讲就是负责对冗长的写命令进行整理。auto-aof-rewrite-min-size 限制大小就意味着比这个配置小的aof文件没有整理的必要。

     以上仅仅为个人总结~,各位选择性的吸收即可。

 

推荐阅读