公有云降本增效最佳實踐

東風微鳴發表於2022-12-21

前言

最近看到了幾個事情,一個是某保險系統,為了快速上線,全量上雲,結果生產正式執行後每月賬單高達幾十萬。相關業務總扛不住這個支出,又勞師動眾,讓下面的專案經理、開發、運維、架構師花了3個月把業務全量從公有云遷移下來。相關人員被折磨的半死不活,而且大大拖慢了系統的迭代速度。

另一個是某個電商的案例,上雲後剛開始費用賬單也是很高,每月接近 20 萬,經過「降本增效」最佳化後,費用大幅度降低,每月費用降到了 4 萬左右,服務質量反而還有提升。

這 2 個故事告訴我們,雲時代的滾滾浪潮撲面而來,我們也應該根據公有云的特性(如:彈性、靈活、多種計費方式等),在不降低服務質量的情況下,最大限度地最佳化成本。

以下是一些最佳實踐。

最佳實踐

整體

首選公有云服務而非自建

公有云除了提供 IaaS(計算、儲存、網路等)外,也會提供 PaaS(微服務、中介軟體、資料庫、大資料、開發套件等)和 SaaS 服務。

在公有云提供的服務(如 MySQL 資料庫)可以滿足需求的前提下,建議首選公有云上的 MySQL 資料庫服務,而非自建。

理由簡單說明如下:

對比項 成本 效能 伸縮性 維護方 可靠性 監控 易用性
自建 我方
雲上服務 雲提供商 易用
  • 成本
    • 自建,需要人員維護和最佳化的成本,需要自行考慮高可靠(可能需要購買多臺伺服器)和高效能(可能需要購買高效能儲存),使得成本偏高。
    • 雲上服務,透過規模效應、資源池化、引數調優等實現成本相對不高。
  • 效能
    • 自建,不一定知道所有的引數最佳化項,也不一定同價位能買到專用的高效能硬體。
    • 雲上服務,效能明碼標價,按需選擇適合自己的效能配置。
  • 伸縮性
    • 自建,伸縮較麻煩,要不手動,要不透過 歷經檢驗的 DevOps 指令碼,伸縮性弱。
    • 雲上服務,很多PaaS類服務可以一鍵升配。
  • 維護方
    • 自建,我方自行兜底
    • 雲上服務,雲提供商提供 SLA 兜底。
  • 可靠性
    • 自建,不一定能實現該元件的叢集模式或高可用模式的全部最佳實踐。
    • 雲上服務,會做好網路高可用(甚至是跨AZ的高可用)、儲存多副本、計算跨物理伺服器/機架/AZ甚至region、服務監控及自愈、備份等多種措施保障可靠性。
  • 監控
    • 自建,要不沒監控,要不監控需要從頭(採集端)到尾(告警通知)實現一遍
    • 雲上服務,監控具備,且和公有云監控無縫對接。
  • 易用性
    • 自建:一般沒有 Web 介面,需要透過線下或流程平臺或 CLI 來申請和操作
    • 雲上服務:有易用的 web 介面,可以在 web 介面上完成大部分功能。

比如雲資料庫:

  • 運維架構:
    • 儲存的資料規模及後期擴充套件,採用的高可用架構;
    • 異常切換
  • 硬體及基礎環境部署
    • 選擇什麼配置的伺服器,伺服器型號及對應磁碟陣列;
    • 作業系統環境及核心設定;
  • 資料庫安裝及最佳化
    • 資料庫版本安裝部署及配置;
    • 資料庫配置引數調優;
  • SQL 語句最佳化;
    • 慢查詢,對 SQL 語句及索引做最佳化
  • 資料庫日常備份及恢復。
    • 備份;
    • 熱備還是冷備?物理備份還是邏輯備份?
    • 備份策略、週期、頻率

使用雲資料庫,這些步驟雲資料庫都幫你做了。其他 PaaS(中介軟體、大資料、微服務、DevOps等)也類似。

做好安全防護

公有云最大的風險就是資料洩露。所以一定要做好安全防護。這個安全防護是多方面的。詳細見 安全 部分。

雲的優勢是「分散式」

