從零開始搭建創業公司後臺技術棧!

原文 : http://ju.outofmemory.cn/entry/351897

前言

說到後臺技術棧,腦海中是不是浮現的是這樣一幅圖?

圖 1

有點眼暈,以下只是我們會用到的一些語言的合集,而且只是語言層面的一部分,就整個後臺技術棧來說,這只是一個開始,從語言開始,還有很多很多的內容。今天要說的後臺是大後臺的概念,放在服務器上的東西都屬於後臺的東西,比如使用的框架,語言,數據庫,服務,操作系統等等。

整個後臺技術棧我的理解包括 4 個層面的內容:

結合以上的的 4 個層面的內容,整個後臺技術棧的結構如圖 2 所示:

圖 2 後臺技術棧結構

以上的這些內容都需要我們從零開始搭建,在創業公司,沒有大公司那些完善的基礎設施,需要我們從開源界,從雲服務商甚至有些需要自己去組合,去拼裝,去開發一個適合自己的組件或系統以達成我們的目標。咱們一個個系統和組件的做選型,最終形成我們的後臺技術棧。

各系統組件選型

1、項目管理 / Bug 管理 / 問題管理


項目管理軟件是整個業務的需求,問題,流程等等的集中地,大家的跨部門溝通協同大多依賴於項目管理工具。有一些 SaaS 的項目管理服務可以使用,但是很多時間不滿足需求,此時我們可以選擇一些開源的項目,這些項目本身有一定的定製能力,有豐富的插件可以使用,一般的創業公司需求基本上都能得到滿足,常用的項目如下:

2、DNS


DNS 是一個很通用的服務,創業公司基本上選擇一個合適的雲廠商就行了,國內主要是兩家:

如果你的業務是在國內,主要就是這兩家,選 一個就好,像今日頭條這樣的企業用的也是 DNSPod 的服務,除非一些特殊的原因才需要自建,比如一些 CDN 廠商,或者對區域有特殊限制的。要實惠一點用阿里最便宜的基礎版就好了,要成功率高一些,還是用 DNSPod 的貴的那種。

在國外還是選擇亞馬遜吧,阿里的 DNS 服務只有在日本和美國有節點,東南亞最近纔開始部點, DNSPod 也只有美國和日本,像一些出海的企業,其選擇的雲服務基本都是亞馬遜。

如果是線上產品,DNS 強烈建議用付費版,阿里的那幾十塊錢的付費版基本可以滿足需求。如果還需要一些按省份或按區域調試的邏輯,則需要加錢,一年也就幾百塊,省錢省力。

如果是國外,優先選擇亞馬遜,如果需要國內外互通並且有自己的 APP 的話,建議還是自己實現一些容災邏輯或者智能調度,因爲沒有一個現成的 DNS 服務能同時較好的滿足國內外場景,或者用多個域名,不同的域名走不同的 DNS 。

3、LB(負載均衡)


LB(負載均衡)是一個通用服務,一般雲廠商的 LB 服務基本都會如下功能:

如果你線上的服務機器都是用的雲服務,並且是在同一個雲服務商的話,可以直接使用雲服務商提供的 LB 服務,如阿里雲的 SLB,騰訊雲的 CLB,亞馬遜的 ELB 等等。如果是自建機房基本都是 LVS + Nginx。

4、CDN


CDN 現在已經是一個很紅很紅的市場,基本上只能掙一些辛苦錢,都是貼着成本在賣。國內以網宿爲龍頭,他們家佔據整個國內市場份額的 40% 以上,後面就是騰訊,阿里。網宿有很大一部分是因爲直播的興起而崛起。

國外,Amazon 和 Akamai 合起來佔比大概在 50%,曾經的國際市場老大 Akamai 擁有全球超一半的份額,在 Amazon CDN 入局後,份額跌去了將近 20%,衆多中小企業都轉向後者,Akamai 也是無能爲力。

國內出海的 CDN 廠商,更多的是爲國內的出海企業服務,三家大一點的 CDN 服務商裏面也就網宿的節點多一些,但是也多不了多少。阿里和騰訊還處於前期階段,僅少部分國家有節點。

