欢迎光临
我们一直在努力
广告
广告
广告
广告
广告
广告
广告
广告
广告
广告

云服务器时区管理的最佳解决方案:保持分布式团队和业务协调一致 (云服务器时间不对)

引言

在当今全球化的商业环境中,拥有分布式团队和远程办公人员已变得越来越普遍。这给时区管理带来了独特的挑战,可能会对团队协调、业务运营和客户满意度产生影响。对于托管在云服务器上的应用程序和服务,时区管理尤为关键,因为它们通常由不同时区的人员访问和维护。

时区管理挑战

处理云服务器时区管理时,会遇到以下几个主要挑战:

  • 时间戳不一致:来自不同时区的用户可能会看到不同的时间戳,导致数据混淆和操作错误。
  • 难以协调日程安排:团队成员在安排会议、电话会议和协作活动时可能会遇到沟通障碍。
  • 业务运营中断:如果关键应用程序或服务因时区差异而发生故障,可能会导致业务运营中断。
  • 客户体验受影响:客户可能在不方便的时间收到通知或更新,影响他们的体验和满意度。

最佳解决方案

为了解决这些挑战,日程安排协调,并为用户提供无缝的体验。这不仅提高了生产力和效率,而且还改善了客户满意度和业务运营的整体成功。


vps服务器和云服务器一样吗?谁能解释一下云服务器的工作原理?

VPS服务器(Virtual Private Server,虚拟专用服务器)和云服务器虽然都是基于虚拟化技术的服务器,但它们之间存在一些关键区别。以下是对两者的对比以及云服务器工作原理的详细解释:

VPS服务器与云服务器的区别

RocketMQ消息积压,异步方案,缓存策略解决方案

大家好,我是Leo。

MQ分布式事务的相关实现

MQ消息丢失,一致性问题在生产,存储,消费阶段如何解决

消息重发之后,如何避免重复消费

继上篇RocketMQ技术总结二,这篇主要介绍一下

消息积压问题如何处理

阅读源码的小技巧

异步方案提升系统性能

MQ的缓存策略

基础知识系列

3万字聊聊什么是MySQL(初篇)

3万字聊聊什么是Redis(完结篇)

3万字聊聊什么是RocketMQ (二)

2万字聊聊什么是秒杀系统(中)

大厂面试系列

4万字聊聊阿里二面,保证你看不完

聊聊Redis面试题

本章概括

异步方案那里可以暂时一笔带过,后续写实战的时候会详细深入的

入手源码那里,根据自己对未来的发展规划选择性翻阅吧。

消息积压问题什么是消息积压

消息积压是使用MQ消息队列系统中,最常见的一种性能问题。

如下图所示,当生产端的生产效率大于消费端的消费效率就会造成消息处理不完的情况,也就叫 “消息积压”。

消息积压应对方案(一)

第一种方案主要是优化生产端,消费端的处理能力。(消息队列你就别优化了,那么牛逼的团队设计出那么好的产品不会出问题的)

所以 我们只需要处理如何与消息队列配合,达到一个最佳的性能就够了。

对于生产端来说,并不会影响性能。

因为一般生产端都是先执行自己的业务程序之后,再生产消息到MQ的。

如果说,你的代码发送消息的性能上不去,你需要优先检查一下,是不是发消息之前的业务逻辑耗时太多导致的。

我们之前在讲生产端发送消息的过程中,假设这一次交互的平均耗时1ms,我们把这1ms的时间分解开,主要包括下列几项

发送前的准备数据,序列化数据,构造请求等耗时。也就是生产端在发送网络请求之间的耗时

发送消息和返回响应在网络传输中的耗时

Broker处理消息的耗时

如果是单线程发送,每次只发送 1 条消息,那么每秒只能发送 1000ms / 1ms * 1 条 /ms = 1000 条 消息,这种情况下并不能发挥出消息队列的全部实力。

无论是增加每次发送消息的批量大小,还是增加并发,都能成倍地提升发送性能。

至于到底是选择批量发送还是增加并发,主要取决于生产端程序的业务性质。

复习链接 生产端发送消息过程

对于消费端来说,大部分的问题应该都是出在这里的。

主要的调优点也是在这个位置。

如果消费端的性能延时只是暂时的,那问题不大,只要消费端的性能恢复之后,超过生产端的性能,那积压的消息是可以逐渐被消化掉的。

