歡迎光臨
每天分享高質量文章

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

 

說到後臺技術棧,腦海中是不是浮現的是這樣一幅圖?
圖 1
有點眼暈,以下只是我們會用到的一些語言的合集,而且只是語言層面的一部分,就整個後臺技術棧來說,這隻是一個開始,從語言開始,還有很多很多的內容。今天要說的後臺是大後臺的概念,放在服務器上的東西都屬於後臺的東西,比如使用的框架,語言,資料庫,服務,操作系統等等。
整個後臺技術棧我的理解包括 4 個層面的內容:
  • 語言: 用了哪些開發語言,如:C++/Java/Go/PHP/Python/Ruby 等等;

  • 組件:用了哪些組件,如:MQ 組件,資料庫組件等等;

  • 流程:怎樣的流程和規範,如:開發流程,專案流程,發佈流程,監控告警流程,代碼規範等等;

  • 系統:系統化建設,上面的流程需要有系統來保證,如:規範發佈流程的發佈系統,代碼管理系統等等;

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

 

各系統組件選型

 

專案管理/Bug管理/問題管理
專案管理軟體是整個業務的需求,問題,流程等等的集中地,大家的跨部門溝通協同大多依賴於專案管理工具。有一些 SaaS 的專案管理服務可以使用,但是很多時間不滿足需求,此時我們可以選擇一些開源的專案,這些專案本身有一定的定製能力,有豐富的插件可以使用,一般的創業公司需求基本上都能得到滿足,常用的專案如下:
  • Redmine: 用 Ruby 開發的,有較多的插件可以使用,能自定義欄位,集成了專案管理,Bug 問題跟蹤,WIKI 等功能,不過好多插件 N 年沒有更新了;

  • Phabricator:用 PHP 開發的,Facebook 之前的內部工具,開發這工具的哥們離職後自己搞了一個公司專門做這個軟體,集成了代碼托管, Code Review,任務管理,文件管理,問題跟蹤等功能,強烈推薦較敏捷的團隊使用;

  • Jira:用 Java 開發的,有用戶故事,task 拆分,燃盡圖等等,可以做專案管理,也可以應用於跨部門溝通場景,較強大;

  • 悟空 CRM :這個不是專案管理,這個是客戶管理,之所以在這裡提出來,是因為在 To B 的創業公司裡面,往往是以客戶為核心來做事情的,可以將專案管理和問題跟進的在悟空 CRM 上面來做,他的開源版本已經基本實現了 CR< 的核心 功能,還帶有一個任務管理功能,用於問題跟進,不過用這個的話,還是需要另一個專案管理的軟體協助,順便說一嘴,這個系統的代碼寫得很難維護,只能適用於客戶規模小(1萬以內)時。

 
DNS
DNS 是一個很通用的服務,創業公司基本上選擇一個合適的雲廠商就行了,國內主要是兩家:
  • 阿裡萬網:阿裡 2014 年收購了萬網,整合了其域名服務,最終形成了現在的阿裡萬網,其中就包含 DNS 這塊的服務;

  • 騰訊 DNSPod:騰訊 2012 年以 4000 萬收購 DNSPod 100% 股份,主要提供域名解析和一些防護功能;

如果你的業務是在國內,主要就是這兩家,選 一個就好,像今日頭條這樣的企業用的也是 DNSPod 的服務,除非一些特殊的原因才需要自建,比如一些 CDN 廠商,或者對區域有特殊限制的。要實惠一點用阿裡最便宜的基礎版就好了,要成功率高一些,還是用 DNSPod 的貴的那種。
在國外還是選擇亞馬遜吧,阿裡的 DNS 服務只有在日本和美國有節點,東南亞最近才開始部點, DNSPod 也只有美國和日本,像一些出海的企業,其選擇的雲服務基本都是亞馬遜。
如果是線上產品,DNS 強烈建議用付費版,阿裡的那幾十塊錢的付費版基本可以滿足需求。如果還需要一些按省份或按區域除錯的邏輯,則需要加錢,一年也就幾百塊,省錢省力。
如果是國外,優先選擇亞馬遜,如果需要國內外互通並且有自己的 APP 的話,建議還是自己實現一些容災邏輯或者智慧調度,因為沒有一個現成的 DNS 服務能同時較好的滿足國內外場景,或者用多個域名,不同的域名走不同的 DNS 。
LB(負載均衡)
LB(負載均衡)是一個通用服務,一般雲廠商的 LB 服務基本都會如下功能:
  • 支持四層協議請求(包括 TCP、UDP 協議);

  • 支持七層協議請求(包括 HTTP、HTTPS 協議);

  • 集中化的證書管理系統支持 HTTPS 協議;

  • 健康檢查;

