轉自 : http://ju.outofmemory.cn/entr...前端
說到後臺技術棧,腦海中是否是浮現的是這樣一幅圖? git
圖 1程序員
有點眼暈,如下只是咱們會用到的一些語言的合集,並且只是語言層面的一部分,就整個後臺技術棧來講,這只是一個開始,從語言開始,還有不少不少的內容。今天要說的後臺是大後臺的概念,放在服務器上的東西都屬於後臺的東西,好比使用的框架,語言,數據庫,服務,操做系統等等。數據庫
整個後臺技術棧個人理解包括 4 個層面的內容:編程
結合以上的的 4 個層面的內容,整個後臺技術棧的結構如圖 2 所示:api
圖2 後臺技術棧結構緩存
以上的這些內容都須要咱們從零開始搭建,在創業公司,沒有大公司那些完善的基礎設施,須要咱們從開源界,從雲服務商甚至有些須要本身去組合,去拼裝,去開發一個適合本身的組件或系統以達成咱們的目標。我們一個個系統和組件的作選型,最終造成咱們的後臺技術棧。安全
一、項目管理/Bug管理/問題管理服務器
項目管理軟件是整個業務的需求,問題,流程等等的集中地,你們的跨部門溝通協同大多依賴於項目管理工具。有一些 SaaS 的項目管理服務可使用,可是不少時間不知足需求,此時咱們能夠選擇一些開源的項目,這些項目自己有必定的定製能力,有豐富的插件可使用,通常的創業公司需求基本上都能獲得知足,經常使用的項目以下:網絡
二、DNS
DNS 是一個很通用的服務,創業公司基本上選擇一個合適的雲廠商就好了,國內主要是兩家:
若是你的業務是在國內,主要就是這兩家,選 一個就好,像今日頭條這樣的企業用的也是 DNSPod 的服務,除非一些特殊的緣由才須要自建,好比一些 CDN 廠商,或者對區域有特殊限制的。要實惠一點用阿里最便宜的基礎版就行了,要成功率高一些,仍是用 DNSPod 的貴的那種。
在國外仍是選擇亞馬遜吧,阿里的 DNS 服務只有在日本和美國有節點,東南亞最近纔開始部點, DNSPod 也只有美國和日本,像一些出海的企業,其選擇的雲服務基本都是亞馬遜。
若是是線上產品,DNS 強烈建議用付費版,阿里的那幾十塊錢的付費版基本能夠知足需求。若是還須要一些按省份或按區域調試的邏輯,則須要加錢,一年也就幾百塊,省錢省力。
若是是國外,優先選擇亞馬遜,若是須要國內外互通而且有本身的 APP 的話,建議仍是本身實現一些容災邏輯或者智能調度,由於沒有一個現成的 DNS 服務能同時較好的知足國內外場景,或者用多個域名,不一樣的域名走不一樣的 DNS 。
三、LB(負載均衡)
LB(負載均衡)是一個通用服務,通常雲廠商的 LB 服務基本都會以下功能:
若是你線上的服務機器都是用的雲服務,而且是在同一個雲服務商的話,能夠直接使用雲服務商提供的 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 框架以下:
六、名字發現/服務發現
名字發現和服務發現分爲兩種模式,一個是客戶端發現模式,一種是服務端發現模式。
框架中經常使用的服務發現是客戶端發現模式。
所謂服務端發現模式是指客戶端經過一個負載均衡器向服務發送請求,負載均衡器查詢服務註冊表並把請求路由到一臺可用的服務實例上。如今經常使用的負載均衡器都是此類模式,經常使用於微服務中。
全部的名字發現和服務發現都要依賴於一個可用性很是高的服務註冊表,業界經常使用的服務註冊表有以下三個:
除此以外也能夠本身實現服務實現,或者用 Redis 也行,只是須要本身實現高可用性。
七、關係數據庫
關係數據庫分爲兩種,一種是傳統關係數據,如 Oracle,MySQL,Maria,DB2,PostgreSQL 等等,另外一種是 NewSQL,即至少要知足如下五點的新型關係數據庫:
傳統關係數據庫用得最多的是 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個類型:
除了以上4種類型,還有一些特種的數據庫,如對象數據庫,XML 數據庫,這些都有針對性對某些存儲類型作了優化的數據庫。
在實際應用場景中,什麼時候使用關係數據庫,什麼時候使用 NoSQL,使用哪一種類型的數據庫,這是咱們在作架構選型時一個很是重要的考量,甚至會影響整個架構的方案。
九、消息中間件
消息中間件在後臺系統中是必不可少的一個組件,通常咱們會在如下場景中使用消息中間件:
業界消息中間件是一個很是通用的東西,你們在作選型時有使用開源的,也有本身造輪子的,甚至有直接用 MySQL 或 Redis 作隊列的,關鍵看是否知足你的需求,若是是使用開源的項目,如下的表格在選型時能夠參考:
圖 3
以上圖的緯度爲:名字、成熟度、所屬社區/公司、文檔、受權方式、開發語言、支持的協議、客戶端支持的語言、性能、持久化、事務、集羣、負載均衡、管理界面、部署方式、評價。
十、代碼管理
代碼是互聯網創業公司的命脈之一,代碼管理很重要,常見的考量點包括兩塊:
十一、持續集成
持續集成簡,稱 CI(continuous integration),是一種軟件開發實踐,即團隊開發成員常常集成他們的工做,天天可能會發生屢次集成。每次集成都經過自動化的構建(包括編譯,發佈,自動化測試)來驗證,從而儘早地發現集成錯誤。持續集成爲研發流程提供了代碼分支管理/比對、編譯、檢查、發佈物輸出等基礎工做,爲測試的覆蓋率版本編譯、生成等提供統一支持。
業界免費的持續集成工具中系統咱們有以下一些選擇:
十二、日誌系統
日誌系統通常包括打日誌,採集,中轉,收集,存儲,分析,呈現,搜索還有分發等。一些特殊的如染色,全鏈條跟蹤或者監控均可能須要依賴於日誌系統實現。日誌系統的建設不只僅是工具的建設,還有規範和組件的建設,最好一些基本的日誌在框架和組件層面加就好了,好比全連接跟蹤之類的。
對於常規日誌系統ELK能知足大部分的需求,ELK 包括以下組件:
由於免費的 ELK 沒有任何安全機制,因此這裏使用了 Nginx 做反向代理,避免用戶直接訪問 Kibana 服務器。加上配置 Nginx 實現簡單的用戶認證,必定程度上提升安全性。另外,Nginx 自己具備負載均衡的做用,可以提升系統訪問性能。ELK 架構如圖4所示:
圖 4,ELK 流程圖
對於有實時計算的需求,可使用 Flume + Kafka + Storm + MySQL 方案,一 般架構如圖 5 所示:
圖 5,實時分析系統架構圖
其中:
Kafka 追求的是高吞吐量、高負載,Flume 追求的是數據的多樣性,兩者結合起來簡直完美。
1三、監控系統
監控系統只包含與後臺相關的,這裏主要是兩塊,一個是操做系統層的監控,好比機器負載,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),能夠知足大部分中小團隊的監控需求。
1四、配置系統
隨着程序功能的日益複雜,程序的配置日益增多:各類功能的開關、降級開關,灰度開關,參數的配置、服務器的地址、數據庫配置等等,除此以外,對後臺程序配置的要求也愈來愈高:配置修改後實時生效,灰度發佈,分環境、分用戶,分集羣管理配置,完善的權限、審覈機制等等,在這樣的大環境下,傳統的經過配置文件、數據庫等方式已經愈來愈沒法知足開發人員對配置管理的需求,業界有以下兩種方案:
創業公司前期不須要這種複雜,直接上 zk,弄一個界面管理 zk 的內容,記錄一下全部人的操做日誌,程序直連 zk,或者或者用 Qconf 等基於 zk 優化後的方案。
1五、發佈系統/部署系統
從軟件生產的層面看,代碼到最終服務的典型流程如圖 8 所示:
圖 8,流程圖
從上圖中能夠看出,從開發人員寫下代碼到服務最終用戶是一個漫長過程,總體能夠分紅三個階段:
發佈系統集成了製品管理,發佈流程,權限控制,線上環境版本變動,灰度發佈,線上服務回滾等幾方面的內容,是開發人員工做結晶最終呈現的重要通道。開源的項目中沒有徹底知足的項目,若是隻是 Web 類項目,Walle、Piplin 都是可用的,可是功能不太知足,創業初期能夠集成 Jenkins + Gitlab + Walle(能夠考慮兩天時間完善一下),以上方案基本包括製品管理,發佈流程,權限控制,線上環境版本變動,灰度發佈(須要本身實現),線上服務回滾等功能。
1六、跳板機
跳板機面對的是需求是要有一種能知足角色管理與受權審批、信息資源訪問控制、操做記錄和審計、系統變動和維護控制要求,並生成一些統計報表配合管理規範來不斷提高IT內控的合規性,能對運維人員操做行爲的進行控制和審計,對誤操做、違規操做致使的操做事故,快速定位緣由和責任人。其功能模塊通常包括:賬戶管理、認證管理、受權管理、審計管理等等。
開源項目中,Jumpserver 可以實現跳板機常見需求,如受權、用戶管理、服務器基本信息記錄等,同時又可批量執行腳本等功能;其中錄像回放、命令搜索、實時監控等特色,又能幫助運維人員回溯操做歷史,方便查找操做痕跡,便於管理其餘人員對服務器的操做控制。
1七、機器管理
機器管理的工具選擇的考量能夠包含如下三個方面:
如圖9所示:
圖 9,機器管理軟件對比
通常創業公司選擇 Ansible 能解決大部問題,其簡單,不須要安裝額外的客戶端,能夠從命令行來運行,不須要使用配置文件。至於比較複雜的任務,Ansible 配置經過名爲 Playbook 的配置文件中的 YAML 語法來加以處理。Playbook 還可使用模板來擴展其功能。
一、選擇合適的語言
二、選擇合適的組件和雲服務商
選擇靠譜的雲服務商,其實這是一個僞命題,由於哪一個服務商都不靠譜,他們所承諾的那些可用性問題基本上都會在你的身上發生,這裏咱們仍是須要本身作一些工做,好比多服務商備份,如用 CDN,你必定不要只選一家,至少選兩家,一個是災備,保持後臺切換的能力,另外一個是多點覆蓋,不一樣的服務商在 CDN 節點上的資源是不同的。
選擇了雲服務商之後,就會有不少的產品你能夠選擇了,比較存儲,隊列這些都會有現成的產品,這個時候就糾結了,是用呢?仍是本身在雲主機上搭呢?在這裏個人建議是前期先用雲服務商的,大了後再本身搞,這樣會少掉不少運維的事情,可是這裏要多瞭解一下雲服務商的組件特性以及一些坑,好比他們內網會常常斷開,他們升級也會閃斷,因此在業務側要作好容錯和規避。
關於開源組件,儘量選擇成熟的,成熟的組件經歷了時間的考驗,基本不會出大的問題,而且有成套的配套工具,出了問題在網上也能夠很快的找到答案,你所遇到的坑基本上都有人踩過了。
三、制定流程和規範
四、自研和選型合適的輔助系統
全部的流程和規範都須要用系統來固化,不然就是空中樓閣,如何選擇這些系統呢?參照上個章節我們那些開源的,對比一下選擇的語言,組件之類的,選擇一個最合適的便可。
好比項目管理的,看下本身是什麼類型的公司,開發的節奏是怎樣的,瀑布,敏捷的 按項目劃分,仍是按客戶劃分等等,平時是按項目組織仍是按任務組織等等。
好比日誌系統,以前是打的文本,那麼上一個 ELK,規範化一些日誌組件,基本上很長一段時間內不用考慮日誌系統的問題,最多拆分一下或者擴容一下。等到組織大了,本身搞一個日誌系統。
好比代碼管理,項目管理系統這些都放內網,安全,在互聯網公司來講,屬於命脈了,命脈的東西仍是放在別人拿不到或很難拿到的地方會比較靠譜一些。
五、選擇過程當中須要思考的問題
技術棧的選擇有點像作出了某種承諾,在必定的時間內這種承諾無法改變,因而咱們須要在選擇的時候有一些思考。
看前面內容,有一個詞出現了三次,合適,選擇是合適的,不是最好,也不是最新,是最合適,適合是針對當下,這種選擇是最合適的嗎?好比用 Go 這條線的東西,技術比較新,業界組件儲備夠嗎?組織內的人員儲備夠嗎?學習成本多少?寫出來的東西能知足業務性能要求嗎?能知足時間要求嗎?
向將來看一眼,在一年到三年內,咱們須要作出改變嗎?技術棧要作根本性的改變嗎?若是組織發展很快,在 200 人,500 人時,現有的技術棧是否須要大動?
創業過程當中須要考慮成本,這裏的成本不只僅是花費多少錢,付出多少工資,有時更重要的是時間成本,不少業務在創業時你們拼的就是時間,就是一個時間窗,過了就沒你什麼事兒了。
結合上面內容的考量,在對一個個系統和組件的作選型以後,以雲服務爲基礎,一個創業公司的後臺技術架構如圖10所示:
圖 10,後臺技術架構