2012-11-18 37 views
5

我第一次開發的應用程序需要相當的縮放比例,我從來沒有一個應用程序需要在多個實例上運行。如何使用EC2在多臺服務器上分發應用程序?

這通常如何實現?我是否將SQL服務器羣集在一起,然後在所有服務器上鏡像編程並使用負載平衡?

或者我分離出一些功能在一臺服務器上運行一些服務器?

另外如何將代碼推送到所有EC2窗口實例?

回答

5

免責聲明 - 我不會提及任何Windows細節,因爲我一直在Unix機器上工作。這些準則相當通用。

這是一個主觀問題,每個人都會以獨特的風格定製自己的系統。以下是我遵循的一些指導原則。

如果是Web應用程序,請將演示文稿(前端),中間件(API)和數據庫層分開。與單一應用程序相比,切片式架構可以實現最佳性能。

  1. 數據庫 - 亞馬遜提供了極好的和高度可用的服務(除非你是在美國東部可用區)爲SQL和NoSQL數據存儲。您可能想要查看關係數據庫的RDS和NoSQL的DynamoDb。兩者都可以很好地擴展,一旦啓動它們,您就不必擔心管理和加載分片/集羣數據存儲。
  2. 中間件API - 這是一個關鍵部分。擁有一組API(最好是REST,但你幾乎可以在這裏使用任何東西)很重要,它將後端功能作爲服務公開。面向服務的體系結構可以輕鬆擴展以迎合多個面向前端的客戶端,如Web,移動,桌面,第三方小部件等。中間件API通常不應該是您的業務邏輯處理的地方,大部分或全部)應該轉換爲數據庫查詢/查詢以獲得更高的性能。這些服務可以實現負載均衡以實現高可用性。亞馬遜的Elastic Load Balancers(ELB)適合初學者。如果您想進一步定製,比如阻止某些IP地址集的流量,請執行Blue/Green deployments,那麼可能應該考慮部署HAProxy負載均衡器來分隔實例。
  3. 前端 - 這是您的表示層應該駐留的位置。它應該避免任何直接的數據庫查詢,除了那些限於前端範圍的數據庫查詢,例如:簡單的Redis調用來獲取前端碎片的最新緩存鍵。從服務調用到前端碎片,這幾乎可以執行大量緩存。您可以將AWS CloudFront用於靜態資產投放,AWS ElastiCache用於您的緩存存儲。 ElastiCache不過是一個託管的memcached集羣。您甚至應該考慮負載平衡ELB後面的前端節點。

所有這些都可以使用AWS Elastic Beanstalk與AutoScaling捆綁和部署。它目前支持ASP .NET,PHP,Python,Java和Ruby容器。 AWS Elastic Beanstalk仍然有其自身的侷限性,但它是管理基礎架構非常酷的一種方式,可以以最少的麻煩監視,縮放和負載平衡。

提示:識別應用程序的讀寫密集區域有很大幫助。然後,您可以繼續前進並相應地分割您的基礎架構,並一次執行讀取或寫入焦點所需的優化。總而言之,Amazon AWS幾乎可以用來製作服務器拓撲結構。這是在你選擇組件。

希望這會有所幫助!

7

這將取決於您的要求。但作爲一般指導原則(我假設一個網站),我會將數據庫,網絡服務器,緩存服務器等分離到不同的實例,並對靜態資產使用s3(+ cloudfont)。我也會確保適當的速率限制,以便只有合法的負載在基礎設施上。

對於RDBMS服務器,我可能會設置一個主從數據庫設置(RDS使這更容易),使用db分片等。數據庫集羣解決方案也存在,這將更復雜的設置,但簡化了應用程序員的數據庫訪問。我也會相應地檢查所有的db查詢和調諧db/sql查詢。在某些情況下,純粹的NoSQL類型數據庫可能比RDBMS更好,或者根據所需的數據在應用程序之間進行切換。

對於網絡服務器,我將設置一個負載均衡器,然後在負載均衡器後面的web服務器實例上使用自動調節。如果有的話,類似的東西也適用於應用服務器。我也將調整網絡服務器設置。

緩存服務器也將被分成它的一個實例集羣。 ElastiCache看起來像一個很好的服務。 Redis具有與memcache相媲美的性能,但具有更多功能(如列表,集合等),這些功能在縮放時可能會派上用場。

2

我會這樣做的方式是將1臺服務器作爲運行mysql的數據庫服務器。我所有關於memcached的數據都可以跨越多個服務器和我的客戶端,使用簡單的「如果不在memcached上,從db中讀取,將其放在memcached上並返回」。

與數據庫相比,Memcached非常易於擴展。數據庫擴展需要很多管理工作。它是一個讓它正確工作的痛苦。所以我選擇了memcached。事實上,我有更多的memcached服務器,只是爲了管理停機時間(如果我的任何memcached)服務器。

我的數據大部分是讀取的,很少寫入。當寫入發生時,我也將數據推送到memcached。總而言之,這對我來說更好,代碼,管理,回退,故障轉移,負載均衡方式。都贏了。你只需要編寫一個「小」的一點。

羣集mysql更具誘惑力,因爲它似乎更容易編碼,部署,維護和保持和執行。記住mysql是基於硬盤的,而memcached是基於內存的,所以它本質上更快(至少10倍)。由於它接管了數據庫的所有讀取負載,因此您的db配置可以非常簡單。

我真的希望有人在這裏指出一個相反的論點,我很樂意聽到它。

相關問題