如果你線上的服務機器都是用的雲服務,並且是在同一個雲服務商的話,可以直接使用雲服務商提供的 LB 服務,如阿裡雲的 SLB,騰訊雲的 CLB,亞馬遜的 ELB 等等。如果是自建機房基本都是 LVS + Nginx。
CDN
CDN 現在已經是一個很紅很紅的市場,基本上只能掙一些辛苦錢,都是貼著成本在賣。國內以網宿為龍頭,他們家占據整個國內市場份額的 40% 以上,後面就是騰訊,阿裡。網宿有很大一部分是因為直播的興起而崛起。
國外,Amazon 和 Akamai 合起來占比大概在 50%,曾經的國際市場老大 Akamai 擁有全球超一半的份額,在 Amazon CDN入局後,份額跌去了將近 20%,眾多中小企業都轉向後者,Akamai 也是無能為力。
國內出海的 CDN 廠商,更多的是為國內的出海企業服務,三家大一點的 CDN 服務商裡面也就網宿的節點多一些,但是也多不了多少。阿裡和騰訊還處於前期階段,僅少部分國家有節點。
就創業公司來說,CDN 用騰訊雲或阿裡雲即可,其相關係統較完善,能輕鬆接入,網宿在系統支持層面相對較弱一些,而且還貴一些。並且,當流量上來後,CDN 不能只用一家,需要用多家,不同的 CDN 在全國的節點改寫不一樣,而且針對不同的客戶雲廠商內部有些區分客戶集群,並不是全節點改寫(但有些雲廠商說自己是全網節點),除了節點改寫的問題,多 CDN 也在一定程度上起到容災的作用。
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 框架如下:
  • Dubbo:Dubbo 是阿裡巴巴公司開源的一個 Java 高性能優秀的服務框架,使得應用可通過高性能的 RPC 實現服務的輸出和輸入功能,可以和 Spring 框架無縫集成。當年在淘寶內部,Dubbo 由於跟淘寶另一個類似的框架 HSF 有競爭關係,導致 Dubbo 團隊解散,最近又活過來了,有專職同學投入。

  • DubboX:DubboX 是由噹噹在基於 Dubbo 框架擴展的一個 RPC 框架,支持 REST 風格的遠程呼叫、Kryo/FST 序列化,增加了一些新的feature。 Motan:Motan 是新浪微博開源的一個 Java 框架。它誕生的比較晚,起於 2013 年,2016 年 5 月開源。Motan 在微博平臺中已經廣泛應用,每天為數百個服務完成近千億次的呼叫。

  • rpcx:rpcx 是一個類似阿裡巴巴 Dubbo 和微博 Motan 的分佈式的 RPC 服務框架,基於 Golang net/rpc 實現。但是 rpcx 基本只有一個人在維護,沒有完善的社區,使用前要慎重,之前做 Golang 的 RPC 選型時也有考慮這個,最終還是放棄了,選擇了 gRPC,如果想自己自研一個 RPC 框架,可以參考學習一下。

 

