redis持久化与架构搭建

记录一下学习笔记。
redis作为一个内存数据库,读写数据非常高效,能够搭建非常好的高可用架构,虽然是内存数据库,但是也提供了不错的持久化方式。

redis支持的持久化方式:

  • RDB快照方式(二进制的方式存储)
  • AOF方式(命令的方式存储,resp协议)
  • 混合方式(rdb+aof的方式)

RDB持久化方式

在redis目录下,有个dump.rdb文件,redis在持久化过程中,会将数据以二进制的方式写进dump.rdb文件。
redis.conf是redis最重要的配置文件,所有配置信息包括集群都在该配置文件中,在redis.conf中有一段配置是
设置RDB持久化策略的:
持久化策略
比如 “save 900 1” 表示900s内至少有一条数据的改动,则进行持久化操作。
持久化不一定要redis来做,也可以手动执行,持久化命令方式有两种:bgsave和save命令,
通过执行该两种命令就可以将数据持久化到新的rdb文件,并且覆盖原有rdb文件中。
redis是使用了bgsave命令持久化的。

bgsave的写时复制:

该命令使用了操作系统的写时复制技术,当命令执行时,主线程会fork一个子线程出来,让该子线程读取主线程的数据,然后将数据进行持久化操作,主线程和子线程互不干扰。当主线程有写操作时,会将被写数据复制一个副本出来,fork子线程会将副本数据进行持久化,主线程仍然可以继续写数据。

save 与 bgsave命令的对比:

save bgsave
同步IO 一部IO
会阻塞其他命令 否(在生成子进程执行调用fork函数时会有短暂阻塞)
不会有额外内存开销 需要fork子进程,有额外开销

AOF(append-only file)持久化方式

在进行持久化操作时,会将每一条命令记录到appendonly.aof文件中,可通过redis.conf设置appendonly yes来开启,如下:

# Please check http://redis.io/topics/persistence for more information.

appendonly yes

# The name of the append only file (default: "appendonly.aof")

appendfilename "appendonly.aof"

设置完重启服务,执行几条命令,可以看到aof文件保存的数据格式如下:

127.0.0.1:6291> set appendonly mode
OK
127.0.0.1:6291> set way 5
OK
127.0.0.1:6291> exit
[root@iZwz9a3e04j4x7s9jarg1iZ redis-6.0.9]# cat appendonly.aof 
*2
$6
SELECT
$1
0
*3  # *3表示执行的命令个数是3个
$3  # $3表示当前set命令字符长度是3
set
$10 # $10表示当前命令参数appendonly的字符长度是10
appendonly
$4
mode
*3
$3
set
$3
way
$1
5

这是一种resp协议格式数据,在做数据恢复时,只需要将该文件命令重新执行一遍就行了。
可通过配置实现redis fsync刷新数据的频率,可看如下redis.conf配置信息:

# If unsure, use "everysec".

# appendfsync always # 每更新一条数据就fsync到磁盘,性能并不好,但是数据安全,宕机了最多就只丢失一条数据
appendfsync everysec # 默认开启,每秒刷新一次数据到磁盘
# appendfsync no # 把主动权交给操作系统,会更快,不确定性也更高

AOF还有一个重写机制,我们每写一条数据都会被记录,有可能是一条记录经过几条命令修改,这是一条命令就可以达到的效果,AOF机制会根据内存的最新数据重新生成命令更新aof文件。
来看一段redis.conf配置信息:

# Specify a percentage of zero in order to disable the automatic AOF
# rewrite feature.
# 这个是百分比,当文件大小再次增长100%时,将再次触发重写机制
auto-aof-rewrite-percentage 100 
# 当文件大小为64mb时,进行文件重写,如果设置内存太小,则没必要重写,文件小则重启快。
auto-aof-rewrite-min-size 64mb

可根据情况进行设置。
也可以进行手动重写,执行bgrewriteaof命令,类似bgsave命令,会fork一个子线程进行重写。

redis4.0 混合持久化

因为RDB方式不太安全,容易丢失数据,而AOP方式恢复数据速度不够快,所以结合两种方式:
在进行持久化过程中,会将内存中的数据以rdb方式保存在新aof文件中,然后将该aof文件覆盖掉appendonly.aof文件。新加进来的数据会以resp协议的方式追加到aof文件中,也就是aof文件中以两种格式的数据保存着。
混合持久化配置信息(因为是aof文件,所以必须先开启AOF方式):

# When loading, Redis recognizes that the AOF file starts with the "REDIS"
# string and loads the prefixed RDB file, then continues loading the AOF
# tail.
aof-use-rdb-preamble yes

redis提供的架构方式:

  • 单体架构:主从架构
  • 群体架构:哨兵集群和cluster集群
主从架构

如果我们只启动了一个redis服务,当redis进程宕掉了之后,我们的缓存数据就不能用了,这是很严重的问题,所有访问都打到数据库上,可能会把数据库打挂了,所以需要加强架构,可以加多一个或多个redis实例,当正在使用的实例挂掉了,另一个可以顶上去,这是属于单机体系的架构,保证我们的单机系统可用性,也可以实现读写分离,主写从读,这是我们常见的主从架构。

最简单的主从架构:只有一个从节点,从主节点中备份数据,当主节点挂掉时顶上。
最简单的主从架构
并不是从节点越多就越好,每个从节点都要备份主节点的数据,从节点越多,主节点的压力就越大,这样可以考虑一下结构:
主从架构

搭建主从架构

redis搭建主从架构很简单的,修改下redis.conf配置,启动主从节点就ok了,步骤如下:
假设条件:服务器已经有redis包
1、复制一份redis.conf文件,目录随意
2、单机情况下修改端口号

# Accept connections on the specified port,default is 6379 (IANA #815344)
# If port 0 is specified Redis will not listen on a TCP socket.
port 6230 # 修改自己想要的

3、修改pid配置文件,可自己指定pid

# Creating a pid file is best effort: if Redis is not able to create it
# nothing bad happens, the server will start and run normally.
pidfile /var/run/redis_6230.pid

4、配置log文件

# output for logging but daemonize, logs will be sent to /dev/null
logfile "6230.log"

5、指定数据目录,默认当前目录

# Note that you must specify a directory here, not a file name.
dir /user/software/redis/redis-6230/data

6、注释掉bind

#bind 127.0.0.1

7、配置主从

 replicaof <masterip> <masterport>

8、如果master有配置密码的话,则要配置slave的配置

# If the master is password protected (using the "requirepass" configuration
# directive below) it is po
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值