就創業公司來說,CDN 用騰訊雲或阿里雲即可,其相關係統較完善,能輕鬆接入,網宿在系統支持層面相對較弱一些,而且還貴一些。並且,當流量上來後,CDN 不能只用一家,需要用多家,不同的 CDN 在全國的節點覆蓋不一樣,而且針對不同的客戶雲廠商內部有些區分客戶集羣,並不是全節點覆蓋(但有些雲廠商說自己是全網節點),除了節點覆蓋的問題,多 CDN 也在一定程度上起到容災的作用。

5、RPC 框架


維基百科對 RPC 的定義是:遠程過程調用(Remote Procedure Call,RPC)是一個計算機通信協議。該協議允許運行於一臺計算機的程序調用另一臺計算機的子程序,而程序員無需額外地爲這個交互作用編程。

通俗來講,一個完整的 RPC 調用過程,就是 Server 端實現了一個函數,客戶端使用 RPC 框架提供的接口,調用這個函數的實現,並獲取返回值的過程。

業界 RPC 框架大致分爲兩大流派,一種側重跨語言調用,另一種是偏重服務治理。

跨語言調用型的 RPC 框架有 Thrift、gRPC、Hessian、Hprose 等。這類 RPC 框架側重於服務的跨語言調用,能夠支持大部分的語言進行語言無關的調用,非常適合多語言調用場景。但這類框架沒有服務發現相關機制,實際使用時需要代理層進行請求轉發和負載均衡策略控制。

其中,gRPC 是 Google 開發的高性能、通用的開源 RPC 框架,其由 Google 主要面向移動應用開發並基於 HTTP/2 協議標準而設計,基於 ProtoBuf(Protocol Buffers)序列化協議開發,且支持衆多開發語言。本身它不是分佈式的,所以要實現框架的功能需要進一步的開發。

Hprose(High Performance Remote Object Service Engine)是一個 MIT 開源許可的新型輕量級跨語言跨平臺的面向對象的高性能遠程動態通訊中間件。

服務治理型的 RPC 框架的特點是功能豐富,提供高性能的遠程調用、服務發現及服務治理能力,適用於大型服務的服務解耦及服務治理,對於特定語言 (Java) 的項目可以實現透明化接入。缺點是語言耦合度較高,跨語言支持難度較大。國內常見的冶理型 RPC 框架如下:

6、名字發現 / 服務發現


名字發現和服務發現分爲兩種模式,一個是客戶端發現模式,一種是服務端發現模式。

框架中常用的服務發現是客戶端發現模式。

所謂服務端發現模式是指客戶端通過一個負載均衡器向服務發送請求,負載均衡器查詢服務註冊表並把請求路由到一臺可用的服務實例上。現在常用的負載均衡器都是此類模式,常用於微服務中。

所有的名字發現和服務發現都要依賴於一個可用性非常高的服務註冊表,業界常用的服務註冊表有如下三個:

除此之外也可以自己實現服務實現,或者用 Redis 也行,只是需要自己實現高可用性。

7、關係數據庫


關係數據庫分爲兩種,一種是傳統關係數據,如 Oracle,MySQL,Maria,DB2,PostgreSQL 等等,另一種是 NewSQL,即至少要滿足以下五點的新型關係數據庫:

  1. 完整地支持 SQL,支持 JOIN / GROUP BY / 子查詢等複雜 SQL 查詢。

  2. 支持傳統數據標配的 ACID 事務,支持強隔離級別。

  3. 具有彈性伸縮的能力,擴容縮容對於業務層完全透明。

  4. 真正的高可用,異地多活、故障恢復的過程不需要人爲的接入,系統能夠自動地容災和進行強一致的數據恢復。

  5. 具備一定的大數據分析能力。

傳統關係數據庫用得最多的是 MySQL,成熟,穩定,一些基本的需求都能滿足,在一定數據量級之前基本單機傳統數據庫都可以搞定,而且現在較多的開源系統都是基於 MySQL,開箱即用,再加上主從同步和前端緩存,百萬 pv 的應用都可以搞定了。不過 CentOS 7 已經放棄了 MySQL,而改使用 MariaDB。MariaDB 數據庫管理系統是 MySQ L 的一個分支,主要由開源社區在維護,採用 GPL 授權許可。開發這個分支的原因之一是:甲骨文公司收購了 MySQL 後,有將 MySQL 閉源的潛在風險,因此社區採用分支的方式來避開這個風險。

