Blog Details

从虚机到容器,秒拍架构师告诉你若何平滑举行营业迁徙
by weswoo

shopify独立站

Planning your online business goals with a specials

Kristin Weswoo

Aug 30, 2023

近期,炫一下(北京)科技有限公司(简称“一下科技”)短视频产物“秒拍”完成了一个“大动作”——将原来部署在虚拟机上的主体营业迁徙到华为云,同时将公司的手艺系统承载在下一代虚拟手艺容器(Docker)上。而这一系列动作是在营业不下线,用户无感知的条件下完成的,秒拍是若何做到的?

秒拍是一个媒体属性很强的营业,在用户规模到达一定体量后,由明星热门事宜引发的流量突发状态异常严重,而传统虚机营业存在扩容响应速率慢,成本高等一系列问题,于是秒拍想到了容器。容器服务拥有启动快速、占用资源少、运行效率高等手艺特点,在处置海量数据方面拥有自然的优势。然则若何保证营业能够快速无缝地举行切换,让最终用户毫无感知的完成从虚机到容器的迁徙,真正要做到这一点异常难题。

只管难题重重,但秒拍在评估了未来营业需求和手艺团队规模之后,照样选择将已部署在云上的主体营业迁徙到华为云CCE上。而华为云壮大的手艺支持能力和服务团队,为这次迁徙解决了后顾之忧。

以下是秒拍架构师李东辉对本次营业迁徙的纪录,若是你也希望从虚机向更天真的容器升级,又不希望影响营业,不妨一看:

靠山

我们现在主体营业已经是部署在某云上了,但整个手艺系统,照样基于传统的虚拟机去承载的,由于我们产物自己的媒体属性,导致了不能制止的会经常遇到突发流量,相比于一直对照平稳的流量,这种对服务端的磨练更高,焦点关注点照样在怎么保障在这种时刻用户都能获得优越的体验。

另一方面,由于云平台自己的一些不能抗力因素,不能保证百分百的高可用,怎么降低单点依赖的风险,也是我们需要重点思量的。

经由综合性的权衡,我们决议把主体营业迁徙到华为云,而且优化升级原来的架构,以便更好的支持海量用户接见。前端机也从VM过渡到docker,迁徙后的整体架构图如下

各个资源的迁徙历程

1. mc迁徙

现在营业上使用mc只是做暂且缓存,cache miss会从存储(DB、ES等)拉一份写进去,而且业内也没有对照成熟的mc存量与增量迁徙方案,以是这部门数据可以忽略,等上线前,预热一部门热门数据进去。不外使用上有一些区别,原平台使用的是服务端集群,现在是客户端集群,需要确立MC毗邻的时刻,添加所有的服务器列表以及权重。

2. mq迁徙

mq主要用来解耦营业模块,生产端生产一份数据,消费端可能有多个,迁徙的话,需要先设置好资源的vhost,exechange尚有queue,服务端先更新设置上线,数据写入到新资源,消费端在旧资源消费完成后,切换到新资源的消费上。

3. redis迁徙

redis的迁徙需要区分两个场景的数据,一个是缓存数据,可以根据mc的迁徙计谋忽略,另一部门是持久化数据,主要是营业上的种种计数,这部门数据要求只管正确快速的迁徙到新资源,那时思量了两种方案

· 一种呢,是基于快照文件迁徙 存量数据可以通过RDB快照,只需要原平台有备份RDB的权限,在新资源通过快照回放完玉成量数据的迁徙。 这种方案优点对照突出,操作简朴快速,但瑕玷是不支持增量同步。

· 另一种呢,基于营业迁徙 首先,读 优先重新资源读,没有掷中的从老资源读取一份,写入到新资源并返回这个值。 其次,写 (incr decr操作) 优先更新老资源,而且根据更新后的返回值写入到新资源。

这种方案能兼顾存量与增量数据,但存在的问题是,读写新老资源的历程非原子性,理论上高并发情形下会存在一定误差,而且营业上的这种刷新增添了后期的维护成本,另外,从性能方面思量,原来一次毗邻(短毗邻)、一次redis操作就能搞定的事,现在都需要两到三次。

综合现在的营业量思量,我们接纳了第一种方案,然则时间点选在破晓四点低峰时段,将影响局限尽可能降到最低,后续通过落到DB的数据做统计恢复。

4. db迁徙

db迁徙相对对照容易,全量数据预先复制一份已往,增量数据由于都是基于binlog订阅,只需要获取原平台DB的权限,就可以通过binlog同步到新数据库。

这里需要注重的是一个主从同步的问题,新资源主从是半同步复制,主库只需要守候一个从库节点收到而且 Flush Binlog 到 Relay Log 文件即可,同时,这里只是一个收到的反馈,而不是已经完全完成而且提交的反馈,这时刻,主库就会举行其他操作,相比与之前的全同步的事务复制,节约了许多时间,然则也造成了新的问题,即:主从有理论上1ms的延迟,现实测试延迟时间是0.5-0.8ms,这在“更新DB后又立马读取一次DB数据”的场景下会有问题,而且凭证Cache Aside Pattern的缓存更新计谋,DB更新乐成会直接删除缓存,由于主从延迟,这时刻读历程读取到老数据而且写入到缓存,从而导致了一段时间内的脏数据。

