Redis——03
Redis 持久化策略
Redis 不仅仅是一个内存型数据库,还具备持久化能力。
这个持久化并不是 Redis 数据库读写的主要内容,跟 MySQL 不一样,这个持久化只是为了备份,防止服务器突然宕机或断电做数据恢复而准备的。
1. RDB
RDB 模式是 Redis 的默认模式,可以在指定的时间间隔内生成数据快照(snapshot),默认保存到 dump.rdb 文件中。一定保证在 Redis 在正常关闭前保存当前最后的数据快照,并且 redis 重启后会自动加载 dump.rdb 文件到内存中。
用户可以使用 SAVE(同步)或 BGSAVE (异步)手动保存数据。
也可以通过配置文件 snapshot 内容的 save 选项,让服务器每个一段时间自动执行依次 BGSAVE 命令,
可以通过 save 选项设置多个保存条件,但只要其中任意以一个条件被满足,服务器就会执行 BGSAVE 命令。
优点
RDB 是一个紧凑文件,直接使用就可以还原数据。
数据保存由一个子线程进行保存,不影响父线程。
恢复数据的效率要高于 AOF。
缺点
每次保存,如果 Redis 意外关闭,可能会导致数据丢失。
由于每次保存数据都要创建一个子线程,在数据量较大时可能会比较耗费性能。
2. AOF
AOF 默认是否关闭的,需要在配置文件中开启 AOF(appedonly)。Redis 允许 AOF 和 RDB 同时生效,通过同时存在,AOF 的恢复优先级高于 RDB(优先使用 AOF 的数据恢复)。
原理是,监听执行命令,每当执行了修改数据操作,直接同步到数据库的文件中(类似于日志或命令集)。然后恢复的时候就按照命令集的执行顺序依次进行,从而达到恢复数据的操作。
优点:
相对于 RDB 更加安全,每秒都会记录修改操作。
缺点:
恢复速度很慢。
持久化的文件也很大,随着修改数据操作增加,大小增加。
小结:
到此呢 Redis 的基本使用就完成了。
接下来就是学习 Redis 在软件架构中发挥的作用,以及自身功能的增强。
从 Redis 的数据安全、扩容、性能、高可用各个方面进行考量给出以下几个方向:
- 主从复制:安全
- 哨兵:高可用
- 集群:安全,性能,高可用...
Redis 主从复制
为了保证单一节点可用性,redis 支持主从复制功能,每个节点有 N 个复制品,其中一个是主(master),另外 N - 1 个是从(slave),也就是说 Redis 支持一主多从。
优点:
增加单一节点的健壮性,从而提升整个集群的稳定性。
从节点可以对主节点数据备份,提升容灾能力。
读写分离。主节点一般用作写(具备读能力),从节点只能读。
搭建主从模型:
1. 关闭 redis 服务
2. 备份 Redis 安装目录到一个文件夹(模型文件夹)
- 在模型文件夹中创建一个主备份:master --> redis-master
- 在模型文件夹中创建两个从备份:slave--> redis-s1、redis-s2
3. 修改三个 redis 的配置文件。
-
分配端口号
- 主:7001
- 从1:7002
- 从2:7003
-
设置两个从节点的
replicaof
配置replicaof <masterip>[主节点的ip地址] <masterport>[主节点的端口号]
eg:
4. 启动运行
先启动主再启动两个从,注意不能在同一个路径下同时启动多个,因为这会造成多个 redis 的 rdb 文件相互覆盖,造成错误。
可以写一个脚本运行:
startup.sh
# 启动主
cd redis-master
bin/redis-server redis.conf
# 启动从1
cd ../redis-s1
bin/redis-server redis.conf
# 启动从2
cd ../redis-s2
bin/redis-server redis.conf
给予 startup shell 脚本运行权限:chmod 755 startup.sh
启动运行:
可以看到 3 个 redis 都已经启动了。
5. 测试环境是否搭建成功
启动3个 xshell 命令界面:分别用 redis-cli 连接主节点和两个从节点(当前的主从复制在一个电脑上)
启动 redis 的客户端:(redis-cli 是可执行文件在那个节点启动都行)
bin/redis-cli -h localhost -p 7001
查看复制集信息:
info replication
可以看到此时是连接的主节点,在主节点插入一条数据:name="tom";age=18;sex="man"
看看会不会备份到从节点中:
bin/redis-cli -h localhost -p [7002|7003]
查看所有的 keys 发现有数据,此时如果在从节点插入数据时:
发现是没有权限的当前的是只读副本,无法写入。