在 Google 發佈了 F1: A Distributed SQL Database That Scales 和 Spanner: Google’s Globally-Distributed Databasa 之後,業界開始流行起 NewSQL。於是有了 CockroachDB,於是有了奇叔公司的 TiDB。國內已經有比較多的公司使用 TiDB,之前在創業公司時在大數據分析時已經開始應用 TiDB,當時應用的主要原因是 MySQL 要使用分庫分表,邏輯開發比較複雜,擴展性不夠。

8、NoSQL


NoSQL 顧名思義就是 Not-Only SQL,也有人說是 No – SQL,個人偏向於 Not-Only SQL,它並不是用來替代關係庫,而是作爲關係型數據庫的補充而存在。

常見 NoSQL 有 4 個類型:

除了以上 4 種類型,還有一些特種的數據庫,如對象數據庫,XML 數據庫,這些都有針對性對某些存儲類型做了優化的數據庫。

在實際應用場景中,何時使用關係數據庫,何時使用 NoSQL,使用哪種類型的數據庫,這是我們在做架構選型時一個非常重要的考量,甚至會影響整個架構的方案。

9、消息中間件


消息中間件在後臺系統中是必不可少的一個組件,一般我們會在以下場景中使用消息中間件:

業界消息中間件是一個非常通用的東西,大家在做選型時有使用開源的,也有自己造輪子的,甚至有直接用 MySQL 或 Redis 做隊列的,關鍵看是否滿足你的需求,如果是使用開源的項目,以下的表格在選型時可以參考:

圖 3

以上圖的緯度爲:名字、成熟度、所屬社區 / 公司、文檔、授權方式、開發語言、支持的協議、客戶端支持的語言、性能、持久化、事務、集羣、負載均衡、管理界面、部署方式、評價。

10、代碼管理


代碼是互聯網創業公司的命脈之一,代碼管理很重要,常見的考量點包括兩塊:

11、持續集成


持續集成簡,稱 CI(continuous integration),是一種軟件開發實踐,即團隊開發成員經常集成他們的工作,每天可能會發生多次集成。每次集成都通過自動化的構建(包括編譯,發佈,自動化測試)來驗證,從而儘早地發現集成錯誤。持續集成爲研發流程提供了代碼分支管理 / 比對、編譯、檢查、發佈物輸出等基礎工作,爲測試的覆蓋率版本編譯、生成等提供統一支持。

業界免費的持續集成工具中系統我們有如下一些選擇:

12、日誌系統


日誌系統一般包括打日誌,採集,中轉,收集,存儲,分析,呈現,搜索還有分發等。一些特殊的如染色,全鏈條跟蹤或者監控都可能需要依賴於日誌系統實現。日誌系統的建設不僅僅是工具的建設,還有規範和組件的建設,最好一些基本的日誌在框架和組件層面加就行了,比如全鏈接跟蹤之類的。

對於常規日誌系統 ELK 能滿足大部分的需求,ELK 包括如下組件:

因爲免費的 ELK 沒有任何安全機制,所以這裏使用了 Nginx 作反向代理,避免用戶直接訪問 Kibana 服務器。加上配置 Nginx 實現簡單的用戶認證,一定程度上提高安全性。另外,Nginx 本身具有負載均衡的作用,能夠提高系統訪問性能。ELK 架構如圖 4 所示:

圖 4,ELK 流程圖

對於有實時計算的需求,可以使用 Flume + Kafka + Storm + MySQL 方案,一 般架構如圖 5 所示:

圖 5,實時分析系統架構圖

其中:

Kafka 追求的是高吞吐量、高負載,Flume 追求的是數據的多樣性,二者結合起來簡直完美。

13、監控系統


監控系統只包含與後臺相關的,這裏主要是兩塊,一個是操作系統層的監控,比如機器負載,IO,網絡流量,CPU,內存等操作系統指標的監控。另一個是服務質量和業務質量的監控,比如服務的可用性,成功率,失敗率,容量,QPS 等等。常見業務的監控系統先有操作系統層面的監控(這部分較成熟),然後擴展出其它監控,如 Zabbix,小米的 Open-Falcon,也有一出來就是兩者都支持的,如 Prometheus。如果對業務監控要求比較高一些,在創業選型中建議可以優先考慮 Prometheus。這裏有一個有趣的分佈,如圖 6 所示。

