Salesforce架構:日事務過13億,2.4萬TPS的數據庫峰值
近日,salesforce.com的可靠性工程師發表了Salesforce核心平臺和應用的架構概覽,其中并未涉及Heroku的Dyno、work.com等其它產品的子系統,但是覆蓋了database.com。以下為譯文:
自1999年,salesforce.com就專注于互聯網技術,致力傳統企業軟件的置換。首先從salesforce.com的一些術語開始:
術語定義
1. 實例——系統、網絡及存儲設施的一個完整集合,包括共享和不共享兩種,將Salesforce的服務打包成子集提供給用戶。比如na14.salesforce.com就是一個實例。
2. Superpod——由系統、網絡和存儲設施組成的1個集合,包括外出代理服務器(outboud proxy server)、負載均衡器、電子郵件服務器、SAN設備及支撐多種實例的其它基礎設施。Superpod提供數據中心級別的服務隔離,因此在共享和復雜組件上產生的問題不會波及數據中心上的所有實例。
3. Org(又名organization)——Salesforce應用程序的***用戶。在www.salesforce.com或者developer.force.com上的每次訪問都會產生一個新的org。org可以高度定制,讓標準salesforce.com CRM對象(甚至是REST API)可以擁有不同的安全設置、記錄可見度以及共享設置,UI界面外觀、工作流、觸發器、定制對象、定制字段。Org支持任何場景,可以用來支撐1到100萬的獨立授權用戶、門戶用戶以及Force.com Sites用戶。
4. 沙箱——salesforce.com實例的一種,為客戶應用部署托管完整產品org的全拷貝。讓用戶在Salesforce應用平臺上可以進行完整的應用程序開發周期。在產品變動部署前,提供針對應用程序的測試環境。
統計數據(截止2013年8月)
·18個北美實例、4個EMEA實例及2個APAC實例
·20個沙箱實例
·13億以上的日事務處理
·峰值情況下每秒2.4萬個數據庫事務
·1.5萬個以上的硬件系統
·原始存儲容量高于22 PB
·5000個以上的SAN port
使用的技術
·作為開發和主要產品系統的Linux
·Solaris 10 w/ ZFS
·Jetty
·Solr
·Memcache
·Apache QPID
·QFS
·Puppet, Razor
·Perl, Python
·Nagios
·Perforce, Git, Subversion
·硬件及軟件架構
1. 支撐登錄
Salesforce運維了大量的服務器為實例支撐登錄,其中一部分的服務器被用來處理登錄請求,并把會話重定義到用戶自己的實例,這也是登錄login.salesforce.com時候所做的事情。
用戶流量開始于Salesforce的外部DNS,一旦實例收到IP地址,會通過標準的互聯網路由將其直接發送給合適的數據中心。
一旦這個流量進入了某個數據中心,它將被指向IP地址對應的負載均衡器,所有來自互聯網的IP都會在active/standby服務器上以VIP的形式配置。
2. 實例內部
負載均衡器將流量指向應用程序層指定的實例,標準網頁流量及API流量都會放到這個層。API占所有流量的60%,基于用戶的需求,它將被轉到附加服務器層進行不同類型的后端處理。
3. 核心應用
核心應用層使用了10到40個服務器,數量主要取決于實例。每個服務器都單獨運行一個多達14 GB堆配置的Hotspot JVM,,主要取決于服務器硬件配置。
批處理服務器主要負責數據庫層的既定、自動化進程。舉個例子,在單歸檔文件格式下,Weekly Export進程被作為一種備份形式,用以導出用戶數據。
Salesforce.com提供了一系列的服務,包括了基礎及高級的內容管理。使用一個內容搜索服務器和一個批處理服務器來管理內容應用層的異步進程。內容批處理服務器負責內容類型進程的調度,擁有指定文件類型渲染預覽及文件類型轉換等功能。
4. 數據庫
主數據流一般發生在核心應用層和數據庫層之間,從軟件的觀點來看,所有處理都會通過數據庫,所以數據庫的性能至關重要。每個主實例(比如NA、AP或者EU實例)使用了1個8節點集群數據庫層。用戶沙箱,比如CS實例,使用了1個4節點集群數據庫層。
鑒于salesforce.com系統偏向于數據庫驅動,減少數據庫上的負載至關重要。為了減少負載,他們開發了ACS——API Cursor Server,它可以幫助解決提高數據庫性能上的兩個問題。首先,之前他們在數據庫中儲存游標,但是刪除操作會影響性能。其次,在使用數據庫表格來處理游標之后,DDL開銷會帶來負效應。ACS是個運行在2個服務器上的游標緩存系統,讓數據庫在游標處理上得以解放。
5. 搜索
Salesforce的搜索層運行在商用Linux主機上,每個都可以擴展到640 GB PCI-E閃存,一般使用它來緩存搜索結果。這些主機通過NFS文件系統從共享SAN陣列中讀取數據,搜索索引被存儲在閃存上將提供更高的性能,從而獲得更大的搜索吞吐量。
搜索索引一般發生在轉換服務器上,它將通過Fibre Channel SAN從儲存陣列中mount LUN。這些LUN組成了QFS文件系統,允許單寫及多讀。類似其它的核心系統,使用active/passive模式,passive節點只用于執行一些低優先級索引搜索工作。之后會將結果返回給active節點,從而寫入QFS文件系統。
當這些相同的LUN被一組4個在SPARC上運行Solaris 10的NFS服務器只讀mount時,會發生這種轉換,這些裝載了SAN的文件系統都通過NFS共享到之前描述的搜索層中。
6. Fileforce
我們同樣運維著對象存儲層,類似于Amazon的S3或者是OpenStack的Swift項目。Fileforce由內部開發,用以減少DB層上的負載。引用之前介紹的Fileforce,Binary Large Object(BLOB)被直接存儲到數據庫中。一旦使用Fileforce,所有大于32 KB的BLOB都被遷移其中,而小于這個值的BLOB仍然儲存在數據庫中。Fileforce中的BLOB在數據庫中都有引用,所以如果想從備份中恢復Fileforce中的數據,必須在數據庫備份的基礎上,重新開啟一個擁有相同恢復點的數據庫。
Fileforce還包含了一個捆綁功能,用以減少Filfeforce服務器上的磁盤搜索。如果在數據庫上存儲了100個以上小于32KB的對象,一個運行在應用服務器上的進程會將這些對象都整合到一個單一的文件。數據庫中會保存一個到整合文件的引用,并且記錄了文件在整合文件中的偏移量,這特性類似于Facebook的Haystack文件存儲系統。
7. 支持
每個實例都包含了多種服務器用以支持不同的任務,比如:應用層的應用程序調試服務器“Hammer testing”、用以監視每個實例健康狀態的hub服務器、以及運行Nagios的監視服務器。而在實例之外仍然存在一些支持服務器,比如儲存管理、數據庫管理、日志聚合、產品身份驗證及其它功能。