TCP接入层的负载均衡、高可用、扩展性架构
一、web-server的负载均衡
互联网架构中,web-server接入一般使用nginx来做反向代理,实施负载均衡。整个架构分三层:
上游调用层,一般是browser或者APP
中间反向代理层,nginx
下游真实接入集群,web-server,常见web-server的有tomcat,apache
整个访问过程为:
browser向daojia.com发起请求
DNS服务器将daojia.com解析为外网IP(1.2.3.4)
browser通过外网IP(1.2.3.4)访问nginx
nginx实施负载均衡策略,常见策略有轮询,随机,IP-hash等
nginx将请求转发给内网IP(192.168.0.1)的web-server
由于http短连接,以及web应用无状态的特性,理论上任何一个http请求落在任意一台web-server都应该得到正常处理(如果必须落在一台,说明架构不合理,不能水平扩展)。
问题来了,tcp是有状态的连接,客户端和服务端一旦建立连接,一个client发起的请求必须落在同一台tcp-server上,此时如何做负载均衡,如何保证水平扩展呢?
二、单机法tcp-server
单个tcp-server显然是可以保证请求一致性:
client向tcp.daojia.com发起tcp请求
DNS服务器将tcp.daojia.com解析为外网IP(1.2.3.4)
client通过外网IP(1.2.3.4)向tcp-server发起请求
方案的缺点?
无法保证高可用。
三、集群法tcp-server
通过搭建tcp-server集群来保证高可用,客户端来实现负载均衡:
client内配置有tcp1/tcp2/tcp3.daojia.com三个tcp-server的外网IP
客户端通过“随机”的方式选择tcp-server,假设选择到的是tcp1.daojia.com
通过DNS解析tcp1.daojia.com
通过外网IP连接真实的tcp-server
如何保证高可用呢?
如果client发现某个tcp-server连接不上,则选择另一个。
潜在的缺点?
每次连接前,需要多实施一次DNS访问:
难以预防DNS劫持
多一次DNS访问意味着更长的连接时间,这个不足在手机端更为明显
如何解决DNS的问题?
直接将IP配置在客户端,可以解决上述两个问题,很多公司也就是这么做的(俗称“IP直通车”)。
“IP直通车”有什么新问题?
将IP写死在客户端,在客户端实施负载均衡,扩展性很差:
如果原有IP发生变化,客户端得不到实时通知
如果新增IP,即tcp-sever扩容,客户端也得不到实时通知
如果负载均衡策略变化,需要升级客户端
四、服务端实施负载均衡
只有将复杂的策略下沉到服务端,才能根本上解决扩展性的问题。
增加一个http接口,将客户端的“IP配置”与“均衡策略”放到服务端是一个不错的方案:
client每次访问tcp-server前,先调用一个新增的get-tcp-ip接口,对于client而言,这个http接口只返回一个tcp-server的IP
这个http接口,实现的是原client的IP均衡策略
拿到tcp-server的IP后,和原来一样向tcp-server发起TCP长连接
这样的话,扩展性问题就解决了:
如果原有IP发生变化,只需要修改get-tcp-ip接口的配置
如果新增IP,也是修改get-tcp-ip接口的配置
如果负载均衡策略变化,需要升级客户端
然而,新的问题又产生了,如果所有IP放在客户端,当有一个IP挂掉的时候,client可以再换一个IP连接,保证可用性,而get-tcp-ip接口只是维护静态的tcp-server集群IP,对于这些IP对应的tcp-server是否可用,是完全不知情的,怎么办呢?
五、tcp-server状态上报
get-tcp-ip接口怎么知道tcp-server集群中各台服务器是否可用呢,tcp-server主动上报是一个潜在方案,如果某一个tcp-server挂了,则会终止上报,对于停止上报状态的tcp-server,get-tcp-ip接口,将不返回给client相应的tcp-server的外网IP。
该设计的存在的问题?
诚然,状态上报解决了tcp-server高可用的问题,但这个设计犯了一个“反向依赖”的耦合小错误:使得tcp-server要依赖于一个与本身业务无关的web-server。
六、tcp-server状态拉取
更优的方案是:web-server通过“拉”的方式获取各个tcp-server的状态,而不是tcp-server通过“推”的方式上报自己的状态。
这样的话,每个tcp-server都独立与解耦,只需专注于资深的tcp业务功能即可。
高可用、负载均衡、扩展性等任务由get-tcp-ip的web-server专注来执行。
多说一句,将负载均衡实现在服务端,还有一个好处,可以实现异构tcp-server的负载均衡,以及过载保护:
静态实施:web-server下的多个tcp-server的IP可以配置负载权重,根据tcp-server的机器配置分配负载(nginx也有类似的功能)
动态实施:web-server可以根据“拉”回来的tcp-server的状态,动态分配负载,并在tcp-server性能极具下降时实施过载保护
七、总结
web-server如何实施负载均衡?
利用nginx反向代理来轮询、随机、ip-hash。
tcp-server怎么快速保证请求一致性?
单机。
如何保证高可用?
客户配置多个tcp-server的域名。
如何防止DNS劫持,以及加速?
IP直通车,客户端配置多个tcp-server的IP。
如何保证扩展性?
服务端提供get-tcp-ip接口,向client屏屏蔽负载均衡策略,并实施便捷扩容。
如何保证高可用?
tcp-server“推”状态给get-tcp-ip接口,
or
get-tcp-ip接口“拉”tcp-server状态。
TCP接入层的负载均衡、高可用、扩展性架构的更多相关文章
- LVS+Keepalived-DR模式负载均衡高可用集群
LVS+Keepalived DR模式负载均衡+高可用集群架构图 工作原理: Keepalived采用VRRP热备份协议实现Linux服务器的多机热备功能. VRRP,虚拟路由冗余协议,是针对路由器的 ...
- 实现基于Haproxy+Keepalived负载均衡高可用架构
1.项目介绍: 上上期我们实现了keepalived主从高可用集群网站架构,随着公司业务的发展,公司负载均衡服务已经实现四层负载均衡,但业务的复杂程度提升,公司要求把mobile手机站点作为单独的服务 ...
- Linux下"负载均衡+高可用"集群的考虑点 以及 高可用方案说明(Keepalive/Heartbeat)
当下Linux运维技术越来越受到企业的关注和追捧, 在某些企业, 尤其是牵涉到电子商务和电子广告类的网站,通常会要求作负载均衡和高可用的Linux集群方案.那么如何实施Llinux集群架构,才能既有效 ...
- Lvs+keepAlived实现负载均衡高可用集群(DR实现)
第1章 LVS 简介 1.1 LVS介绍 LVS是Linux Virtual Server的简写,意为Linux虚拟服务器,是虚拟的服务器集群系统,可在UNIX/LINUX平台下实现负载均衡集群功能. ...
- HAProxy实现slave负载均衡[高可用]
下面要执行的是HAProxy部分 这是一个集群,其他的部分在: mysql-cluster 7.3.5安装部署 mysql主备部署[高可用] mysql主备切换[高可用] mysql读写分离[高可用] ...
- linux系统下对网站实施负载均衡+高可用集群需要考虑的几点
随着linux系统的成熟和广泛普及,linux运维技术越来越受到企业的关注和追捧.在一些中小企业,尤其是牵涉到电子商务和电子广告类的网站,通常会要求作负载均衡和高可用的Linux集群方案. 那么如何实 ...
- Nginx+Keepalived负载均衡高可用
Nginx+Keepalived负载均衡高可用方案: Nginx 使用平台:unix.linux.windows. 功能: A.www web服务 http 80 b.负载均衡(方向代理proxy) ...
- JAVAEE——宜立方商城03:Nginx负载均衡高可用、Keepalived+Nginx实现主备
1 nginx负载均衡高可用 1.1 什么是负载均衡高可用 nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机后端web服务将无法提供服务, ...
- Nginx负载均衡高可用
1. Nginx负载均衡高可用 首先介绍一下Keepalived,它是一个高性能的服务器高可用或热备解决方案,Keepalived主要来防止服务器单点故障的发生问题,可以通过其与Nginx的配合实 ...
随机推荐
- vue-cli脚手架目录讲解
build目录 config目录 是webpack配置相关的 node-modules目录 是我们用npm install 安装的依赖代码库 src目录 是我们项目的源码(我们开发的所有项目文件都在s ...
- C++ 标准库和标准模板库(STL)
转自原文http://blog.csdn.net/sxhelijian/article/details/7552499 一.C++标准库 C++标准库的内容分为10类,分别是(建议在阅读中,将你已经用 ...
- New Concept English Two 27 73
新概念一:对应小学水平,重在口语和基础.是不可多得的学习教材,全本144课,可以给孩子(hello world 级别的我)学半年.新概念二:对应高中水平,重在听力和场景对话,共96课,学后,听懂歪果仁 ...
- wpf 客户端【JDAgent桌面助手】业余开发的终于完工了。。晒晒截图
目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...
- 使用caddy 进行nodejs web应用近实时编译更新
caddy 相比nginx 是一个不错的轻量代理服务器,支持的功能也是比较多的, 同时插件也挺多 demo 测试的是通过git 插件进行一个使用spec-md 编写的文档近实时编译以及预览 项目使用d ...
- 使用dev_add_pack注冊新的以太网类型
接着上一篇文件:使用PF_PACKET和SOCK_RAW发送自己定义type以太网数据包 上一篇文章我们使用wireshare抓包.尽管在Linux下也能够使用抓包工具,可是我打算自己动手,在内核添加 ...
- TestCase和TestSuite详解
一.TestCast和TestSuite概念介绍 TestCase:字面意思,测试用例.为一个或多个方法提供测试方法,一般是一个test. TestSuite:测试集合,即一组测试.一个test su ...
- Ant build.xml相关属性详解
关键字: ant build.xml Ant的概念 可能有些读者并不连接什么是Ant以及入可使用它,但只要使用通过Linux系统得读者,应该知道make这个命令.当编译Linux内核及一些软件的源程序 ...
- Phonegap 自定义插件
一.PhoneGap中js与Java之间相互调用分为同步和异步两种方式 1.同步:js调用Java类的方法,然后Java类的方法直接返回一个值给js端 2.异步:js调用Java类的方法,Java类的 ...
- 希尔排序算法-python实现
#-*- coding: UTF-8 -*- import numpy as np def ShellSort(a): gap = a.size / 2 while gap >= 1: for ...