阿里云
阿里云多端小程序中小企业获客首选
发表主题 回复主题
  • 5277阅读
  • 3回复

[干货分享]三分钟读懂TT猫分布式、微服务和集群之路

级别: 论坛版主
发帖
3414
云币
8980

— 本帖被 不靠谱贝贝 设置为精华(2017-09-14) —
引用
针对新手入门的普及,有过大型网站技术架构牛人路过,别耽误浪费了时间,阅读之前,请确保有一定的网络基础,熟练使用Linux,浏览大概需要3-5分钟的时间,结尾有彩蛋。
}-`4DHgq  
'c~4+o4co  
分布式 SS2%q v  
V VCZ9MVJ  
y)<q /  
小马正在经营一个在线购物网站,名叫TT猫,有商品管理、订单管理、用户管理、支付管理、购物车等等模块,每个模块部署到独立的云服务主机。 v` r:=K  
FGkVqZ Y2?  
_VXN#@y  
现在,程序员小明同学浏览TT猫,想买一款牛逼的cherry机械键盘来提升己的工作效率。小明打开TT猫首页、搜索商品、浏览详情以及评论、添加购物车、下单、支付等等一系列操作。小明同学一气呵成,流畅的完成了购物,当然也花费了不少银子。 *K; ~!P  
7-A2_!_x{  
e:W{OIz:  
但是系统又是如何对这一系列操作,如下图错综复杂的调用关系(自行忽略部分细节)。用户看不见,模不着,整个下单过程却行走在网络之间。 ,"ql5Q4  
*lb<$E]="!  
W_ ZJ0GuE(  
;n},"&  
TT猫把所有功能模块分布部署在不同的地方,最终完成了用户一系列的请求,这大概就是一个分布式系统吧。 fXB0j;A  
:gC#hmm^  
`y0FY&y=  
微服务 FgO)DQm  
LgYq.>Nl9  
PI<vxjOK`  
博主认为微服务是一种架构,也是在分布式范畴之内的。多微才叫微?在分布式系统中,微服务更加强调单一职责、轻量级通信(HTTP)、独立性并且进程隔离。 !!y a  
y?# Loe  
}~q5w{_n  
好了,没什么好说的了,实践出真知,建议大家多多了解 spring-cloud相关微服务组件。 i6N',&jFU  
|cY`x(?yP  
L%5%T;0'~  
TT猫,每年都会搞一些活动,比如女生最爱的光棍节(双11),夜深人静的时候会瞬间涌入大量用户,指不定就会把某个服务打趴下。 azU"G(6y?+  
A)KZa"EX  
\Og+c%  
这时候,问题来了用户下单超时,或者直接500错误,如何去解决? I 2DpRMy  
(iGTACoF  
Dhv3jg;lq  
ET >](l9  
:H[6Lg\*  
{:W$LWET  
~;]d"'  
负载均衡集群 uVU)d1N  
"h ^Z  
4/)k)gLI  
这种事情怎么可以在如此重要的活动中出现,其实马爸爸提前购买了多台服务器,工程师们已分别把各个业务功能模块复制部署了多份。 FgI3   
1nOCQ\$l  
Hr4}3.8  
每个相同功能的模块,它们构成了一个组,并以单一系统的模式加以管理。当妹子进行下单操作时,实际上是跟一个集群组发生关系,但系统会确保只跟其中一个发生了关系,具体跟谁,集群组有自己的调度算法,不要担心跟妹子发生不了关系。 :i7;w%B  
&~w}_Fjk  
\(T /O~b2  
Xm 2'6f,  
u-C)v*#L  
举个古代猥琐而不淫荡的例子吧,如果你生活在古代,年18,未婚,高富帅,急需解决个人生理问题。故,你来到了传说中的风月场,咳咳,这个古代可是合法的。这时候老鸨或者大茶壶过来招呼你了,如果没有特殊要求,你会被带进一个屋里,里面有个风尘女子...... d5l UGRg  
]cruF#`%  
{ BHO/q3  
PxE3K-S)G  
>OK^D+v"j  
画风一转,有没有闪瞎自己的程序员万年钛合金狗眼。你可以这么理解,老鸨就是负载均衡器,内置调度算法,风尘女子就是集组其中的一个。 Q5_o/wk  
o? $.fhD   
-`t^7pr  
2Hv+W-6v  
好了,言归正传,省略号自行脑补,小伙伴们看到这里可能会问了,平时生产环境中我们都用什么做负载均衡器。 >"<Wjr8W!$  
],v=]+R  
VD\=`r)nT  
  • 财大气粗的用硬件F5
  • 不差钱的使用DNS负载均衡
  • 技术牛逼的用LVS
  • 苦逼的创业型小公司只能使用Nginx
