胡凯, bilibili 运维负责人,曾经就职于金山软件、金山网络、猎豹移动,负责运维相关工作。 Bilibili 是国内最大的年轻人潮流文化娱乐社区,银河系知名弹幕视频分享 UGC 平台。
95 后二次元新人类的追捧,让以视频弹幕、 UP 主闻名于世的 bilibili(以下简称 B 站)愈发火爆,无数年轻人通过电脑、手机、电视等终端设备在 B 站上追番、看弹幕,特别是新番上线时的访问压力是非常大的,这就给 B 站的 IT 运维团队带来了巨大压力。胡凯在去年加入 B 站刚刚成立的运维部,人少事多,遇到了很多坑。 本文根据作者在 “监控与性能分享群” 中的分享内容整理。
B 站运维痛点主要有 3 个:人手不足、故障多、运维系统跟不上,针对这三个痛点, B 站采用了三种方式进行破冰。
目前 B 站的 CDN 主要是自建的, TB 级带宽,视频存储也已达到 N 个 PB ,运维压力非常大。招人确实可以解决问题,但在上海这座魔都招聘合适的运维人员非一朝一夕能够完成的,人手不足怎么办?那就想办法把劳动力从繁杂的日常运维工作中释放出来。
由于之前没有专门的运维部门, IT 系统的权限都在开发手上,出问题了以后运维总得跟在开发后面查原因,效率低不说,沟通往往容易出现问题。 ** 所以我们第 1 步做的就是:用 Ansible + Jenkins 搞定自动发布。 Ansible 是相对简单的批量管理工具,支持模板管理等高级功能。搞定了自动发布,开发的服务器需求已经明显下降,只要把代码提交到 Git 主干,就会自动触发发布。 **
Git 使用的是 GitLab ,同时为了安全我们做了一层 LDAP 代理,效果相当于 “将军令”,操作机、 Git 和 Jenkins 用 OpenLDAP 做统一认证,后续用到的 Redmine 、 Grafana 、 Zabbix 等都接入了 OpenLDAP 认证,每个人都有个动态口令,每次验证都需要用到。
由于原始的监控不满足快速增长的业务,我们部署了开源监控系统 Zabbix ,虽然运维同事能够很好的使用 Zabbix ,但其他部门同事总觉得易用性不高、而且很多定制化监控实现起来很麻烦。
然后,我们开始折腾监控系统——“一棒子监控”,为什么这么说呢,因为要把监控细化,不是一两天的事情。而 B 站的几乎所有请求都要经过 CDN ,入口在手上,出问题想知道还难吗?于是,我们在入口处做了监控,所有 5xx 的错误都打到 ELK ,那么无论是什么业务出问题了都会及时告警,让相关人员来处理,后续再细化。 另外,要把精力投入到最重要的事情上。我们可以花很长的时间去搞好 Zabbix 、 Open-Falcon ,但结果可能是 从 80 分 到 90 分这种并不显著的效果,而很多监控并不是 Zabbix 、 Open-Falcon 擅长的,不如打个差异战。 上图中有个 StatsD 推荐给大家, StatsD 可以非常灵活的嵌入到代码里进行监控( Shell 都可以),因为使用 UDP 协议,所以服务端性能和故障不会影响到调用的程序,可以实现业务级的 QPS 、响应时间等统计类监控。
B 站是自建 CDN 的,在国内有覆盖全国的好几百个 CDN 节点, CDN 的监控一直是个难点,当某 1 个链路出现问题,用传统的 Zabbix 、 Open-Falcon 监控很难发现问题。虽然我们自研了 Http-monitor 监控,可用于网站的可用性监控告警,但考虑到独立资源和数据可靠性,还有用户端网络质量的检测,还是同时使用了第三方监控宝的服务。监控宝使用简单,功能实用,监控点多,分布式监控可以及时发现网络上出现的问题,提供的快照功能可以快速定位问题和查看详细信息。而且监控宝属于第三方独立的,还能出具网站的 SLA 证书,作为 B 站内部工作考核的依据。
B 站技术氛围浓厚,爱开源、爱新技术,所以使用了大量的开源组件,包括 SheepDog(丢过数据)和 GlusterFS(卡成翔),其中最大的坑是 SD 卡 + Ceph 存储。 Ceph 本身的设计非常好,但是姿势不对也会死很惨。比如 B 站的某套服务器集群用 SD 卡来跑系统,结果 SD 卡跪了导致系统也跪了,所有虚拟机的磁盘 io 都卡顿甚至死机,经过不断调优终于还是稳定了。 Ceph 给我最大的安慰是:它没有丢数据,没有丢! 此外, Redis3.0 、 Codis 、 Twemproxy 等开源系统都在 B 站得到了使用,最后我们自研了 BiliTW(已开源),主要原因是 Codis 现在没更新了, Twemproxy 的性能比较差,特别是后端 Redis 多的情况下(而且它和 Redis 一样、只吃单核)。 BiliTW 最大的改进是支持多核,增加了一些易于运维的功能。 最后总结一下 B 站运维团队的成长过程: 由于人手不足,所以事情得挑着做;由于故障多,得先抓入口、抓大的;由于运维系统跟不上,得先拿开源的顶着;由于用了大量开源系统,所以踩了很多坑。