首页 > 其他分享 >高可用浅谈

高可用浅谈

时间:2024-03-15 23:14:33浏览次数:21  
标签:缓存 浅谈 可用 系统 Redis 重试 超时

一 什么是高可用,判断标准是神么

高可用(High Availability)描述的是一个系统在大部分时间都是可用的,可以为我们提供服务的。高可用代表系统即使在发生硬件故障或者系统升级的时候,服务仍然是可用的。

一般情况下,我们使用多少个 9 来评判一个系统的可用性,比如 99.9999% 就是代表该系统在所有的运行时间中只有 0.0001% 的时间是不可用的,这样的系统就是非常非常高可用的了!当然,也会有系统如果可用性不太好的话,可能连 9 都上不了。

除此之外,系统的可用性还可以用某功能的失败次数与总的请求次数之比来衡量,比如对网站请求 1000 次,其中有 10 次请求失败,那么可用性就是 99%。

 

二 有哪些提供系统可用性的办法

1 注重代码质量,测试严格把关

我觉得这个是最最最重要的,代码质量有问题比如比较常见的内存泄漏、循环依赖都是对系统可用性极大的损害。大家都喜欢谈限流、降级、熔断,但是我觉得从代码质量这个源头把关是首先要做好的一件很重要的事情。

 

2 使用集群,减少单点故障

先拿常用的 Redis 举个例子!我们如何保证我们的 Redis 缓存高可用呢?答案就是使用集群,避免单点故障。当我们使用一个 Redis 实例作为缓存的时候,这个 Redis 实例挂了之后,整个缓存服务可能就挂了。使用了集群之后,即使一台 Redis 实例挂了,不到一秒就会有另外一台 Redis 实例顶上。

 

冗余设计是保证系统和数据高可用的最常的手段。高可用集群、同城灾备、异地灾备、同城多活和异地多活是冗余思想在高可用系统设计中最典型的应用。

光做好冗余还不够,必须要配合上 故障转移 才可以! 所谓故障转移,简单来说就是实现不可用服务快速且自动地切换到可用服务,整个过程不需要人为干涉。

举个例子:哨兵模式的 Redis 集群中,如果 Sentinel(哨兵) 检测到 master 节点出现故障的话, 它就会帮助我们实现故障转移,自动将某一台 slave 升级为 master,确保整个 Redis 系统的可用性。整个过程完全自动,不需要人工介入。

再举个例子:Nginx 可以结合 Keepalived 来实现高可用。如果 Nginx 主服务器宕机的话,Keepalived 可以自动进行故障转移,备用 Nginx 主服务器升级为主服务。并且,这个切换对外是透明的,因为使用的虚拟 IP,虚拟 IP 不会改变。

 

3 限流 

流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性

 

4 超时和重试机制

一旦用户请求超过某个时间的得不到响应,就抛出异常。这个是非常重要的,很多线上系统故障都是因为没有进行超时设置或者超时设置的方式不对导致的。我们在读取第三方服务的时候,尤其适合设置超时和重试机制。一般我们使用一些 RPC 框架的时候,这些框架都自带的超时重试的配置。如果不进行超时设置可能会导致请求响应速度慢,甚至导致请求堆积进而让系统无法再处理请求。重试的次数一般设为 3 次,再多次的重试没有好处,反而会加重服务器压力(部分场景使用失败重试机制会不太适合)。 

 

5 熔断机制

超时和重试机制设置之外,熔断机制也是很重要的。 熔断机制说的是系统自动收集所依赖服务的资源使用情况和性能指标,当所依赖的服务恶化或者调用失败次数达到某个阈值的时候就迅速失败,让当前系统立即切换依赖其他备用服务。 比较常用的流量控制和熔断降级框架是 Netflix 的 Hystrix 和 alibaba 的 Sentinel。

 

6 异步调用

异步调用的话我们不需要关心最后的结果,这样我们就可以用户请求完成之后就立即返回结果,具体处理我们可以后续再做,秒杀场景用这个还是蛮多的。但是,使用异步之后我们可能需要 适当修改业务流程进行配合,比如用户在提交订单之后,不能立即返回用户订单提交成功,需要在消息队列的订单消费者进程真正处理完该订单之后,甚至出库后,再通过电子邮件或短信通知用户订单成功。除了可以在程序中实现异步之外,我们常常还使用消息队列,消息队列可以通过异步处理提高系统性能(削峰、减少响应所需时间)并且可以降低系统耦合性。

 

7 使用缓存

如果我们的系统属于并发量比较高的话,如果我们单纯使用数据库的话,当大量请求直接落到数据库可能数据库就会直接挂掉。使用缓存缓存热点数据,因为缓存存储在内存中,所以速度相当地快!

 

