Redis学习笔记(4)-持久化、主从配置、哨兵、集群配置
持久化
快照方式
什么是快照方式?
Redis会根据配置规则将内存中的数据复制一份,存储在硬盘上。
如何使用快照方式?
方式一:根据配置进行快照
配置说明:save S N
S:seconds 秒数
N:number 键个数
例子:save 60 20 当60秒内改动的键数大于20时,进行快照。
可以配置多行save配置,多个配置可同时生效。
配置执行快照采用的是异步策略,在执行的过程中不会阻塞客户端请求。
方式二:根据命令执行快照
客户端命令:save和besave
当输入这两个命令时,redis会执行快照。
区别:save配置会阻塞所有客户端请求,besave不会阻塞,所以生产环境还是得用besave。
客户端命令:lastsave
当输入lastsave命令时,会返回最近一次执行快照的时间戳,用于查看快照是否执行完成。
客户端命令:flushall
当执行flushall命令时,redis会清空所有数据,但是清空前会执行快照。
但是,只有存在save配置的情况下才会执行快照。
方式三:执行主从复制时
主从复制初始化时,主数据库会执行一次快照并向从数据库传递当前的快照文件。
其他信息
- 存储的位置默认为Redis当前工作目录的dump.rdb文件中。
- 可以通过配置dir(路径)与dbfilename(文件名)两个参数来配置快照的文件的路径与文件名。
- 一个数据库只有一份rdb文件,当在快照执行过程中是不会修改RDB文件的,当快照结束后,才会替换老的rdb文件,也就是说,任何时候rdb文件都是完整的。
- 数据恢复时发生在redis重新启动时。
命令记录方式
什么是命令记录方式?
- 命令记录方式是将会改变Redis数据的命令实时记录到硬盘中。
- 好处是最大限度的降低redis意外终止导致的数据损失。
- 坏处是此种方式会降低redis性能。
如何使用命令记录方式?
方式:根据配置开启记录
配置参数:appendonly yes
配置后,启动redis,redis就会打开命令记录方式实现持久化功能。
配置参数:appendfsync everysec
配置后,redis才会每秒将命令写入到文件中,否则将由于系统限制,每30秒执行一次写入。
其他信息
- 默认Redis没有开启此方式。
- 存储的位置默认为Redis当前工作目录的appendonly .aof文件中。
- 可以通过配置dir(路径)与appendfilename(文件名)两个参数来配置快照的文件的路径与文件名。
- Redis会自动优化aof文件(优化冗余命令),可以通过配置参数配置优化策略: auto-aof-rewrite-percentage
100(当前AOF文件大小超过上一次重写的AOF文件大小的百分之多少才会重写) auto-aof-rewrite-min-size
64mb(允许重写的最小AOF文件大小)。 - 也可以通过BGREWRITEAOF命令手动执行重写。
- 数据恢复时发生在redis重新启动时。
主从复制
主从复制介绍
- 主数据库:能读能写,可有多个从库。
- 从数据库:默认配置只能读不能写,只能有一个主库。
如何配置主从复制?
配置参数:slaveof 主库IP地址 主库端口
在从数据库配置中加入此参数,即可配置主从复制。
具体操作:
- 打开主数据库
- 从数据库配置文件中加入slave of参数
- 打开从数据库
成功信息
配置成功后启动显示
主端使用info replication显示
从端使用info replication显示
其他信息
- 进入相应的数据库后可以用info replication命令查看节点主从信息。
- 从库配置了主库后启动时,主库会生成快照并缓存生成快照期间的所有写命令,当快照生成完毕后,主库会把快照和缓存起来的写命令一起发给从库,从库拿到数据后进行初始化,初始化结束后,主库每次接到写的命令都会同步到从库。
- 当主从库断线重连后,会重新执行从库初始化过程保证数据同步。
- 主从数据库可以做读(从)写(主)分离提高数据库性能。
- 为了提高性能,可以设置从库启用持久化,主库禁用持久化,这样做也符合哨兵的机制。
哨兵
什么是哨兵?
- 哨兵的作用就是监视主从库
- 并且当主库出问题时将从库转成主库。
- 当崩溃的主库恢复时,将此库变为现有在的主库的从库。
- 哨兵之间也会相互监控运行情况。
如何配置哨兵?
- 建立起主从数据库
- 在想要建立哨兵的物理节点上单独建立一个sentinel.conf配置文件
- 登录此物理节点并执行命令启动哨兵:redis-sentinel 配置文件路径
成功结果显示
其他信息
- 配置文件内容为:sentinel monitor 哨兵名称(自定义,唯一) 主库IP地址 主库端口号 哨兵节点同意数(整数)
- 哨兵节点同意数:多个哨兵监控一个主库时,当主库崩溃,只有当此数以上的哨兵都检测到奔溃,才会启动哨兵的主从切换。
- 配置文件只需要配置主数据库信息,哨兵会自动发现从数据库。
哨兵部署参考方案
- 每个物理节点都部署一个哨兵,不论是主库还是从库。
- 设置哨兵节点同意数为:N/2+1,N为哨兵节点数量。
集群配置(水平切分)
为什么要使用集群配置?
当使用主从时,每个库都有着全部的数据,这样的话,最大的存储空间受限于最小内存的机器,因此,将数据水平的放在不同的物理节点上,可以解决以上问题。
如何配置水平切分?
- 每个集群至少需要三个主库
- 配置每个库的cluster-enable yes
- 启动每个库
- 使用info cluster查看当前节点是否成功打开了集群配置,cluster-enable:1表示打开成功,但此时只是打开了集群配置,并没有加入集群。
- 使用redis-trib.rb插件初始化集群。
其他信息
- 当节点加入集群后,实现数据水平切分的方式是为需要成为主库的节点分配插槽(slot)。
- 插槽:redis以算法将所有可能的键值换算为0-16384的整数,这分配出来的键值就是插槽。
如何使用redis-trib.rb插件初始化?
客户端命令
redis-trib.rb create –replicas N 节点IP:节点端口 节点IP:节点端口 节点IP:节点端口
N:每个主数据库拥有的从数据库的个数
节点部分的组成格式:如果N为1,就是主从,N为2就是主从从。
初始化所做的事情
- 查看每个节点是否运行正常,是否打开了集群配置。
- 将每个节点加入集群。
- 分配插槽
- 分配主从数据节点。
- 使用cluster slots查看插槽分配情况。
如何使用redis-trib.rb插件重新分配插槽?
如果插槽被分配过,需要重新移动节点,并且不影响已有数据。
此情况适用于集群运行过程中新增节点或删除节点等操作。
具体操作
- 配置新增库的cluster-enable yes
- 启动新增的每个库
- 使用节点命令redis-trib.rb reshard 节点IP:节点端口,节点可以是集群中任意一个节点,脚本会自动获取整个集群信息。
- 程序寻要你需要移动多少个插槽。输入你想移动的插槽个数。
- 程序寻要目的地节点ID,使用cluster nodes命令可以得到节点ID,并输入ID。
- 程序寻要移出插槽的节点ID,输入ID。
- 使用cluster slots查看插槽分配情况。