如果對比單臺伺服器,可能雲主機的效能差一些。「分散式」是雲端計算的最大優勢。在實踐中,不要只追求單臺機器的效能,而是要透過分散式的設計思想來保障業務的高效能。最佳實踐推薦,伺服器標配 4C8G,低配也可以採用 2C4G 的配置。透過分散式充分壓榨了單臺伺服器的資源,從而最大限度地保障了最終的低成本。
所以,在雲上,一般情況下應用伺服器的選擇條件是:更多的低配的雲服務勝於更少的高配的雲伺服器。
所以,在雲上,對於資料庫來說,如果資料量非常大,也推薦使用「分散式資料庫」,而非在雲上自建 Oracle。

雲的優勢是「彈性」

所以,在雲上,不要按照業務峰值購買全量的資源,而是推薦:

  • 買滿足日常需求的資源
  • 高峰時,再提前購買一些彈性的資源,彈性擴容。

另外,不僅僅是伺服器資源,對於網路也適用,如果您的系統經常搞活動,網路負載差距很大,那麼推薦:「大頻寬按量付費」而不是「固定頻寬固定計費」。

動靜分離

靜態:放 CDN + 物件儲存上,或者放 NGINX 伺服器上也好,不要直接用應用伺服器(如tomcat或nodejs)來處理靜態資源。(浪費,術業有專攻)
動態:典型架構是 LB - NGINX - 應用伺服器 - redis - 資料庫。

上雲前做好業務量的評估

上雲前做好業務量的評估,為雲上的資源規劃做好資源預算。
可以透過:

  • 壓測
  • 已有監控資料分析

等方式評估業務量。

常用的業務量指標如下:

指標 計算週期 指標含義
PV Page View。指 B/S 架構中的 Web 類業務一天內頁面的訪問次數,每開啟或重新整理一次頁面,算一個 PV。
UV UV 是 Unique Visitor 的簡寫。指 B/S 架構中 Web 類業務一天內訪問站點的使用者數(以 cookie 為依據)
IP B/S 架構中 Web 類業務一天內有多少個獨立的 IP 瀏覽了頁面,即統計不同的 IP 瀏覽使用者數量。
使用者數 -- 業務系統的註冊使用者數
活躍使用者數 註冊使用者數中,一天中實際使用了業務系統的使用者數量,跟 UV 的概念一樣
線上使用者數 一天的活躍使用者數中,使用者同時在一定的時間段內線上的數量
併發使用者數 -- 指線上使用者數基礎上,某一時刻同時指向伺服器傳送請求的使用者數

具體的效能監控指標如何和業務指標進行轉換就先略過了。

推薦幾個公有云雲產品

這些公有云產品是基本上都會用到的,歷經檢驗,且比較實用的產品。

  1. 雲伺服器
  2. 關係型資料庫
  3. 負載均衡
  4. 物件儲存
  5. VPC(Virtual Private Cloud):專有網路
  6. CDN
  7. Redis
  8. 安全類的基本產品(如:安全組、ACL、漏掃、WAF、DDoS防護等)

計算

雲伺服器配置以中低配為主

雲伺服器一般用於承載應用,推薦以更多臺數的中低配為主,避免資源的浪費。
建議一般配置不要超過:16C32G,主流配置為:

  • 4C8G 甚至更低
  • 8C16G

推薦使用容器服務

容器服務有諸多優勢,推薦無狀態應用使用容器服務。

  • 資源粒度更細,細粒度到: 0.1C, 記憶體 MB。
  • 自動擴縮容更方便
  • 擴容後 pod 自動加入負載均衡
  • ...

按需購買

在雲上,不要按照業務峰值購買全量的資源,而是推薦:買滿足日常需求的資源

彈性擴容

在雲上,如果需要搞活動,再透過「容器」或「API + 映象 +快照」批次購買、彈性擴容。

比如在某手機的秒殺活動中,會瞬間開啟 200 臺機器且持續 2H 來應對,IT 資源花費 600 元人民幣:

  1. 搭建好環境,製作好映象;
  2. 活動前透過 API 秒開 200 臺伺服器來應對活動;
  3. 活動結束後,透過 API 瞬間釋放資源

這在傳統架構中,根本不可想象。比如傳統架構,搞「雙十一」,都要提前一個月準備 IT 資源。

另外上面的場景也可以利用 「彈性伸縮服務」或「容器 HPA」來動態調整。

使用 Ansible 等 DevOps 工具

