双机热备的原理

转载自 双机热备的原理

夜半惊魂

上次的文章《负载均衡的原理》中讲到,张大胖在Bill的指导下,成功地开发了一个四层的负载均衡软件, 把流量“均匀地”分发到了后面的几个服务器中, 获得了老板的1000块钱奖励。



但是张大胖心中隐隐不安,总觉得系统埋着一颗定时炸弹,随时会引爆,这个炸弹就是:  Load Balancer 只有一台服务器,万一这个服务器挂掉了怎么办?


没有了Load Balancer这个入口,用户的请求无法分发过来,后面的这些服务器只能干瞪眼了。


系统有“单点失败(Single Point of Failure)”的风险就是这个意思。


有一天晚上张大胖做了一个梦,梦见这个Load Balancer在高峰期挂掉了,导致整个系统瘫痪,看到损失了无数的订单, 愤怒的老板不停地向他咆哮:扣你小子半年工资。


吓得张大胖半夜醒来,出了一身冷汗。


不想单点失败该怎么办? 张大胖稍微思索下就能想到解决方案: 上两台Load Balancer !


可问题是:客户端究竟要访问哪一个?



还用DNS轮询的方式? 那就回到最原始的问题了。


在这两个Load Balancer之前再加一个Load Balancer?  那岂不又是单点失败?


不,这个路子是走不通的。


张大胖准备另辟蹊径。


在客户端看来,这两个Load Balancer 最好是一个整体,就像一个虚拟的服务器, 这个虚拟的服务对外提供一个IP (简称VIP)。



两个Load Balancer中,一个叫做Master, 另外一个可以叫做Backup , 平时Master 负责干活, Backup待命,一旦Master挂掉, Backup 服务器立刻接管。  在外界看来,那个虚拟的服务器还在工作,并不知道内部发生的“大地震”。


想到这里,张大胖激动起来,竟然睡不着了, 干脆爬起来看邮件,写代码。


详细设计

第二天,张大胖七点就来到了公司,想着把昨晚的方案给Bill 汇报下。


可是他来得太早了,公司空无一人。 罢了,很多细节还没有完善,先不着急。


首先是这个虚拟的VIP , 怎么才能实现在两个服务器之间的“IP漂移”呢?


张大胖曾经记得,一个网卡可以设置多个地址,比如在Linux上eth0表示网卡1,它可以绑定一个IP, 与此同时,还可以设置一个ip alias  或者 secondary ip 。


eth0 --> 192.168.1.10

eth0:1  --> 192.168.1.100


张大胖想: 我可以让这个192.168.1.100为VIP,如果服务器是Master, 就可以把这个IP给绑定上, 如果是Backup,那就不绑定。


换句话说,通过动态地绑定/解绑 就可以让这个VIP在两个服务器之间来回“漂移”了。



“IP漂移”的问题可以这么解决, 但是那个Backup 怎么知道Master 挂掉了呢?


从道理上说,很简单,只需要让Master不断地给Backup发“心跳”消息即可(可以采用广播的方式发消息), 这个Backup(LoadBalancer2)得有个定时器, 如果在一个特定的时间(嗯,这个时间应该可以设置)内收不到心跳,那就认为Master完蛋了,就需要挺身而出,擦干眼泪,继承前任的遗志,很Happy地绑定VIP , 继续伟大的革命事业。


可是那个之前的Master(LoadBalancer1)如果又活了呢?


LoadBalancer2 该怎么办?革命的康庄大道还没走几步, 就要拱手让出还没捂热乎的VIP吗?


如果LoadBalancer1是个性能更加强悍的机器,同志们肯定希望由他来统领全局。


这里得定义一个策略,每个机器都得有个优先级(一个整数),在允许抢占的情况下,谁的优先级高,谁就是Master!


张大胖想到: 看来需要我开发一个软件了,实现这些通信“协议”和策略, 这个软件需要安装运行在每个Load Balancer上,让他们组成单个虚拟的Load Balancer, 对外提供服务。


在每个Load Balancer中,状态转换是这样的, 张大胖画了一张图:



汇报工作

到了9点钟, CTO Bill 准时上班, 张大胖赶忙跑去向领导汇报昨晚和今早的思想动态。


Bill 听完,沉吟片刻,说道:“这个主意不错,我支持! 可是。。。。。。”


