redis部署和持久化

redis部署和持久化

一、Redis介绍

Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统。和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相对更多,包括string、list、set、zset和hash。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作。在此基础上,Redis支持各种不同方式的排序。
和Memcache一样,Redis数据都是缓存在计算机内存中,不同的是,Memcache只能将数据缓存到内存中,无法自动定期写入硬盘,这就表示,一断电或重启,内存清空,数据丢失。所以Memcache的应用场景适用于缓存无需持久化的数据。而Redis不同的是它会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,实现数据的持久化。

Redis数据类型
  • String — 字符串
  • Hash — 字典
  • List — 列表
  • Set — 集合
  • Sorted Set — 有序列表
  • Pub/Sub — 有序集合
  • Transactions — 事物
常用配置

bind 类似白名单,允许谁访问

protected-mode yes 保护模式,只能本机访问 #启动条件:1.没有使用bind配置 2.没有设置防问密码

daemonize yes 是否以守护进程模式运行(以后台方式运行)

timeout 客户端连接多少时间后关闭 0表示关闭此功能

二、Redis的安装

redis下载请往http://download.redis.io/releases/

# 下载redis的安装包并解压至/usr/local
[root@localhost ~]# cd /usr/src/
[root@localhost src]# wget http://download.redis.io/releases/redis-4.0.14.tar.gz
[root@localhost src]# ls
debug  kernels  redis-4.0.14.tar.gz
[root@localhost src]# tar xf redis-4.0.14.tar.gz -C /usr/local/

# 编译redis
[root@localhost src]# cd /usr/local/redis-4.0.14/
[root@localhost redis-4.0.14]# make

# 编译完成之后,可以看到解压文件redis-3.0.7 中会有对应的src、conf等文件夹
[root@localhost redis-4.0.14]# ls
00-RELEASENOTES  CONTRIBUTING  deps     Makefile   README.md   runtest          runtest-sentinel  src    utils
BUGS             COPYING       INSTALL  MANIFESTO  redis.conf  runtest-cluster  sentinel.conf     tests

# 进入到src 目录,执行 make install ; 通过这个命令,会把src目录下便宜生成的6个命令安装到/usr/local/bin下
[root@localhost redis-4.0.14]# cd src/
[root@localhost src]# make install
过程略...
[root@localhost ~]# ls /usr/local/bin/
redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli  redis-sentinel  redis-server

三、Redis的部署

# 把参数文件,拷贝到 /usr/local/etc/redis 目录下,这个目录需要自己手工创建
[root@localhost ~]# mkdir /usr/local/etc/redis
[root@localhost ~]# cp /usr/local/redis-4.0.14/redis.conf /usr/local/etc/redis/
[root@localhost ~]# ls /usr/local/etc/redis/
redis.conf

# 可以which 命令,看是否找到,能找到,就可以执行
[root@localhost ~]# which redis-server
/usr/local/bin/redis-server

# 直接启动界面如下
[root@localhost ~]# redis-server
5640:C 05 Sep 21:27:23.314 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
5640:C 05 Sep 21:27:23.314 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=5640, just started
5640:C 05 Sep 21:27:23.314 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
5640:M 05 Sep 21:27:23.315 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 4.0.14 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 5640
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

5640:M 05 Sep 21:27:23.315 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
5640:M 05 Sep 21:27:23.315 # Server initialized
5640:M 05 Sep 21:27:23.315 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
5640:M 05 Sep 21:27:23.316 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
5640:M 05 Sep 21:27:23.316 * Ready to accept connections

# 注意:这里直接执行Redis-server 启动的Redis服务,是在前台直接运行的(效果如上图),也就是说,执行完该命令后,如果Lunix关闭当前会话,则Redis服务也随即关闭。正常情况下,启动Redis服务需要从后台启动,并且指定启动配置文件。

#  后台启动redis服务
## 首先编辑conf文件,将daemonize属性改为yes(表明需要在后台运行)
[root@localhost ~]# vim /usr/local/etc/redis/redis.conf
daemonize yes     ## 修改为yes

# 再次启动redis服务,并指定启动服务配置文件
[root@localhost ~]# redis-server /usr/local/etc/redis/redis.conf
5652:C 05 Sep 21:33:13.053 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
5652:C 05 Sep 21:33:13.053 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=5652, just started
5652:C 05 Sep 21:33:13.053 # Configuration loaded


# 服务端启动成功后,执行redis-cli启动Redis 客户端,查看端口号。
[root@localhost ~]# redis-cli
127.0.0.1:6379> exit
[root@localhost ~]# ss -antl |grep 6379
LISTEN     0      128    127.0.0.1:6379                     *:*   

# 到这里redis就应经部署完成了  

四、Redis 操作常用命令

Redis-server /usr..../redis.conf   启动redis服务,并指定配置文件
Redis-cli 	 启动redis 客户端
Pkill redis-server  关闭redis服务
Redis-cli shutdown  关闭redis客户端
Netstat -tunpl|grep 6379  查看redis 默认端口号6379占用情况