名字發現/服務發現
名字發現和服務發現分為兩種樣式,一個是客戶端發現樣式,一種是服務端發現樣式。
框架中常用的服務發現是客戶端發現樣式。
所謂服務端發現樣式是指客戶端通過一個負載均衡器向服務發送請求,負載均衡器查詢服務註冊表並把請求路由到一臺可用的服務實體上。現在常用的負載均衡器都是此類樣式,常用於微服務中。
所有的名字發現和服務發現都要依賴於一個可用性非常高的服務註冊表,業界常用的服務註冊表有如下三個:
  • etcd,一個高可用、分佈式、一致性、key-value 方式的儲存,被用在分享配置和服務發現中。兩個著名的專案使用了它:Kubernetes 和 Cloud Foundry。

  • Consul,一個發現和配置服務的工具,為客戶端註冊和發現服務提供了API,Consul還可以通過執行健康檢查決定服務的可用性。

  • Apache ZooKeeper,是一個廣泛使用、高性能的針對分佈式應用的協調服務。Apache ZooKeeper 本來是 Hadoop 的子工程,現在已經是頂級工程了。

 

除此之外也可以自己實現服務實現,或者用 Redis 也行,只是需要自己實現高可用性。
關係資料庫
關係資料庫分為兩種,一種是傳統關係資料,如 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 要使用分庫分表,邏輯開發比較複雜,擴展性不夠。
NoSQL
NoSQL 顧名思義就是 Not-Only SQL,也有人說是 No – SQL,個人偏向於 Not-Only SQL,它並不是用來替代關係庫,而是作為關係型資料庫的補充而存在。
常見 NoSQL 有4個型別:
  • 鍵值,適用於內容快取,適合混合工作負載併發高擴展要求大的資料集,其優點是簡單,查詢速度快,缺點是缺少結構化資料,常見的有 Redis,Memcache,BerkeleyDB 和 Voldemort 等等;

  • 列式,以列簇式儲存,將同一列資料存在一起,常見於分佈式的檔案系統,其中以 Hbase,Cassandra 為代表。Cassandra 多用於寫多讀少的場景,國內用得比較多的有 360,大概 1500 台機器的集群,國外大規模使用的公司比較多,如 eBay,Instagram,Apple 和沃爾瑪等等;

  • 文件,資料儲存方案非常適用承載大量不相關且結構差別很大的複雜信息。性能介於 kv 和關係資料庫之間,它的靈感來於 lotus notes,常見的有 MongoDB,CouchDB 等等;

  • 圖形,圖形資料庫擅長處理任何涉及關係的狀況。社交網絡,推薦系統等。專註於構建關係圖譜,需要對整個圖做計算才能得出結果,不容易做分佈式的集群方案,常見的有 Neo4J,InfoGrid 等。

除了以上4種型別,還有一些特種的資料庫,如物件資料庫,XML 資料庫,這些都有針對性對某些儲存型別做了優化的資料庫。
在實際應用場景中,何時使用關係資料庫,何時使用 NoSQL,使用哪種型別的資料庫,這是我們在做架構選型時一個非常重要的考量,甚至會影響整個架構的方案。
訊息中間件
訊息中間件在後臺系統中是必不可少的一個組件,一般我們會在以下場景中使用訊息中間件:
  • 異步處理:異步處理是使用訊息中間件的一個主要原因,在工作中最常見的異步場景有用戶註冊成功後需要發送註冊成功郵件、快取過期時先傳回老的資料,然後異步更新快取、異步寫日誌等等;通過異步處理,可以減少主流程的等待響應時間,讓非主流程或者非重要業務通過訊息中間件做集中的異步處理。

  • 系統解耦:比如在電商系統中,當用戶成功支付完成訂單後,需要將支付結果給通知ERP系統、發票系統、WMS、推薦系統、搜索系統、風控系統等進行業務處理;這些業務處理不需要實時處理、不需要強一致,只需要最終一致性即可,因此可以通過訊息中間件進行系統解耦。通過這種系統解耦還可以應對未來不明確的系統需求。

  • 削峰填谷:當系統遇到大流量時,監控圖上會看到一個一個的山峰樣的流量圖,通過使用訊息中間件將大流量的請求放入佇列,通過消費者程式將佇列中的處理請求慢慢消化,達到消峰填谷的效果。最典型的場景是秒殺系統,在電商的秒殺系統中下單服務往往會是系統的瓶頸,因為下單需要對庫存等做資料庫操作,需要保證強一致性,此時使用訊息中間件進行下單排隊和流控,讓下單服務慢慢把佇列中的單處理完,保護下單服務,以達到削峰填谷的作用。

 

