知乎在線部分的技術架構
作者:姚鋼強
鏈接:https://www.zhihu.com/question/314356555/answer/625772570
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
鏈接:https://www.zhihu.com/question/314356555/answer/625772570
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
知乎截至 2019 年 1 月的數據:
- 用戶數:2.2 億
- 話題數: 27 萬
- 問題數: 3000 萬
- 回答數: 1.3 億
以下內容全部基於 2019.1 之前情況
簡述下知乎在線部分的技術架構,先看下整體的架構圖,整體比較清晰不再贅述。
知乎在線架構
- 微服務架構,知乎從 11 年就開始了微服務的探索,嘗試過 protocol buffers、Avro、Thrift,最終在 16 年確認使用 Thrift,同時使用 Consul 和 HAProxy 作為注冊中心和負載均衡。是在 14 年確認的這套微服務架構,並且穩定使用到了現在。所以大家不要問為什么不使用 gRPC 了。
- 雲平台,知乎有自己的內部研發的 ZAE ,絕大部分的在線業務容器在 15 年就已經全部跑在了 Docker 里,現在我們 HBase 和 Kafka 也是跑在容器里的。我們最開始使用的是Mesos 做的資源調度,現在已經切換到了 Kubernetes 。
- 部署平台,知乎的部署平台是與 ZAE 在一起的, 基於 Jenkins 搭建的自動集成,在 MR(Gitlab) 階段自動使用 SonarQube 進行靜態代碼檢查。部署分為測試環境,辦公室環境,金絲雀1(灰度單個容器),金絲雀2(灰度 20% 流量),生產環境(100% 流量上線)。如果金絲雀階段出現錯誤,會自動進行回滾操作。
- 監控,我們主要基於 Grafana、OpenTracing、Graphite 等搭建了監控系統。同時自研了 Halo 可以方便的是業務方觀測到服務之間的依賴關系、響應時間(P95, P99, P999)、錯誤數。同時也進行了新技術的嘗試,目前在業務容器監控使用了Prometheus 。
- 存儲,主要是 MySQL、Redis、HBase;正在調研 TiDB,目前有一套生產集群上線准備給「已讀」服務使用。
- 消息隊列,早期使用自研的 Sink,目前使用 Kafka,同時提供在 Kafka 的基礎上包裝了Beanstalkd 作為任務隊列方便業務進行使用。
- 編程語言,Python、Golang、Java、Rust。目前 Golang 使用比較廣泛,Python 使用場景逐漸變少。Java 在一些算法項目和商業系統中有使用。搜索系統使用的 Rust 重寫 Lucene,現並在此基礎上重寫了類 ES 的集群化搜索引擎。架構師 會去 https://rustcon.asia/ 做分享。
- 目前已經搭建好完備的測試環境,會在 Q2 投入使用。
- 現在已經搭建了多機房,目前重要的業務都是異地多活。
總結:
- 勇於探索新的技術,例如早期的微服務(11 年)和容器化(15年)。
- 在開源技術可以滿足的前提下,盡量不自造輪子,從而使項目可以持續維護。
- 知乎技術上一直崇尚工具化、自動化,例如我們的部署平台,監控,報警系統等,不管是平台還是業務方,都沒有專職的運維人員。
- 整體來說知乎的平台化(我不是做平台的)一直做得很統一,比較少出現業務方自造一套輪子的情況,但是也不排斥業務方的嘗試。
感謝知乎優秀的技術平台工程師,給我們業務方帶來這么好的基礎設施。:-D
==================== End