要是消费速度一直比生产速度慢,时间长了,整个系统就会出现问题,要么,消息队列的存储被填满无法提供服务,要么消息丢失,这对于整个系统来说都是严重故障。

所以,我们在设计系统的时候,一定要保证消费端的消费性能要高于生产端的发送性能,这样的系统才能健康的持续运行。

除了优化业务性能,也可以对消费端进行水平扩容,增加消费端的并发数从而达到总体的消费性能。

在扩容 Consumer 的实例数量的同时, 必须同步扩容主题中的分区(也叫队列)数量,确保 Consumer 的实例数和分区数量是相等的。

如下图所示。

如果 Consumer 的实例数量超过分区数量,这样的扩容实际上是没有效果的。原因 我们之前讲过,因为对于消费者来说,在每个分区上实际上只能支持单线程消费

消息积压应对方案(二)

第二种方案应对的业务场景是,系统正常运转时,不会出现消息积压问题。

但是某一时刻,突然就开始积压并且持续上涨。

这种问题还是比较纠结的,扩容的话,一般情况下是不需要的,不扩容的话某一刻又挡不住。

遇到这样的场景无需就是两种原因,要不生产变快了,要不消费变慢了。

我们可以通过监控程序观察一下数据情况再定位某种原因。

最后实在没办法可以将系统进行降级,通过关闭一些不重要的业务,减少生产方发送的数据量,最低限度的让系统的热卖业务还能正常运转。

重复消费也会拖慢整个系统的消费速度。

关于重复消费可以参考 重复消费解决方案

如何入手学习源码

最核心的一点就是查看 官方文档

官方文档是所有技术中 最权威,最齐全的一个资料聚集地

有些翻译中文的网站,可能会做到更新不及时,所以还是建议直接看英文文档,借助翻译即可。也可以锻炼英文水平

首先要 掌握这个技术的整体结构,有哪些功能特性,涉及到的关键技术、实现原理和生态系统 等等。

掌握了这些,对它的整体有了一定了解,然后再去看它的源代码,就会非常通畅了。

比如我之前做的MySQL技术分享如下图。

Redis的技术分享如下图

RocketMQ的技术分享还没画,可以暂时参考一下官方

我觉得学习这个东西最好的老师是兴趣。

所以一定要带着问题去读源码。

比如

RocketMQ的消息是怎么写到文件中的? (肯定不会像我们业务程序那样直接写的)

RocketMQ的重发机制是怎么实现的?

RocketMQ的确认机制是怎么实现的?

RocketMQ的分布式的实现源码是怎么样的?

RocketMQ的消息不丢失是否和MySQL那样有binlog,redo log,是否和Redis那样有RDB,AOF呢?

上述问题反正是我当下最想知道的,但是不要操之过急,学懂整体后再深入。

一定不要直接从main里看,程序跟书是不一样的,书是由人学懂之后,整理的一个先后学习顺序。而程序是一个网状结构,是一个功能一个功能的实现

这上述也是我接下来学习源码的方法

源码分析的话,我的想法是等我学完RocketMQ的基础原理,我会从第一篇文章涉及到的知识点,进入源码阅读分析整理

MySQL,Redis就算了,打算发力MQ

异步方案提升系统性能

这里先简单聊一下思想,后续会用代码案例实现。

异步执行

简单的说,异步思想就是,当我们要执行一项比较耗时的操作时,不去等待操作结束,而是给这个操作一个命令:“当操作完成后,接下来去执行什么。”

使用异步编程模型,虽然并不能加快程序本身的速度,但可以减少或者避免线程等待,只用 很少的线程就可以达到超高的吞吐能力。

同时我们也需要注意到异步模型的问题:相比于同步实现,异步实现的复杂度要大很多,代 码的可读性和可维护性都会显著的下降。

虽然使用一些异步编程框架会在一定程度上简化异 步开发,但是并不能解决异步模型高复杂度的问题。

异步性能虽好,但一定不要滥用,只有类似在像消息队列这种业务逻辑简单并且需要超高吞 吐量的场景下,或者必须长时间等待资源的地方,才考虑使用异步模型。

如果系统的业务逻 辑比较复杂,在性能足够满足业务需求的情况下,采用符合人类自然的思路且易于开发和维 护的同步模型是更加明智的选择。

异步网络

传统的同步网络 IO,一般采用的都是一个线程对应一个 Channel 接收数据,很难支持高并 发和高吞吐量。

这个时候,我们需要使用异步的网络 IO 框架来解决问题。