業界訊息中間件是一個非常通用的東西,大家在做選型時有使用開源的,也有自己造輪子的,甚至有直接用 MySQL 或 Redis 做佇列的,關鍵看是否滿足你的需求,如果是使用開源的專案,以下的表格在選型時可以參考:
圖 3
以上圖的緯度為:名字、成熟度、所屬社區/公司、文件、授權方式、開發語言、支持的協議、客戶端支持的語言、性能、持久化、事務、集群、負載均衡、管理界面、部署方式、評價。
代碼管理
代碼是互聯網創業公司的命脈之一,代碼管理很重要,常見的考量點包括兩塊:
  • 安全和權限管理,將代碼放到內網並且對於關係公司命脈的核心代碼做嚴格的代碼控制和機器的物理隔離;

  • 代碼管理工具,Git 作為代碼管理的不二之選,你值得擁有。GitLab 是當今最火的開源 Git 托管服務端,沒有之一,雖然有企業版,但是其社區版基本能滿足我們大部分需求,結合 Gerrit 做 Code review,基本就完美了。當然 GitLab 也有代碼對比,但沒 Gerrit 直觀。Gerrit 比 GitLab 提供了更好的代碼檢查界面與主線管理體驗,更適合在對代碼質量有高要求的文化下使用。

持續集成
持續集成簡,稱 CI(continuous integration),是一種軟體開發實踐,即團隊開發成員經常集成他們的工作,每天可能會發生多次集成。每次集成都通過自動化的構建(包括編譯,發佈,自動化測試)來驗證,從而儘早地發現集成錯誤。持續集成為研發流程提供了代碼分支管理/比對、編譯、檢查、發佈物輸出等基礎工作,為測試的改寫率版本編譯、生成等提供統一支持。
業界免費的持續集成工具中系統我們有如下一些選擇:
  • Jenkins:Java 寫的有強大的插件機制,MIT 協議開源 (免費,定製化程度高,它可以在多台機器上進行分佈式地構建和負載測試)。Jenkins 可以算是無所不能,基本沒有 Jenkins 做不了的,無論從小型團隊到大型團隊 Jenkins 都可以搞定。不過如果要大規模使用,還是需要有人力來學習和維護。

  • TeamCity:TeamCity 與 Jenkins 相比使用更加友好,也是一個高度可定製化的平臺。但是用的人多了,TeamCity就要收費了。

  • Strider:Strider 是一個開源的持續集成和部署平臺,使用 Node.js 實現,儲存使用的是 MongoDB,BSD 許可證,概念上類似 Travis 和Jenkins。

  • GitLab CI:從GitLab 8.0開始,GitLab CI 就已經集成在 GitLab,我們只要在專案中添加一個 .gitlab-ci.yml 檔案,然後添加一個 Runner,即可進行持續集成。並且 GitLab 與 Docker 有著非常好的相互協作的能力。免費版與付費版本不同可以參見這裡:https://about.gitlab.com/products/feature-comparison/。

  • Travis:Travis 和 GitHub 強關聯;閉原始碼使用 SaaS 還需考慮安全問題;不可定製;開源專案免費,其它收費。

  • Go:Go 是 ThoughtWorks 公司最新的 Cruise Control 的化身。除了 ThoughtWorks 提供的商業支持,Go 是免費的。它適用於 Windows,Mac 和各種 Linux 發行版。

 
日誌系統
日誌系統一般包括打日誌,採集,中轉,收集,儲存,分析,呈現,搜索還有分發等。一些特殊的如染色,全鏈條跟蹤或者監控都可能需要依賴於日誌系統實現。日誌系統的建設不僅僅是工具的建設,還有規範和組件的建設,最好一些基本的日誌在框架和組件層面加就行了,比如全鏈接跟蹤之類的。
對於常規日誌系統ELK能滿足大部分的需求,ELK 包括如下組件:
  • ElasticSearch 是個開源分佈式搜索引擎,它的特點有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,RESTful 風格接口,多資料源,自動搜索負載等。

  • Logstash 是一個完全開源的工具,它可以對你的日誌進行收集、分析,並將其儲存供以後使用。

  • Kibana 是一個開源和免費的工具,它可以為 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 界面,可以幫助彙總、分析和搜索重要資料日誌。

  • Filebeat 已經完全替代了 Logstash-Forwarder 成為新一代的日誌採集器,同時鑒於它輕量、安全等特點,越來越多人開始使用它。

