redis 主从复制 集群 发展
2023-05-30 13:48:11 0 举报
redis入门到精通
作者其他创作
大纲/内容
RDB快照
redis
client
X
keys *get k1 get k2
Kernel
实际的内存
主从复制 RDB 命令: 1. REPLICAOF localhost:6379 (主从同步命令) 2. REPLICAOF NO ONE (脱离主从)相关配置 1. redis 2.8 之后支持的断点续传 RDB文件 会记录 replica- id 支持断点续传 AOF 不支持 每次同步都会全量写入 ######################### 主从同步 ########################## 主从同步配置。# 1) redis主从同步是异步的,但是可以配置在没有指定slave连接的情况下使master停止写入数据。# 2) 连接中断一定时间内,slave可以执行部分数据重新同步。# 3) 同步是自动的,slave可以自动重连且同步数据。# slaveof <masterip> <masterport># master连接密码# masterauth <master-password># 当一个slave失去和master的连接,或者同步正在进行中,slave的行为有两种可能:# 1) 如果 slave-serve-stale-data 设置为 \"yes\" (默认值),slave会继续响应客户端请求,可能是正常数据,也可能是还没获得值的空数据。# 2) 如果 slave-serve-stale-data 设置为 \"no\",slave会回复\"正在从master同步(SYNC with master in progress)\
read fd1
a3
REPLICAOF IP 端口号
异步可能失败
sharding分片
hash算法
index
异步
Client连接
redis 单机持久化
数值
select
redis 常见问题
从文件中批量插入数据http://www.redis.cn/topics/batch-insert.html
找到节点存储数据
-1
8x
fd 1
常用方法:lindex lsetlrange llenlrem 移除元素
弊端分布式下的扩展性会随着模数发生变化
c
字节位置
逻辑业务拆分
aof
无序性可去重
集合操作并集/交集
hash
单机/单节点/单实例存在问题:1.单点故障 2.容量有限问题 3.访问压力问题AKF 拆分原则:X轴:全量镜像Y轴:功能、业务划分不同的redisZ轴:优先级、逻辑在进行拆分
同步阻塞
常用方法:lpush -> rpoplpush -> lpop
clientrpop
Set
mapping0,1,2
list
4.0 以前
都给出强一致性 可以
mysql
mapping6,7,8
select 1000fds
弱一致性(数据丢失)异步非阻塞方式 数据可能写失败redis 主从使用模型
通过发布订阅发现其他哨兵
Socket nonblocking同步非阻塞IO如果有 1000个fd 代表用户进程轮询调用 1000次内核出现 成本问题
轮询操作发生在用户空间
SRAMDMEMBER key count正数:取出一个去重的结果集(不超过已有集)负数:取出一个可重复的结果集,一定满足结果数量要求0: 不反回任何结果
反向索引
存储层 1.快照/副本 2.日志2. 前置知识 1. linux 管道会触发创建【子进程】 2. linux 父子进程是相互隔离的,数据也是相互隔离的 3. export的环境变量, 子进程的修改不会破坏父进程, 父进程的修改也不会破坏子进程 通过 copy on write :内核机制:写时复制 创建子进程时并不发生复制而是复制了一个指针 减少IO操作及 内存的占用 fork() -> 速度快,占用的空间小
fd 2
redissorted_set
redis-server /path/to/sentinel.conf --sentinel
Hashmap (k-v)
MULTI
string
EXEC
消息队列ooxx:topic && partionkafaka
kafka可靠集群响应速度快
LVS
4.0 以后
89101112131415
数组:对索引操作
解决数据倾斜问题
缓存一致性问题(双写)
BGREWRITEAOF触发重写操作
proxy
数据一致性的取舍
数据无法拆分
2
read (fd)
redis冷启动
常用方法:lpush + brpoprpush + blpop
save 操作:阻塞状态适用时机:关机维护bgsave 操作:fork() 操作 子进程
删除抵消的命令合并重复的命令
Service
redis 持久化问题
取数据时产生不一致的数据
强一致性发生写操作时 所有节点阻塞直到数据全部一致
监控
SortedSet
失效模式
查找最近的物理节点位置
JVM c
redis3
哈希环
Socket blocking同步阻塞IO同一个时间点只能有一个线程在执行同步阻塞IO 运行效率降低 资源浪费
抢购,秒杀,详情页,点赞,评论等规避并发下对数据库的事物操作完全由redis内存操作
sub
0
最终一致性
file
epoll
keepalive
a
将老的数据RDB到aof 的文件中,将增量数据以指令的方式追加到 aof 文件中
线程/进程
适用场景:随机抽奖/点赞/
linux
弱一致性丢失数据
d
命令
sentinal哨兵模式
根据分值:物理内存:左小右大,不以命令而改变
缓存可以允许数据的不准确性
插入元素lpush:头插法rpush:尾插法
推导:1,统计不准确,不够势力范围问题:网络分区脑裂!2 在3个节点成功解决脑裂问题3 在4个节点成功解决脑力问题3 在5个节点成功解决脑力问题n/2+1 过半!使用奇数台!允许出现问题的机器最少
足够快同步阻塞
双写模式 先更新数据库 再更新缓存利弊:
栈:同向操作
redis单线程
read fd2
应用场景热搜排行榜:根据查询的数量实现 结果的自动排序 # 向 zset 中增加元素 zadd test 40 english 50 math 79 history #给 集合中 key 的某一元素增加值 zincrby test 60 english #查询集合中的所有元素 根据 得分从低到高 :同样存在正负索引 zrange test 0 -1 #根据得分 从高到低查询所有元素 并查询相关积分 ZREVRANGE test 0 -1 withscores
redis:6379单进程、单线程、单实例并发很多请求如何变得很快
1
kafakarabbitMqrocketMq
方案二
fd : 文件描述符
mapping3,4,5
client实现bloom算法自己承载bitmap
代表数值:abcd
配置文件中给出的关于 save 的 规则 1. 规则 save 3600 1 save 300 100 save 60 100002. rdb文件名 dbfilename dump.rdb3. 存储路径 dir. ./file/..
00000000
score
node2
client2
只能用作缓存,不能用做分布式数据库用
查找顺序
过期淘汰策略
缓存穿透
# 实现全年用户数据统计的功能 #sean 第一天 登陆(1:代表状态)setbit sean 1 1; setbit sean 7 1;setbit sean 364 1; strlen sean; #计算给定字符串中,被设置为 1 的比特位的数量bitcount -2 -1
Z
相关命令 1. 是否开启 aof 方式 appendonly no 2.aof 文件名 appendfilename \"appendonly.aof\" 3. aof 策略 appendfsync always appendfsync everysec appendfsync no4. 主动出发 aof 配置 # 设置重写的百分比 auto-aof-rewrite-percentage 100 # 设置重写的基准值 auto-aof-rewrite-min-size 64mb 5.混合模式 #AOF文件开头是RDB的格式,先加载RDB部分的内容,再加载剩余的AOF #AOF文件开头不是RDB的格式,直接加载整个AOF文件 #混合模式可以结合AOF和RDB的优点,能够快速加载的同时避免丢失过多的数据。 aof-use-rdb-preamble yes 6. aof 文件修复 redis-check-aof --fix file
port 26379sentinel monitor mymaster 127.0.0.1 6381 2
使用redis sortedSet存储最近的聊天记录数据模型zadd chat timeStamp 聊天记录
9w
node 的节点为真是存在的
跳表是如何实现的
type:表示 value的类型
双写模式
redis 中 rdb 和aop 可以同时启动
应用场景 1. 随机事件 ##向集合中添加员工 sadd employeers sean tom ly zm sm wh ##随机抽取员工信息并删除员工 spop employeers2. 抽奖 人少礼物多 使用 返回负数 ##向集合中添加员工 sadd employeers sean tom ly zm sm wh ##随机返回元素:返回元素中有重复元素 srandmember memeber -5 人多礼物少 使用 返回正数 ##向集合中添加员工 sadd employeers sean tom ly zm sm wh ##随机返回元素:返回元素无重复元素 srandmember memeber 10 3. 年会抽奖 每个人只能抽一次 ##向集合中添加员工 sadd employeers sean tom ly zm sm wh ##随机抽取员工信息并删除员工 spop employeers 1
RDBAOF
一致性hash 算法kemata(映射算法)key/node/data 参与运算
redisbloom.sobitmap
# 京东 618 送礼 备货数量( key 代表日期 位数代表用户id 值为是否登陆)setbit 20190101 1 1setbit 20190102 1 1setbit 20190102 7 1#bitop 进行或运算计算登陆用户数量且去重bitop or result 20190101 20190102#计算登陆用户bitcount result 0 -1
canal
3
保存其它节点的映射
需要人工切换
缓存雪崩:某一个时间段,缓存集中过期失效,Redis 宕机 常用解决方案 1. 业务层面做处理:零点延时 2. key 做随机过期时间处理 3. 强依赖缓存击穿方案 利弊: 数据库增加元素呢?
incr decr
redis 子进程
read fd1read fd2
虚拟节点
DBservice
配套视频可联系 vv 183 3478 8812
redis 单机单进程缓存数据库
AOF写操作记录到文件中
分布式锁
多路复用 NIOepoll(不负责数据的读写,只是管理读写的时间)mmap (一种内存映射文件的方法)
value
b
配置文件
无状态客户端请求不依赖服务端的信息,任何多次请求不需要必须访问到同一台服务服务端的集群和状态对客户端透明 =-服务端可以任意的迁移和伸缩 =-减小服务端存储压力
data/key
key value
aof 利弊 1. 丢失数据量少 2. 日志文件占有量大 3. 运行速度和恢复速度 都慢于 rdb 方式
ooxxlist
缓存击穿
动态代理只需关注代理层性能
字符串
主备:备机不参与访问只是作为备用机主从:从机也参与访问主机读写 :又出现单点故障问题对 主 做 HA 高可用
Y
orange
常识:磁盘: 1. 寻址:ms 2. 带宽:G/M 内存: 1. 寻址:ns 2. 带宽:很大 I/O buffer:成本 磁盘与磁道 扇区 一扇区 512Byte带来一个成本变大 4K操作系统,无论你读多少,都是最少4K从磁盘拿比较: 1.磁盘比内存在寻址上满了10W倍 2. 数据库 数据量很大 性能下降 1. 增删改变慢 查询速度? 1. 一个或少量的数据查询对性能没影响 2. 并发量很大的时候会受硬盘带宽影响速度
clientproxy算法预分区:0,1,2,3,4... 8
布隆过滤器
数据库出现:减少磁盘 I/O但数据库的数据量很大时 增删改的性能变慢
新增 node
分布式锁问题 1、加锁、解锁必须是原子操作 (lua 脚本 实现原子操作) 2、业务逻辑超时 锁的续期问题 3、只删除是自己加的 value 过期时间
管道PipleLineing
redis 作为数据和缓存的区别
redis 基本数据结构
常用方法:setgetmsetmget
缓存击穿:存在的数据失效了导致缓存击穿 常用解决方案 1. 热点key 数据不设置过期时间 2. 使用分布式锁 利弊: 数据库增加元素呢?
优点:增加节点可以分担压力不会造成全局洗牌缺点:新增节点造成一部分数据不会命中更倾向于作为缓存,而不是数据库
redisbitmap
client实现bloom算法
共享空间用户和内核的共享空间
7
对 server 端连接压力变大
redis1
\bLVS
value:值的编码类型1. 存在 三种编码类型: embstr /int /raw2. redis 存储为字节流 二进制安全,不会破坏编码集
折中方案出现部分数据迁移到缓存:memcached / redis
队列:异向操作
redis 聊天室架构
主从复制未解决容量问题redis-cluster:容量问题
消息发送
redis 进阶使用
主备
element
一致性哈希环
sortedSet 模型
-2
事务
redis 过期淘汰策略 1.最大内存设置 maxmemory <bytes> 2. 过期淘汰策略 # LRU means Least Recently Used (最近少使用) # LFU means Least Frequently Used (最不经常使用)淘汰机制 noeviction:当内存使用超过配置的时候会返回错误,不会驱逐任何键 allkeys-lru:加入键的时候,如果过限,首先通过LRU算法驱逐最久没有使用的键 volatile-lru:加入键的时候如果过限,首先从设置了过期时间的键集合中驱逐最久没有使用的键 allkeys-random:加入键的时候如果过限,从所有key随机删除 volatile-random:加入键的时候如果过限,从过期键的集合中随机驱逐 volatile-ttl:从配置了过期时间的键中驱逐马上就要过期的键 volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键 allkeys-lfu:从所有键中驱逐使用频率最少的键redis 定时 + 惰性删除算法实现:.java实现redis中key过期事件触发 ? https://spring.io/guides/gs/messaging-redis/ https://www.jianshu.com/p/c37ad337146f 三、Redis采用的过期策略惰性删除+定期删除 在进行get或setnx等操作时,先检查key是否过期,若过期,删除key,然后执行相应操作;若没过期,直接执行相应操作 定期删除流程(简单而言,对指定个数个库的每一个库随机删除小于等于指定个数个过期key) 遍历每个数据库(就是redis.conf中配置的\"database\"数量,默认为16) 检查当前库中的指定个数个key(默认是每个库检查20个key,注意相当于该循环执行20次,循环体时下边的描述) 如果当前库中没有一个key设置了过期时间,直接执行下一个库的遍历 随机获取一个设置了过期时间的key,检查该key是否过期,如果过期,删除key 判断定期删除操作是否已经达到指定时长,若已经达到,直接退出定期删除。 hz 10 ((即1秒执行10次,100ms一次,值越大说明刷新频率越快,最Redis性能损耗也越大))
AOF中包含RDB 全量,增量数据 以aof 方式追加到文件
分区容忍性
-4
一次性向redis 发送多条命令 提高执行效率
redis 事务 1. 事务在组队过程中出现语法错误,事务会直接取消 2.但如果是执行阶段某个命令出现了错误,则只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。使用 WATCH 实现 ZPOP (乐观锁)WATCH 可以用于创建 Redis 没有内置的原子操作。举个例子, 以下代码实现了原创的 ZPOP 命令, 它可以原子地弹出有序集合中分值(score)最小的元素:WATCH zsetelement = ZRANGE zset 0 0MULTIZREM zset elementEXEC程序只要重复执行这段代码, 直到 EXEC 的返回值不是nil-reply回复即可。
固定ip
利弊 1. 实时性,速度快,恢复速度快 2. 不支持拉链式 只有一个 dump.rdb 文件 3.丢失数据多:时点对时点之间的数据很容易丢失
三种模式不能用作数据库用预分区功能:redis 集群模式 无主模型redis-cluster:16384 个 hash槽位
zookeeper
第三方框架
set k1 acrdpm set k2 asjdpm
单机redis 锁
磁盘 I/O 瓶颈,读取文件缓慢
缓存雪崩
主从模型推导Redis使用默认的异步复制,其特点是低延迟和高性能
(1)如何让redis集群支撑几十万QPS高并发+99.99%高可用+TB级海量数据+企业级数据备份与恢复?:redis企业级集群架构(2)如何支撑高性能以及高并发到极致?同时给缓存架构最后的安全保护层?:(nginx+lua)+redis+ehcache的三级缓存架构(3)高并发场景下,如何解决数据库与缓存双写的时候数据不一致的情况?:企业级的完美的数据库+缓存双写一致性解决方案(4)如何解决大value缓存的全量更新效率低下问题?:缓存维度化拆分解决方案(5)如何将缓存命中率提升到极致?:双层nginx部署架构,以及lua脚本实现的一致性hash流量分发策略(6)如何解决高并发场景下,缓存重建时的分布式并发重建的冲突问题?:基于zookeeper分布式锁的缓存并发重建解决方案(7)如何解决高并发场景下,缓存冷启动MySQL瞬间被打死的问题?:基于storm实时统计热数据的分布式快速缓存预热解决方案(8)如何解决热点缓存导致单机器负载瞬间超高?:基于storm的实时热点发现,以及毫秒级的实时热点缓存负载均衡降级(9)如何解决分布式系统中的服务高可用问题?避免多层服务依赖因为少量故障导致系统崩溃?:基于hystrix的高可用缓存服务,资源隔离+限流+降级+熔断+超时控制(10)如何应用分布式系统中的高可用服务的高阶技术?:基于hystrix的容错+多级降级+手动降级+生产环境参数优化经验+可视化运维与监控s(11)如何解决恐怖的缓存雪崩问题?避免给公司带来巨大的经济损失?:独家的事前+事中+事后三层次完美解决方案(12)如何解决高并发场景下的缓存穿透问题?避免给MySQL带来过大的压力?:缓存穿透解决方案(13)如何解决高并发场景下的缓存失效问题?避免给redis集群带来过大的压力?:缓存失效解决方案
发布/订阅PUBLISH/SUBSCRIBE
01234567
有序性可重复
失效模式 先更新数据库 再删除缓存利弊:
应用场景商品详情页,对象缓存,购物车 等
方案一
bitmap
mmap
二进制位索引
apple
如果开启的AOF只会用AOF 恢复
redis2
hash算法crcfnvmd5(映射算法)
算法hash + 取模modula
pub
阻塞:单播队列FIFO
数据库数据不可以丢失
randomlpush
node1
最终一致性可能产生不一致的数据
物理内存左小右大(分值排序)不随命令发生变化zrangezrevrange
redis: fork(). 虚拟内存
AKF 一变多问题:数据一致性 !!!强一致性问题(同步问题)超时问题 破坏 redis 可用性1.通过异步方式 2.容忍数据丢失一部分
skip list跳表
key hash
代理层逻辑实现modularandomkemata
权重/聚合指令
多路复用 NIO用户态内核态fd相关数据考来考去mmap (一种内存映射文件的方法)
pear
集群red-lock
代理集群
-3
正向索引
client1
缺点:聚合操作很难实现解决方案hash tag:即把数据按照一定的规则放到同一个 hash 槽内 {符号}:将key打到同一个 redis 节点内
client 1
缓存穿透:查询不存在的数据 常用解决方案 1. 布隆过滤器(将有的元素做 bitmap 映射)/布谷鸟过滤器 2. guava / redisson 客户端已经实现布隆过滤器 3. 缓存 null 值利弊: 数据库增加元素呢?
vip
数据在磁盘和内存中体积不一样
常见实现twemproxypredixy(性能较高 推荐使用)codis(豌豆荚)
排序是怎么实现的增删改查的速度?
正反向索引
收藏
0 条评论
下一页