Netty 和 NIO 是两种异步网络框架。

Netty 自动地解决了线程控制、缓存管理、连接管理这些问题,用户只需要实现对应的 Handler 来处理收到的数据即可。

NIO 是更加底层的 API,它提供了 Selector 机制,用单个线程同时管理多个连接,解决了多路 复用这个异步网络通信的核心问题。

以上是 IO、BIO、NIO的发展,流程图

缓存策略

缓存策略的出现,主要解决的就是如何减少与磁盘IO交互,提升系统性能。

对于持久化来说,肯定还是要存磁盘的。

所以我们必须保证最大的几率命中缓存,同时也要减少与磁盘IO的交互。

一般来说 SSD 每秒钟可以读写几千次,如果说我们的程序在处理业务请求的时候直接来读写磁盘,假设处理每次请求需要读写 3~5 次,即使每次请求的数据量不大,你的程序最多每秒也就 能处理 1000 次左右的请求。

而内存的随机读写速度是磁盘的 10 万倍!所以,使用内存作为缓存来加速应用程序的访问速度,是几乎所有高性能系统都会采用的方法。

只读与读写缓存的抉择

使用缓存,首先你就会面临选择读缓存还是读写缓存的问题。他们唯一的区别就是,在更新数据的时候,是否经过缓存

读写缓存: 它是一种牺牲数据一致性换取性能的设计,天然是不可靠的。

为什么说他是不可靠的呢? 可以从上图中看出,写入数据到PageCache时,并不是同步写入的,而是异步,如果在这段期间,还没开始异步写入时,服务器直接宕机了,就丢失了数据。

如果说我们人工操作,执行一次sync。这样也就失去了缓存的意义

缓存的意义不就是减少与磁盘IO的交互嘛

写缓存的实现是非常复杂的。

应用程序不停地更新 PageCache 中的数据,操作系统 需要记录哪些数据有变化,同时还要在另外一个线程中,把缓存中变化的数据更新到磁盘文 件中。

在提供并发读写的同时来异步更新数据,这个过程中要保证数据的一致性,并且有非常好的性能,实现这些真不是一件容易的事儿。

所以一般 推荐使用只读缓存。

如何保持缓存数据新鲜

上面提到了推荐使用只读缓存,对于只读缓存来说,缓存中的数据来源只有一个途径,就是从磁盘上来。

当数据需要更新的时候,磁盘中的数据和缓存中的副本都需要进行更新。

我们知道在分布式系统中,除非是使用事务或者一些分布式一致性算法来保证数据一致性,否则,由于节点宕机、网络传输故 障等情况的存在,我们是无法保证缓存中的数据和磁盘中的数据是完全一致的。

我们要做的就是尽可能最大的保证数据同步。

最省心,代价最大的就是采用分布式事务来解决了。

另一种简单的方式就是采用Redis那种过期key的方式实现,数据过期以后即使它还存在缓存中,我们也认为它不再有效,需要从 磁盘上再次加载这条数据,这样就变相地实现了数据更新。

还是根据业务吧。比如微信头像修改后的实时显示,邮件的延迟几秒钟接收都可以采用过期key的方式

如果是那种交易类系统,对数据一致性比较敏感的可以采用牺牲性能来决定一致性。

缓存的置换策略

在使用缓存的过程中,除了要考虑数据一致性的问题,你还需要关注的另一个重要的问题是,在内存有限的情况下,要优先缓存哪些数据,让缓存的命中率最高。

当应用程序要访问某些数据的时候,如果这些数据在缓存中,那直接访问缓存中的数据就可 以了,这次访问的速度是很快的,这种情况我们称为一次缓存命中;如果这些数据不在缓存 中,那只能去磁盘中访问数据,就会比较慢。

这种情况我们称为“缓存穿透”。

显然,缓存 的命中率越高,应用程序的总体性能就越好。

那用什么样的策略来选择缓存的数据,能使得缓存的命中率尽量高一些呢?

如果你的系统是那种可以预测未来访问哪些数据的系统,比如说,有的系统它会定期做数据同步,每次同步的数据范围都是一样的,像这样的系统,缓存策略很简单,就是你要访问什么数据,就缓存什么数据,甚至可以做到百分之百的命中。

但是,大部分系统,它并没有办法准确地预测未来会有哪些数据会被访问到,所以只能使用一些策略来尽可能地提高缓存命中率。

一般来说,我们都会在数据首次被访问的时候,顺便把这条数据放到缓存中。