既然雲的優勢是「分散式」,資源多,那麼 Ansible 這種批次的 DevOps 工具是必不可少的,可以大幅度提升效率。
具體應用,可以透過 Ansible,定製對應的 Playbook,自動化批次安裝和運維。

透過映象提升雲端部署效率

先開通一臺雲伺服器,並對這臺雲伺服器做運維規範方面的系統調優、安全加固等措施。然後把這臺雲伺服器做成一個基礎映象,批次開通 其他同樣環境的伺服器,可以大大提升部署效率。

網路

域名備案要先行

上雲的最後一步,是要將域名的 IP 解析到 負載均衡 公網 IP 上。但需要提前在共有云上對域名進行備案,如果到最後域名解析到公有云上後才發現域名被拉黑,業務訪問被拒絕,這將會變得非常麻煩。因此需要提前透過公有云進行域名備案,或者已經在其他供應商進行備案,那麼需要將域名備案轉接入公有云。

推薦必備 .CN 域名

近期國際形勢愈演愈烈,中美摩擦進一步升級,形勢緊張。要做最壞的打算:美國可能會斷掉您的 .COM 域名的解析。
另外國家最近有指引,不要使用外國管控的根域名作為基礎設施的一級域名。
.cn 是國家根域,.com.cn、net.cn、org.cn 等這些都是可以的。

嚴禁每臺伺服器都能訪問公網

出於安全(受攻擊面太大)和成本(公網IP都是錢)的考慮。
而且沒必要,如果是業務訪問,入向透過負載均衡進來,出向透過 NAT 閘道器出去。
如果是運維,推薦透過VPN + 跳板機(中小企業)或專線 + 堡壘機(大企業)來實現運維管理。

如果需要出公網,建議使用 NAT 閘道器而非在某臺機器繫結公網IP

原因:可靠性更高,更安全。

利用低成本高負載的按量頻寬

對於中小規模企業,如果您的系統經常搞活動,網路負載差距很大,那麼推薦:「大頻寬按量付費」而不是「固定頻寬固定計費」,比如:「1Gbps峰值頻寬按量計費」對比「100Mbps固定頻寬」:

  • 費用可能更低
  • 頻寬更大,活動期間可能會超過 100Mbps,那這時候固定頻寬就會影響使用者體驗,而 1Gbps 峰值頻寬是完全可以支撐的住的。

以某客戶上雲前後為例,在 IDC 機房,200Mbps 的獨享電信頻寬,一年的成本大概是 1Mbps/100元/月 x 12 個月 x 200 = 24萬。而在雲端,採用 1Gbps 峰值的 BGP 多線 SLB 頻寬,在頻寬質量上面提升了幾個量級。另外,頻寬費用採用按量付費,大大降低了維護成本。

推薦使用雲上軟負載均衡

推薦使用公有云提供的負載均衡,可以作為反向代理,防止客戶端直連雲伺服器帶來的安全和穩定性風險。

加入 負載均衡 可以保障架構靈活擴充套件性:加入 負載均衡 後,架構變得更加靈活。典型場景是將所有域名先繫結到 負載均衡 上,然後轉到後端 Nginx,透過 Nginx 做虛擬主機等七層更靈活的控制。

高併發情況下,推薦使用 4 層負載均衡

採用 4層 負載均衡 保障效能:在實踐中,面對高併發效能的場景時,發現 7 層的負載均衡,相比 4 層的負載均衡,在效能上面有很大差距。7 層負載均衡只能達到萬級別併發,而 4 層的負載均衡能達到幾十萬級,甚至上百萬級的併發量。所以在電商等網站應用中,對於 負載均衡,優先選擇 TCP 層。四層 LB 能扛得住 10w-50w 的併發。

DNS 記錄調整要注意

使用者的 DNS TTL 我們是無法控制的,如果調整了某域名的DNS記錄,可能某些使用者已生效,某些使用者沒有生效。
針對這種情況,需要在原有IP上做 302 重定向跳轉,將依舊訪問原IP 的客戶引流到新IP上,這將大大提高使用者的訪問體驗。

大型企業 - DNS 負載均衡實踐

大規模應用。當後端有一兩百臺雲伺服器,而一臺負載均衡 效能有限時,可以採用多個 負載均衡,前邊透過DNS 負載均衡。典型如:淘寶、阿里雲官網。

