<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          億級流量架構(gòu),服務(wù)器如何擴容?寫得太好了!

          共 3812字,需瀏覽 8分鐘

           ·

          2022-05-20 07:23


          作者:等不到的口琴
          來源:cnblogs.com/Courage129/p/14425669.html

          為什么要擴容

          說人話就是, 無論如何優(yōu)化性能,能達到的最大值是一定的,對于一個用戶量大的應(yīng)用,可以對服務(wù)器進行各種優(yōu)化,諸如限流、資源隔離,但是上限還是在那里,這時候就應(yīng)該改變我們的硬件,例如使用更強的CPU、更大的內(nèi)存,在前文中舉了一個學生食堂打飯的例子,如果學生多了,可以通過令牌桶算法優(yōu)先給高三學生令牌打飯,但是如果高三的學生還是很多呢?那就只有增加窗口或者食堂的數(shù)量,也就是硬件上的擴容。

          擴容策略

          擴容策略可以分為兩種, 一種是對單機整體擴容,也就是機器內(nèi)部包含CPU、內(nèi)存、存儲設(shè)備等,另一種是擴容對應(yīng)的組件,例如擴內(nèi)存、擴磁盤、擴CPU。

          整機硬件

          整機擴容的好處是,有很多專業(yè)的服務(wù)器硬件供應(yīng)商,例如IBM、浪潮、DELL、HP等,專業(yè)的硬件供應(yīng)商,他們組裝以及搭配方面可能經(jīng)驗更加豐富,另外有些公司會對組件進行一些優(yōu)化,從而服務(wù)器更加穩(wěn)定,可以類比為買電腦,有的人可能選擇買淘寶賣家已經(jīng)組裝好的臺式,有的人可能自己買各種硬件自己回家組裝,對于一般人而言,選擇前者是較為靠譜的選擇,因為你即使懂硬件的一些參數(shù),也難保自己搭配的機器是否能發(fā)揮各個部件最大性能。

          組件

          對于一些技術(shù)能力強悍的公司,更多的是自己買各種組件組裝,這樣成本更低,因為節(jié)省了組裝等費用,并且可以根據(jù)業(yè)務(wù)個性化定制,例如有的公司是計算密集型的,那么主要是更換更強的CPU,有的IO密集型,那么擴容的應(yīng)該是內(nèi)存等,有的公司需要存儲大量的數(shù)據(jù),那么可能擴容的是硬盤等存儲設(shè)備。

          組件包含:

          cpu

          Intel、Amd ,參考頻率、線程數(shù)等

          網(wǎng)卡

          百兆->千兆 -> 萬兆

          內(nèi)存

          ECC校驗

          磁盤

          SCSI HDD(機械)、HHD(混合)、SATA SSD、PCI-e SSD、 MVMe SSD。想成為架構(gòu)師,這份架構(gòu)師圖譜建議看看,少走彎路。

          AKF拆分原則

          對于一個應(yīng)用,如果單機不足以支撐服務(wù)請求,那么可以建立諸如主主、主從等模式的集群:

          這個叫AKF原則X軸擴展,目的是將請求分流在多臺機器上,但是多臺機器中間要解決數(shù)據(jù)同步性的問題,越多的機器數(shù)據(jù)不同步的可能性越大,這也就意味著沒法無限整體復制擴容。

          所以可以整理搜集服務(wù)器內(nèi)熱點的業(yè)務(wù)請求,將業(yè)務(wù)分離出來,只對熱點業(yè)務(wù)進行擴容,這就是AKF原則的Y軸拆分:

          對業(yè)務(wù)拆分之后,某個業(yè)務(wù)還可能太熱點,也就是Y軸拆分后水平復制還是不足以支撐數(shù)據(jù)請求,那么可以將業(yè)務(wù)的數(shù)據(jù)進行拆分, 具體來說就是,某個業(yè)務(wù)的數(shù)據(jù),可以放在多個地方,例如在湖北、北京、上海部署機房,各地的人們需要請求數(shù)據(jù)時,由離得近的服務(wù)器提供服務(wù)。

          拆分擴容后存在的問題

          隨著業(yè)務(wù)的增長,系統(tǒng)變得越來越龐大, 根據(jù)系統(tǒng)功能拆分成獨立而又互通的項目, 比如交易系統(tǒng)、財務(wù)系統(tǒng)、生產(chǎn)流程系統(tǒng)、物流系統(tǒng)、網(wǎng)站系統(tǒng)等等,但是分布式結(jié)構(gòu)會存在很多問題。對于這些問題每一個都值得深入探討,這兒簡單的提一下,后面再開篇幅。
          1. 數(shù)據(jù)共享問題 所有的服務(wù)之間數(shù)據(jù)如何共享同步,這是一個需要考慮的問題,微服務(wù)架構(gòu)中,數(shù)據(jù)不可能只有一份,沒法避免機器損壞等原因造成的數(shù)據(jù)丟失,多份數(shù)據(jù)之間如何同步?目前可供參考的解決思路是建立數(shù)據(jù)中心、搭建數(shù)據(jù)庫集群。
          2. 接口調(diào)用問題 不同的服務(wù)器之間進行調(diào)用遵循遠程調(diào)用協(xié)議RPC

            JAVA RMI:Java遠程方法調(diào)用,即Java RMI(Java Remote Method Invocation)是Java編程語言里,一種用于實現(xiàn)遠程過程調(diào)用的應(yīng)用程序編程接口。它使客戶機上運行的程序可以調(diào)用遠程服務(wù)器上的對象。

            dubbo:提供了面向接口代理的高性能RPC調(diào)用

          3. 持久化數(shù)據(jù)雪崩問題 數(shù)據(jù)庫分庫分表 資源隔離 緩存設(shè)定數(shù)據(jù)持久化策略

          4. 高并發(fā)問題

            緩存:諸如緩存擊穿、穿透、雪崩等

            數(shù)據(jù)閉環(huán):為了便于理解,舉個例子,對于淘寶而言,有網(wǎng)頁版、IOS版、安卓版、還有什么一淘等等,雖然客戶端不一樣,但是展示的商品信息是相同的,也就是一件商品,無論是哪個端用的數(shù)據(jù)是一樣的,需要一套方案來解決并發(fā)下根據(jù)相同數(shù)據(jù)在不同端進行不同展示的問題,這就叫數(shù)據(jù)閉環(huán)。

          5. 數(shù)據(jù)一致性問題

            這是一個難點,大意就是多個服務(wù)器之間數(shù)據(jù)如何保證一致性,同樣的商品在不同客戶端服務(wù)端端價格應(yīng)該是一樣的, 通常使用分布式鎖。

          數(shù)據(jù)庫擴容:集群

          先簡單說一下分布式與集群的區(qū)別,這兩個詞兒經(jīng)常一起出現(xiàn),但是意義卻有所不同,分布式會縮短單個任務(wù)的執(zhí)行時間來提升工作效率,而集群強調(diào)的是提高單位時間內(nèi)執(zhí)行操作數(shù)的增加來提高效率。更簡單的來說,分布式是將步驟分到每臺電腦上,不考慮依賴關(guān)系,集群方案是指幾個任務(wù)同時在處理。
          單一數(shù)據(jù)庫存儲難以滿足業(yè)務(wù)需求時,采取集群的方式,將數(shù)據(jù)存儲在不同的服務(wù)器,這可以是主主或者主從,主從中主負責寫,從負責讀,將與數(shù)據(jù)庫有關(guān)的壓力進行分解到多臺機器上。

          分布式ID

          在復雜分布式系統(tǒng)中,往往需要對大量的數(shù)據(jù)和消息進行唯一標識。很容易想到的是利用自增,但是自增有很多問題,例如ID有太強的規(guī)律,可能會被惡意查詢搜集,面對數(shù)據(jù)日漸增長,對數(shù)據(jù)分庫分表后需要有一個唯一ID來標識一條數(shù)據(jù)或消息,這樣數(shù)據(jù)庫的自增ID顯然不能滿足需求;特別一點的如商品、訂單、用戶也都需要有唯一ID做標識。此時一個能夠生成全局唯一ID的系統(tǒng)是非常必要的。概括下來,那業(yè)務(wù)系統(tǒng)對ID號的要求有哪些呢?

          分布式ID要求

          面對分布式ID,需要滿足下面的要求:

          1. 全局唯一性:不能出現(xiàn)重復的ID號,既然是唯一標識,這是最基本的要求。
          2. 趨勢遞增:在MySQL InnoDB引擎中使用的是聚集索引,由于多數(shù)RDBMS使用B-tree的數(shù)據(jù)結(jié)構(gòu)來存儲索引數(shù)據(jù),在主鍵的選擇上面我們應(yīng)該盡量使用有序的主鍵保證寫入性能。
          3. 單調(diào)遞增:保證下一個ID一定大于上一個ID,例如事務(wù)版本號、IM增量消息、排序等特殊需求。
          4. 信息安全:如果ID是連續(xù)的,惡意用戶的扒取工作就非常容易做了,直接按照順序下載指定URL即可;如果是訂單號就更危險了,競對可以直接知道我們一天的單量。所以在一些應(yīng)用場景下,會需要ID無規(guī)則、不規(guī)則。

          上述123對應(yīng)三類不同的場景,但是3和4的需求是互斥的,也就是無法使用同一個方案滿足。另外,搜索公眾號互聯(lián)網(wǎng)架構(gòu)師后臺回復“9”,獲取一份驚喜禮包。

          除了對ID號碼自身的要求,業(yè)務(wù)還對ID號生成系統(tǒng)的可用性要求極高,想象一下,如果ID生成系統(tǒng)癱瘓,整個與數(shù)據(jù)有關(guān)的動作都無法執(zhí)行,會帶來一場災(zāi)難。由此總結(jié)下一個ID生成系統(tǒng)最少應(yīng)該做到如下幾點:

          1. 平均延遲和TP999延遲都要盡可能低;
          2. 可用性5個9(這是美團的要求,有些企業(yè)例如阿里要求6個9);
          3. 高QPS。

          分布式ID生成策略

          目前業(yè)界常用的ID生成策略有很多,例如UUID、雪花生成算法、Redis、Zookeeper等,這兒只簡單講講UUID以及Snowflake,后面要開篇詳談。

          UUID生成算法

          UUID(Universally Unique Identifier)的標準型式包含32個16進制數(shù)字,以連字號分為五段,形式為8-4-4-4-12的36個字符,示例:550e8400-e29b-41d4-a716-446655440000,到目前為止業(yè)界一共有5種方式生成UUID。

          優(yōu)點:

          • 性能非常高:本地生成,沒有網(wǎng)絡(luò)消耗。

          缺點:

          • 不易于存儲:UUID太長,16字節(jié)128位,通常以36長度的字符串表示,很多場景不適用。

          • 信息不安全:基于MAC地址生成UUID的算法可能會造成MAC地址泄露,這個漏洞曾被用于尋找梅麗莎病毒的制作者位置。

          • ID作為主鍵時在特定的環(huán)境會存在一些問題,比如做DB主鍵的場景下,UUID就非常不適用:

            ① MySQL官方有明確的建議主鍵要盡量越短越好[4],36個字符長度的UUID不符合要求。

          • All indexes other than the clustered index are known as secondary indexes. In InnoDB, each record in a secondary index contains the primary key columns for the row, as well as the columns specified for the secondary index. InnoDB uses this primary key value to search for the row in the clustered index.If the primary key is long, the secondary indexes use more space, so it is advantageous to have a short primary key.

          ② 對MySQL索引不利:如果作為數(shù)據(jù)庫主鍵,在InnoDB引擎下,UUID的無序性可能會引起數(shù)據(jù)位置頻繁變 動,嚴重影響性能。

          雪花生成算法

          這種方案大致來說是一種以劃分命名空間(UUID也算,由于比較常見,所以單獨分析)來生成ID的一種算法,這種方案把64-bit分別劃分成多段,分開來標示機器、時間等,比如在snowflake中的64-bit分別表示如下圖(圖片來自網(wǎng)絡(luò))所示:


          41-bit的時間可以表示(1L<<41)/(1000L360024*365)=69年的時間,10-bit機器可以分別表示1024臺機器。如果我們對IDC劃分有需求,還可以將10-bit分5-bit給IDC,分5-bit給工作機器。這樣就可以表示32個IDC,每個IDC下可以有32臺機器,可以根據(jù)自身需求定義。

          12個自增序列號可以表示212212個ID,理論上snowflake方案的QPS約為409.6w/s,這種分配方式可以保證在任何一個IDC的任何一臺機器在任意毫秒內(nèi)生成的ID都是不同的。

          這種方式的優(yōu)缺點是:

          優(yōu)點:

          • 毫秒數(shù)在高位,自增序列在低位,整個ID都是趨勢遞增的。
          • 不依賴數(shù)據(jù)庫等第三方系統(tǒng),以服務(wù)的方式部署,穩(wěn)定性更高,生成ID的性能也是非常高的。
          • 可以根據(jù)自身業(yè)務(wù)特性分配bit位,非常靈活。

          缺點:

          • 強依賴機器時鐘,如果機器上時鐘回撥,會導致發(fā)號重復或者服務(wù)會處于不可用狀態(tài)。

          彈性擴容

          說人話,就是讓集群根據(jù)計劃在某一段時間自動對資源進行擴容,并在設(shè)置的計劃還原時間時釋放資源。這樣能解決規(guī)律性的資源峰谷需求,達到充分合理利用資源的目的。但是彈性擴容有一些問題:

          第一,虛擬機彈性能力較弱。使用虛擬機部署業(yè)務(wù),在彈性擴容時,需要經(jīng)過申請?zhí)摂M機、創(chuàng)建和部署虛擬機、配置業(yè)務(wù)環(huán)境、啟動業(yè)務(wù)實例這幾個步驟。前面的幾個步驟屬于私有云平臺,后面的步驟屬于業(yè)務(wù)工程師。一次擴容需要多部門配合完成,擴容時間以小時計,過程難以實現(xiàn)自動化。如果可以實現(xiàn)自動化“一鍵快速擴容”,將極大地提高業(yè)務(wù)彈性效率,釋放更多的人力,同時也消除了人工操作導致事故的隱患。

          第二,IT成本高。由于虛擬機彈性能力較弱,業(yè)務(wù)部門為了應(yīng)對流量高峰和突發(fā)流量,普遍采用預(yù)留大量機器和服務(wù)實例的做法。即先部署好大量的虛擬機或物理機,按照業(yè)務(wù)高峰時所需資源做預(yù)留,一般是非高峰時段資源需求的兩倍。資源預(yù)留的辦法帶來非常高的IT成本,在非高峰時段,這些機器資源處于空閑狀態(tài),也是巨大的浪費。


          THE?END
          熱門推薦:

          PS:如果覺得我的分享不錯,歡迎大家隨手點贊、轉(zhuǎn)發(fā)、在看。
          瀏覽 27
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  超碰大香蕉精品国产 | 激情5月婷婷 | 俺也来俺也去视频在线看 | 欧美亚洲日本在线 | 8050午夜 |