集群
简介
解决业务发展过程中遇到的峰值瓶颈,扩展业务需求内存容量,集群就是使用网络将若干台计算机联通起来,是一组机器的统称,他们作为一个整体向用户提供一组网络资源,单个的计算机是集群中的节点。
作用,特点
分担单台服务器的访问压力,实现负载均衡,缓解储存压力,实现可扩展性,降低单台服务器宕机带来的业务灾难,实现高可用性。
可扩展性 新的服务实体可以动态地加入到集群中,从而增强集群的性能
高可用性 同样的服务可以由多个服务实体提供,如果一个服务实体失败了,另一个服务实体会接管失败的服务实体。
集群结构设计
数据存储设计
通过算法设计,计算出key应该保存的位置 ; 将所有的存储空间计划切割成16384份,每台主机保存一部分 每份代表的是一个存储空间,不是一个key的保存空间 ;将key按照计算出的结果放到对应的存储空间,这样设计的目的是增强可扩展性。
集群内部通讯设计
各个数据库相互通信,保存各个库中槽的编号数据 , 一次命中,直接返回 ,一次未命中,发送具体位置。
集群结构搭建
搭建方式:手动安装(单条命令) 1 配置服务器(3主3从) 2 建立通信(Meet) 3 分槽(Slot) 4 搭建主从(master-slave)
工具安装(批处理)
基本命令
集群配置
添加节点 cluster-enabled
yes|no cluster配置文件名,该文件属于自动生成,仅用于快速查找文件并查询文件内容 cluster-config-file
节点服务响应超时时间,用于判定该节点是否下线或切换为从节点 cluster-node-timeout
cluster-migration-barrier
集群节点操作命令
查看集群节点信息 cluster
nodes
进入一个从节点 redis,切换其主节点 cluster replicate
发现一个新节点,新增主节点 cluster
meet ip:port
忽略一个没有solt的节点 cluster
forget
手动故障转移 cluster
failover
redis-trib命令
添加节点 redis-trib.rb
add-node 删除节点 redis-trib.rb
del-node
重新分片 redis-trib.rb
reshard
实操
先创建3个master,3个slave,一个主命令操作客服端,一个master1客服端,一个slave1客服端,一个机动客户端。
在conf里配置集群
再把已配置好的conf复制到其他5个端口的conf,例如:sed "s/6379/6380/g" redis-6379.conf >redis-6380.conf
启动3主3从服务端。在主命令操作客服端查看是否启动,查看Redis命令。
使用 ./redis-tribe.rb create --replicas 1 127.0.0.1:6379 一直到6384
遇到了bug,使用时报上面的警告,原因是因为redis5.0使用redis-cli作为创建集群的命令,使用c语言实现,不再使用ruby语言。
创建成功
在master1客户端添加数据
在slave读数据
先切断slave1连接,发现除了master1,其他主从服务端接受的信息是一样的,master1会标记一下slave1端口,并不影响使用,之后再连上slave,继续测试断开master1,在6380端口用cluster nodes查看集群节点信息可以看出master1 端口号6379 fail disconnected信息,再次开启6379 服务端,继续查询结点信息发现正常。
面试问题
缓存预热
问题:1. 请求数量较高 2. 主从之间数据吞吐量较大,数据同步操作频度较高
解决:第一步:1. 日常例行统计数据访问记录,统计访问频度较高的热点数据 2. 利用LRU数据删除策略,构建数据留存队列
第二步:1. 将统计结果中的数据分类,根据级别,redis优先加载级别较高的热点数据 2. 利用分布式多服务器同时进行数据读取,提速数据加载过程 3. 热点数据主从同时预热
第三步:1. 使用脚本程序固定触发数据预热过程 2. 如果不考虑经济,可以使用CDN(内容分发网络)
缓存雪崩
问题:数据库服务器崩溃可能出现的情况: 系统平稳运行过程中,忽然数据库连接量激增 , 应用服务器无法及时处理请求 , 大量408,500错误页面出现 , 客户反复刷新页面获取数据 , 数据库崩溃, 应用服务器崩溃, 重启应用服务器无效,Redis服务器崩溃 , Redis集群崩溃 , 重启数据库后再次被瞬间流量放倒。
主要原因是:短时间范围内大量key集中过期
解决方案:1. 更多的页面静态化处理 2. 构建多级缓存架构 Nginx缓存+redis缓存+ehcache缓存 3. 检测Mysql严重耗时业务进行优化,对数据库的瓶颈排查:例如超时查询、耗时较高事务等 4. 灾难预警机制监控redis服务器性能指标 ( CPU占用、CPU使用率 , 内存容量、 查询平均响应时间 ,线程数 )5. 限流、降级 ,短时间范围内牺牲一些客户体验,限制一部分请求访问,降低应用服务器压力,待业务低速运转后再逐步放开访问.
最佳解决方案:1. LRU与LFU切换 2. 数据有效期策略调整 :根据业务数据有效期进行分类错峰,A类90分钟,B类80分钟,C类70分钟 ; 过期时间使用固定时间+随机值的形式,稀释集中到期的key的数量 3. 超热数据使用永久key 4. 定期维护(自动+人工) 对即将过期数据做访问量分析,确认是否延时,配合访问量统计,做热点数据的延时 5. 加锁 慎用!
缓存击穿
问题: 系统平稳运行过程中 ,数据库连接量瞬间激增 , Redis服务器无大量key过期 , Redis内存平稳,无波动 , Redis服务器CPU正常 , 数据库崩溃
主要原因: Redis中某个key过期,该key访问量巨大 , 多个数据请求从服务器直接压到Redis后,均未命中 3. Redis在短时间内发起了大量对数据库中同一数据的访问
解决方案:预先设定对某个热点信息key的过期时长,也可以监控访问量,对自然流量激增的数据延长过期时间或设置为永久性key,也可采用启动定时任务,高峰期来临之前,刷新数据有效期,确保不丢失,设置二级缓存,设置不同的失效时间,保障不会被同一时间淘汰 ,不到万不得已,也不是把性能放在第一位,可以加分布式锁,防止缓存被击穿。
缓存穿透
服务器崩溃可能出现的问题: 系统平稳运行过程中 , 应用服务器流量随时间增量较大 , Redis服务器命中率随时间逐步降低 , Redis内存平稳,内存无压力 5. Redis服务器CPU占用激增 , 数据库服务器压力激增 , 数据库崩溃
主要原因:Redis中大面积出现未命中 , 出现非正常URL访问。
解决方案:
对查询结果为null的数据进行缓存进行时限处理,定期清理;
设置数据白名单,提前预热各种分类数据id对应的bitmaps,id作为bitmaps的offset。当加载正常数据时,放行,加载异常数据时直接拦截;也可使用布隆过滤器(可以忽略布隆过滤器的命中问题)
实时监控redis命中率(业务正常范围时,通常会有一个波动值)与null数据的占比 ,使用黑名单进行防控,可以通过业务活动状态来判断; 非活动时段波动:通常检测3-5倍,超过5倍纳入重点排查对象, 活动时段波动:通常检测10-50倍,超过50倍纳入重点排查对象
对key进行业务层传输加密服务,设定校验程序,通过key校验
性能指标监控
简介:性能指标:Performance
内存指标:Memory
基本活动指标:Basic activity
持久性指标:Persistence
错误指标:Error
性能指标
latency redis响应一个请求的时间
instantaneous_ops_per_sec平均每秒处理请求总数
hit rate(calculated) 缓存命中率(计算的)
内存指标
used_memory 已使用内存
mem_fragmentation_ratio 内存使用率
evicted_keys 由于最大内存限制被移除的key的数量
blocked_clients 由于BLPOP,BRPOP,or BRPOPLPUSH而被阻塞的客户端
基本活动指标
connected_clients 客服端连接数 connected_slaves Slave数量
master_last_io_seconds_ago 最近一次主从交互之后的秒数
keyspace 数据库中key的总数
持久性指标
rdb_last_save_time 最后一次持久化保存到磁盘的时间戳
rdb_changes_since_last_save 自最后一次持久化数据库的更改次数
错误指标
rejected_connections 由于达到maxclient限制而被拒绝的连接数
keyspace_misses Key值查找失败次数
master_link_down_since_seconds 主从断开的持续时间(以秒为单位)
基本命令
benchmark redis-benchmark
[-h ] [-p ] [-c ] [-n
默认配置是50个连接,10000次请求对应的性能。
-c 指定并发连接数 -n 指定请求数
**monitor**
打印服务器调试信息
**showlong**
[operator] get:获取慢查询日志 len :获取慢查询日志条目数 reset :重置慢查询日志
slowlog-log-slower-than
1000 设置慢查询的时间下线,单位:微秒
slowlog-max-len
100 设置慢查询命令对应的日志显示长度,单位:命令数