后端架构笔记(docker,集群)
很高兴自己能走到这一步
无意中看到一篇文章,写得很好,怕自己忘了温习,所以就摘一些片段免得忘记 (摘自DockOne微信分享(八十四):Docker在B站的实施之路)
应用全自动扩缩容的实现方案
Marathon Hook: 通过Marathon提供的/v2/events接口监听Marathon的事件流。当在Bili PaaS平台手动扩容或触发规则自动扩容时,Bili Paas平台会调用Marathon的API。Marathon的每个操作都会产生事件,通过/v2/events接口暴露出来。Marathon Hook程序会把所有容器的信息注册到Consul中。当Marathon删除或创建容器时,Marathon Hook就会更新Consul中的Docker容器信息,保证Consul中的信息和Marathon中的信息是一致的,并且是最新的。
Nginx+UpSync+Consul: 当Marathon扩容完成时,新容器的IP:PORT一定要加到SLB(Tengine/Nginx)的Upstream中,并reload SLB后才能对外提供服务。但Tengine/Nginx reload时性能会下降。为了避免频繁reload SLB导致的性能损耗,我们使用了动态Upstream:Nginx + UpSync + Consul。Upsync是Weibo开源的一个模块,使用Consul保存Upstream的server信息。Nginx启动时会从Consul获取最新的Upstream server信息,同时Nginx会建立一个TCP连接hook到Consul,当Consul里的数据有变更时会立即通知到Nginx,Nginx的worker进程更新自己的Upstream server信息。整个过程不需要reload nginx。注意:UpSync的功能是动态更新upstream server,当有vhost的变更时,还是需要reload nginx。
健康检测
我们规定所有的Web服务必须提供一个Health Check接口,这个接口随着服务一同起来,这个接口任何非200的http code都代表应用异常。Marathon刚启动容器时,显示此容器的Health状态是uknow。当Health Check成功时,Marathon显示此容器的Health状态Healthy,并会产生一个事件。Marathon Hook程序通过Hook这个事件,就能准确捕获容器中应用启动成功的时间,并更新Consul,同步Nginx,对外提供服务。