8 其他

  • 核心应用和服务优先使用更好的硬件
  • 监控系统资源使用情况增加报警设置。
  • 注意备份,必要时候回滚。
  • 灰度发布: 将服务器集群分成若干部分,每天只发布一部分机器,观察运行稳定没有故障,第二天继续发布一部分机器,持续几天才把整个集群全部发布完毕,期间如果发现问题,只需要回滚已发布的一部分服务器即可
  • 定期检查/更换硬件: 如果不是购买的云服务的话,定期还是需要对硬件进行一波检查的,对于一些需要更换或者升级的硬件,要及时更换或者升级。

标签:缓存,浅谈,可用,系统,Redis,重试,超时
From: https://www.cnblogs.com/balfish/p/18076439

相关文章

  • nginx是怎么实现高可用的
    1、进程池 nginx在启动的时候会创建有固定数量(此数量在配置文件可配置)的worker即进程池,在之后的运行过程中不会在fork新的worker,并且一一绑定分配好的cpu。(解决了频繁创建和切换进程的成本) 2、多阶段 nginx把整个Web服务器分解成了多个“功能模块”,可以在配置文件里任......
  • Linux高可用性方案之Heartbeat安装(高级运维)
    安装Heartbeat前的准备 Heartbeat集群必须的硬件从下图看出,构建一个Heartbeat集群系统必须的硬件设备有:节点服务器;网络和网卡;共享磁盘。节点服务器安装Heartbeat至少需要两台主机,并且对主机的要求不高,普通的PC服务器即可满足要求。当然,也可以在虚拟机上安装Heartbeat,现在Hear......
  • 分享一个可用的chatgpt网站
    背景作为一种基于人工智能技术的自然语言处理工具,近期的热度直接沸腾......
  • 浅谈奇偶校验
    奇校验:"1"的个数为奇数偶校验:"1"的个数为偶数(补充的1位校验码放在前后其实都可以,这里是往后面放)比如001的奇校验0010,偶校验0011比如010的奇校验0100,偶校验0101比如011的奇校验0111,偶校验0110简简单单,但是为什么奇偶校验的码距是2呢?首先需要知道码距是什么定......
  • 浅谈容斥原理在计数中的应用
    基本容斥[ABC066D]11首先如果没有重复的数,答案肯定是\(C_n^k\)。考虑如何加入有重复的数这一性质。不难想到用容斥思想,减去重复的部分。那么考虑那些数列可能会重复:显然如果\(x\)出现了两次并且分别出现在\(y1\),\(y2\),那么重复了的数列中一定不会出现下标在\((y1,y2-1)......
  • 浅谈HTTP 和 HTTPS (中间人问题)
    前言由于之前的文章已经介绍过了HTTP,这篇文章介绍HTTPS相对于HTTP做出的改进开门见山:HTTPS是对HTTP的加强版主要是对一些关键信息进行了加密一.两种加密方式1.对称加密公钥+明文=密文密文+公钥=明文2.非对称加密举个例子就好比小区邮箱提供......
  • 综合:配置高可用、负载均衡
    环境说明:LVS-DR模式client1:eth0->192.168.88.10lvs1:eth0->192.168.88.5lvs2:eth0->192.168.88.6web1:eth0->192.168.88.100web2:eth0->192.168.88.200环境准备#关闭2台web服务器上的keepalived,并卸载[root@pubservercluster]#vim08-rm-keepalived.yml---......
  • Zabbix监控nginx高可用是否脑裂
    Zabbix监控nginx高可用是否脑裂实验环境所有机关闭防火墙与selinux第一台机zabbix192.168.159.141lamp、zabbix_server、zabbix_agentd第二台机lb1192.168.159.139keepalived、nginx_master负载均衡rs1和rs2的网页测试页面第三台机lb2192.168.159.147keepalived......
  • 浅谈Java中的String,StringBuffer与StringBuilder
    String,StringBuffer与StringBuilder类是我们比较常用的三个类,弄懂它们也是很重的,下面是我学习之后对这三个类的总结,欢迎评论纠错String类用法:1、String对象用于保存字符串,也就是一组字符序列2、字符串常量(如"Tom")对象是用双引号括起的字符序列。例如:“你好”、“12.2......
  • ElasticSearch高可用部署
    简单说明我们在部署ElasticSearch高可用集群时,要规划好集群的规模,每个节点的职责,规划好后续的水平扩展方案,再进行部署。核心概念Cluster:集群,由一个或多个Elasticsearch节点组成。Node:节点,组成Elasticsearch集群的服务单元,同一个集群内节点的名字不能重复。通常在一个节点......