备份
rdb数据快照,内存数据记录到磁盘,故障重启磁盘读取文件 恢复数据
save主进程进行save阻塞其他命令
bgsave fork子进程rdb不影响其他的
fork主进程得到子进程 共享主进程内存数据 fork读取内存数据写入rdb文件
当主进程执行写操作时 拷贝一份数据 执行写操作 copy-on-write
文件有压缩,体积小 恢复快 占用资源大 cpu和内存 丢失数据的风险
aof 记录每一次命令,默认关闭 redis.conf appendonly yes
频率 appendsync always/everysec/no
bgrewriteaof 整理命令 文件体积大 数据完整性高;恢复速度慢 重写会占用大量cpu和内存资源
主从
第一次全量同比
版本信息 ------> bgsave ------> 完整数据生成rdb文件
后续命令记录缓存区repl_baklog 逐步发送给slave命令
replication Id数据集标记 id一致说明同一数据集 master唯一然后slave继承
offset偏移量 repl_baklog 中数据增大 slave完成同步记录当前offset
slave重启后 增量同步
优化
repl-diskless-sync yes无磁盘复制 通过网络直接同步 避免全量同步;磁盘慢网络快
单节点内存占用不要太大,减少rdb过多磁盘io
提高repl_baklog大小 ,尽快故障恢复 避免全量同步
限制master上slave节点数量,太多slave 可采用主从从链式结构 建构master压力
哨兵sentinel
监控:检查master slave是否正常工作 发送ping命令
自动故障恢复:重新选主
选主:
判断slave与master断开时间长短,超过指定时间down-after-milliseconds*10会排除slave节点
判断slave节点的slave-priority值,越小优先级越高,0不参与选举,一样则offset值越大数据越新优先级越高
slave节点运行id大小,越小优先级越高
故障转移:
sentinel 通知备选master执行slaveof no one ,其他的
模式:readFrom
master主节点读取, master_preferred优先从master读取然后才读取replica
replica从slave读取,replica_preferred 优先从slave读取 所有slave不可用才读取master
分片集群*莱熙
搭建分片集群
多个master各保存自己的数据 海量数据存储 高并发写
master通过ping检测彼此健康状态,客户端访问任意节点
散裂插槽:每一个master映射到0-16383 数据key与插槽绑定 据key有效部分CRC16计算插槽值
key含{} 且至少1个字符,{}的部分是有效部分
key中不含{} 整个key都是有效部分
CRC16得到hash值,然后对16384取余 = slot值
集群伸缩
添加节点 redis-cli --cluster add-node ip:port 集群中存在的ip:port
redis-cli --cluster reshard 集群中存在的ip:port //重新分片
故障转移 redis-cli当前节点执行cluster failover
3 是数据同步;
failover模式:
缺省 默认流程如上图
force省略对offset一致性校验
takeover直接执行第五步忽略一致性/master状态/其他master意见
redisTemplate:lettuce
多级缓存
浏览器客户端缓存 nginx本地缓存 redis tomcat进程缓存 mysql
caffeine java8
lua:c openResty处理nginx逻辑
nil 无效值 false boolean number数值 string字符串 function函数 table关联数组
openResty 处理nginx逻辑,调用redis等
查询tomcat
封装http查询函数
tomcat 集群 负载均衡 进程缓存间不共享
upstream
nginx负载均衡:轮询 hash 权重
canal数据同步
mysql等slave节点,监听binlog
健值设计
key 业务名:数据名:id 长度<44字节 不含特殊字符
避免bigkey:key大小 成员数量综合判定
单个key的value<10kb 集合类型key 元素数量<100
少量qps导致带宽使用率被占满 ;运算耗时久 cpu压力序列化
redis-cli --bigkeys 遍历所有key返回整体统计信息和top1的bigkey
scan扫描key strlen hlen等判断key长度 不推荐memory usage占用cpu
三方工具redis-rdb-tools分析rdb快照文件
监控redis网络数据,报警
拆分存储 / 删除(异步删 4.0后unlink命令异步删除 3前拆分删)
恰当的数据类型
对象:
json对象 简单粗暴 但数据耦合
字符串打散 依次存储 占空间大 统一处理困难
hash ziplist压缩 中间占用少 灵活访问 ,代码相对复杂
entry>500 哈希表不是ziplist 内存占用多
hash-mx-ziplist-entries配置entry上限,但是entry多导致bigkey 最好<1000zf
字符串会有原数据等信息 占用无谓的空间 推荐使用hash set sortedset等
批处理优化
pipeLine 不具备原子性
redis存储key先计算slot,同一批key所在slot等节点不一样报错,使用spring封装等template
服务端优化
关闭rdb持久化功能 使用aof持久化 在slave定期手动rdb作为备份
合理的rewrite阈值 避免频繁bgrewrite
配置no-appendfsync-on-rewrite=yes 禁止在rewrite期间被aof 避免阻塞
redis实例物理机预留足够内存,给fork rewrite预留
单个redis实例内存上限不要太大 4/8g 加快fork速度 减少主从同步 数据迁移压力
不要与cpu密集型应用部署在一起
不要高硬盘负载应用部署 数据库 消息队列
慢查询
超过slowlog-log-slower-than阈值的命令 建议1000,入队列排队执行 微妙
日志长度slowlog-max-len慢查询日志 队列的长度 128 建议1000
安全:
设置密码 / 禁用keys flushall flushdb config set(rename-command重命名)
bing限制网卡 禁止外网访问
开防火墙 不使用root账户启动redis 不使用默认端口
内存配置
内存不足 key频繁被删 响应时间变长 qps不稳定
数据内存:redis主要部分(bigkey 碎片 重启)
进程内存:代码 常量池
缓存区内存:客户端 aof 复制 波动比较大
复制缓冲区:主从复制repl_backlog_buf 如果太小可能导致频繁全量复制,影响性能 repl_backlog_size来设置,默认1mb
aof缓冲区:aof刷盘前缓存区域,aof执行rewrite缓存区 无法设置上限
客户端缓冲区:输入 输出 最大1g 不能设置 输出缓冲区可以设置
info memory
集群配置
默认配置,一个插槽不可用 整个集群停止对外服务 数据一致性
建议 cluster-require-full-coverage no
集群节点不断的ping确定其他节点状态,ping携带信息插槽信息/集群状态信息
集群中节点越多 状态信息数据量越大 :
避免大集群 节点数量不要太多 <1000 多个集群
避免单个物理机运行太多redis实例
配置合适的cluster-node-timeout值