天天看點

架構執行個體

作為一個移動端開發人員來講,是很難接觸到後端項目架構的,所幸,從2015年開始,負責部分管理工作,參與了項目架構相關的工作。項目從小到大,架構也越來越複雜,特别是最近做的一個跨國型項目,涉及到國内國外伺服器的部署,尤為複雜。本文結合這些項目實踐,介紹基于阿裡雲的後端架構設計。(部分内容為引用他人的文章,文中已有說明,咱是尊重版權的)

1.基礎架構:

2015年初,團隊做了一個美食項目,業務邏輯比較簡單,主要是實作使用者、餐館、美食三元素的增删改查及三者之間的關聯查詢。後端程式采用的是php,前端面對的是iOS和Android兩款App。當時購買了一台阿裡雲ECS伺服器,在該伺服器上安裝了MySQL以用于資料存儲。應用程式、資料庫、檔案等所有資源都在一台伺服器上,網站架構如下圖所示:

此架構簡單,适用于項目初期,通路量比較小情況。這裡着重要說一下的是,此項目中涉及到資源檔案的存儲但并沒有用到OSS伺服器,我們的做法是在用戶端在上傳圖檔檔案的時候,接口程式會将圖檔壓縮為所需的多種尺寸,并儲存在對應的檔案夾下,前端再取圖檔的時候在URL後拼接對于的尺寸即可通路。如用戶端上傳了一張圖檔,程式會壓縮為30*30,120*120,240*240三種尺寸,用戶端根據界面需要采用xxxxx_30.png的方式通路,這個功能在阿裡雲的OSS伺服器上有現成的服務,無需自己壓縮。

2.應用與資料分離架構:

2015年底,團隊開始做了一個圖檔社交項目,其功能是全部模仿Instagram,但是内容主要針對的是服裝、奢侈品。使用者通過手機拍攝一些奢侈品、服裝相關的視訊、圖檔,并添加對應的下載下傳連結,釋出到平台後,使用者可以看到其他所有人釋出的内容,并可以根據連結購買。

這個項目中涉及到大量視訊、圖檔的處理,這裡我們實作了應用服務、資料服務、資源服務的分離。我們購買了四台阿裡雲伺服器,分别是兩台ECS、一台OSS、一台RDS,其結構如下圖:

3.叢集式部署初級架構

