【干货】负载均衡!中级运维必知的10个问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【干货】负载均衡!中级运维必知的10个问题相关的知识,希望对你有一定的参考价值。

参考技术A

负载均衡!中级运维必知的10个问题

负载均衡 是衡量初中级以上运维技术水平的重要标尺!

负载均衡 是普通运维人员很难有机会接触和系统学习的知识!

一、负载均衡转发数重要吗?

keepalived + lvs 的组合,执行ipvsadm ,输出的数据显示了每个后端服务器连接的数量,一些服务器的值高些,而一些却低一些。一些人纠结:怎么a服务器活跃数是90,而b服务器才55?

负载均衡的均衡是相对的,当访问量很小的时候,这个差异会明显一些。一旦上量,差别就会缩小。比如活跃数都是数千个,一些机器多几十或者少几百,你不会觉得有什么不妥。

负载均衡的主要目标是高可用,只要负载均衡、监控检查、失败切换三个功能正常,并且从用户的角度出发,访问应用(比如网站)一切正常,才是重点,多几个负载量,少几个负载量无关紧要。

二、哪种负载均衡工具更好?

lvs + keepalived、haproxy+nginx、nginx + keepalived几种组合,keepalived倒是一致之选,而其它几个工具,选谁更好呢?

看场景吧,缓存类的应用,如squid适合lvs;其它情形可根据自己的使用习惯来选择。

现在一般的web服务,弃用apache而选nginx居多,如果负载均衡再部署一个nginx,变成keepalived + nginx + nginx 的形式,个人感觉有点别扭,更愿意选择haproxy。

三、vip不漂移怎么办?

很多时候可能是输入的时候不小心,犯了低级的错误。比如keepalived里边,主备两系统的router_id不一致、或者virtual_router_id不一致。

这类错误比较难以排查,在书写的时候,一定要仔细。

另外一个情况可能是,在同一个局域网内,有多个负载均衡集群存在,集群之间的router_id 、virtual_router_id 要注意分别,保持唯一性。

四、完成负载均衡的最佳实践?

经常在网上有人求助,按文档部署的集群不能正常的工作。通过沟通,发现工作方式往往不正确。

那么正确、高效的方式是什么呢(有些人称最佳实践)?请往下看:

五、什么情况下需要负载均衡?

有人说我没那么大的访问量,用负载均衡有点浪费。负载均衡是实现高可用的手段之一,不是以流量大小为出发点的。

如果你的公司或者机构,主要收入来自与网络的话,发生故障造成服务不可访问,造成的损失是否可以忍受,考虑好这个,再做决策。

还有人说,我用了阿里云、腾讯云,弹性计算、高可用,买个高配的云主机,要什么负载均衡!建议多了解一下,这些云服务商有专门的负载均衡,要花钱的,用不着的话,它推这个有啥意义?

六、开源软件不稳定吗?

这是商业解决供应商的说辞,他们的市场做得比较成功,以至于一些技术人员,一旦提及开源解决方案,第一反应就是:开源的稳定么?性能上得去么?

前几天有个系统集成商也只要质疑,我回答他:“你拿一个商业软件,我找一个对应的开源软件比比如何?”

七、公有云上的负载均衡?

大部分公有云不提供havip支持,因此在技术上不太容易实现负载均衡。

从产品设计上考虑,用户自己部署负载均衡,会与云服务商推出的服务产生冲突。

从其不断推出的产品线来看,恨不得把所有的服务都囊括进去,让用户从此依赖服务商,财源滚滚。

八、如何快速排查负载均衡故障?

步骤如下:

A.确定问题是部分还是全部?是网络问题还是系统问题?

B.检查后端服务是否正常。因为后端才是真实提供服务的场所,是整个负载均衡存在的根基(就算负载均衡体系暂时崩溃了,只要后端服务正常,可临时采取措施,把用户请求直接暴露给用户,可最快速度恢复业务)。在实际的工作中,大部分的故障集中在后端服务器,比如大名鼎鼎的502。