随着访问的数据越来越多,总有把缓存占满的时刻,这个时候就需要把缓存中的一些数据删除掉,以便存放新的数据,这个过程称为缓存置换。

到这里,问题就变成了:当缓存满了的时候,删除哪些数据,才能会使缓存的命中率更高一 些,也就是采用什么置换策略的问题。

命中率最高的置换策略,一定是根据你的业务逻辑,定制化的策略。

比如,你如果知道某些数据已经删除了,永远不会再被访问到,那优先置换这些数据肯定是没问题的。

再比如,你的系统是一个有会话的系统,你知道现在哪些用户是在线的,哪些用户已经离线,那优先置换那些已经离线用户的数据,尽量保留在线用户的数据也是一个非常好的策略。

另外一个选择,就是使用通用的置换算法。

一个最经典也是最实用的算法就是 LRU 算法, 也叫最近最少使用算法。

这个算法它的思想是,最近刚刚被访问的数据,它在将来被访问的 可能性也很大,而很久都没被访问过的数据,未来再被访问的几率也不大。

基于这个思想,LRU 的算法原理非常简单,它总是把最长时间未被访问的数据置换出去。

你别看这个 LRU 算法这么简单,它的效果是非常非常好的。

可以参考Redis的的LRU文章,实现原理都是差不多的 LRU算法的实现

充电分享

少年有梦,不应止于心动,更应付出行动,用自己的关,照亮自己的路,努力追上那个曾经被赋予厚望的自己 ?—— 致自己,致各位追梦的你们

结尾

有些不懂的地方或者不对的地方,麻烦各位指出,一定修改优化!

非常欢迎大家加我个人微信有关后端方面的问题我们在群内一起讨论! 我们下期再见!

原文:

负载均衡进阶:SLB常见问题解决方法

摘要: 在由云栖社区和阿里云网络团队联合主办的2017阿里云网络技术在线高峰论坛上,阿里云技术专家添毅分享了网络产品部根据客户和阿里云运维的反馈提炼出的几大最主要和最常见的在使用SLB产品中发生的问题,并为大家介绍了针对这些常见问题的相应处理方法。

摘要: 在由云栖社区和阿里云网络团队联合主办的2017阿里云网络技术在线高峰论坛上,阿里云技术专家添毅分享了网络产品部根据客户和阿里云运维的反馈提炼出的几大最主要和最常见的在使用SLB产品中发生的问题,并为大家介绍了针对这些常见问题的相应处理方法。

想知道如何借助SLB构建高可用系统以及健康检查是如何实现的,本文不容错过!本文内容根据演讲嘉宾分享视频以及PPT整理而成。

本次的分享将会主要围绕以下5个部分 基本概念回顾 如何构建高可用系统 选择性能共享型还是性能保障型实例 为什么健康检查异常 为什么负载不均衡一、基本概念回顾 SLB是什么 SLB是阿里云推出的一款云负载均衡服务,其主要针对于多台云服务器进行流量分发,能够将业务流量分发到由多台云服务器所组成的后端服务器池上去,以此来提升系统的处理能力。

负载均衡所解决的问题主要包括两点:第一点,SLB能够消除系统的单点故障,这是因为SLB的后面是由多台云服务器组成的服务器池,那么当其中某一台服务器出现故障的时候并不会影响整个系统的可服务性。

第二点,由于后端的云服务器能够横向地进行扩展,所以也具有为海量业务提供服务的能力。

那么,为什么要使用云上的负载均衡呢?这是因为云上负载均衡主要有这样的几个特点:高可靠、高性能、低成本、安全性、易用性。

SLB基本组件 阿里云的SLB主要包括了三个基本组件,这里也进行简单地介绍。

第一个基本组件就是实例,每个实例都唯一地标识了云负载均衡器,并且每个实例都对应一个VIP,VIP唯一地标识了负载均衡实例,也是负载均衡对外提供服务的地址。

第二个组件是监听,监听是由VIP+端口号来唯一标识的,一个监听中包含用户定制的负载均衡策略和转发规则。

最后一个基本组件就是后端挂载的服务器,也就是云服务器ECS,负责处理真正的业务请求。

二、如何构建高可用系统 多层次的高可用 如下图所示,阿里云的负载均衡是从四个层面上去构建高可用的。

从底层往上层看,分别是应用级别的高可用、集群级别的高可用、可用区级别(AZ)的高可用以及地域级别(Region)的高可用。

