作者 Gavin Terrill譯者 郭曉剛 發布于 2007年10月7日 下午4時2分

社區
Architecture
主題
性能和擴展性

“可伸縮性(Scalability)”是軟件廠商常常在新聞稿中用到的一個詞(也是人們站在飲水機旁談論的一個詞),但這個詞在很多情況下都被誤解了。例如,很多人說起可伸縮性的時候其實指的是性能和高可用性。Royans K Tharakan試圖回答“什么是可伸縮性”這個問題,他說:

可伸縮性,簡單來說,是以更大的規模來做你現在所做的事。伸展一個Web應用的規模在于讓更多的人使用你的程序。如果你沒法找出 方法在伸展規模的同時提高性能,沒關系。而且只要你可以伸展規模來處理更大數量的用戶,那么有幾個單點故障(single point of failure)也沒關系。

Royans解釋說如今我們在面對規模伸展的時候有兩個選擇:

  • 縱向的可伸縮性——在同一個邏輯單元內增加資源來提高處理能力。這樣的例子包括在現有服務器上增加CPU,或者在現有的RAID/SAN存儲中增加硬盤來提高存儲量。
  • 橫向的可伸縮性——增加更多邏輯單元的資源,并令它們像是一個單元一樣工作。大多數集群方案、分布式文件系統、負載平衡都是在幫助你提高橫向的可伸縮性。

架構師們都在為達到線性的可伸縮性而掙扎,目的是讓系統產出的增長與系統中投入資源的增長保持穩定的比率。然而,增加資源會導致一般耗費 (overhead)的額外增長,因此難以達到線性的可伸縮性。Royans將之稱為“伸縮性因子”,并用它來區分各種類型的伸縮能力:

  • 如果在你擴大規模的時候伸縮性因子保持為常數,這種叫做線性伸縮性
  • 但很可能有些組件并不像其他組件那么適應規模的增長。小于1.0的伸縮性因子叫做次線性伸縮性
  • 話說回來,也可能因為增加更多組件而獲得更佳的性能(在RAID系統中跨多個磁盤的I/O,當磁盤越多,性能越好)。這種叫做超線性伸縮性
  • 如果應用程序沒有專門為可伸縮性而設計,有可能當規模擴大的時候情況會變糟。這種稱為負伸縮性

跟軟件開發中的許多事物一樣,這里也沒有適合一切情形的銀彈可以解決你的伸縮性問題。Royans建議說,“如果你急切需要可伸縮性,向縱向發展可能是最容易的”,但注意“不幸的是縱向伸展會隨著你的規模增長而越來越昂貴”,而且“無窮的橫向線性伸縮性只是難以達到,而無窮的縱向伸縮性絕不可能”。他繼續說:

從另一方面來說,橫向可伸縮性并不要求你購買越來越昂貴的服務器。它的本意是用普通的存儲和服務器方案來實現規模伸展。不過橫向可伸縮性也不便宜。應用必須從建造的最底層就加以考慮才能在多臺服務器上運行得像一臺服務器一樣。

Royans最后建議應該考慮所有的層次才能解決可伸縮性問題:

對于一個成功的Web應用,所有的層次都要同樣能夠應付規模的增長。包括存儲層(集群文件系統、S3等)、數據庫層(分區、聯 合)、應用層(memcached、scaleout、terracota、tomcat clustering等等)、Web層、負載平衡、防火墻等等。比如,如果你沒辦法實現多個負載平衡控制器來處理未來的網絡流量,不管你在Web層的橫向 伸縮性上扔下多少錢,都不會有什么效果。你的流量始終被限制在一個負載平衡控制器能夠承受的程度。

查看英文原文:Think you know what scalability is?