存储-redis
2021-12-24 09:25:15 0 举报
redis简介
作者其他创作
大纲/内容
数据结构
string
SET lock_key random_value NX PX 5000
list
blpop 阻塞弹出
set
sortedSet
延时队列,score为毫秒数
map
常用命令
慢日志
config get/set slowlog-log-slower-than 10000 执行时间大于多少微秒的记录
config get/set slowlog-max-len 128储存多少条慢查询的记录
slowlog get N 获取慢日志
dbsize当前数据库的key的数量
time ,显示服务器时间 , 时间戳(秒), 微秒数
Showdown [save/nosave] 关闭
INFO 查看Replication/CPU
/Memory/server/clients/stats
/Persistence/Cluster
/Memory/server/clients/stats
/Persistence/Cluster
human开头:以可读格式返回
used_memory: Redis分配的内存总量
used_memory_rss:从系统角度,显示Redis进程占用的物理内存总量
used_memory_peak:内存使用的最大值
total_system_memory:系统总内存
used_memory_lua:Lua进程使用内存
mem_fragmentation_ratio:内存碎片率,
等价于(used_memory_rss /used_memory)
等价于(used_memory_rss /used_memory)
如何产生
碎片率的意义
碎片率大解决
config get/set 获取设置文件参数
子主题
publish发布
Subscribe订阅
事务
watch unwatch 监控及取消
multi 开启
exec 提交
discard 回滚
randomkey 返回随机key
type 存储的值的类型
ttl 查询生命周期
expire 设置生命周期,以秒为单位
persist 置为永久有效
keys pattern 查询相应的key
eval 执行lua
内存组成
对象内存
Value对象
Key对象
缓冲内存
复制积压缓冲区
AOF缓冲区
客户端缓冲
普通客户端的连接
从客服端链接
订阅客户端
自身进程内存
不由jemalloc分配,不计在used_memory
内存碎片
Redis默认的内存分配器是jemalloc,删除数据后会被redis截留
原因
频繁更新
大量过期键删除
方案
减小内存碎片
尽量数据对齐
redis4.0以上手动回收内存碎片
子进程内存消耗
指AOF/RDB重写时Redis创建的子进程内存消耗
虚拟内存
超出物理内存时:数据在内存与磁盘换入换出的一个持久化策略,管理成本高
内存回收策略
惰性删除
定期删除
定时任务删除
内存溢出的控制策略
volatile-lru
allkeys-lru
volatile-random
allkeys-random
volatile-ttl
noeviction
持久化
快照
bgsave 子进程生成快照
save 生成快照
stop-writes-on-bgsave-error 后台备份进程出错时,主进程停不停止写入
rdbcompression 导出的rdb文件是否压缩
Rdbchecksum 导入rbd恢复时数据时,要不要检验rdb的完整性
dbfilename 导出来的rdb文件名
dir ./ 放置路径
AOF
BGREWRITEAOF 后台进程重写AOF
appendonly no/yes 打开关闭aof功能
auto-aof-rewrite-percentage 文件大小比起上次重写时的大小,增长率X%时,重写
auto-aof-rewrite-min-size 64mb 至少超过64M时,重写
参数
maxmemory
config set maxmemory 8GB 设置最大内存
开快照,设置45%,否95%
maxmemory-policy过期策略 noeviction
主从复制??
命令
slaveof no one 不做从改为主
slaveof IP port 指为IP的从
过程
slave发送一个 PSYNC命令给 master
初次连接到 master会触发一次 full resynchronization 全量复制
RDB生成完毕后, master将这RDB 发送给 slave,slave 会先写入本地磁盘,然后再从本地磁盘加载到内存中。
master将内存中缓存的写命令发送到 slave,slave 也会同步这些数据。
slave跟master有网络故障,断开了连接,会自动重连,连接之后 master仅复制给 slave部分缺少的数据。
内存缓冲区(in-memory backlog)
复制偏移量(replication offset)和master run id ,
master run id系统且偏移量在内存缓冲区有效
Redis从2.8.18版本开始尝试支持无磁盘的复制
sentinel
功能
集群监控
消息通知
故障转移
配置中心
工作机制
每个哨兵节点每隔10s会向Master发送info replication命令,获取最新拓扑
每个哨兵每隔1s会向集群中的Master和各个Slave节点发送心跳,判断节点是否存活
每个哨兵每隔2s会向Redis中的指定频道发布其对Master节点的判断,同时每个哨兵会订阅该频道
投票,发现Master节点故障后,且超过指定数量,哨兵充当Leader进行故障转移
选举,挑选其中一个存活的Slave节点断开与Master节点的连接,并使其成为新的Master节点
然后将其他Slave节点与该新的Master节点建立联系
最后修改各个节点的redis.conf配置文件,更新主从映射关系
参数配置
redis-server.exe sentinel.conf --sentinel 启动
sentinel monitor mymaster 127.0.0.1 6379 2
当2个sentinel实例都认为master失效时,正式失效
当2个sentinel实例都认为master失效时,正式失效
sentinel down-after-milliseconds mymaster 30000
多少毫秒后连接不到master认为断开
多少毫秒后连接不到master认为断开
sentinel can-failover mymaster yes
是否允许sentinel修改slave->master. 如为no,则只能监控,无权修改
是否允许sentinel修改slave->master. 如为no,则只能监控,无权修改
entinel parallel-syncs mymaster 1
一次性修改几个slave指向新的new master
一次性修改几个slave指向新的new master
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh
重新配置new master,new slave过程,可以触发的脚本
重新配置new master,new slave过程,可以触发的脚本
主动切换过程
Redis Cluster
设计
采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。
图示
内部使用二进制协议优化传输速度和带宽
节点的fail是通过集群中超过半数的节点检测失效时才生效
客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点
cluster把所有的物理节点映射到16384个slot上,维护node<->slot<->value。
key放在CRC16(key) % 16384槽对应的机器上
Gossip 协议
核心功能
主从复制
哨兵模式
分片分区
配置
./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002
创建cluster:主,从(1个副本),主分的槽,主从关系。
创建cluster:主,从(1个副本),主分的槽,主从关系。
./redis-trib.rb check 127.0.0.1:7002
检测cluster状态
检测cluster状态
分布式寻址算法
hash 算法(扩减会大量缓存重建)
一致性 hash 算法(自动缓存迁移)+
虚拟节点(自动负载均衡)
虚拟节点(自动负载均衡)
1 对2的32次方取模,从小到大首位相连形成虚拟圆环
2 对服务器的IP或主机名进行哈希,定位在环中位置。
每个服务器节点顺时针到下个节点,则为该机器的数据范围。
每个服务器节点顺时针到下个节点,则为该机器的数据范围。
3 对数据key哈希,定位在哪台服务器。
减少增加节点,只对变更节点到下个节点产生影响。
数据倾斜问题(服务器数据分布不均)
1 各个服务增加虚机节点。
如:每个服务器名增加10个序号
如:每个服务器名增加10个序号
2 对虚拟节点哈希后定位位置
3 数据哈希找到虚拟节点
再由虚拟节点找到实际服务器ip。
再由虚拟节点找到实际服务器ip。
redis cluster 的 hash slot 算法
一共有2^14(16384)个槽
集群用CRC16(key) %16384 来计算属于哪个槽
每个服务节点负责哈希槽的一个子集
0 条评论
下一页