有一个对照快速的方式能够解决这个问题,那就是在DB更新乐成后直接更新缓存,然则这样处置后会发生新的问题,并发的写操作,又会导致统一资源key的脏数据,不外是概率巨细的问题。这就涉及到了取舍,就像为了保证DB、cache的强一致性,接纳2PC(prepare, commit/rollback),大大降低性能一样,软件设计从来都是取舍。

5. ES迁徙

ES主要服务的是APP以及Admin后台,用户、媒资等数据的搜索,数据源在DB,以是存量数据直接从DB拉一份进去,增量数据通过监听DB更新,同步到ES里。

6. 版本库迁徙

版本库的迁徙主要是利便接入镜像构建与k8s部署,同时呢,项目使用到的资源链接地址、用户名、密码等也需要更新,这部门都是统一设置,直接修改就行。

7. 服务发现

原来营业上都是基于服务端发现的模式,一个微服务对应着一个LB,通过DNS剖析到对应的LB IP,LB实现VM的负载平衡计谋与保活机制。LB下层现在多了一层k8s的调剂,k8s调剂的单元也不再是VM,而是Pod(逻辑主机),在这里VM的存在也仅仅是提供差异规格的物理资源。

其次使用DNS剖析也可以利便差异VPC子网指向差其余资源IP,例如测试环境与生产环境,项目使用到的资源地址是相同的,只不外剖析到了差其余资源。

8. Dokerfile

需要预先制作好基础镜像,包罗基本的php、nginx环境跟用户权限这些,Dokerfile主要实现将项目代码复制到容器。

9. 切流量

后端资源迁徙完成,准备停当以后,就可以最先切公网流量了,非焦点营业直接修改公网DNS,剖析到新LB IP,焦点营业LB上层尚有一层高防,在高防稳固的情形下,只需要修改高防源站IP到新LB就行。

流量迁徙完毕后,全线验证,考察错误日志,固然这个历程并不是只有等流量切完才会最先,而是从资源迁徙最先就一直延续举行的。

10. 部署上线

原来的部署是通过中控机,将代码分发到各个线上服务器,现在呢,需要使用上一步确立的Dockerfile,构建镜像,将构建好的镜像通过k8s转动升级(先kill老镜像,再派生出新镜像)。升级的步骤如下:

push后镜像已经推送到私有客栈,现在需要确立k8s的设置文件用于治理和升级容器。

 

确立pod kubectl create -f miaopai.yaml 后边再升级容器,先把容器更新push到客栈后,修改image地址,通过apply举行升级就可以。

架构优化

架构优化的目的是剖析现在营业上存在的问题,并针对性的优化解决,连系压测效果,主要确定了几个优化点。

1. mc、redis的优化

mc使用上存在的问题是,只有在存储查询到的情形下才会缓存数据,这样就会导致许多空查询落到存储,解决这个问题只需要将没有查询到数据的情形,也写一份空数据到缓存就能解决。

除此之外,mc的批量查询,存在太多的伪批量(redis也存在),例如:foreach每次循环里都使用get查询,需要将这样的处置都改成multiget的形式,不外multiget在集群的情形下会存在hole征象,这个问题最早是由 facebook 的事情职员提出的

facebook 在 2010 年左右,memcached 节点就已经达3000 个.缓存数千 G 内容.他们发现了一个问题-memcached 毗邻频率,效率下降了,于是加 memcached 节点, 添加了后, 发现由于毗邻频率导致的问题, 仍然存在, 并没有好转,称之为”multiget hole征象”。请求多台服务器并不是问题的症结,真正的缘故原由在于客户端在请求多台服务器时是并行的照样串行的!问题是许多客户端,包罗Libmemcached在内,在处置Multiget多服务器请求时,使用的是串行的方式!也就是说,先请求一台服务器,然后守候响应效果,接着请求另一台,效果导致客户端操作时间累加,请求聚积,性能下降。

有推荐凭证key做hash的,这样就可以使得相同key前缀的数据漫衍在一台机械上,然则这样又会导致新的问题,例如:增添营业庞漂亮,每个节点的数据漫衍不均等等,不外信托大部门公司营业的体量都没设施对标facebook的,若是真的到了需要思量这个问题的时刻,着实是推荐使用redis的pipeline并行机制来解决的。

2. 焦点营业的降级计谋

作为APP内首屏的几个tab,数据都是从推荐系统中获取,一旦推荐系统挂掉,基本没有了用户体验,以是需要时照样需要接纳熔断降级计谋,降级计谋相对来说,只需要保证用户能获取到部门列表数据,纵然所有用户获取到的数据都一样。实现上呢,先把部门列表数据存储到cache,一旦发生熔断,那么数据从推荐系统读取的渠道会直接切断,转而从cache里读取返回给用户。然则有一个问题,读取的这个流程应该是由营业完成,照样由前端web服务器(nginx)直接完成呢。我们现在接纳的后者,一方面使用ngx_lua能保证系统的吞吐,另一方面不仅仅是推荐系统,纵然在服务端整体挂掉的情形下,也可以继续提供服务。