C.排查负载均衡是否正常。一般情况下,负载均衡服务器基本不安装其它服务(一机多用者慎重),因此,除了硬盘被日志塞满产生故障外,另外一个可能就是硬件损坏。本人管理的系统,运行时间最长的负载均衡服务器,有超过八年没趴窝的。

九、有负载均衡就完事无忧了么?

部署了负载均衡,后端服务器可以部分失效、负载均衡器本身也可以有一个失效。看起来很让人放心,就算发生故障,也暂时能顶一阵。是不是慢吞吞地地心情好了,想起来了再去做故障恢复?

最好不要这样干,有故障发生,发现以后,尽可能快的把故障修复并再次加入集群,不玩心跳。

十、负载均衡能承载多大的并发?

这与后端服务关系密切,后端程序、逻辑性能极佳,承载的并发数就大;反之就小,无确切的数据支撑。

上线前,有可能对系统做压力测试,但这种测试大部分是一致性测试(至少是同一个访问源),与真实的用户访问还是存在很大差异。

真实的用户访问,来源不同,访问的对象不同,比如有的用户网络环境差,访问速度慢,完成一次连接的时间长,占有资源的释放时间就要久一些。这种测试可做大概的参考,评估时应该预留余量。

必知的 15 个jQuery小技巧(干货)

1.返回顶部按钮

你可以利用 animate 和 scrollTop 来实现返回顶部的动画,而不需要使用其他插件.

$('a.top').click(function(){
    $(document.body).animate({scrollTop:0},800);returnfalse
});

改变 scrollTop 的值可以调整返回距离顶部的距离,而 animate 的第二个参数是执行返回动作需要的时间(单位:毫秒)。

2.预加载图片


如果你的页面中使用了很多不可见的图片(如:hover 显示),你可能需要预加载它们:

$('a.top').click(function(){
    $(document.body).animate({scrollTop:0},800);returnfalse
});

3.检查图片是否加载完成

有时候你需要确保图片完成加载完成以便执行后面的操作:

$('img').load(function(){
  console.log('image load successful');
});

你可以把 img 替换为其他的 ID 或者 class 来检查指定图片是否加载完成。


4.自动修改破损图像

如果你碰巧在你的网站上发现了破碎的图像链接,你可以用一个不易被替换的图像来代替它们。添加这个简单的代码可以节省很多麻烦:

$('img').on('error',function(){
  $(this).prop('src','img/broken.png');
});

即使你的网站没有破碎的图像链接,添加这段代码也没有任何害处。


5.鼠标悬停(hover)切换Class属性

假如当用户鼠标悬停在一个可点击的元素上时,你希望改变其效果,下面这段代码可以在其悬停在元素上时添加 class 属性,当用户鼠标离开时,则自动取消该 class 属性:

$('.btn').hover(function(){
  $(this).addClass('hover');},function(){
    $(this).removeClass('hover');
});

你只需要添加必要的CSS代码即可。如果你想要更简洁的代码,可以使用 toggleClass 方法:

$('.btn').hover(function(){ 
  $(this).toggleClass('hover');
});

注:直接使用CSS实现该效果可能是更好的解决方案,但你仍然有必要知道该方法。


6.禁用 input 字段

有时你可能需要禁用表单的 submit 按钮或者某个 input 字段,直到用户执行了某些操作(例如,检查“已阅读条款”复选框)。可以添加 disabled 属性,直到你想启用它时:

$('input[type="submit"]').prop('disabled',true);

你要做的就是执行 removeAttr 方法,并把要移除的属性作为参数传入:

$('input[type="submit"]').removeAttr('disabled');

7.阻止链接加载

有时你不希望链接到某个页面或者重新加载它,你可能希望它来做一些其他事情或者触发一些其他脚本,你可以这么做:

$('a.no-link').click(function(e){
  e.preventDefault();
});

8.切换 fade/slide

fade 和 slide 是我们在 jQuery 中经常使用的动画效果,它们可以使元素显示效果更好。但是如果你希望元素显示时使用第一种效果,而消失时使用第二种效果,则可以这么做:

$('.btn').click(function(){
  $('.element').fadeToggle('slow');
});
$('.btn').click(function(){
  $('.element').slideToggle('slow');
});

9.简单的手风琴效果

这是一个实现手风琴效果快速简单的方法:

$('#accordion').find('.content').hide();
$('#accordion').find('.accordion-header').click(function(){varnext= $(this).next();next.slideToggle('fast');
  $('.content').not(next).slideUp('fast');returnfalse;
});

10.让两个 DIV 高度相同

有时你需要让两个 div 高度相同,而不管它们里面的内容多少。可以使用下面的代码片段:

var $columns = $('.column');var height =0;$columns.each(function(){if($(this).height()> height){
    height = $(this).height();}
});
$columns.height(height);

这段代码会循环一组元素,并设置它们的高度为元素中的最大高。

11.css3实现div的淡入淡出效果。

@-webkit-keyframes fadeIn{0%{
opacity: 0;/*初始状态*/flter:"Alpha(Opacity=0)";
}20%{opacity: 0.2;flter:"Alpha(Opacity=0.2)";
}40%{opacity: 0.4;flter:"Alpha(Opacity=0.4)";
}60%{opacity: 0.6;flter:"Alpha(Opacity=0.6)";
}80%{opacity: 0.8;flter:"Alpha(Opacity=0.8)";
}100%{opacity: 1.0;flter:"Alpha(Opacity=1.0)";
}}
.fadeInShow{-webkit-animation-name: fadeIn;/*动画名称*/-webkit-animation-duration: 300ms; /*动画持续时间*/-webkit-animation-iteration-count: 1; /*动画次数*/-webkit-animation-delay: 0s; /*延迟时间*/}

引入动画效果:

$('.my-project-selector').hover(function(){
$('#project-popover').css('display','block').addClass('fadeInShow');
},function(){
$('#project-popover').css('display','none').removeClass('fadeInShow');
});

12、Jquery遍历一组checkbox复选框,取出选中的值放在数组里

var obj = $("input[name='projectId']"),arr=[],i=0;for(;i<obj.length;i++){
  if(obj[i].checked){
    arr.push(obj[i].value);
  }
}


13、jquery的ajax错误error方法查看状态值代码

error: function(XMLHttpRequest) {      //(canceled)==捕捉到的状态值是 “0”
      if(XMLHttpRequest.status=="0"){      //屏蔽canceled状态值         }
}


14、超出部分截取字符,显示“...”(超出的文字自动+省略号)

$.fn.limit=function(){var self = $("*[limit]");
   self.each(function(){var objString = $.trim($(this).text());var objLength = $.trim($(this).text()).length;var num = $(this).attr("limit");if(objLength > num){
$(this).attr("title",objString);
               objString = $(this).text(objString.substring(0,num) + "...");
            }
         }
   )
};


使用方式:<span limit="5">天空飘来五个字,那都不是事儿</span>
当前页面写入:
$("span[limit]").limit();

15、光标定位到字符最后(使用场景:input=text文本框获取焦点后,光标显示在字符最后)

$.fn.selectRange = function(start, end) {return this.each(function() {if (this.setSelectionRange) {this.focus();this.setSelectionRange(start, end);
      } else if (this.createTextRange) {var range = this.createTextRange();
         range.collapse(true);
         range.moveEnd('character', end);
         range.moveStart('character', start);
         range.select();
      }
   });
};


16、JS判断是否为数组:

Object.prototype.toString.call([1,2,3]) === [object Array]   //true

以上是关于【干货】负载均衡!中级运维必知的10个问题的主要内容,如果未能解决你的问题,请参考以下文章

负载均衡!中级运维必知的10个问题

运维必学:全局负载均衡与CDN内容分发

SNMP概述–运维必知的协议基础

运维必知的网络基础知识!

运维必知的 Vi/Vim 编辑器使用命令

Linux企业运维——LVS负载均衡