2016年我們開始做一個大型的線上教育平台項目,經曆一年的磨合,項目趨于穩定,我們的伺服器架構也日臻完善。本想總結一下伺服器的架構,在下筆之前在網上看到了他人總結的一篇文章,項目架構設計總結,再此先向作者表示敬意,以下是引用的這篇文章的部分内容:

 --------------------------------------引用有此處開始--------------------------------------

 項目背景

 項目的前端主要為ios應用以及一些web管理系統,後端的職能主要為前端提供資料接口。我個人在項目中主要負責整個後端的架構設計、伺服器運維、php開發等一系列後端工作,因為主要是我一個人負責,在一定程度上也減少了許多溝通成本。

 總體架構

 項目後端架構使用阿裡雲服務搭建,其中RDS為主從叢集,并配備災備執行個體。ECS可根據業務量動态彈性伸縮,其餘服務均采用單執行個體的方式遠端調用。

 VPC

 搭建VPC的原因有以下幾點

 1.可以将業務資料庫和業務伺服器放置在可以自己掌握的同一内網,可以提高一些安全性。

 2.阿裡雲服務之間通過内網通路的流量是不收費的。是以在選購服務時,帶寬可以選擇流量版,這樣在保證帶寬速率的同時,還可以極大的減少運維費用。

 舉個例子:同樣一台ECS,在同為百兆帶寬的情況下,每月的費用如下圖:

 按固定帶寬

 按使用流量

 當然,能這樣的做的原因也是因為在這個架構中,ECS僅處理業務邏輯,幾乎不存儲檔案資源。大部分靜态資源,如視訊圖檔等,都是存儲在OSS上。如果存放靜态資源,比如下視訊或圖檔什麼的,流量一多那就很虧了。

 3.内網通路,穩定而且速度快。

 業務資料層

 RDS

 項目一開始,RDS選購的是共享型單執行個體的,随着業務量的提升,可以多區域部署隻讀執行個體。另外,保險起見,主執行個體可以配有一個災備執行個體,防止意外發生。

 Redis

 提到阿裡雲的這個Redis,不得不吐槽一句,它竟然是不支援主從的,隻能單執行個體,不過,用它做資料緩存,還真是蠻不錯的選擇,響應速度非常快。而且,因為是放置在内網的且隻能内網通路,是以安全性也很高。

 MongoDB

 結構型資料,主要存儲檔案式的資料,比如每個使用者的操作行為,以檔案式記錄并進行統計分析,友善下一階段的項目做個性化服務。另外一些關聯複雜的資料,也可以用MongoDb存儲,可以提高通路速度。還有,一些對軟體應用版本比較敏感的資料也可以存在MongoDB中,比如a版本拿到A資料,b版本拿到B資料,而這個AB資料都是由很多關聯關系複雜的資料所組成,如果把這些資料根據版本号存儲在不同的MongoDB檔案中,需要時,直接根據版本号拿就可以了,這樣就避免了很多的mysql查詢。

 靜态資源

 OSS + CDN

 OSS存儲靜态資源,CDN(内容分發網絡)可以加速靜态資源的下載下傳速度。至于資源連結位址,用戶端可以通過接口通路從後端業務資料庫中拿到。

 伺服器安全

 運維層面

 1.選購了阿裡雲的web防火牆和态勢感覺的服務。這兩個服務可以實時監控伺服器狀态,識别并跟蹤攻擊來源和類型,可以說,用這兩個工具也節省了很多人力成本。阿裡雲還有其它安全類産品,可以根據項目選購,使用起來也都很友善。

 2.配置firewalld。

 業務層面

 針對接口通路的安全性,主要做了以下工作

 1.簽名驗證:防止僞造請求

 2.通路頻次限制:計數器是用phpredis制作的毫秒級計數器

 3.https通路

 4.部分敏感資料,使用RSA非對稱加密

 伺服器叢集

 主ECS

 通過這台ECS,可以管理其它從屬的ECS,并檢視狀态。安裝的主要工具為ansible。

 如果不需要用這台ECS來做負載均衡的話,可以配置白名單連接配接,隻允許管理者ip才能通路。

 從屬ECS

 這類ECS伺服器隻存放邏輯代碼,是以當需求量增加時,隻需增加此類伺服器的個數即可。而且,在增加個數時,可以使用之前制作好的鏡像,建立多台相同環境的ECS伺服器。每台ECS的web環境為nginx1.10和php7,微服務容器環境用的docker。

 負載均衡

 負載均衡可以采用兩種方式

 1.購買阿裡雲的負載均衡執行個體(注意要買帶公網ip的)。由該負載均衡執行個體接收請求後,會分發到内部伺服器。

 2.在某台具有外網ip的ECS上使用nginx部署負載均衡服務。

 個人更傾向第一種,畢竟管理起來比較友善,節省人力。

 使用到的第三方服務

 Coding

 後端的所有代碼都是放在Coding上的,喜歡Coding的原因有三個。

 1.私有git倉庫沒有個數限制。

 2.有ios用戶端且比較好用。

 3.操作界面好看。

 後端代碼的自動部署是通過Coding的webhook實作的

 具體操作可以去看這篇部落格《利用Coding的webhook自動部署項目》。

 實作的場景:代碼的自動部署與持續內建。

 當我送出代碼到開發分支上時,測試伺服器上會自動更新開發分支上的代碼。

 當我把開發代碼合并到主分支上時,正式伺服器會自動拉取master分支上的代碼,可謂是友善快捷。

 jenkins 之類的工具雖然也嘗試過,但是感覺部署起來很不友善,不夠定制化,而且還消耗了一部分伺服器資源。

 後端邏輯層架構

 接口

 項目起初的接口是基于phalapi架構開發,現在逐漸過渡到基于laravel5.3開發。

 項目起初選擇phalapi的原因

 1.phalapi架構是輕量級的接口發架構,開發起來比較便捷、快速,尤其是那個依賴注入挺好用的。

 2.phalapi架構有很多現成的擴充可以使用,不用去找,而且這些也能基本滿足業務的需要。我個人還基于這個架構開發了兩個擴充,一個是關于使用workman的,一個是關于使用gearman的。

 其中gearman是用來異步處理請求的,詳細介紹可以看這篇部落格《基于Phalapi架構的gearman擴充(異步并發)》

 根據業務量提高性能

 http請求的并發性能可以通過增加ECS實作,針對部分耗時較長且無須即時回調的請求,可以用gearman異步處理。

 資料庫的并發連接配接數可以通過增加配置來提高,也可以通過建立隻讀執行個體進行讀寫分離,提高資料處理能力。再往後,可能需要搭建hadoop管理資料庫叢集,不過等用上hadoop的時候,應該已經不是項目初期了,至少資料量得是TB級的了。

 其它還可以采用優化nginx配置,優化linux核心,采用高速固态硬碟等等的手段。

 #總結評價

 這套架構基本上可以完全滿足項目初期的業務需要,而且所有的雲服務費用總和也非常少(相比于自建伺服器機房)。随着業務量的提升,可以逐漸更新配置以應對需求,還可以在短時間内臨時性的提高并發處理能力。總結起來就是省錢、省時、省力氣。

 ----------------------------------------引用到此為止--------------------------------------

4.叢集式部署國際化架構

随着業務的擴充,最近我們的項目需要釋出到海外市場,原有的伺服器架構已經不能滿足市場的需求。由于之前并未接觸如此大的項目,對海外市場伺服器的部署非常不了解,在跟阿裡雲架構師溝通的基礎上,我們得出兩種解決方案:

方案一:

阿裡雲有一款叫全球加速的産品,該産品不用購買和部署海外伺服器,隻需購買全球加速服務,阿裡雲接入其自建的全球骨幹網絡,據說可實作海外通路100ms的延時。不過此種方式,成本較高,我們選擇了放棄,其結構如下圖:

方案二:

第二種方案就是在海外部署伺服器,其結構如下圖:

在上一種架構的基礎上,在所需要的點購買ECS伺服器,海外節點通過香港入口通路國内的RDS和Redis。同時在海外對應的節點部署CDN,用于通路OSS伺服器時的加速,海外使用者通路對應節點的CDN,CDN通過香港入口通路OSS伺服器,并将所通路的對象檔案緩存到對應的節點,當使用者下次再次通路該對象時,直接從對應的CDN節點緩存中擷取,以此方式提高通路速度。

---------------------

作者:星期八的日出

來源:CSDN

原文:https://blog.csdn.net/javayujiafeng/article/details/79086710

版權聲明:本文為部落客原創文章,轉載請附上博文連結!