圖 6,監控系統分佈

亞洲區域使用 Zabbix 較多,而美洲和歐洲,以及澳大利亞使用 Prometheus 居多,換句話說,英文國家地區(發達國家?)使用 Prometheus 較多。

Prometheus 是由 SoundCloud 開發的開源監控報警系統和時序列數據庫(TSDB)。Prometheus 使用 Go 語言開發,是 Google BorgMon 監控系統的開源版本。相對於其它監控系統使用的 push 數據的方式,Prometheus 使用的是 pull 的方式,其架構如圖 7 所示:

圖 7,Prometheus 架構圖

如上圖所示,Prometheus 包含的主要組件如下:

創業公司選擇 Prometheus + Grafana 的方案,再加上統一的服務框架(如 gRPC),可以滿足大部分中小團隊的監控需求。

14、配置系統


隨着程序功能的日益複雜,程序的配置日益增多:各種功能的開關、降級開關,灰度開關,參數的配置、服務器的地址、數據庫配置等等,除此之外,對後臺程序配置的要求也越來越高:配置修改後實時生效,灰度發佈,分環境、分用戶,分集羣管理配置,完善的權限、審覈機制等等,在這樣的大環境下,傳統的通過配置文件、數據庫等方式已經越來越無法滿足開發人員對配置管理的需求,業界有如下兩種方案:

創業公司前期不需要這種複雜,直接上 zk,弄一個界面管理 zk 的內容,記錄一下所有人的操作日誌,程序直連 zk,或者或者用 Qconf 等基於 zk 優化後的方案。

15、發佈系統 / 部署系統


從軟件生產的層面看,代碼到最終服務的典型流程如圖 8 所示:

圖 8,流程圖

從上圖中可以看出,從開發人員寫下代碼到服務最終用戶是一個漫長過程,整體可以分成三個階段:

發佈系統集成了製品管理,發佈流程,權限控制,線上環境版本變更,灰度發佈,線上服務回滾等幾方面的內容,是開發人員工作結晶最終呈現的重要通道。開源的項目中沒有完全滿足的項目,如果只是 Web 類項目,Walle、Piplin 都是可用的,但是功能不太滿足,創業初期可以集成 Jenkins + Gitlab + Walle(可以考慮兩天時間完善一下),以上方案基本包括製品管理,發佈流程,權限控制,線上環境版本變更,灰度發佈(需要自己實現),線上服務回滾等功能。

16、跳板機


跳板機面對的是需求是要有一種能滿足角色管理與授權審批、信息資源訪問控制、操作記錄和審計、系統變更和維護控制要求,並生成一些統計報表配合管理規範來不斷提升 IT 內控的合規性,能對運維人員操作行爲的進行控制和審計,對誤操作、違規操作導致的操作事故,快速定位原因和責任人。其功能模塊一般包括:帳戶管理、認證管理、授權管理、審計管理等等。

開源項目中,Jumpserver 能夠實現跳板機常見需求,如授權、用戶管理、服務器基本信息記錄等,同時又可批量執行腳本等功能;其中錄像回放、命令搜索、實時監控等特點,又能幫助運維人員回溯操作歷史,方便查找操作痕跡,便於管理其他人員對服務器的操作控制。

17、機器管理


機器管理的工具選擇的考量可以包含以下三個方面:

  1. 是否簡單,是否需要每臺機器部署 Agent(客戶端)

  2. 語言的選擇(Puppet/Chef vs Ansible/SaltStack )開源技術,不看官網不足以熟練,不懂源碼不足以精通;Puppet、Chef 基於 Ruby 開發,Ansible、SaltStack 基於 Python 開發的

  3. 速度的選擇(Ansible vs SaltStack)Ansible 基於 SSH 協議傳輸數據,SaltStack 使用消息隊列 zeroMQ 傳輸數據;大規模併發的能力對於幾十臺 - 200 臺規模的兄弟來講,Ansible 的性能也可接受,如果一次操作上千臺,用 salt 好一些。