因為免費的 ELK 沒有任何安全機制,所以這裡使用了 Nginx 作反向代理,避免用戶直接訪問 Kibana 服務器。加上配置 Nginx 實現簡單的用戶認證,一定程度上提高安全性。另外,Nginx 本身具有負載均衡的作用,能夠提高系統訪問性能。ELK 架構如圖4所示:
圖 4,ELK 流程圖
對於有實時計算的需求,可以使用 Flume + Kafka + Storm + MySQL 方案,一 般架構如圖 5 所示:
圖 5,實時分析系統架構圖
其中:
  • Flume 是一個分佈式、可靠、和高可用的海量日誌採集、聚合和傳輸的日誌收集系統,支持在日誌系統中定製各類資料發送方,用於收集資料;同時,Flume 提供對資料進行簡單處理,並寫到各種資料接受方(可定製)的能力。

  • Kafka 是由 Apache 軟體基金會開發的一個開源流處理平臺,由 Scala 和 Java 編寫。其本質上是一個“按照分佈式事務日誌架構的大規模發佈/訂閱訊息佇列”,它以可水平擴展和高吞吐率而被廣泛使用。

Kafka 追求的是高吞吐量、高負載,Flume 追求的是資料的多樣性,二者結合起來簡直完美。
監控系統
監控系統只包含與後臺相關的,這裡主要是兩塊,一個是操作系統層的監控,比如機器負載,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 Server 主要負責資料採集和儲存,提供 PromQL 查詢語言的支持。Server 通過配置檔案、文本檔案、ZooKeeper、Consul、DNS SRV Lookup 等方式指定抓取標的。根據這些標的會,Server 定時去抓取 metrics 資料,每個抓取標的需要暴露一個 http 服務的接口給它定時抓取。

  • 客戶端 SDK:官方提供的客戶端類庫有 Go、Java、Scala、Python、Ruby,其他還有很多第三方開發的類庫,支持 Nodejs、PHP、Erlang 等。

  • Push Gateway 支持臨時性 Job 主動推送指標的中間網關。

  • Exporter Exporter 是 Prometheus 的一類資料採集組件的總稱。它負責從標的處搜集資料,並將其轉化為 Prometheus 支持的格式。與傳統的資料採集組件不同的是,它並不向中央服務器發送資料,而是等待中央服務器主動前來抓取。Prometheus 提供多種型別的 Exporter 用於採集各種不同服務的運行狀態。目前支持的有資料庫、硬體、訊息中間件、儲存系統、HTTP 服務器、JMX 等。

  • Alertmanager:是一個單獨的服務,可以支持 Prometheus 的查詢陳述句,提供十分靈活的報警方式。

  • Prometheus HTTP API 的查詢方式,自定義所需要的輸出。

  • Grafana 是一套開源的分析監視平臺,支持 Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch 等資料源,其 UI 非常漂亮且高度定製化。

 