DNS有個最大的問題,就是 本地 DNS 快取。

  1. 可以讓 DNS TTL生效快一點;
  2. DNS配置的是負載均衡 IP,而不是雲伺服器的IP。
  3. 如果還是有部分使用者出問題,指導使用者清理 DNS 快取,或強制繫結本機 host 指向域名解析。

智慧解析 -- 跨地域分散式架構中必不可少。根據 ClientIP,選擇返回對應地域、運營商的IP。

運營商線路解析

如:DNS記錄:

  • 預設線路:電信伺服器IP
  • 網通:網通IP
  • 移動:移動IP
  • 教育網:教育網IP
  • 海外:海外IP

如果有 BGP 線路,那就更簡單了:

  • 預設線路:負載均衡的公網IP
地域線路解析

如:使用者請求訪問域名,DNS 自動判斷訪問者IP 是「上海聯通」還是「北京聯通」,然後智慧返回設定的對應的「上海聯通」和「北京聯通」的伺服器 IP 地址完成域名解析。

海外:可以選擇「海外、海外大洲、海外(國家/地區)」來細分解析。

如:

  • 海外 - 亞洲地區 - 新加坡線路:指向新加坡伺服器的 IP
  • 海外 - 北美洲 - 美國線路:指向美國伺服器的 IP
  • 海外 - 歐洲 - 德國線路:指向德國伺服器的 IP
  • 預設線路:指向新加坡伺服器的 IP

CDN 就是智慧解析的最佳實踐

儲存

雲上善用「物件儲存服務」

雲上建議儘量不要使用類 NAS 的共享檔案儲存服務,而應該使用物件儲存服務來替代。
在傳統環境,NAS 的典型使用場景如下:

  • 負載均衡:使用 LB + 多臺 雲伺服器(如:Web 伺服器)部署的業務。多臺 雲伺服器 需要訪問同一個儲存空間,以便多臺 雲伺服器 共享資料。

    • 替代方案:直接使用普通雲資料盤,透過 DevOps 等工具實現批次部署及資料一致。
  • 程式碼共享:多臺 雲伺服器 應用,部署的程式碼一致。將程式碼放在同一個儲存空間,提供給多臺 雲伺服器 同時訪問。程式碼集中管理。

    • 替代方案:程式碼放在程式碼倉庫中集中管理。
  • 日誌共享:多臺 雲伺服器 應用,需要將日誌寫入到同一個儲存空間,以便做集中的日誌資料處理和分析

    • 替代方案:日誌定期儲存到物件儲存中,可以根據策略、冷熱資料的實際情況選擇分別儲存到「標準物件儲存」、「低頻物件儲存」和「歸檔儲存」中進一步壓縮成本;或直接使用雲上的「日誌服務」。
  • 企業辦公檔案共享場景:企業有公共的檔案需要共享給多組業務使用,需要集中的共享儲存來存放資料。

    • 替代方案:使用物件儲存來替代。
  • 容器服務的場景:部署的容器服務需要共享訪問某個檔案資料來源,特別是在資源編排的容器服務。對應的容器可能會在不同的伺服器中進行服務漂移,所以檔案共享訪問尤為重要。

    • 替代方案:這種場景確實需要用到雲上檔案系統服務。
  • 備份的場景:使用者希望將資料備份到雲上,可以透過掛載檔案系統來儲存資料備份。

    • 替代方案:備份到物件儲存的「歸檔儲存」中,進一步降低成本。

錯誤用法:NGINX 做公網轉發到物件儲存

在某個客戶場景中,靜態資源放到 物件儲存 中,前端對靜態資源的請求透過 Nginx 反向代理轉發給 物件儲存。但這種做法,在雲端架構上是不推薦的,因為它會帶來幾個問題:

  • 訪問靜態資源的流量走 雲伺服器 的頻寬流量,特別是中大型的 Web 應用中。流量走 雲伺服器 的頻寬,很可能出現效能瓶頸。
  • Nginx 是透過公網將請求反向代理轉發給 物件儲存 的,所以在網路傳輸上會影響速度效能。
  • 透過 Nginx 反向代理,不僅增加運維成本,還要維護 Nginx 配置檔案等。

