1、持久化Persistence:
- Persistence: Know your options when configuring Redis' durability.
- 两种方式:
- 快照Snapshotting:将某一时刻的所有内存数据存储到硬盘
- 通常rdb文件指的是快照文件(redis database)
- 只追加文件AOF:当执行【写命令】时,将写命令追加到硬盘。
- 两者的区别:
- 快照方式,两次备份间隔通常超过1分钟,所以存在,丢失大量数据的可能。
- AOF方式,必须考虑重写AOF
- 快照Snapshotting:将某一时刻的所有内存数据存储到硬盘
- 创建快照的方式:
- 客户端BGSAVE命令、SAVE命令
- BGSAVE是通过fork子进程实现BG创建快照。
- SAVE命令由当前主进程执行,阻塞所有命令。
- save配置选项:详细配置选项,参考redis.conf文件
- 同时满足两个条件,才会触发BGSAVE操作。例如save 60 1000
- 表示距上次备份超过60秒、并且有超过1000次写入时,触发。
- 可以配置多条。任意一条满足即可。
- 同时满足两个条件,才会触发BGSAVE操作。例如save 60 1000
- 当关闭服务器时,执行SAVE命令
- 主从复制时,主服务器执行BGSAVE
- 客户端BGSAVE命令、SAVE命令
- 正常情况下,都是BGSAVE操作。除非内存不足、关闭服务器
- 配置快照文件:
- dbfilename选项,指定快照文件名
- dir选项,指定快照文件目录
- AOF方式:
- 开启配置选项:appendonly yes
- 文件同步频率:appendfsync
- 推荐使用everysec。。。慎用always
- 文件写入硬盘操作,存在缓冲区机制。
- 重写AOF文件:
- 不断追加命令,会造成AOF文件体积过大问题
- BGREWRITEAOF命令,fork子进程执行重写
- 配置选项:
- 同时满足两个条件,才会触发重写:例如auto-aof-rewrite-percentage 100、auto-aof-rewrite-min-size 64mb
- aof文件超过上次重写之后的文件大小的100%,并且当前文件大小超过64mb
- 必须设置min-size,因为aof文件很小的时候,指定percentage没有意义。
- 同时满足两个条件,才会触发重写:例如auto-aof-rewrite-percentage 100、auto-aof-rewrite-min-size 64mb
2、复制Replication:
- Redis Cluster tutorial: a gentle introduction and setup guide to Redis Cluster.
- Replication: What you need to know in order to set up master-slave replication.
- 主从复制模式(master-slave replication)
- 主写,从读。初始副本,写入同步
- 读写请求的二八原则。
- 读写分离
- readonly slave:一旦服务器被设置成从服务器,则变成只读服务器,拒绝写请求。
- 单个redis实例(进程),顺序执行命令。。不存在多线程并发执行。
- 一个redis进程,叫做redis实例,也叫做redis节点(node)
- 复制跟从操作:即将当前服务器设置为另一台服务器的从服务器
- 开启服务器复制跟从,两种:
- 配置选项slaveof host port
- 如果服务器不是以slaveof从服务器的形式启动的。默认会从快照文件初始化内存数据集。所以快照文件,类似于数据库备份文件。
- 命令SLAVEOF host port
- 配置选项slaveof host port
- 停止服务器复制跟从:命令SLAVEOF NO ONE
- 复制过程:
- 初始副本:
- 从服务器发送SYNC命令、根据配置选项选择是否拒绝读请求
- 主服务器执行BGSAVE操作、缓冲区接收后续命令
- 主服务器发送快照文件,随后发送缓冲区命令
- 从服务器丢弃旧数据(注意),解析收到的文件/命令,构建数据集
- 写入同步:
- 初始化之后,主服务器会将每条写入命令发送给从服务器——类似AOF,发送的是写命令
- 初始副本:
- 多个从服务器复制时:
- 以主服务器执行BGSAVE操作为界,之前连接的从服务器,会使用相同的【快照文件】/【缓冲区命令】
- 之后连接的从服务器,则要等到下次复制过程。
- 以主服务器执行BGSAVE操作为界,之前连接的从服务器,会使用相同的【快照文件】/【缓冲区命令】
- 主从链:
- 从服务器也可以被其他服务器复制跟从
- 主从复制时,当从服务器删除旧数据解析快照时,会断开跟从它的所有从服务器的连接,触发其resync重新同步
- redis多节点(node)分担主服务器复制工作
- 使用slaveof配置选项/SLAVEOF命令,建立树状主从链
- 从服务器也可以被其他服务器复制跟从
3、在一台机器上启动多个redis实例:
- 拷贝单独的一份redis.conf。。
- 修改必要的配置项:
- pidfile、port、dbfilename、logfile
- 最佳实践:
- 端口,在默认6379之上递增即可。
- 文件的话,以端口为后缀,在原来目录即可。如redis6380.conf
- 启动实例:redis-server confFile
4、验证快照文件、AOF文件:
- check验证文件是否损坏:
- REDIS_HOME/src目录下提供的命令行程序:redis-check-aof、redis-check-rdb
- CRC64 checksum校验和??
- fix修复文件:
- redis-check-aof --fix修复aof文件。将出错的写命令及其随后的所有命令删除。
- 快照文件(rdb)无法修复。。
1、redis集群故障转移Failover:
- Redis Sentinel 工具,监视一系列Redis实例。并提供【自动故障转移Failover】
2、Redis性能优化:
- Memory optimization: Understand how Redis uses RAM and learn some tricks to use less of it.
- Redis附带的性能测试程序redis-benchmark
- 可以模拟指定数目的客户端,统计出常用命令每秒的执行次数
- 常用形式:redis-benchmark -q -c 1
- 其中q(quiet)表示简化输出格式。c(clients)表示模拟访问的客户端数目
- 详细用法,见命令参考
- 实际性能比对redis-benchmark的测试结果,可以判断是否存在性能问题:
- 单个客户端,50%~60%——不使用流水线的正常预期性能
- 单个客户端,25%~30%或者返回错误Cannot assign requested address——问题:每个命令都开启了新的连接
- 连接池模式,解决连接重用的性能问题:由Redis客户端提供实现。
3、常见提高性能的途经:
- 使用合适的redis结构
- 大体积数据压缩后放入redis
- 流水线,提高IO性能
- redis连接池
4、扩展读性能:
- 利用从服务器扩展读性能
- 默认情况下,从服务器只读。但是可以配置选项调整。
- 利用树状复制中间层,减少主服务器的复制负载
- 利用SSH,提供【复制】过程中的加密压缩,提升安全减少IO
- 注意开启ssh的断线重连
- 推荐最高开启5级压缩。可以兼顾压缩比和压缩时间上
- 如果带宽够用,应该使用1级压缩
- redis Sentinel(哨兵)
- 是运行在特殊模式下的redis-server
- 会监视一系列主服务器及其主从链上的服务器
- 对主服务器提供故障转移,过程:
- 一个主服务器下线,监视它的所有Sentinel经过一定计算,选出一个Sentinel,并选出一个从服务器作为新的主服务器
- 被选出的Sentinel,迁移其他从服务器(即SLAVE OF新的主服务器,调整构建新的主从链)
5、
了解单台服务器的吞吐量很重要,根据实际负载量的波峰波谷,计算需要部署多少台服务器应对。