触发熔断的条件可以有许多,例如:每20个请求中,50%失败,固然了,失败包罗响应失败跟超时,也可以凭证当次请求效果来判断。熔断的条件着实并没有什么尺度,更多的是遵照以往系统的履向来一步步骤整。在以前并没有许多熔断履历的情形下,只管扩大这个阈值,随着履历的一步步积累,再确定各个模块对照合理的熔断条件和降级计谋。

3. 负载平衡计谋

传统负载平衡LB,实现的是请求到VM和端口的负载平衡,容器化之后,LB下层挂载了k8s集群,现实上这里的负载平衡除了LB的,尚有k8s的,即请求到达节点(VM)后,再负载平衡到差其余容器。

上边提到的负载平衡只是四层(IP加端口),若是要凭证应用层的信息,好比:URI,cookie等等,做负载平衡,就需要使用七层LB,我们使用到的场景,主要是还没有切割成微服务的大单体,凭证URI,将差异模块的请求打到差其余四层LB。

4. Mysql HA

Mysql作为我们底层的焦点存储,必须要保障它的高可用,现在架构是接纳主从+主备的形式,不外这两种方式都有个共性的问题,主机故障后,无法举行写操作,若是主机一直无法恢复,需要人工指定新主机角色。优化的目的也显而易见,就是设计双机切换,在主机故障之后,能够自动切换到其他主机。

PHP自己实现了mysql的负载平衡和failover计谋,需要依赖插件mysqlnd_ms,详见http://php.net/mysqlnd_ms,不外仅限于PHP5.x版本,倒是有支持PHP7.0以上的非官方版本,https://github.com/sergiotabanelli/mysqlnd_ms,但若是直接用在生产环境,并不十明晰智,而且mysqlnd_ms需要特殊名堂的资源设置,在一个项目里维护两份资源设置,也会带来新的庞漂亮问题。

要实现双击切换的焦点点在于,对主机状态的判断,和状态决议,可以通过引入一其中介角色,主机和备机把状态通报给中介,由中介完成决议功效,但引入中介的角色并不是没有价值的,那就是要思量中介角色的高可用。这就陷入了一个递归的陷阱:为了实现高可用,我们引入中介,但中介自己又要求高可用,于是又要设计中介的高可用方案……云云递归下去就无限无尽了。

MongoDB的Replica Set接纳的就是这种方式,基本架构如下:

幸运的是,开源方案已经有对照成熟的中介式解决方案,例如:Zookeeper和Keepalived。ZP自己已经实现了高可用集群架构,因此已经解决了中介自己的可靠性问题,在实践中也推荐这种架构。

5. 日志与监控

线上日志的准时网络反馈也是必不能少的,日志包罗服务器的access_log,error_log,固然尚有营业的自界说log。网络的目的主要是用来统计一段时间内的http code 漫衍、响应时间和错误信息。

通过在实例跟资源上部署agent,准时网络CPU和内存信息也是需要的。统计型的数据需要网络汇总成表格,利便考察,种种指标的阈值也需要提前设置好,跨越阈值后能够实时报警,通知到责任人。固然了,监控不是最终目的,实时巡检线上资源、接口,清扫系统隐患,提防于未然才是最终之道。

不得不说,互联网企业把大多数营业部署在云服务器上,现在已渐成趋势,但由于历史缘故原由,手艺往往是架设在传统的虚拟机(VM)上。若是企业要过渡到下一代虚拟手艺容器,会涉及到种种资源迁徙和手艺架构优化,整个历程是必须短暂而痛苦的。但若是没有响应规模的手艺团队来操作,再加上云厂商没有完善的手艺支持团队,这个历程会加倍痛苦。若何削减企业营业升级的痛苦,这就异常磨练企业手艺决议者的选择智慧!华为云,现在已经展现出了在手艺服务的怪异优势,未来一定是摆在企业眼前最具竞争力的选项之一。

虚拟主机上的网站备份方法

Random Image 608
Random Image 608

Manage your online banking

Morbi lorem proin morbi tempor risus. Nisl lobortis diam id faucibus pretium vitae suspendisse sed accumsan. Sodales morbi tristique elit cursus gravida. Ullamcorper commodo eget pulvinar pretium. Condimentum rhoncus commodo amet nec auctor nibh vel mi blandit.

Neque ultrices nunc condimentum morbi risus tincidunt. Vel arcu lacus non ornare. Porttitor in rhoncus magna augue adipiscing.

  • Manage your time so you’ll get more done in less time
  • Cut expenses without sacrificing quality
  • Attract and retain quality, high-paying customers

开始您的独立站品牌出海

独立站品牌从0到1的步骤:产品开发 - VI定调 - 网站定制 - 运营自动化 - 客户维护

  • 12小时技术团队支持

  • 全方位品牌出海护航