五、redis配置文件常用配置

1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
   
    daemonize no

2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定

pidfile /var/run/redis.pid

3. 指定Redis监听端口,默认端口为6379

    port 6379

4. 绑定的主机地址

    bind 127.0.0.1

5.当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能

    timeout 300

6. 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose

    loglevel verbose

7. 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null

    logfile stdout

8. 设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id

    databases 16

9. 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合

    save <seconds> <changes>

    Redis默认配置文件中提供了三个条件:

    save 900 1

    save 300 10

    save 60 10000

    分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。

 

10. 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大

    rdbcompression yes

11. 指定本地数据库文件名,默认值为dump.rdb

    dbfilename dump.rdb

12. 指定本地数据库存放目录

    dir ./

13. 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步

    slaveof <masterip> <masterport>

14. 当master服务设置了密码保护时,slav服务连接master的密码

    masterauth <master-password>

15. 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭

    requirepass foobared

16. 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息

    maxclients 128

17. 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区

    maxmemory <bytes>

18. 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no

    appendonly no

19. 指定更新日志文件名,默认为appendonly.aof

     appendfilename appendonly.aof

20. 指定更新日志条件,共有3个可选值: 
    no:表示等操作系统进行数据缓存同步到磁盘(快) 
    always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) 
    everysec:表示每秒同步一次(折衷,默认值)

    appendfsync everysec

 

21. 指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)

     vm-enabled no

22. 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享

     vm-swap-file /tmp/redis.swap

23. 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0

     vm-max-memory 0

24. Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值

     vm-page-size 32

25. 设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。

     vm-pages 134217728

26. 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4

     vm-max-threads 4

27. 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启

    glueoutputbuf yes

28. 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法

    hash-max-zipmap-entries 64

    hash-max-zipmap-value 512

29. 指定是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)

    activerehashing yes

30. 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件

    include /path/to/local.conf

六、redis持久化

redis是基于内存运行的,但是redis会在某一时间将内存的数据写入磁盘(以文件的方式)这样就达到了持久化的效果。

redis持久化的两种方式
RDB

redis默认就是rdb持久化

rdb工作原理:假如redis中有k1 k2 k3这三个值rdb会复制redis这个进程,称为子进程,这个子进程的变量,环境变量,程序计数器等都和原进程一模一样,会将数据写入到一个临时文件中,待持久化结束了,在用这个临时文件替换上次持久化好的文件,整个过程中,主进程不进行任何的io操作,这就确保了极高的性能。

为什么要用子进程来做持久化:因为redis是单线程的同时只能做一件事情,它不能一边处理客户端的请求一边来做持久化。

每次关闭后登陆都自动会加载所在目录下的rdb文件

rdb文件在哪里?
dir ./ # 由配置文件决定默认存放在当前目录,也就是redis的启动目录下,在哪里启动就会在哪里,建议写死,不然容易导致数据丢失

什么时候会触发rdb

  1. shutdown时,如果没有开启aof,会触发

  2. 配置文件中默认的快照配置

  3. 执行命令save或者bgsave

    save命令持久化是调用主进程去进行持久化的,而不是子进程,那么这种情况下主进程将不能处理客户端的请求,要直等到save持久化完成后才能继续处理客户端请求。

    bgsave命令:shutdown,配置文件中默认的快照,默认都是调用bgsave进行持久化,所以bgsave是调用的子进程,主线程仍然可以处理客户端操作。

  4. flushall命令 :清空16个数据库,会触发,但是里面是空的,无意义

save 900 1		# 900s之内有一次更改触发
save 300 10		# 300s之内有10次更改触发
save 60 10000	# 60s之内有10000次更改触发
# 更改指的是“更删改”不包括“查”

rdb丢失数据可能性比aof大,默认配置最低是60s持久化一次,但是如果在59s断电了,那么这59s的数据全部丢失了。

rdb的优缺点

优点:
1 适合大规模的数据恢复。
2 如果业务对数据完整性和一致性要求不高,RDB是很好的选择。

缺点:
1 数据的完整性和一致性不高,因为RDB可能在最后一次备份时宕机了。
2 备份时占用内存,因为Redis 在备份时会独立创建一个子进程,将数据写入到一个临时文件(此时内存中的数据是原来的两倍哦),最后再将临时文件替换之前的备份文件。
所以Redis 的持久化和数据的恢复要选择在夜深人静的时候执行是比较合理的。

rdb模式测试

# 先确保aof模式是没有开启的
[root@localhost redis-4.0.14]# redis-server /usr/local/etc/redis/redis.conf
[root@localhost redis-4.0.14]# redis-cli
127.0.0.1:6379> set k1 1
OK
127.0.0.1:6379> set k2 2
OK
127.0.0.1:6379> set k3 3
OK
127.0.0.1:6379> set k4 4
OK
127.0.0.1:6379> set k5 5
OK
127.0.0.1:6379> set k6 6
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k1"
3) "k6"
4) "k5"
5) "k4"
6) "k2"
127.0.0.1:6379> SHUTDOWN
not connected> quit
[root@localhost redis-4.0.14]# ll
...
-rw-r--r--.  1 root root    134 6月  17 10:40 dump.rdb
...