創業公司選擇 Prometheus + Grafana 的方案,再加上統一的服務框架(如 gRPC),可以滿足大部分中小團隊的監控需求。
配置系統
隨著程式功能的日益複雜,程式的配置日益增多:各種功能的開關、降級開關,灰度開關,引數的配置、服務器的地址、資料庫配置等等,除此之外,對後臺程式配置的要求也越來越高:配置修改後實時生效,灰度發佈,分環境、分用戶,分集群管理配置,完善的權限、審核機制等等,在這樣的大環境下,傳統的通過配置檔案、資料庫等方式已經越來越無法滿足開發人員對配置管理的需求,業界有如下兩種方案:
  • 基於 zk 和 etcd,支持界面和 api ,用資料庫來儲存版本歷史,預案,走審核流程,最後下發到 zk 或 etcd 這種有推送能力的儲存里(服務註冊本身也是用 zk 或 etcd,選型就一塊了)。客戶端都直接和 zk 或 etcd 打交道。至於灰度發佈,各家不同,有一種實現是同時發佈一個需要灰度的 IP 串列,客戶端監聽到配置節點變化時,對比一下自己是否屬於該串列。PHP 這種無狀態的語言和其他 zk/etcd 不支持的語言,只好自己在客戶端的機器上起一個 Agent 來監聽變化,再寫到配置檔案或共享記憶體,如 360 的 Qconf。

  • 基於運維自動化的配置檔案的推送,審核流程,配置資料管理和方案一類似,下發時生成配置檔案,基於運維自動化工具如 Puppet,Ansible 推送到每個客戶端,而應用則定時重新讀取這個外部的配置檔案,灰度發佈在下發配置時指定IP串列。

創業公司前期不需要這種複雜,直接上 zk,弄一個界面管理 zk 的內容,記錄一下所有人的操作日誌,程式直連 zk,或者或者用 Qconf 等基於 zk 優化後的方案。
發佈系統/部署系統
從軟體生產的層面看,代碼到最終服務的典型流程如圖 8 所示:
圖 8,流程圖
從上圖中可以看出,從開發人員寫下代碼到服務最終用戶是一個漫長過程,整體可以分成三個階段:
  • 從代碼(Code)到成品庫(Artifact)這個階段主要對開發人員的代碼做持續構建並把構建產生的製品集中管理,是為部署系統準備輸入內容的階段。

  • 從製品到可運行服務 這個階段主要完成製品部署到指定環境,是部署系統的最基本工作內容。

  • 從開發環境到最終生產環境 這個階段主要完成一次變更在不同環境的遷移,是部署系統上線最終服務的核心能力。

 

發佈系統集成了製品管理,發佈流程,權限控制,線上環境版本變更,灰度發佈,線上服務回滾等幾方面的內容,是開發人員工作結晶最終呈現的重要通道。開源的專案中沒有完全滿足的專案,如果只是 Web 類專案,Walle、Piplin 都是可用的,但是功能不太滿足,創業初期可以集成 Jenkins + Gitlab + Walle(可以考慮兩天時間完善一下),以上方案基本包括製品管理,發佈流程,權限控制,線上環境版本變更,灰度發佈(需要自己實現),線上服務回滾等功能。
跳板機
跳板機面對的是需求是要有一種能滿足角色管理與授權審批、信息資源訪問控制、操作記錄和審計、系統變更和維護控制要求,並生成一些統計報表配合管理規範來不斷提升IT內控的合規性,能對運維人員操作行為的進行控制和審計,對誤操作、違規操作導致的操作事故,快速定位原因和責任人。其功能模塊一般包括:帳戶管理、認證管理、授權管理、審計管理等等。
開源專案中,Jumpserver 能夠實現跳板機常見需求,如授權、用戶管理、服務器基本信息記錄等,同時又可批量執行腳本等功能;其中錄像回放、命令搜索、實時監控等特點,又能幫助運維人員回溯操作歷史,方便查找操作痕跡,便於管理其他人員對服務器的操作控制。
機器管理
機器管理的工具選擇的考量可以包含以下三個方面:
  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 還可以使用模板來擴展其功能。
創業公司的選擇

 

選擇合適的語言
  • 選擇團隊熟悉的/能掌控的,創業公司人少事多,無太多冗餘讓研發團隊熟悉新的語言,能快速上手,能快速出活,出了問題能快速解決的問題的語言才是好的選擇。

  • 選擇更現代一些的,這裡的現代是指語言本身已經完成一些之前需要特殊處理的特性,比如記憶體管理,執行緒等等。

  • 選擇開源輪子多的或者社區活躍度高的,這個原則是為了保證在開發過程中減少投入,有穩定可靠的輪子可以使用,遇到問題可以在網上快速搜索到答案。

  • 選擇好招人的 一門合適的語言會讓創業團隊減少招聘的成本,快速招到合適的人。

  • 選擇能讓人有興趣的 與上面一點相關,讓人感興趣,在後面留人時有用。

 