如圖 9 所示:

圖 9,機器管理軟件對比

一般創業公司選擇 Ansible 能解決大部問題,其簡單,不需要安裝額外的客戶端,可以從命令行來運行,不需要使用配置文件。至於比較複雜的任務,Ansible 配置通過名爲 Playbook 的配置文件中的 YAML 語法來加以處理。Playbook 還可以使用模板來擴展其功能。

創業公司的選擇

1、選擇合適的語言


2、選擇合適的組件和雲服務商


選擇靠譜的雲服務商,其實這是一個僞命題,因爲哪個服務商都不靠譜,他們所承諾的那些可用性問題基本上都會在你的身上發生,這裏我們還是需要自己做一些工作,比如多服務商備份,如用 CDN,你一定不要只選一家,至少選兩家,一個是災備,保持後臺切換的能力,另一個是多點覆蓋,不同的服務商在 CDN 節點上的資源是不一樣的。

選擇了雲服務商以後,就會有很多的產品你可以選擇了,比較存儲,隊列這些都會有現成的產品,這個時候就糾結了,是用呢?還是自己在雲主機上搭呢?在這裏我的建議是前期先用雲服務商的,大了後再自己搞,這樣會少掉很多運維的事情,但是這裏要多瞭解一下雲服務商的組件特性以及一些坑,比如他們內網會經常斷開,他們升級也會閃斷,所以在業務側要做好容錯和規避。

關於開源組件,儘可能選擇成熟的,成熟的組件經歷了時間的考驗,基本不會出大的問題,並且有成套的配套工具,出了問題在網上也可以很快的找到答案,你所遇到的坑基本上都有人踩過了。

3、制定流程和規範


4、自研和選型合適的輔助系統


所有的流程和規範都需要用系統來固化,否則就是空中樓閣,如何選擇這些系統呢?參照上個章節咱們那些開源的,對比一下選擇的語言,組件之類的,選擇一個最合適的即可。

比如項目管理的,看下自己是什麼類型的公司,開發的節奏是怎樣的,瀑布,敏捷的 按項目劃分,還是按客戶劃分等等,平時是按項目組織還是按任務組織等等。

比如日誌系統,之前是打的文本,那麼上一個 ELK,規範化一些日誌組件,基本上很長一段時間內不用考慮日誌系統的問題,最多拆分一下或者擴容一下。等到組織大了,自己搞一個日誌系統。

比如代碼管理,項目管理系統這些都放內網,安全,在互聯網公司來說,屬於命脈了,命脈的東西還是放在別人拿不到或很難拿到的地方會比較靠譜一些。

5、選擇過程中需要思考的問題


技術棧的選擇有點像做出了某種承諾,在一定的時間內這種承諾沒法改變,於是我們需要在選擇的時候有一些思考。

看前面內容,有一個詞出現了三次,合適,選擇是合適的,不是最好,也不是最新,是最合適,適合是針對當下,這種選擇是最合適的嗎?比如用 Go 這條線的東西,技術比較新,業界組件儲備夠嗎?組織內的人員儲備夠嗎?學習成本多少?寫出來的東西能滿足業務性能要求嗎?能滿足時間要求嗎?

向未來看一眼,在一年到三年內,我們需要做出改變嗎?技術棧要做根本性的改變嗎?如果組織發展很快,在 200 人,500 人時,現有的技術棧是否需要大動?

創業過程中需要考慮成本,這裏的成本不僅僅是花費多少錢,付出多少工資,有時更重要的是時間成本,很多業務在創業時大家拼的就是時間,就是一個時間窗,過了就沒你什麼事兒了。

基於雲的創業公司後臺技術架構

結合上面內容的考量,在對一個個系統和組件的做選型之後,以雲服務爲基礎,一個創業公司的後臺技術架構如圖 10 所示:

圖 10,後臺技術架構

參考資料

http://database.51cto.com/art/201109/291781.htm

https://zh.wikipedia.org/wiki/Kafka

https://prometheus.io/docs/introduction/overview/

http://deadline.top/2016/11/23 / 配置中心那點事 /

http://blog.fit2cloud.com/2016/01/26/deployment-system.html

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/bhXoiM_t8-Bq6Fef5vyb2Q