个人博客:www.hellocode.top
Java知识导航:Java-Navigate
⭐想获得更好的阅读体验请前往Java-Navigate
本文专栏:《流行框架》
如没有JavaWEB基础,请先前往《Java Web从入门到实战》专栏学习相应知识
⚡如有问题,欢迎指正,一起学习~~
Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态
过期的数据真的删除了吗?
不会被立即删除,会根据对应的数据删除策略进行过期数据的删除
假如同时有大量数据过期,如果立即删除,将会占用CPU性能,影响用户的set和get操作,所以一般来说过期数据并不会立即删除
时效性数据的存储结构
在对redis中数据设置过期时间后,会在expires域中存储对应数据的内存地址和过期时间(以hash结构进行存储)
也就是说,进行过期设置后,和数据本身并没有直接关联
数据删除策略的目标
在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成整体redis性能的下降,甚至引发服务器宕机或内存泄漏
定时删除
惰性删除
定期删除(折中方案)
Redis启动服务器初始化时,读取配置server.hz的值,默认为10
每秒钟执行server.hz次以下方法
serverCron()----->databasesCron----->activeExpireCycle()
activeExpireCycle()
对每个expires[*]逐一进行检测,每次执行250ms/server.hz(CPU性能的1/4)
对某个expires[*]检测时,随机挑选W个key进行检测
key的数量>W*25%
,循环该过程key数量<=W*25%
,检查下一个expires[*],0-15循环参数current_db用于记录activeExpireCycle()
进入哪个expires[*]执行
如果activeExpireCycle()
执行时间到期,下次从currrent_db继续向下执行
当新数据进入redis时,如果内存不足怎么办?
freeMemoryIfNeeded()
检测内存是否充足。如果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。清理数据的策略称为数据淘汰策略或逐出算法。(error) OOM command not allowed when used memory > 'maxmemory'
影响数据淘汰的相关配置
maxmemory ?mb
maxmemory-samples count
maxmemory-policy poicy
选择策略
maxmemory-policy volatile-lru
数据逐出策略配置依据
连接redis客户端后,使用info命令输出监控信息,查询缓存 hit 和 miss 的次数,根据业务需求调优Redis配置
互联网“三高”架构
单机redis的风险与问题
问题1:机器故障
问题2:容量瓶颈
结论
为了避免单点redis服务器故障,准备多台服务器,互相连通。将数据复制多个副本保存在不同的服务器上,连接在一起,并保证数据是同步的。即使有其中一台服务器宕机,其他服务器依然可以继续提供服务,实现redis的高可用,同时实现数据冗余备份
多台服务器连接方案
提供数据方:master
主服务器,主节点,主库,主客户端
接收数据方:slave
从服务器,从节点,从库,从客户端
需要解决的问题
数据同步(master的数据复制到slave中)
主从复制
作用
主从复制过程大体可以分为3个阶段
阶段一:建立连接阶段
至此,主从连接成功
主从连接(slave连接master)
slaveof masterip masterport
redis-server --slaveof masterip masterport
slaveof masterip masterport
断开主从连接
slaveof no one
授权访问
requirepass password
config set requirepass password
config get requirepass
auth password
masterauth password
redis-server -a password
阶段二:数据同步阶段工作流程
步骤1:请求同步数据
步骤2:创建RDB同步数据
步骤3:恢复RDB同步数据
步骤4:请求部分同步数据
步骤5:恢复部分同步数据
至此,数据同步工作完成
当前状态
slave刚连接master,master会将已有数据复制给slave,称为全量复制;在全量复制过程中,master中可能又会存入新的数据,将进入复制缓冲区,当全量复制完成,再将复制缓冲区的数据同步到slave,称为增量复制(部分复制)
数据同步阶段master说明
repl-backlog-size ?mb
数据同步阶段slave说明
slave-serve-stale-data yes|no
阶段三:命令传播阶段
命令传播阶段的部分复制
命令传播阶段出现了断网现象
部分复制的三个核心要素
服务器运行ID(runid)
复制(积压)缓冲区
内部工作原理
主从服务器复制偏移量(offset)
数据同步+命令传播阶段工作流程
心跳机制
心跳阶段注意事项
min-slave-to-write 2
min-slave-max-lag 8
频繁的全量复制(1)
伴随着系统的运行,master的数据量会越来越大,一旦master重启,runid将发生变化,会导致全部slave的全量复制操作
内部优化调整方案
master内部创建master_replid变量,使用runid相同的策略生成,长度41位,并发送给所有slave
在master关闭时执行命令 shutdown save
,进行RDB持久化,将runid与offset保存到RDB文件中
repl-id
repl-offset
redis-check-rdb
命令可以查看该信息master重启后加载RDB文件,恢复数据
重启后,将RDB文件中保存的repl-id与repl-offset加载到内存中
master_repl_id = repl
master_repl_offset = repl-offset
作用:本机保存上次runid,重启后恢复该值,使所有slave认为还是之前的master
频繁的全量复制(2)
repl-backlog-size ?mb
频繁的网络中断(1)
repl-timeout seconds
频繁的网络中断(2)
repl-ping-slave-period seconds
数据不一致
slave-serve-stale-data yes|no
哨兵(sentinel)是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的master并将所有slave连接到新的master
作用
注意:哨兵也是一台redis服务器,只是不提供数据相关服务,通常哨兵的数量配置为单数
redis-sentinel filename.conf
配置哨兵
sentinel monitor master_name master_host master_port sentinel_number
sentinel down-after-milliseconds master_name million_seconds
sentinel failover-timeout master_name million_seconds
sentinel parallel-syncs master_name sync_slave_number
port 26379
dir /data/26379 ####哨兵sentinel的工作目录
sentinel monitor mymaster 127.0.0.1 6379 2 #### 这行的意思是当有2个哨兵服务器认为master失联,那么这时客观上就认为主节点失联了。这里的按照所有的(哨兵节点/2)+1的个数来判断
sentinel down-after-milliseconds mymaster 30000 #### 指定多少毫秒之后,主节点没有应答哨兵sentinel 此时,哨兵主观上认为主节点下线,默认是30秒
sentinel parallel-syncs mymaster 1 #### 这个配置是指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行同步,如果这个数字越小,完成failover时间就越长,
#如果这个数字越大,对物理机的CPU、内存资源消耗的就越大。
sentinel failover-timeout mymaster 180000
###故障转移的超时时间(1:同一个sentinel对同一个master两次failover之间的间隔时间。
#2:当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确master那里同步数据时。
#3:当先要取消一个正在进行的failover所需要的时间,
#4:当进行failover时,配置所有slave指向新的master所需要的最大时间。不过,即使过了这个超时,slaves依然被正确配置为执向master,但是就不按parallel-syncs所配置的规则)
#以上配置就可以正常的启动哨兵
阶段一:监控阶段
阶段二:通知阶段
哨兵内部互通消息,同步消息(所监控服务对应的状态)
阶段三:故障转移阶段
SRI_S_DOWN
,并在对应的哨兵网中通知其他sentinel(主观下线)SRI_O_DOWN
状态(客观下线)处置阶段
服务器列表中挑选备选master(排除)
处置完成,发送指令(sentinel)
业务发展过程中遇到的峰值瓶颈
作用
Redis是使用Cluster进行集群结构设计
单机
集群
集群内部通讯设计
Cluster配置
cluster-enabled yes|no
cluster-config-file filename
cluster-node-timeout milliseconds
cluster-migration-barrier min_slave_number
Cluster节点操作命令(了解即可)
cluster nodes
cluster replicate master-id
cluster meet ip:port
cluster forget server_id
cluster failover
redis-cli命令
创建集群
redis-cli --cluster create masterhost1:masterport1 masterhost2:masterport2
masterhost3:masterport3 [masterhostn:masterportn ...] slavehost1:slaveport1
slavehost2:slaveport2 slavehost3:slaveport3 --cluster-replicas n
配置文件
port 6501
dir "/redis/data"
dbfilename "dump-6501.rdb"
cluster-enabled yes
cluster-config-file "cluster-6501.conf"
cluster-node-timeout 5000
搭建集群后,存入key时会计算出该key应该存入哪个服务器,所以在连接客户端时应该
redis-cli -c -h ip -p port
,加上-c
,表示以集群模式启动,将会在集群服务器客户端间实现自动切换,完成数据存储
redis-cli命令
redis-cli --cluster add-node new-master-host:new-master-port now-host:now-port
redis-cli --cluster add-node new-slave-host:new-slave-port master-host:master-port --cluster-slave --cluster-master-id masterid
redis-cli --cluster del-node del-slave-host:del-slave-port del-slave-id
添加master时,
now-host:now-port
随便输入一个已经添加到集群中的服务即可但是新添加master后,并没有为其分槽,需要进行重新分槽操作
redis-cli --cluster reshard new-master-host:new-master-port --cluster-from src-master-id1,src-master-id2,src-master-idn --cluster-to target-master-id --cluster-slots slots
,
分隔redis-cli --cluster reshard src-master-host:src-master-port --cluster-from src-master-id --cluster-to target-master-id --cluster-slots slots --cluster-yes
缓存预热就是系统启动前,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据库缓存的问题!用户直接查询事先被预热的缓存数据
宕机
服务器启动后迅速宕机
问题排查
解决方案
前期准备工作
准备工作
实施
缓存雪崩就是瞬间过期数据量太大,导致对数据库服务器造成压力。如能够有效避免过期时间集中,可以有效解决雪崩现象的出现(约40%),配合其他策略一起使用,并监控服务器的运行数据,根据运行记录做快速调整
数据库服务器崩溃(1)
问题排查
问题分析
解决方案(道)
解决方案(术)
缓存击穿就是单个高热数据过期的瞬间,数据访问量较大,未命中redis后,发起了大量对统一数据的数据库访问,导致对数据库服务器造成压力。应对策略应该在业务数据分析与预防方面进行,配合运行监控测试与即时调整策略,毕竟单个key的过期监控难度较高,配合雪崩处理策略即可
数据库服务器崩溃(2)
问题排查
问题分析
解决方案(术)
缓存穿透访问了不存在的数据,跳过了合法数据的redis数据缓存阶段,每次访问数据库,导致对数据库服务器造成压力。通常此类数据的出现量是一个较低的值,当出现此类情况以毒攻毒,并及时报警。应对策略应该在临时预案防范方面多做文章
无论黑名单还是白名单,都是对整体系统的压力,警报解除后尽快移除
数据库服务器崩溃(3)
问题排查
问题分析
解决方案(术)
监控指标
监控指标——性能指标(Performance)
latency
instantaneous_ops_per_sec
hit_rate(calculated)
监控指标——内存指标(Memory)
used_memory
mem_fragmentation_ratio
evicted_keys
blocked_clients
监控指标——基础活动指标(Basic_activity)
connected_clients
connected_slaves
master_last_io_seconds_ago
keyspace
监控指标——持久化指标(Persistence)
rdb_last_save_time
rdb_changes_since_last_save
监控指标——错误指标(Error)
rejected_connections
keyspace_misses
master_link_down_since_seconds
监控方式
benchmark
redis-benchmark [-h] [-p] [-c] [-n [-k]
redis-benchmark
redis-benchmark -c 100 -n 5000
monitor
monitor
slowlog
slowlog [operator]
slowlog-log-slower-than 1000 # 设置慢查询的时间下限,单位:微秒
slowlog-max-len 100 # 设置慢查询命令对应的日志显示长度,单位:命令数