選擇合適的組件和雲服務商
  • 選擇靠譜的雲服務商;

  • 選擇雲服務商的組件;

  • 選擇成熟的開源組件,而不是最新出的組件;

  • 選擇採用在一線互聯網公司落地並且開源的,且在社區內形成良好口碑的產品;

  • 開源社區活躍度;

 

選擇靠譜的雲服務商,其實這是一個偽命題,因為哪個服務商都不靠譜,他們所承諾的那些可用性問題基本上都會在你的身上發生,這裡我們還是需要自己做一些工作,比如多服務商備份,如用 CDN,你一定不要只選一家,至少選兩家,一個是災備,保持後臺切換的能力,另一個是多點改寫,不同的服務商在 CDN 節點上的資源是不一樣的。
選擇了雲服務商以後,就會有很多的產品你可以選擇了,比較儲存,佇列這些都會有現成的產品,這個時候就糾結了,是用呢?還是自己在雲主機上搭呢?在這裡我的建議是前期先用雲服務商的,大了後再自己搞,這樣會少掉很多運維的事情,但是這裡要多瞭解一下雲服務商的組件特性以及一些坑,比如他們內網會經常斷開,他們升級也會閃斷,所以在業務側要做好容錯和規避。
關於開源組件,盡可能選擇成熟的,成熟的組件經歷了時間的考驗,基本不會出大的問題,並且有成套的配套工具,出了問題在網上也可以很快的找到答案,你所遇到的坑基本上都有人踩過了。
制定流程和規範
  • 制定開發的規範,代碼及代碼分支管理規範,關鍵性代碼僅少數人有權限;

  • 制定發佈流程規範,從發佈系統落地;

  • 制定運維規範;

  • 制定資料庫操作規範,收攏資料庫操作權限;

  • 制定告警處理流程,做到告警有人看有人處理;

  • 制定彙報機制,晨會/周報;

 
自研和選型合適的輔助系統
所有的流程和規範都需要用系統來固化,否則就是空中樓閣,如何選擇這些系統呢?參照上個章節咱們那些開源的,對比一下選擇的語言,組件之類的,選擇一個最合適的即可。
比如專案管理的,看下自己是什麼型別的公司,開發的節奏是怎樣的,瀑布,敏捷的 按專案劃分,還是按客戶劃分等等,平時是按專案組織還是按任務組織等等。
比如日誌系統,之前是打的文本,那麼上一個 ELK,規範化一些日誌組件,基本上很長一段時間內不用考慮日誌系統的問題,最多拆分一下或者擴容一下。等到組織大了,自己搞一個日誌系統。
比如代碼管理,專案管理系統這些都放內網,安全,在互聯網公司來說,屬於命脈了,命脈的東西還是放在別人拿不到或很難拿到的地方會比較靠譜一些。
選擇過程中需要思考的問題
技術棧的選擇有點像做出了某種承諾,在一定的時間內這種承諾沒法改變,於是我們需要在選擇的時候有一些思考。
看前面內容,有一個詞出現了三次,合適,選擇是合適的,不是最好,也不是最新,是最合適,適合是針對當下,這種選擇是最合適的嗎?比如用 Go 這條線的東西,技術比較新,業界組件儲備夠嗎?組織內的人員儲備夠嗎?學習成本多少?寫出來的東西能滿足業務性能要求嗎?能滿足時間要求嗎?
向未來看一眼,在一年到三年內,我們需要做出改變嗎?技術棧要做根本性的改變嗎?如果組織發展很快,在 200 人,500 人時,現有的技術棧是否需要大動?
創業過程中需要考慮成本,這裡的成本不僅僅是花費多少錢,付出多少工資,有時更重要的是時間成本,很多業務在創業時大家拼的就是時間,就是一個時間窗,過了就沒你什麼事兒了。
基於雲的創業公司後臺技術架構

 

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

已同步到看一看
赞(0)

分享創造快樂