公有云降本增效最佳實踐

2022-12-21 12:01:15

前言

最近看到了幾個事情,一個是某保險系統,為了快速上線,全量上雲,結果生產正式執行後每月賬單高達幾十萬。相關業務總扛不住這個支出,又勞師動眾,讓下面的專案經理、開發、運維、架構師花了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 反向代理走公網請求 物件儲存,速度和效率會提升得更高,價格特定情況下也會更划算。