[root@localhost redis-4.0.14]# cp dump.rdb dump_bk.rdb

[root@localhost redis-4.0.14]# redis-server /usr/local/etc/redis/redis.conf
...
[root@localhost redis-4.0.14]# redis-cli
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> SHUTDOWN
not connected> quit

[root@localhost redis-4.0.14]# cp dump_bk.rdb dump.rdb
cp:是否覆盖"dump.rdb"? y
[root@localhost redis-4.0.14]# redis-server /usr/local/etc/redis/redis.conf
...
[root@localhost redis-4.0.14]# redis-cli
127.0.0.1:6379> keys *
1) "k5"
2) "k1"
3) "k4"
4) "k3"
5) "k6"
6) "k2"
# 已经恢复了,这里要注意shutdown和flushall都会触发rdb,所以要备份cp dump_bk.rdb dump.rdb
AOF

当开启了两种模式的情况下默认首先使用AOF的存储方式
以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),
只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis
重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
注:所有的指令记录也包括flushDB操作。
redis中这种存储方式默认是关闭的,需要在redis.conf文件中开启
Redis对于AOF存储方式是怎么持久化的在redis.conf也有。

如何开启aof模式

开启aof存储
appendonly yes
appendfilename "appendonly.aof"

默认开启数据压缩
rdbcompression yes
# 配置存储至本地数据库时是否压缩数据,默认为yes。Redis采用LZF压缩方式,但占用了一点CPU的时间。若关闭该选项,但会导致数据库文件变的巨大。建议开启


# 指定更新日志条件
# appendfsync always
appendfsync everysec
# appendfsync no

always   	# 同步持久化,每次发生数据变化会立刻写入到磁盘中。性能较差但数据完整性比较好(慢,安全)
everysec	# 出厂默认推荐,每秒异步记录一次(默认值)
no  		# 不同步

配置文件对于这种方式的持久化有三种方式:

  1. 有写操作就写。显然这种方式影响性能。但是数据完整,不会丢数据
  2. 不开启。不开启AOF就没意思了
  3. 每秒写文件。折中的方式更加合适。但是有可能导致一秒的数据丢失。

aof的重写rewrite

AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,
当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩

AOF 的数据完整性比RDB高,但记录内容多了,会影响数据恢复的效率。 Redis 针对 AOF文件大的问题,提供重写的瘦身机制。

若只打算用Redis 做缓存,可以关闭持久化。若打算使用Redis 的持久化。建议RDB和AOF都开启。其实RDB更适合做数据的备份,留一后手。AOF出问题了,还有RDB。

重写规则
AOF是使用文件追加的方式,随着系统使用的越来越久,AOF的文件会越来越大,当AOF的大小超过文件大小所设定的阈值时,Redis就会启动AOF文件内容压缩,只保留可以恢复的最小指令集。

重写原理
AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。

触发条件
Redis会记录上次重写时AOF的大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍,且文件大于64M时触发,可以在配置文件中修改。

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

AOF存储方式优点

1、 每秒同步。
2、 每修改同步。

AOF存储方式缺点

1、 AOF文件远大于RDB。
2、 运行效率慢。

aof存储方式测试

# 先开启aof
[root@localhost redis-4.0.14]# vim redis.conf
appendonly yes	# 开启aof

# 重新启动redis并set三个值后退出
[root@localhost redis-4.0.14]# redis-server redis.conf
[root@localhost redis-4.0.14]# redis-cli
127.0.0.1:6379> set 123 321
OK
127.0.0.1:6379> set 222 333
OK
127.0.0.1:6379> set 444 555
OK
127.0.0.1:6379> keys *
1) "444"
2) "123"
3) "222"
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> SHUTDOWN
not connected> QUIT


# 发现aof文件
[root@localhost redis-4.0.14]# ll
...
-rw-r--r--.  1 root root      134 6月  18 15:59 appendonly.aof	##aof文件产生
...

# 编辑aof文件将最后一行的FLUSHALL删除
# FLUSHALL 命令会被写入AOF文件中,导致数据恢复失败

# 最后重新登录redis可以发现数据还在
[root@localhost redis-4.0.14]# redis-server redis.conf
[root@localhost redis-4.0.14]# redis-cli
127.0.0.1:6379> keys *
1) "333"
2) "222"
3) "123"
127.0.0.1:6379>

# 校验aof文件的命令
[root@localhost redis-4.0.14]#  redis-check-aof --fix appendonly.aof
AOF analyzed: size=116, ok_up_to=116, diff=0
AOF is valid
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值