前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自动扩容真香!再也不怕你们给我爬挂了

自动扩容真香!再也不怕你们给我爬挂了

作者头像
崔庆才
发布2021-12-08 19:10:04
6900
发布2021-12-08 19:10:04
举报
文章被收录于专栏:进击的Coder进击的Coder

这是「进击的Coder」的第 520 篇技术分享

作者:崔庆才

最近大家应该陆陆续续收到《Python3网络爬虫开发实战(第二版)》的书了。

然而,当大家开始学习的时候,我的挑战就来了!

因为书里面所有的案例都是基于我做的案例平台 https://scrape.center/ 的,比如说,https://spa1.scrape.center/ 这个网站就是一个无反爬的服务端渲染的网站,如图所示:

为了确保大家学习的过程中不会遇到什么问题,我必须要保证的是这个网站一定要能稳定正常运行。

这个挑战其实还是蛮大的。

毕竟,某乎之前不经常性地崩掉吗?

而且,我这个网站它也有着自己特殊的定位,它就是让大家来爬的。也就是说,某个时刻,大家的爬虫运行起来了,我的这个网站瞬间需要承受的就是上百上千甚至上万的并发量,我是完全不知道你到底是起了个什么进程来爬我的网站的。

假如说你搞了个 aiohttp 瞬间给我来一个几千并发,那这个还是很难顶的。

那有办法顶吗?

其实还是有办法的。

我这些案例是基于 Vue + Django 开发的,如果说我部署的时候采用某种比较传统的部署方式,比如说在某个机器上装个 Python 环境,然后使用 uwsgi、Nginx 来把服务运行起来,小的并发没啥问题,但真的并发量上来了,真的是扛不住的。

主要因为什么?因为这种传统的部署方式没法在短时间内完成扩容。

有什么好的解决办法吗?

现在这个时代,Kubernetes 已经大行其道。里面有很多优秀的设计理念和强大的功能,使得服务的部署、扩容等等操作变得非常简单。

所以,我当时制作这个案例平台的时候也是选用了 Kubernetes + Docker 来部署和维护,Kubernetes 是直接使用了腾讯云上的容器服务(TKE),因此我也无需操心一些集群本身的创建、维护等工作,同时这个容器服务还提供了相对齐全的监控、报警等功能,所以一旦出现了什么问题,我就能立马收到告警消息。

现在一共两台机器,每一台是 2 核 CPU、8 G 内存、200M 带宽,如图所示:

然后我建立了一个 Kubernetes 的 Namespace,叫做 scrape,然后把一个个案例打包成 Docker 镜像跑起来。

有些案例是前后端分离的,那可能就包含两个镜像,比如 spa1-backend 和 spa1-frontend,就分别代表 https://spa1.scrape.center/ 网站的前端部分和后端部分,运行起来之后再配置好 Ingress 就好了。

那我怎么实现自动扩容呢?

其实 Kubernetes 里面也自带了自动扩容的功能,叫做 HorizontalPodAutoscaler,利用它我们可以根据一些指标来配置自动扩容,比如说当内存使用率超过 80% 的时候,那就开始扩容,低于 80% 的时候就自动缩容,然后指定一个最小和最大的 Pod 数量。

配置类似如下:

代码语言:javascript
复制
spec:
  maxReplicas: 15
  metrics:
  - pods:
      metricName: k8s_pod_rate_mem_usage_limit
      targetAverageValue: "80"
    type: Pods
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: spa1-backend

比如这里我就配置了如果内存用量超过 Limit 值的 80% 的时候,那就开始扩容,最大扩到 15 个 Pod,最小是 1 个 Pod,关联的资源就是 spa1-backend,即 https://spa1.scrape.center/ 后端的 API 服务。

当然腾讯云还有更加方便的图形化配置界面,使用非常方便:

刚才我就尝试了下,当并发量上来的时候,内存占用率就上来了,然后接着 Kubernetes 就会给我自动增加一个 Pod,就在很短的时间内完成了扩容。

这样,如果这个网站的并发量上来了,这个网站背后的 Pod 就会自动完成扩容,以此来应对更高的并发量,如果并发量降下来了,Pod 的量就会自动缩容。

下面这张图是这个网站在被高并发爬取和停止爬取后的 Pod 数量变化:

这是时间倒序排序的,可以看到一开始 Pod 的数量从 6 到了 9,然后后面监测到指标(内存占用)降下来了,然后 Pod 数量就又降下来了。

有了这个的支持,我对这个网站的信息更足了。

当然除了配置自动扩容,我还有一些其他的方法来支持更高的并发和更快的加载速度,比如说 CDN、Cache、虚拟节点等等,这里就暂时不展开讲了,准备双十二开个直播专门讲讲,敬请期待。

欢迎大家前来爬取和测试哈,大家也可以帮忙测测看看能承受多大的并发量,如果感觉还是不太行,我会努力把它变得更加高可用的,谢谢~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 进击的Coder 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档