4H<lm*!^  
当然,负载均衡器不止以上几种,有兴趣的同学自行谷歌了解。 OUXR  
n-OL0$Xu  
as_PoCoss  
《论知行》篇中说:知其然知其所以然,简单说下这几种负载均衡器到底是如何行走于网络中的吧,学过网络的朋友大概都清楚七层网络模型。 -PQv ?5  
H7j0K~U0  
1!gbTeVlY  
首先一张图,让大家重温一下大学基础课程。 *WT`o>  
fd2T=fz-  
8&aq/4:q0  
K96<M);:g  
有没有瞬间课堂书本的感觉,不过瘾?再来一张TCP/IP五层模型。 +?!(G}5  
*D3/@S$B  
?K\axf>F  
t<viX's  
在每一层都工作着不同的设备,比如财大气粗,不差钱的国企使用的F5工作在4-7层,一般互联网企业使用的LVS工作在传输层,使用最广泛的Nginx工作在应用层。 D5HZ2cz|a  
&JI8]JmU)  
C73 kJa  
fwf$Co+R:*  
8*T=Xei8  
最后来聊一下DNS负载均衡,虽然DNS最原始也是最简单的方法,但是DNS负载均衡的控制权在域名服务商手里,NDS存在多级解决,缓存A记录的问题,以及网站自身无法做更多的管理。这样导致了一般中小公司很少使用。 :Z z '1C  
xK\d4 "  
I(0~n,=j  
当然,自身实力够硬,DNS负载均衡也是个不错的选择。下图是检测TT猫域名的A记录得到的部分信息,仅供参考,自行领悟。 ox (%5c)b|  
/~f'}]W  
Oo% d]8W  
FG*r'tC~r  
/RC7"QzL  
q#=(e:aCb  
v oj^pzZ  
高可用集群 "!%l/_p?  
 'CkIz"Wd  
ITT@,  
=zKM=qba  
pD#rnp>WWt  
既然是集群,就不能够出现单点故障,如果大家关注云服务,可能会接触到以下词汇,“双机热备”,“两地三中心”等等词汇。 K&KWN]  
<?4V  
V /V9B2.$  
双击热备是高可用的一种体现形式,如上图所示,生产环境中我们存在两个负载均衡节点,主节点处于激活状态,另一个节点处于备用状态,当主节点意外宕机,可以通过keepalived检测并迅速切换到备用服务,保障业务正常运转。 7Da`   
r #cGop]  
Ge-vWf-RbB  
至于两地三中心,下图可能会让大家理解的更加透彻,图片源于网络。 'u |c  
+s DV~\Vu  
&AbNWtCV+G  
\Et3|Iv  
弹性云 zsyIV!(  
xRLT=.ir  
D!-g&HBTC  
小马哥为了准备双十一,购置了大量服务器,但是活动一过,平时的用户访问量并不能满足服务器的接客能力,导致大量服务器处于空窗期。 Ks`J([(W&  
!58@pLJw  
y''z5['  
0*D$R`$  
这还了得,不能闲着啊,精明的小马哥一拍脑袋,组建了TT云团队。通过多年的努力开发了按量付费云、弹性IP、共享带宽等等产品为中小企业开源节流。 zL`iK"N`  
*VhL\IjN]  
LR.<&m%~.  
故障转移 A1>OY^p3%  
GqaCj^2f  
c?[I?ytl  
;LSANr&  
V_}"+&W9  
小明同学觉得这款键盘不错,美滋滋的点击购买按钮,突然跳到了登陆页面。 Mc_YPR:C  
3E $f)  
什么鬼,裤子我都脱了,你就给我看这个?普通用户可能不会觉得有什么问题,重新登陆一次就是了。但是小明作为一只严谨的程序猿,他想弄明白其中到底发生了什么。 hxd`OG<gF  
a:IC)]j$_  
EPM-df!=  
经过仔细的查阅资料分析,小明得出了以下结论: 9oR@U W1  
']z{{UNUN  
Nk VK  
发生以上故障,小明以为自己下单的那台服务挂机了,请求被分发到另一台服务上,但为什么会跳到登陆页面呢?作为一名程序员,小明清楚的知道服务分为有状态和无状态的,尽管我们平时的HTTP请求是无状态的,但是一般会通过cookie或者session来确定用户状态。 -g Sa_8R  
9YQb &  
 J^5So  
到这里,各位看官应该明白到底是个什么鬼了吧。就拿我们比较熟悉的Tomcat来说,我们的用户信息一般存储在session中,而session存储在Tomcat内存中。浏览器通过cookie中的JSESSIONID来与服务器进行认证。 ]]9R mh=  
})8N5C+KU  
aPfO$b:  
然服务器挂了,下单请求被分发到另一台服务,自然小明再也找不到他的session了。 s6v ;  
Ed,~1GanY  
YPK(be_|I  
小明同学把问题反馈给了TT猫,小马哥一看这还得了,集群都做了还差这点,于是赶紧叫工程师们拿出解决方案。 bj0G5dc=  
FvXZ<(A{  
)E@.!Ut4o  
工程师最终提出了两种方案: z] P SpUd  
  • 服务器用户状态复制(成本大,需要软硬件支持,有延迟,存在失败的风险)
  • 统一存储用户状态(我不说话,我就笑笑)
a85$K$b>  
RD'Q :W  
#9}D4i.`}  
最终,工程师们采用第二种方案,使用Redis存储用户状态数据 (%e .:W${  
pW@Pt 3u  
Cc' 37~6~P  
总结 G"U9E5O  
Bp`]  
](9Xvy  
云栖社区 H*&f:mfq  
)72+\C[*~r  
[ 此帖被小柒2012在2017-09-14 10:38重新编辑 ]
级别: 菜鸟
发帖
56
云币
88
只看该作者 沙发  发表于: 2017-09-14
Re三分钟读懂TT猫分布式、微服务和集群之路
居然全都联系上了
级别: 架构狮
发帖
1217
云币
1946
只看该作者 板凳  发表于: 2018-01-24
    
级别: 架构狮
发帖
1217
云币
1946
只看该作者 地板  发表于: 2018-01-24
发表主题 回复主题
« 返回列表上一主题下一主题

限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
验证问题: 阿里云官网域名是什么? 正确答案:www.aliyun.com
上一个 下一个
      ×
      全新阿里云开发者社区, 去探索开发者的新世界吧!
      一站式的体验,更多的精彩!
      通过下面领域大门,一起探索新的技术世界吧~ (点击图标进入)