应用级别的高可用主要是通过针对SLB后端的ECS实例的健康检查来实现的。

当SLB发现后端不健康的或者不能正常工作的ECS的时候,会将这些不健康的ECS从SLB的转发路径中剔除掉,保证业务流量能够转发到正常的工作服务器当中。

集群级别的高可用主要是通过集群中LVS机器间的session同步来保障任何一个用户的业务会话都能够在所有的LVS机器上是相互同步的,当其中某一台LVS出现故障时,可以由其他的LVS来接替出现故障的机器的工作。

同时,由于会话保持的存在,用户的业务是不会发生中断的。

对于可用区级别的高可用和地域级别的高可用,在本文的后面会进行更加详细的介绍。

细说可用区级别容灾 这里详细地介绍一下可用区级别的容灾。

可用区级别容灾的设计初衷是在当一个可用区出现重大灾情的时候,比如整个可用区的机房发生了掉电、光缆出现了中断、整个可用区机房中所有的物理机都无法正常工作的时候,也就是整个可用区都宕掉了的情况下,能够由备可用区来继续提供服务,这就是可用区级别容灾的设计初衷。

可用区级别的容灾并不是说某一个可用区中的某一个实例或者是某几个实例出现了故障就会发生可用区的切换,实例自动从可用区A切换到可用区B,这是一个比较常见的误区。

而针对于这样的误区,阿里云也建议用户在构建可用区级别的高可用的时候采取以下两个步骤: 首先,建议用户在SLB实例的后端尽可能地去挂载多个可用区的ECS实例。

SLB能够支持跨可用区地挂载ECS云服务器,这样可以避免某个可用区的ECS都出现故障的情况下,还有其他可用区的ECS能够接替工作,虽然跨可用区挂在ECS会存在大约2毫秒左右的延迟,但是却能够大大地提升服务的可用性。

第二步就是针对于一些特别重要的业务,建议在不同的可用区分别地去购买SLB的实例。

比如在可用区A和可用区B各自购买一个SLB实例,在此基础之上再使用全球负载均衡GSLB来进行实例间的调度。

跨地域容灾的实现 跨地域容灾这一部分与上面介绍的可用区级别容灾的第二步非常相似,也是借助于GSLB产品实现的,GSLB即 智能DNS实现了针对于后端的健康检查、路由调度的优化功能,能够实现在地域之间的负载均衡实例的调度。

