• 集群 +面试热点


    集群

    简介

    解决业务发展过程中遇到的峰值瓶颈,扩展业务需求内存容量,集群就是使用网络将若干台计算机联通起来,是一组机器的统称,他们作为一个整体向用户提供一组网络资源,单个的计算机是集群中的节点。

    作用,特点

    分担单台服务器的访问压力,实现负载均衡,缓解储存压力,实现可扩展性,降低单台服务器宕机带来的业务灾难,实现高可用性。

    可扩展性 新的服务实体可以动态地加入到集群中,从而增强集群的性能

    高可用性 同样的服务可以由多个服务实体提供,如果一个服务实体失败了,另一个服务实体会接管失败的服务实体。

    集群结构设计

    数据存储设计

    通过算法设计,计算出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 master连接的slave最小数量 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 [-k ]

    默认配置是50个连接,10000次请求对应的性能。

    -c 指定并发连接数 -n 指定请求数

    **monitor** 打印服务器调试信息

    **showlong** [operator] get:获取慢查询日志 len :获取慢查询日志条目数 reset :重置慢查询日志

    slowlog-log-slower-than 1000 设置慢查询的时间下线,单位:微秒

    slowlog-max-len 100 设置慢查询命令对应的日志显示长度,单位:命令数

  • 相关阅读:
    js少写if语句
    框架大集合
    new运算符工作原理(new运算符的伪码实现)
    原始数据类型和引用数据类型
    关于input 的选中,自定义input[type="checkbox"]样式
    css伪类与伪元素
    js 的function为什么可以添加属性
    工具,如何去掉百度编辑器 ueditor 元素路径、字数统计等
    多种框架好库的混合使用
    js预编译的四部曲
  • 原文地址:https://www.cnblogs.com/zzy8080/p/13971067.html
Copyright © 2020-2023  润新知