张大胖立刻紧张起来, 自己想得挺完善的啊,难道还有问题?


只听Bill 说道:“你可以让那个IP地址在两个主机之间漂移,实现主备切换, 但是MAC地址怎么办? ”


张大胖说:“MAC地址 ? 关MAC地址什么事? ”


啊 ! 他突然明白了,确实是忽略了, IP包是被封装在以太网帧中发送的,其中需要MAC地址。



在发送第一个请求的时候,客户端(确切说是直接向Load Balancer发数据的那个机器)先是知道了VIP(如:192.168.1.100), 接下来它需要知道这个VIP的MAC地址,这样才能发送数据。


为了拿到MAC地址,它需要发起ARP查询: 这个VIP(192.168.1.100)的 MAC的地址是什么?


如果Load Balancer 1是Master ,就会回复: 是23:39:8D:9C:0A:33  (记为 MAC1)


这时候客户端就会缓存,记下来。


然后Load Balancer 1 挂掉, Load Balancer 2 成为 Master。


此时客户端如果再次发送数据,还会往MAC1去放送,于是就出错了。


想通了这一层, 张大胖犯了愁, 这可怎么办?


Bill 提醒道:“你不是有个虚拟的IP地址吗? 是不是也可以搞一个虚拟的MAC地址啊!”


张大胖如梦方醒: “对对, 无论是哪个机器成为Master, 每次响应ARP请求的时候,都返回这个虚拟的MAC地址。这样客户端面对的MAC地址就唯一了。”


看来虚拟IP + 虚拟的MAC 地址才能完整地解决问题!

申请机器

张大胖把软件开发出来了,小心翼翼地向抠门的老板去申请机器,老板看了方案,提了一个让张大胖大跌眼镜的问题: “你这里整了两个Load Balancer服务器, 但是平时只用一个,另外一个一直空闲,是不是极大的浪费啊?”


怎么办?张大胖挠了挠头,犯难了。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c# 向mysql插入数据_C#连接mysql数据库 及向表中插入数据的方法

mysql 语句操作:创建数据库:create database hotelATMDb;use hotelATMDb;C#连接mysql1、引用 dll MySql.Data.dll 下载地址:http://download.csdn.net/detail/chen504390172/67461312、引用 using MySql.Data.MySqlClient;连接语句&#xff1…

微软CEO纳德拉开讲,2016微软开发者峰会在京召开

6月1日,2016微软开发者峰会在京召开。 来自微软总部的高层、技术大拿, 以及来自微软亚洲研究院、微软亚太研发集团、Xamarin 总部团队、微软中国开发体验及平台合作事业部的技术专家对各平台的开发进行技术探讨,向开发者展示了一系列引人入胜…

Linux下如何避免误操作执行 rm

转载自 Linux下如何避免误操作执行 rm最近IT圈子流行着一个段子:某个蠢萌的程序员,不小心在公司的服务器上输入了 rm -rf/ 指令,结果......现在还没出狱呢。当然,绝大部分程序员不可能犯下如此低级的错误,更何况也没有…

Consul入门

简介 为什么要用consul,这里就不详细介绍了,本文重点是Consul的搭建和使用过程。 Consul搭建 参考文献:http://tonybai.com/2015/07/06/implement-distributed-services-registery-and-discovery-by-consul/ 下载consul和consul UI 官方地址&…

Java Socket编程----通信是这样炼成的

转载自 Java Socket编程----通信是这样炼成的 Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket。像大家熟悉的QQ、MSN都使用了Socket相关的…

mysql级联复制转换成一主两从_一主两从转级联复制

一主两从 转 级联复制 示意图如下M ---> S1\ > M ---> S1 ---> S2\ --> S2如果有开启GTID操作起来方便多,GTID是唯一的,直接操作即可。如果使用file_name、position可以使用如下办法(现在还没开启gtid真的是无力吐槽)# 步骤1、# 现将S2的…

细说ASP.NET Core与OWIN的关系

前言 最近这段时间除了工作,所有的时间都是在移植我以前实现的一个Owin框架,相当移植到到Core的话肯定会有很多坑,这个大家都懂,以后几篇文章可能会围绕这个说下,暂时就叫《Dotnet Core踩坑记》吧,呵呵。 接…