所以,新增 Nginx 做反向代理是多此一舉。雲端不推薦這麼做。該客戶這麼用,主要原因是業務程式碼側,靜態資源的請求,都是透過目錄劃分。如果將靜態資源單獨放在二級域名,跨域等問題程式碼側沒很好地解決,從而產生這種不倫不類的架構。最終在業務程式碼側進行了最佳化調整,對 物件儲存 靜態資源的使用規範如下:

  • 業務側使用單獨的二級域名來管理靜態資源(如:<pic-cdn.ewhisper.cn>),靜態資源統一放在 物件儲存 中;
  • 靜態資源的二級域名直接將 CNAME 繫結在 物件儲存 的 URL 地址上(訪問量很少的情況下),這樣就直接跳過「使用 Nginx 做反向代理」這個冗餘的步驟了
  • 如果想要進一步提升 物件儲存 中存放的靜態資源的訪問速度,可以無縫接入 CDN。 CDN 的回源請求,會直接透過內網回源請求 物件儲存 中的源資料。相比 Nginx 反向代理走公網請求 物件儲存,速度和效率會提升得更高,價格特定情況下也會更划算。

資料庫

資料庫推薦雲服務 且必須有高可用保障

資料庫不推薦自建,推薦直接使用雲提供商的相關資料庫服務,且推薦必備高可用保障,如叢集模式或多副本,以及資料備份。
資料庫優先採用雲提供商的相關資料庫服務 ,低成本高效率:如果在雲上購買雲伺服器自建 MySQL 主從部署並維護的模式,使得後期的維護管理成本很大。即我們要監控及維護主從狀態,並且在出現問題時需要及時處理,保障業務對資料庫讀寫的連續性。在採用雲提供商的相關資料庫服務 後,這些問題都可以自動化解決。即對資料庫主從的監控、備份、後期維護、故障切換等,都是全自動。

對於可靠性要求特別高的DB,可以選擇跨AZ高可用的叢集方案

對於可靠性要求特別高的DB,可以選擇跨AZ高可用的叢集方案。比如:Redis、MongoDB、MySQL都有類似的跨AZ高可用的叢集方案提供。

按需選擇合適的資料庫

資料庫多種多樣,根據自己的實際需求進行選擇,以下列出部分:

  • 關係型資料庫
    • MySQL
    • SQL Server
    • Postgresql
    • MariaDB
    • 分散式資料庫(如OceanBase或TDSQL等)
  • 非關係型:記憶體資料庫
    • Redis
    • Memcache
  • 文件資料庫:MongoDB
  • 列資料庫
    • HBase等
  • 時序資料庫
    • InfluxDB
    • TSDB

CDN

典型使用場景:CDN + 物件儲存

  • 資料分發:適用於搭建下載行為較多的APP、音影片平臺、網站等,使用者可結合 CDN + 物件儲存 的能力,將靜態內容(包括音影片、圖片等檔案)託管在物件儲存中,並將熱點檔案提前下發至CDN邊緣節點,降低下載訪問延遲
  • 網站託管:適用於官方網站等偏靜態的站點,將網站的靜態資源快速託管儲存在物件儲存中,同時透過 CDN + 物件儲存 分發,透過CDN 配置的域名作為靜態網站訪客的訪問地址入口,快速建好一個網站

安全

必須設定強密碼

典型如:MongoDB、Redis、ES,預設無密碼或弱密碼,已經發生過多輪、大規模的資料洩露事件,所以針對這些服務,一定要設定強密碼。
至於雲伺服器、雲賬戶、關係型資料庫等,更是要保障強密碼或者更強力的安全措施。

客戶端訪問必須 HTTPS

這個就不多說了。

  • 給域名申請證書,放在 Nginx 或 LB上 管理。
  • 業務側,保留 HTTP 80 埠,做80 -> 443 的重定向。LB 上 80 和 443 埠監聽都要開啟。

一定要配置安全組和ACL

最基本的安全防護

不要 root 直連

不要 root 直連,用普通使用者,登陸過去按需 sudo 切換到 root

建議暴露公網的 SSH 埠不要用 22

建議不要用預設的 22 埠,防止被掃描。另外還有建議用證書認證等方式,就不一一贅述了。

免費安全產品別忘領

如每開通一臺雲伺服器,都會贈送一些免費額度的「DDoS防護和主機安全防護」。有基本的防護,會比裸奔安全很多。

三人行, 必有我師; 知識共享, 天下為公. 本文由東風微鳴技術部落格 EWhisper.cn 編寫.

相關文章