关于这部分的更详细的内容请参考:全球负载均衡跨地域容灾解决方案(。

三、选择性能共享型还是性能保障型实例 共享型vs保障型-WHY保障型 在如今这个共享经济的时代,像滴滴打车这样的模式是非常火的。

但是即便是有了滴滴打车,但是还有人会去买车,这是因为会出现如下两个大家可能曾经都碰到过的场景: 早晚高峰叫不到车?雨雪天气路边冻成狗?还大幅提价? 假期想远离尘嚣,找个僻静旷野放空自我,叫个滴滴?也许有去,但保证无回! 所以说共享和保障都是客户的需求。

出于对于类似需求的考虑,阿里云的负载均衡也推出了性能保障型实例。

以前所推出的SLB共享型实例是因为性能指标没有办法实现隔离,因为所有的共享型实例都处于同一个大共享资源池中,所以在高峰期的时候就会出现资源的争抢,这样就无法满足对于性能具有刚性需求的大客户的诉求。

除此之外,还有一些体量特别大的超级用户,他们对于性能的要求会是非常高的,但是由于共享型实例无法做到性能隔离,也支持不了大颗粒度的性能指标,所以也无法完成这样的工作。

因此,阿里云推出了性能保障型的负载均衡实例。

超强性能 保障型实例的性能规格如上图所示,其并发连接数最大可以达到500万,每秒的新建链接数(CPS)可以达到50万,针对于七层负载均衡系统的QPS可以达到10万。

除此之外,性能保障型实例还具有以下的特点:超强HTTPS性能。

性能保障型实例针对于七层系统,特别是HTTPS的业务进行了优化,实现了高性能硬加解卡,并且能够实现使HTTPS的业务单实例可达10万QPS。

超大并发连接数。

性能保障型实例的单实例的并发连接数可达500万,所以其可承载物联网场景的下海量连接,可以支撑共享自行车、智能手表等存在特别大量长连接的场景。

共享型实例平滑升级。

原有的共享型实例可以平滑升级至性能保障型实例,而无需更换VIP。

完善的业务监控系统。

在推出性能保障型实例之后,因为每个实例都有相应的性能规格和性能指标,所以阿里云也为用户提供了完整的业务指标监控系统,并支持电话、短信、钉钉企业群等方式的告警。

性能规格 上图所展现的是阿里云SLB性能保障型实例的规格参数。

图中的最后两行规格7、8默认在控制台上是无法购买的,目前只针对企业级用户,而且需通过客户经理申请后,通过白名单开放。

如何选择规格 对于保障型实例而言,主要有如下几个性能指标: 最大连接数:一个实例可承载的最大连接数。

新建连接数:CPS表示一个实例每秒可以新建的链接数。

每秒查询数:QPS表示一个实例7层的像HTTP或者HTTPS系统的吞吐量。

通常一个4层SLB的性能好坏由最大连接数和新建连接数来衡量,它们表示了一个SLB系统的并发能力和处理突发连接的能力。

通常一个7层SLB的性能好坏主要由QPS决定,QPS表示了一个7层系统的吞吐量。

这里需要注意的是QPS是7层独有概念。

虽然每个规格都定义了三个性能指标,但是这并不代表这三个性能指标在任何一个性能场景下或者任何一个时刻都能够同时达到最大值,这里存在一个性能指标的短木板原则。

比如在某一个应用系统中,QPS已经达到指标上限,但最大连接数还远远没有达到上限,这时不论怎样加大客户端数量,最大连接数都会因为QPS达到上限,而无法达到最大值。

对于规格的选择而言,需要通过之前提到的业务监控系统来获取相关指标。

如果用户十分了解自己业务的相关指标,也就是对于高峰期的并发连接数会达到多少以及QPS会达到多少都有非常清晰的了解,也可以直接在控制台上选购。

但是如果用户并不清楚自己的相关业务指标,可以在初期选购按量付费的较高规格的实例,并且在一个业务周期内监控流量的峰值,在峰值确定好之后再通过变配的方式改变到比较合适的实例规格。

目前性能保障型实例还处于公测阶段,所以现在还没有对于实例收取规格费用,也就是说在这个阶段无论用户选择最小规格还是最大规格,实际上都只需要花费IP配置费和带宽费就可以了,这样也比较便于用户去熟悉和使用阿里云的性能保障型实例。

监控和告警 前面也有所提及,在负载均衡的控制台上面能够直接地显示出相应的一些性能指标,但是在这里只能够实现对于性能指标的监控,却无法进行告警。

如果用户需要进行监控告警,可以在阿里云所提供的云监控控制台进行操作。

云监控平台可以监控阿里云中的所有产品并且实现业务告警的定制,并且可以选择包括短信邮件、电话、企业钉钉群等方式进行业务的实时告警。

四、为什么健康检查异常 健康检查机制 接下来分享在负载均衡的日常使用中出现的问题,特别是很多用户都存在疑问的健康检查部分的问题。

阿里云的负载均衡一共可以支持四种协议,四层的负载均衡系统主要包括了TCP、HTTP以及UDP协议,而七层的系统则包括了HTTP和HTTPS,而由于目前HTTP和HTTPS都是使用的普通的HTTP方式,所以其实也可以归结为三类协议。

对于TCP而言,健康检查的过程是通过发送ACK这种TCP的探测报文去探测端口是否仍然存活;对于HTTP而言,则主要使用的是HEAD的请求方式来检查目标的页面是否正常;UDP部分则主要借鉴了SMP协议的原理。

健康检查部分主要会涉及到几个指标,这些指标需要用户在控制台上进行设置,上图中给出了一些默认的建议值,比如响应的超时时间,也就是在每一次进行健康检查的时候,如果超过一定时间健康检查还没有回应就认为这次的健康检查是失败的;还有健康检查间隔,也就是两次健康检查之间通常需要间隔2秒钟;而所谓的不健康阀值和健康阀值就是在网络环境中往往会由于网络的抖动以及其他的因素导致偶尔的一次健康检查失败了,但是这时候并不能认为服务是真的失败了,所以需要设置一个阀值,比如3次就指的是当3次健康检查都失败的时候才会认为后端的服务是存在问题的,然后将其从转发路径中摘除掉。

同样的,当服务从不健康变为健康的时候,也需要进行连续的几次探测,当确定处于稳定的健康状态之后再将其加入到SLB的后端中去。

为啥会失败(TCP) TCP的健康检查也经常会出现一些失败的情况,这里也为大家提供了简单的故障排查顺序供参考。

当出现健康检查失败的时候,首先可以检查一下后端的服务器是否已经启动。

如果后端服务器的负载是比较高的,也可能会因为没有CPU时间去处理健检查的回应,这样就有可能导致健康检查失败。

除此之外,因为对于阿里云的负载均衡而言,健康检查使用的都是私网地址实现的,所以如果根本没有监听到私网地址或者私网地址本身存在故障也会导致健康检查的失败。

还有服务器上可能存在防火墙,将监听端口屏蔽掉了,导致健康检查并未通过。

此外还可能存在一些配置方面的问题,比如提供服务的端口和做健康检查的端口不一致也可能存在健康检查失败。

针对于TCP的健康检查而言,很多用户会经常看到自己的后端服务器上日志上面有很多10或者16这些网段的访问,并且访问流量还比较大,这是因为之前所提到的健康检查具有一定的间隔时间,比如2秒或者3秒一次。

这时候一些用户可能就会认为健康检查会影响服务器的性能,占了很多的服务器的连接数。

其实可以从上图中左侧的报文交互情况看到,当SLB对于云服务器发起健康检查的时候首先会发一个SYN的请求,如果服务器端口是存活的,那么它会回应一个ACK,这个时候SLB端就会紧接着发送RST报文。

也就是说实际上连接是并没有建立的,所以也不会占用后端服务器的连接数的资源,并且对于性能的影响也是极为有限的。

为啥会失败(HTTP) HTTP常见的健康检查失败原因大概会有这样的三点:最常见的情况就是有些用户把服务器的HEAD请求方式禁掉了,因为默认在使用浏览器或者手机等请求一个页面的时候使用的都是GET方式,有时候可能需要上传数据则会使用POST方式,虽然很多服务器都支持HEAD请求方式,但是有些服务器可能会处于安全或者其他复杂因素的考虑将HEAD请求禁掉。

所以在这里建议客户将服务器的HEAD请求方式打开,因为阿里云负载均衡七层健康检查方案就是使用的HEAD方案。

另外一种常见情况就是页面访问本身上就存在问题,这样的情况下健康检查也是无法通过的。

最后一种常见情况就是期望结果配置错误,针对于七层的健康检查是通过使用HEAD请求方式去请求页面,页面返回码可能会是200、300或者400以及500等,用户可以在健康检查的配置中设定预期的正常情况下的返回码值,当健康检查返回码值与预期值不一致就会判定健康检查是失败的。

为啥会失败(UDP) 这里介绍一下UDP健康检查的原理。

首先,健康检查通过SLB向后端发送UDP报文探测来获取状态信息。

SLB会周期性地给后端ECS发送UDP报文,如果UDP端口的业务处于正常情况,则没有任何回应。

而当服务出现问题,比如指定的UDP服务端口处于不可达的情况或者无服务的状态的时候,会回复ICMP的不可达报文。

这里也会存在一个问题就是如果后端服务器已经变成了网络中的孤岛,比如出现了整个服务器的掉电、关机情况这样完全不能工作的状态,这时候的ICMP不可达报文是永远不可能收到的,因为后端的服务器无法收到SLB发来的UDP探测报文,那么在这种情况下,可能会出现误认为后端健康的情况,但是实际上这个服务可能已经宕掉了。

为了应对这种情况,健康检查还提供用户自定义UDP应答报文来实现精确的UDP健康检查,也就是由用户自定义指定一个字符串,当后端的云服务器收到UDP健康检查的探测的时候,也回应指定的字符串,之后SLB对于这个字符串进行对比和校验,如果匹配成功则认为服务一定是健康的,这样就可以实现非常精确的健康检查。

而UDP的健康检查失败也有很多原因,比如在协议栈里面有可能会有ICMP限速保护。

当频率达到一定速率的时候,ICMP会被协议栈限制,后端无法回应ICMP不可达报文,进而导致SLB收不到ICMP的报文,出现健康检查的失败情况。

所以这部分是需要注意的,如果可能尽量将速率限制放大一些。

其他问题 健康检查时好时坏的可能原因如下: HTTP类型健康检查目标URI响应慢。

比如本身是动态页面,会涉及到大量的计算才能够渲染完成并返回到前端,这样肯定就会导致健康检查响应比较慢。

如果服务器负载过高同样也会出现这样的问题。

未全部放开对SLB健康检查源地址的限制导致分布式健康检查失败。

因为阿里云的服务器都是分布式的部署,健康检查也会是分布式的探测,LVS等机器在后端有不同的源去针对某一个云服务器进行探测的,所以如果没有将这些源地址都放开,实际上也会影响健康检查的效率,因为对于这么多机器而言,只要有一台机器检测到是正常的那么就是正常的。

还可能出现直接访问正常,但是健康检查失败的情况。

造成这样情况的可能原因如下: 防火墙限制。

目的端口不一致。

检查方法不同,可能使用浏览器看页面是没问题的,但是健康检查却不行,这就是因为刚才所提到的HEAD方法没有开启。

或者七层的健康检查配置了URL按照域名转发,但是在浏览器上直接访问则是使用域名去做的,而健康检查是使用IP地址做的,这样也可能出现转发和预期结果的不同。

检查频率不同,ICMP限速。

五、为什么负载不均衡 调度算法与会话保持 首先介绍一下负载均衡的调度算法。

阿里云的负载均衡支持三种算法,第一种算法是单纯的轮询(RR),也就是将业务的请求依次地分发到后端的服务器。

第二种算法是加权轮询(WRR),也就是在处理调度的时候会根据针对于每一台后端服务器设置权重来进行转发。

这里之所以设置权重是因为后端服务器的处理能力可能是不同的,如果使用相同的权重进行轮询可能就会把后端处理能力比较弱的服务器挤爆,所以需要针对于服务器的处理能力设置一些权重。

第三种算法是针对于加权最小连接数的轮询(WLC),也就是除了根据每台后端服务器设定的权重值来进行轮询,同时还考虑后端服务器的实际负载,也就是连接数。

当权重值相同时,当前连接数越小的后端服务器被轮询到的次数也越高,这样就能够保证负载尽量地均衡。

如果不考虑这一点就会造成某些服务器连接数已经很高了但是流量依然还往上面分发,而另外一些服务器却一直处于空闲状态。

会话保持指的是来自同一用户请求始终保持分发到同一台后端的云服务器上。

对于同一用户而言,使用的是四层的负载均衡和使用七层的负载均衡在理解上是不一样的。

如果是四层负载均衡,则会使用源IP地址标识同一用户,所以如果在可能会有很多办公电脑的大型企业中,这些电脑在企业内部是通过局域网的IP进行通信的,在访问公网的时候都是通过NAT网关处理的,所以在走到Internet的时候,源地址通常会是一个或者很有限的几个。

在这种情况下,如果是四层的负载均衡就会把里面所有的请求都视为来自同一个用户的,这种情况下如果开启了会话保持,就会发生问题。

而七层的负载均衡是根据用户浏览器中的Cookie来进行唯一识别的,对于刚才的案例在大型企业里面因为内网访问公网的源地址都是一样的,导致没有办法识别到底是不是同一个用户,此时建议使用七层的负载均衡方案解决,因为Cookie是每个浏览器都唯一的。

会话的保持时间是可以在控制台上配置的,四层的负载均衡方案最大可达1小时,而七层的方案最大可达24小时。

为何不均衡 最后分享一下不均衡的常见情况。

有时候会需要新加一个服务器进来,这时候往往到新加进来的服务器上的连接会很少,这是因为可能会存在以下原因: 存在会话保持的情况下,会话保持会让请求停留在原有的服务器上,这样到新加进来的服务器上的连接自然会少一些。

权重设置不一致,如果在权重的设置上存在区别,而新加进来的服务器的权重如果很低,连接也过不去。

应用属于长连接类型,因为需要在TCP上复用,如果客户端不主动断开连接,后续所有的请求都会继续复用当前服务器上的连接,只有新建连接才有可能到新的服务器上。

而有时候在业务量或者新建连接较少时,也会出现负载不均衡的问题。

这是因为每个Core都是独立的调度单元,因此可能存在将某个Client的多条业务经过不同core的调度后全部转发到一台ECS上的情况,同时由于业务量较少,因此出现了不均衡。

建议使用轮询算法解决,在RR轮询算法中加入了扰乱因子,可以更加有效的打散SLB到后端的转发路径。

原文链接

赞(0)
未经允许不得转载:优乐评测网 » 云服务器时区管理的最佳解决方案:保持分布式团队和业务协调一致 (云服务器时间不对)

优乐评测网 找服务器 更专业 更方便 更快捷!

专注IDC行业资源共享发布,给大家带来方便快捷的资源查找平台!

联系我们