mysql 外键和事务_Mysql (五)事务和外键

一、 什么是事务:简单说,所谓事务就是一组操作,这组操作要么都成功执行,要么都不执行。二、 事务的使用流程1. 第一步:开启事务,start transaction;2. 第二步:正常操作SQL语句&#…

微软发布正式版SQL Server 2016

微软于6.2 在SQL 官方博客上宣布 SQL Server 数据库软件的正式发布版本(GA),历时一年多,微软为该软件发布了多个公共预览版和候选版本,而今天最终版本终于上线了。在博客中,微软数据集团的企业副总裁 Josep…

怎样用bootsrapcol-md来实现四分屏_用会议平板提升会议效率,做好这两点

图片:皓丽编辑:好哩据相关科学研究显示,百分之 90% 的会议,完全可以在低于 30 分钟的时间内完成,而人的注意力集中的时间差不多也是在 40-45 分钟,所以提升会议效率,保持会议节奏的连续性和抓住…

JAVA 通过 Socket 实现 TCP 编程

转载自 JAVA 通过 Socket 实现 TCP 编程简介 TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层…

Asp.net core与golang web简单对比测试

最近因为工作需要接触了go语言,又恰好asp.net core发布RC2,就想简单做个对比测试。 下面是测试环境: CPU:E3-1230 v2 内存:16G 电脑有点不给力 操作系统:Centos7.0(虚拟机单核2G内存) asp.net core rc2 golang v1.7beta1 下面是各…

mfc定义了变量仍提示未定义标识符_JavaScript-变量

好好学习,天天向上本章主要内容是:变量声明、命名规则、赋值变量变量(variables) 是计算机内存中存储数据的标识符,根据变量名称可以获取到内存中存 储的数据变量相当于一个容器,内部可以存储任意类型的数据…

Java基于socket服务实现UDP协议的方法

转载自 Java基于socket服务实现UDP协议的方法这篇文章主要介绍了Java基于socket服务实现UDP协议的方法,通过两个简单实例分析了java通过socket实现UDP发送与接收的技巧,需要的朋友可以参考下本文实例讲述了Java基于socket服务实现UDP协议的方法。分享给大家供大家参考。具体如下…

EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因

今天我们来聊聊EF的日志记录. 一个好的数据库操作记录不仅仅可以帮你记录用户的操作, 更应该可以帮助你获得效率低下的语句来帮你提高运行效率 废话不多说,我们开始 环境和相关技术 本文采用的环境与技术 系统:WIN7 数据库:SQL Server2008 相关技术:MVC5 EF6.0 简单的记录 …

日期相减 python_如果将excel的数字转化为日期(高级教程)

不知道大家有没有这样的体会,明明我们在单元格里输入的是一个日期,但是excel却提示我们输入的是一个数字,这个东西就很奇怪了,43471怎么就成了日期了那?实际上这和计算机的底层设置有关系,计算机是无法直接…

JSOUP 教程—— Java爬虫,简易入门,秒杀htmlparser

转载自 JSOUP 教程—— Java爬虫,简易入门,秒杀htmlparser关于爬虫,之前一直用做第一个站的时候,记得那时候写的 爬虫 是爬sina 的数据,用的就是 htmlparser 可能是由于好奇和满足我当时的需求,那开始就各…

3到6年的.NETer应该掌握哪些知识

我们组的开发人力一直比较紧张,今年春节后,高层终于给了几个headcount,我们可以开始招人了。从三月初我们就开始找简历,渠道有拉钩,内推,我司自己的招聘网站和智联等。简历筛了很多,也打了很多电…

多边形上点的顺序排序_一种寻找多边形视觉中心的新算法

遇到的问题在一个多边形上放置文本标签或工具提示的最佳位置通常位于其“视觉中心”的某个位置,即多边形内部的一个点,周围有尽可能多的空间。计算这样一个中心首先想到的是多边形质心。你可以用一个简单快速的公式计算多边形中心,但如果形状…

通过Jexus 部署 dotnetcore版本MusicStore 示例程序

ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mono等)上使用MVC 和Entity Framework的示例程序,本文将展示如何在CentOS上运行.NET Core版本的MusicStore,并通过Jexus对外发布。 上篇文章 《结合Jexu…