整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          大廠前端工程師必備能力合輯:響應式設(shè)計、CSS動畫

          大廠前端工程師必備能力合輯:響應式設(shè)計、CSS動畫

          過調(diào)研一線互聯(lián)網(wǎng)大廠的招聘JD(字節(jié)跳動、美團、騰訊、網(wǎng)易、京東等),小編對標C站能力認證要求,為大家整理了系列技術(shù)干貨合集,助力小伙伴們順利進大廠~本篇為響應式設(shè)計、css動畫,核心能力點都會陸續(xù)更新中,歡迎大家關(guān)注csdn高校俱樂部。

          在如今這個時間和知識都是碎片化的時代,C站根據(jù)C1-C4認證的成長路徑,進行知識細化整理,形成系統(tǒng)化的知識圖譜。

          小編根據(jù)C4認證的成長路徑整理了前端的相關(guān)資源,從零基礎(chǔ)帶你進入前端的世界。

          歡迎大家一起學習~

          一、響應式設(shè)計(30篇)

          【自適應響應式網(wǎng)頁設(shè)計(Responsive Web Design)】

          【響應式網(wǎng)頁設(shè)計】

          【響應式網(wǎng)頁設(shè)計實戰(zhàn)】

          【什么是響應式網(wǎng)頁設(shè)計?】

          【用3個步驟實現(xiàn)響應式網(wǎng)頁設(shè)計】

          【網(wǎng)頁響應式設(shè)計】

          【網(wǎng)頁設(shè)計之響應式布局】

          【RWD----響應式網(wǎng)頁設(shè)計】

          【基本響應式設(shè)計概念】

          【響應式設(shè)計與自適應設(shè)計】

          【基于Bootstrap的響應式網(wǎng)頁】

          【W(wǎng)eb頁響應式設(shè)計的一些解決方案】

          【響應式網(wǎng)頁與自適應網(wǎng)頁的區(qū)別】

          【響應式網(wǎng)頁css代碼寫法】

          【響應式設(shè)計】

          【詳細解析網(wǎng)頁響應式設(shè)計的現(xiàn)狀和趨勢】

          【響應式網(wǎng)頁設(shè)計示例】

          【響應式設(shè)計介紹】

          【響應式設(shè)計中的HTML5】

          【響應式Web設(shè)計總結(jié)】

          【web前端響應式設(shè)計總結(jié)】

          【響應性設(shè)計】

          【響應式網(wǎng)頁設(shè)計教程:展示響應式設(shè)計的基本原理】

          【HTML+CSS十分鐘實現(xiàn)響應式布局頁面,響應式布局實戰(zhàn)教程】

          【什么是響應式布局設(shè)計?】

          【vue項目中頁面響應式布局設(shè)計方案】

          【響應式頁面排版】

          【vueweb端響應式布局_移動端和pc端,響應式設(shè)計布局】

          【自適應網(wǎng)頁設(shè)計 or 響應式Web設(shè)計】

          【響應式網(wǎng)頁開發(fā)注意事項】

          二、CSS動畫(20篇)

          【css 動畫】

          【CSS動畫效果】

          【超好看的css動畫特效實現(xiàn)】

          【CSS動畫】

          【9種常用CSS動畫】

          【css動畫讓文字一行一行逐漸顯示】

          【利用css3制作網(wǎng)頁動畫】

          【用html和css制作網(wǎng)頁動畫(transform transition animation)】

          【CSS3(三)Animation 入門詳解】

          【css動畫-animation各個屬性詳解】

          【css動畫及js動畫的區(qū)別】

          【CSS動畫入門:一分鐘實現(xiàn)球體上下跳動動畫效果】

          【CSS動畫案例-無縫滾動】

          【css動畫與js動畫的區(qū)別】

          【CSS3動畫教程--制作Css動畫的兩種方式】

          【常見 CSS 動畫庫】

          【css動畫和js動畫比較!】

          【用css動畫效果做小熊奔跑】

          【css動畫animation繪制向四周擴散的圓圈】

          【css動畫效果,圖片旋轉(zhuǎn)】

          小科普

          CSDN軟件工程師能力認證(以下簡稱C系列認證)是由中國軟件開發(fā)者網(wǎng)CSDN制定并推出的一個能力認證標準。C系列認證歷經(jīng)近一年的實際線下調(diào)研、考察、迭代、測試,并梳理出軟件工程師開發(fā)過程中所需的各項技術(shù)技能,結(jié)合企業(yè)招聘需求和人才應聘痛點,基于公開、透明、公正的原則,甑別人才時確保真實業(yè)務(wù)場景、全部上機實操、所有過程留痕、存檔不可篡改。

          ————————————————

          博主熱門文章


          前端工程師必備50篇:HTML語義化及媒體標簽、表單及CSS選擇器等

          前端框架入門必備100文章:vue、Element、vuetify、iview等

          前端學習知識庫:大廠面試必考的前端工程師項目能力精選文章50篇

          版權(quán)聲明:本文為CSDN博主「軟件工程師能力認證」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。

          近大家刷抖音,是否有刷到拉斯維加斯的新地標 「Sphere」:

          場館內(nèi)部的視覺效果非常驚人,其中一個效果讓我虎軀一震:

          我的第一想法就是,這個看起來用 CSS 也可以實現(xiàn)嘛?還有 CSS 不能實現(xiàn)的?

          本文,就將嘗試使用 CSS,大致還原這個效果。

          拆解動畫效果

          其實,上述的動畫效果,本質(zhì)就是一個 3D 立方體。

          同時,3D 立方體上每個面存在顏色不一樣的文字,文字和顏色都在隨機變化。

          也就是說,我們需要實現(xiàn)一個 3D 立方體:

          同時,我們還需要實現(xiàn)這樣一個動畫效果 -- 文字和顏色都在隨機變化的平面效果:

          兩者組合一下,再挪動 3D 元素的景深距離,就能實現(xiàn)我們想要的效果!

          好,下面我們一個一個實現(xiàn)。

          實現(xiàn)一個 3D 立方體

          實現(xiàn)一個 3D 立方體,相對另外一個文字和顏色都在隨機變化的平面效果而言,屬于非常非常簡單的一步了。

          我們在非常多篇文章中也講過具體的實現(xiàn)方式:

          最常見的 3D 圖形,莫過于一個 3D 立方體。

          如果沒有上下兩個面,只是一個 4 個面的圖形,大概是這樣:

          這樣一個圖形,利用 CSS 3D,如何快速實現(xiàn)呢?

          首先,構(gòu)造這么一個結(jié)構(gòu):

          <div class="perspective">
                  <div class="container">
                          <div class="img">3</div>
                          <div class="img">D</div>
                          <div class="img">視</div>
                          <div class="img">圖</div>
                  </div>
          </div>

          4 個面,就是最內(nèi)層的 4 個 .img,首先,需要給兩個父容器,設(shè)置 3D 的屬性:

          .perspective {
            perspective: 3000px;
          }
          .container {
            width: 400px;
            height: 400px;
            transform-style: preserve-3d;
          }

          簡單解釋一下:

          1. perspective 可以作用于元素的后代,設(shè)置在最上層即可;
          2. transform-style: preserve-3d 設(shè)置給最終需要 3D 空間的元素的父容器之上,由于最終是 4 個 .img 需要 3D 空間,因此設(shè)置給 .container 即可。

          接下來,就是最為核心的,如何設(shè)置 4 個 .img 元素的 3D 變換,使之形成 3D 立方體。

          技巧就是:先旋轉(zhuǎn),再位移

          這里給出一個俯視效果圖:

          以上述 Demo 中的正方體為例子,class 為 .img 的 div 塊的高寬為 400px*400px。那么要利用 4 個 這樣的 div 拼接成一個正方體,需要分別將 4 個 div 繞 Y 軸旋轉(zhuǎn) [90°, 180°, 270°, 360°],再 translateY(200px) 。

          值得注意的是,一定是先旋轉(zhuǎn)角度,再偏移距離,這個順序很重要

          代碼如下:

          .img {
                  position: absolute;
                  top: 0;
                  left: 0;
                  width: 400px;
                  height: 400px;
          }
          @for $i from 1 through $imgCount {
                  .img:nth-child(#{$i}) {
                          transform: rotateY(($i * 90deg)) translateZ(200px);
                  }
          }

          效果如下:

          此時,可能會覺得圖片太太太大了,此時,我們可以通過給中間層 .container 設(shè)置一個恰當?shù)?translateZ 進行視覺大小上的調(diào)節(jié)。

          .container {
              transform: translateZ(-3000px);
          }

          這樣,就能得到恰當大小的立方體元素效果:

          當然,對于我們這個效果,我們 5 要五個面(前后左右與上方即可),因此,我們基于上述的基礎(chǔ)知識鋪墊,重新實現(xiàn)一個我們需要的框架結(jié)構(gòu):

          <div class="perspective">
            <div class="container">
              <div class="g-panel"></div>
              <div class="g-panel"></div>
              <div class="g-panel"></div>
              <div class="g-panel"></div>
              <div class="g-panel"></div>
            </div>
          </div>

          并且,我們希望我們的圖形是一個立方體,只需要稍微改造長寬和 translateZ() 的即可。這樣,我們就能得到一個前后左右與上方 5 個面的立方體元素。

          示意效果如下:

          實現(xiàn)文字動畫效果

          OK,立方體我們先放在一邊。

          接下來,我們嘗試來實現(xiàn)這個效果:

          這個效果如果一個文字用一個 DIV 承載實現(xiàn),那是非常容易的,但是這樣勢必會造成元素過多,再設(shè)置動畫效果,則會導致頁面太為卡頓

          所以,我們需要另辟蹊徑。這里,我們可以使用多層漸變配合 background-clip: text

          首先,我們利用等寬字體,隨機實現(xiàn)一列文字:

          <div>ABCDEFGHIJKLMN</div>
          div {
              font-family: monospace;
              text-align: center;
              font-size: 25px;
              width: 25px;
              line-height: 25px;
              color: #fff;
          }

          效果大致如下:

          此時,如果我們再利用線性漸變,給每個字符的對應空間(也就 25px x 25px),設(shè)置上不同的顏色,大概是這樣:

          @function randomLinear($count) {
              $value: '';
              
              @for $i from 0 through ($count - 1) {
                  $value: $value + randomColor() + string.unquote(" 0 #{$i * 25}px,");
              }
              
              @return linear-gradient(string.unquote(#{$value}) randomColor() 0 100%);
          }
          @function randomColor() {
              @return rgb(randomNum(255), randomNum(255), randomNum(255));
          }
          div {
              // ...
              background: randomLinear(14);
          }

          其中,randomLinear(14) 是一個 SASS 函數(shù),參數(shù) 14 表示生成 14 層線性漸變,每一個文字區(qū)域的顏色都是隨機的,經(jīng)過編譯后的其中一種結(jié)果如下:

          div {
              // ...
              background: linear-gradient(#feea96 0 25px, #edde42 0 50px, #e2344a 0 75px, #cdab7e 0 100px, #e16c8b 0 125px, #dcdc7d 0 150px, #dcb42a 0 175px, #d6a587 0 200px, #984f71 0 225px, #221e34 0 250px, #5e9a69 0 275px, #a955e4 0 300px, #4e908f 0 325px, #8d177e 0 350px);
          }

          上面,我們按照每間隔 25px 的高度,利用線性漸變隨機設(shè)置了一種顏色,最終,能夠得到這么個效果:

          此時,我們只需要再設(shè)置 background-clip: text,配合透明文字顏色 color: transparent,就可以實現(xiàn)單個 div 內(nèi),單列文字,每個字體的顏色都是不一樣的:

          div {
              // ...
              background: randomLinear(14);
              background-clip: text;
              color: transparent;
          }

          此時,效果如下:

          當然,文字顏色可以隨機,那么文字本身也應該隨機。這個不難,我們也可以借助 SASS 函數(shù),編寫一個隨機字符的函數(shù),通過元素的偽元素 content 進行設(shè)置。

          那么此時,完整的代碼可能是這樣的:

          <div></div>
          $str: 'QWERTYUIOPASDFGHJKLZXCVBNMabcdefghigklmnopqrstuvwxyz123456789';
          $length: str-length($str);
          
          @function randomLinear($count) {
              $value: '';
              
              @for $i from 0 through ($count - 1) {
                  $value: $value + randomColor() + string.unquote(" 0 #{$i * 25}px,");
              }
              
              @return linear-gradient(string.unquote(#{$value}) randomColor() 0 100%);
          }
          @function randomColor() {
              @return rgb(randomNum(255), randomNum(255), randomNum(255));
          }
          @function randomChar() {
              $r: random($length);
              @return str-slice($str, $r, $r);
          }
          @function randomChars($number) {
              $value: '';
          
              @if $number > 0 {
                  @for $i from 1 through $number {
                      $value: $value + randomChar();
                  }
              }
              @return $value;
          }
          
          div {
              position: relative;
              width: 25px;
              height: 350px;
          
              &::before {
                  content: randomChars(14);
                  position: absolute;
                  font-family: monospace;
                  background: randomLinear(14);
                  background-clip: text;
                  color: transparent;
                  text-align: center;
                  font-size: 25px;
                  width: 25px;
                  line-height: 25px;
              }
          }

          這樣,每次 div 內(nèi)的文字,都是從上面 SASS 函數(shù)中 $str 變量中隨機取的:

          接下來,我們需要實現(xiàn)文字的隨機跳變,也很好做,我們需要在一開始,隨機生成多個不同的 content,然后,借助 CSS 動畫,進行切換。

          div {
             &::before {
                  content: randomChars(14);
                  --content1: "#{randomChars(14)}";
                  --content2: "#{randomChars(14)}";
                  --content3: "#{randomChars(14)}";
                  --content4: "#{randomChars(14)}";
                  animation: contentChange 1s infinite;
              }
          }
          
          @keyframes contentChange {
              20% {
                  content: var(--content1);
              }
              40% {
                  content: var(--content2);
              }
              60% {
                  content: var(--content3);
              }
              80% {
                  content: var(--content4);
              }
          }

          這里,我們一次生成了 5 個 content,其中 4 個用 CSS 變量保存了起來,隨后,在 CSS 動畫中,利用提前生成好的 content,進行字符內(nèi)容的替換,此時,整個效果如下:

          隨機內(nèi)容有了,單個字體顏色不一樣有了,就差顏色的隨機跳變動畫了,這個也非常好做,我們在多篇文章也提及過,利用 filter: hue-rotate() 可以快速實現(xiàn)內(nèi)容的顏色切換。

          div {
              animation: colorChange 1s steps(12) infinite;
          }
          @keyframes colorChange {
              100% {
                  filter: hue-rotate(360deg);
              }
          }

          我們利用了 filter: hue-rotate() 加上了步驟動畫(steps),成功的實現(xiàn)了顏色的跳變!效果如下:

          當然,我們最終要實現(xiàn)的是整個面隨機顏色加上隨機文字的跳變動畫,只需要在上述的基礎(chǔ)上,利用 SASS 函數(shù),循環(huán)重復多列操作即可。基于上述所有內(nèi)容的鋪墊,我們最終的單個面下的動畫效果代碼如下:

          <div class="g-container">
            <div></div>
            // ... 一個 32 個子 div
            <div></div>
          </div>
          @use "sass:string";
          
          $str: 'QWERTYUIOPASDFGHJKLZXCVBNMabcdefghigklmnopqrstuvwxyz123456789';
          $length: str-length($str);
          $size: 25;
          $count: 41;
          
          @function randomNum($max, $min: 0, $u: 1) {
              @return ($min + random($max)) * $u;
          }
          
          @function randomLinear($count) {
              $value: '';
              
              @for $i from 0 through ($count - 1) {
                  $value: $value + randomColor() + string.unquote(" 0 #{$i * 25}px,");
              }
              
              @return linear-gradient(string.unquote(#{$value}) randomColor() 0 100%);
          }
          
          @function randomColor() {
              @return rgb(randomNum(255), randomNum(255), randomNum(255));
          }
          
          @function randomChar() {
              $r: random($length);
              @return str-slice($str, $r, $r);
          }
          
          @function randomChars($number) {
              $value: '';
          
              @if $number > 0 {
                  @for $i from 1 through $number {
                      $value: $value + randomChar();
                  }
              }
              @return $value;
          }
          
          body,
          html {
              width: 100%;
              height: 100%;
              background: #000;
              font-family: monospace;
          }
          
          .g-container {
              position: relative;
              width: 800px;
              height: 800px;
              display: flex;
              animation: colorChange 1s steps(12) infinite;
              
              div {
                  position: relative;
                  width: #{$size}px;
                  height: 800px;
                  flex-shrink: 0;
                  
                  &::before {
                      position: absolute;
                      inset: 0;
                      text-align: center;
                      font-size: #{$size}px;
                      width: #{$size}px;
                      text-align: center;
                      line-height: #{$size}px;
                      color: transparent;
                  }
              }
              
              @for $i from 1 to $count {
                  div:nth-child(#{$i}) {
                      &::before {
                          content: randomChars(32);
                          --content1: "#{randomChars(32)}";
                          --content2: "#{randomChars(32)}";
                          --content3: "#{randomChars(32)}";
                          --content4: "#{randomChars(32)}";
                          animation: contentChange 1s infinite;
                          background: randomLinear(32);
                          background-clip: text;
                      }
                  }
              }
          }
          @keyframes colorChange {
              100% {
                  filter: hue-rotate(360deg);
              }
          }
          @keyframes contentChange {
              20% {
                  content: var(--content1);
              }
              40% {
                  content: var(--content2);
              }
              60% {
                  content: var(--content3);
              }
              80% {
                  content: var(--content4);
              }
          }

          這樣,我們就成功的實現(xiàn)了單個平面下的,顏色隨機,文字隨機,且不斷變化的動畫效果:

          實現(xiàn)立體效果

          有了上面的立方體和單個平面的效果,要實現(xiàn)立體效果就不難了。我們嘗試將兩者結(jié)合起來。

          改造原有的立方體結(jié)構(gòu),大致改成如下形式:

          .perspective
              .container
                  .g-panel
                      -for(var i=0; i<32; i++)
                          div
                  .g-panel
                      -for(var i=0; i<32; i++)
                          div
                  .g-panel
                      -for(var i=0; i<32; i++)
                          div
                  .g-panel
                      -for(var i=0; i<32; i++)
                          div
                  .g-panel
                      -for(var i=0; i<32; i++)
                          div

          上面采用了 PUG 模板引擎來簡化代碼,編譯后的效果如下:

          <div class="perspective">
            <div class="container">
              <div class="g-panel">
                <div></div>
                // ... 32 個
                <div></div>
              <div class="g-panel">
                <div></div>
                // ... 32 個
                <div></div>
              <div class="g-panel">
                <div></div>
                // ... 32 個
                <div></div>
              <div class="g-panel">
                <div></div>
                // ... 32 個
                <div></div>
              <div class="g-panel">
                <div></div>
                // ... 32 個
                <div></div>
            </div>
          </div>

          這里,我們只需要實現(xiàn) 5 個面的立方體即可(前后左右以及上方)。

          每個 .g-panel,實現(xiàn)一個我們上面鋪墊的單面文字跳變效果,這樣,我們就能得到這么一個立體的 3D 立方體動畫效果:

          接下來,我們只需要稍加調(diào)試,通過控制 perspective 和 transform: translateZ() 控制視覺上的縱深,將畫面的視角放置于整個立方體之中,即可得到這么個效果:

          好,最后,我們模擬文章開頭拉斯維加斯球的效果,讓頂部的平面,向下運動,實現(xiàn)一種天花板往下掉的動畫效果,最終,我們即可使用純 CSS,大致模擬出整個效果:

          由于 GIF 錄制問題,實際效果會比 GIF 展示效果更為震撼。

          今,在各種互聯(lián)網(wǎng)應用中,隨著站點對硬件性能、響應速度、服務(wù)穩(wěn)定性、數(shù)據(jù)可靠性等要求也越來越高,單臺服務(wù)器也將難以無法承擔所有的訪問需求。

          圖片來自 Pexels

          當然了,除了使用性價比高的設(shè)備和專用負載分流設(shè)備外,還有一些其他選擇來幫你解決此問題,就是搭建集群服務(wù)器通過整合多臺普通的服務(wù)器設(shè)備并以同一個地址對外提供相同的服務(wù)。

          今天就帶大家學習企業(yè)中常用的一種群集技術(shù) LVS:

          • 什么是 LVS
          • 為什么要用 LVS
          • LVS 的組成及作用
          • 負載均衡的由來及所帶來的好處
          • LVS 負載均衡集群的類型
          • DNS/軟硬件負載均衡的類型
          • LVS 集群的通用體系結(jié)構(gòu)
          • LVS 負載均衡的基本原理
          • LVS 負載均衡的三種工作模式
          • LVS 的十種負載調(diào)度算法
          • LVS 涉及相關(guān)的術(shù)語與說明
          • 總結(jié)

          什么是 LVS?

          LVS 是 Linux Virtual Server 的簡寫,也就是 Linux 虛擬服務(wù)器,是一個虛擬的服務(wù)器集群系統(tǒng),本項目在 1998 年 5 月由章文嵩博士成立,是中國國內(nèi)最早出現(xiàn)的自由軟件項目之一。

          官方網(wǎng)站:http://www.linuxvirtualserver.org,LVS 實際上相當于基于 IP 地址的虛擬化應用,為基于 IP 地址和內(nèi)容請求分發(fā)的負載均衡提出了高效的解決方法,現(xiàn)在 LVS 已經(jīng)是 Linux 內(nèi)核標準的一部分。

          使用 LVS 可以達到的技術(shù)目標是:通過 LVS 達到的負載均衡技術(shù)和 Linux 操作系統(tǒng)實現(xiàn)一個高性能高可用的 Linux 服務(wù)器集群,具有良好的可靠性、可擴展性和可操作性,從而以低廉的成本實現(xiàn)最優(yōu)的性能。

          LVS 是一個實現(xiàn)負載均衡集群的開源軟件項目,LVS 架構(gòu)從邏輯上可分為調(diào)度層、Server 集群層和共享存儲層。

          為什么要用 LVS?

          那為什么還需要用 LVS 呢?隨著 Internet 的爆炸性增長以及日常生活中的日益重要的作用,Internet 上的流量速度增長,以每年 100% 以上的速度增長。

          服務(wù)器上的工作負載壓力也迅速增加,因此服務(wù)器在短時間內(nèi)將會過載,尤其是對于受歡迎的網(wǎng)站而言。

          為了克服服務(wù)器的過載壓力問題,有兩種解決方案:

          • 一種是:單服務(wù)器解決方案,即將服務(wù)器升級到性能更高的服務(wù)器,但是當請求增加時,將很快過載,因此必須再次對其進行升級,升級過程復雜且成本高;
          • 另一個是:多服務(wù)器解決方案,即在服務(wù)器集群上構(gòu)建可擴展的網(wǎng)絡(luò)服務(wù)系統(tǒng)。當負載增加時,可以簡單地在群集中添加新服務(wù)器或更多服務(wù)器以滿足不斷增長的需求,而商用服務(wù)器具有最高的性能/成本比。因此,構(gòu)建用于網(wǎng)絡(luò)服務(wù)的服務(wù)器群集系統(tǒng)更具可伸縮性,并且更具成本效益。

          構(gòu)建服務(wù)器集群的方法如下:

          基于 DNS 的負載均衡集群:DNS 負載均衡可能是構(gòu)建網(wǎng)絡(luò)服務(wù)群集的最簡單方法。

          使用域名系統(tǒng)通過將域名解析為服務(wù)器的不同 IP 地址來將請求分發(fā)到不同的服務(wù)器。

          當 DNS 請求到達 DNS 服務(wù)器以解析域名時,DNS 服務(wù)器將基于調(diào)度策略發(fā)出服務(wù)器 IP 地址之一,然后來自客戶端的請求使用相同的本地緩存名稱服務(wù)器將在指定的名稱解析生存時間(TTL)中發(fā)送到同一服務(wù)器。

          但是,由于客戶端和分層 DNS 系統(tǒng)的緩存特性,很容易導致服務(wù)器之間的動態(tài)負載不平衡,因此服務(wù)器很難處理其峰值負載。在 DNS 服務(wù)器上不能很好地選擇名稱映射的 TTL 值。

          如果值較小,DNS 流量很高,而 DNS 服務(wù)器將成為瓶頸;如果值較大,則動態(tài)負載不平衡將變得更糟。

          即使 TTL 值設(shè)置為零,調(diào)度粒度也是針對每個主機的,不同用戶的訪問模式可能會導致動態(tài)負載不平衡,因為有些人可能從站點中拉出很多頁面,而另一些人可能只瀏覽了幾頁然后轉(zhuǎn)到遠。

          而且,它不是那么可靠,當服務(wù)器節(jié)點發(fā)生故障時,將名稱映射到 IP 地址的客戶端會發(fā)現(xiàn)服務(wù)器已關(guān)閉。

          基于分派器的負載平衡集群:分派器,也稱為負載平衡器,可用于在群集中的服務(wù)器之間分配負載,以便服務(wù)器的并行服務(wù)可以在單個 IP 地址上顯示為虛擬服務(wù),并且最終用戶可以像單個服務(wù)器一樣進行交互不知道群集中的所有服務(wù)器。

          與基于 DNS 的負載平衡相比,調(diào)度程序可以按精細的粒度(例如每個連接)調(diào)度請求,以實現(xiàn)服務(wù)器之間的更好負載平衡。一臺或多臺服務(wù)器發(fā)生故障時,可以掩蓋故障。

          服務(wù)器管理變得越來越容易,管理員可以隨時使一臺或多臺服務(wù)器投入使用或退出服務(wù),而這不會中斷最終用戶的服務(wù)。

          負載均衡可以分為兩個級別,即應用程序級別和 IP 級別。例如,反向代理和 pWEB是用于構(gòu)建可伸縮 Web 服務(wù)器的應用程序級負載平衡方法。

          他們將 HTTP 請求轉(zhuǎn)發(fā)到群集中的其他 Web 服務(wù)器,獲取結(jié)果,然后將其返回給客戶端。

          由于在應用程序級別處理 HTTP 請求和答復的開銷很高,我相信當服務(wù)器節(jié)點數(shù)增加到 5 個或更多時,應用程序級別的負載均衡器將成為新的瓶頸,這取決于每個服務(wù)器的吞吐量服務(wù)器。

          LVS 與 Nginx 功能對比如下:

          • LVS 比 Nginx 具有更強的抗負載能力,性能高,對內(nèi)存和 CPU 資源消耗較低。
          • LVS 工作在網(wǎng)絡(luò)層,具體流量由操作系統(tǒng)內(nèi)核進行處理,Nginx 工作在應用層,可針對 HTTP 應用實施一些分流策略。
          • LVS 安裝配置較復雜,網(wǎng)絡(luò)依賴性大,穩(wěn)定性高。Nginx 安裝配置較簡單,網(wǎng)絡(luò)依賴性小。
          • LVS 不支持正則匹配處理,無法實現(xiàn)動靜分離效果。
          • LVS 適用的協(xié)議范圍廣。Nginx 僅支持 HTTP、HTTPS、Email 協(xié)議,適用范圍小。

          LVS 的組成及作用

          LVS 由兩部分程序組成:

          • ipvs(ip virtual server):LVS 是基于內(nèi)核態(tài)的 Netfilter 框架實現(xiàn)的 IPVS 功能,工作在內(nèi)核態(tài)。用戶配置 VIP 等相關(guān)信息并傳遞到 IPVS 就需要用到 ipvsadm 工具。
          • ipvsadm:ipvsadm 是 LVS 用戶態(tài)的配套工具,可以實現(xiàn) VIP 和 RS 的增刪改查功能,是基于 Netlink 或 raw socket 方式與內(nèi)核 LVS 進行通信的,如果 LVS 類比于 Netfilter,那 ipvsadm 就是類似 iptables 工具的地位。

          作用如下:

          • 主要用于多服務(wù)器的負載均衡。
          • 工作在網(wǎng)絡(luò)層,可實現(xiàn)高性能,高可用的服務(wù)器集群技術(shù)。
          • 廉價,可把許多低性能的服務(wù)器組合在一起形成一個超級服務(wù)器。
          • 易用,配置簡單,有多種負載均衡的方法。
          • 穩(wěn)定可靠,即使在集群的服務(wù)器中某臺服務(wù)器無法正常工作,也不影響整體效果。
          • 可擴展性好。

          負載均衡的由來及所帶來的好處

          在業(yè)務(wù)剛起步時,一般先使用單臺服務(wù)器對外進行提供服務(wù)。隨著后期的業(yè)務(wù)增長,流量也越來越大。

          當這單臺服務(wù)器的訪問量越大時,服務(wù)器所承受的壓力也就越大,性能也將無法滿足業(yè)務(wù)需求,超出自身所指定的訪問壓力就會崩掉,避免發(fā)生此類事情的發(fā)生。

          我們將采取其他方案,將多臺服務(wù)器組成集群系統(tǒng)從而來提高整體服務(wù)器的處理性能,使用統(tǒng)一入口(流量調(diào)度器)的方式通過均衡的算法進行對外提供服務(wù),將用戶大量的請求均衡地分發(fā)到后端集群不同的服務(wù)器上。

          因此也就有了負載均衡來分擔服務(wù)器的壓力。使用負載均衡給我們所帶來的好處:提高系統(tǒng)的整體性能、提高系統(tǒng)的擴展性、提高系統(tǒng)的高可用性。

          LVS 負載均衡集群的類型

          負載均衡群集:Load Balance Cluster,以提高應用系統(tǒng)的響應能力,盡可能處理更多的訪問請求、減少延遲為目標,從而獲得高并發(fā)、高負載的整體性能。

          高可用群集:High Availability Cluster,以提高應用系統(tǒng)的可靠性,盡可能的減少終端時間為目標、確保服務(wù)的連續(xù)性,達到高可用的容錯效果。

          高性能運算群集:High Performance Computer Cluster,以提高應用系統(tǒng)的 CPU 運算速度、擴展硬件資源和分析能力為目標、從而獲得相當于大型、超級計算機的高性能計算能力。

          DNS/軟硬件負載均衡的類型

          ①DNS 實現(xiàn)負載均衡

          一個域名通過 DNS 解析到多個 IP,每個 IP 對應不同的服務(wù)器實例,就完成了流量的調(diào)度,這也是 DNS 實現(xiàn)負載均衡是最簡單的方式。

          使用該方式最大的優(yōu)點:實現(xiàn)簡單,成本低,無需自己開發(fā)或維護負載均衡設(shè)備。

          不過存在一些缺點:服務(wù)器故障切換延遲大,升級不方便、流量調(diào)度不均衡,粒度大、流量分配策略較簡單,支持的算法較少、DNS 所支持的 IP 列表有限制要求。

          ②硬件負載均衡

          硬件負載均衡是通過專門的硬件設(shè)備從而來實現(xiàn)負載均衡功能,比如:交換機、路由器就是一個負載均衡專用的網(wǎng)絡(luò)設(shè)備。

          目前典型的硬件負載均衡設(shè)備有兩款:F5 和 A10。不過話說,能用上這種硬件負載均衡設(shè)備的企業(yè)都不是一般的公司,反而普通業(yè)務(wù)量級小的其他企業(yè)基本用不到。

          硬件負載均衡的優(yōu)點:

          • 功能強大:支持各層級負載均衡及全面負載均衡算法。
          • 性能強大:性能遠超常見的軟件負載均衡器。
          • 穩(wěn)定性高:硬件負載均衡,大規(guī)模使用肯定是嚴格測試過的。
          • 安全防護:除具備負載均衡功能外,還具備防火墻、防 DDoS 攻擊等安全功能。

          硬件負載均衡的缺點:

          • 價格昂貴。
          • 可擴展性差。
          • 調(diào)試維護麻煩。

          ③軟件負載均衡

          軟件負載均衡有如下幾種:

          • Nginx:支持 4 層/7 層負載均衡,支持 HTTP、E-mail 協(xié)議。
          • LVS:純 4 層負載均衡,運行在內(nèi)核態(tài),性能是軟件負載均衡中最高的。
          • HAproxy:是 7 層負載均衡軟件,支持 7 層規(guī)則的設(shè)置,性能也不錯。

          軟件負載均衡的優(yōu)點:簡單、靈活、便宜(直接在 Linux 操作系統(tǒng)上安裝上述所使用的軟件負載均衡,部署及維護較簡單,4 層 和 7 層負載均衡可根據(jù)業(yè)務(wù)進行選擇也可根據(jù)業(yè)務(wù)特點,比較方便進行擴展及定制功能)。

          LVS 集群的通用體系結(jié)構(gòu)

          第一層:負載調(diào)度器:Load Balancer,它是訪問整個群集系統(tǒng)的唯一入口,對外使用所有服務(wù)器共有的虛擬 IP 地址,也成為群集 IP 地址。

          負載均衡器:是服務(wù)器群集系統(tǒng)的單個入口點,可運行 IPVS,該 IPVS 在 Linux 內(nèi)核或 KTCPVS 內(nèi)部實現(xiàn) IP 負載均衡技術(shù),在 Linux 內(nèi)核中實現(xiàn)應用程序級負載平衡。

          使用 IPVS 時,要求所有服務(wù)器提供相同的服務(wù)和內(nèi)容,負載均衡器根據(jù)指定的調(diào)度算法和每個服務(wù)器的負載將新的客戶端請求轉(zhuǎn)發(fā)到服務(wù)器。無論選擇哪個服務(wù)器,客戶端都應獲得相同的結(jié)果。

          使用 KTCPVS 時,服務(wù)器可以具有不同的內(nèi)容,負載均衡器可以根據(jù)請求的內(nèi)容將請求轉(zhuǎn)發(fā)到其他服務(wù)器。

          由于 KTCPVS 是在 Linux 內(nèi)核內(nèi)部實現(xiàn)的,因此中繼數(shù)據(jù)的開銷很小,因此仍可以具有較高的吞吐量。

          第二層:服務(wù)器池 Server Pool,群集所提供的應用服務(wù),比如:HTTP、FTP 服務(wù)器池來承擔,每個節(jié)點具有獨立的真實 IP 地址,只處理調(diào)度器分發(fā)過來的客戶機請求。

          服務(wù)器群集的節(jié)點可根據(jù)系統(tǒng)所承受的負載進行分擔。當所有服務(wù)器過載時,可添加多臺服務(wù)器來處理不斷增加的工作負載。

          對于大多數(shù) Internet 服務(wù)(例如Web),請求通常沒有高度關(guān)聯(lián),并且可以在不同服務(wù)器上并行運行。因此,隨著服務(wù)器群集的節(jié)點數(shù)增加,整體性能幾乎可以線性擴展。

          第三層:共享存儲 Shared Storage,為服務(wù)器池中的所有節(jié)點提供穩(wěn)定、一致的文件存儲服務(wù),確保整個群集的統(tǒng)一性,可使用 NAS 設(shè)備或提供 NFS (Network File System)網(wǎng)絡(luò)文件系統(tǒng)共享服務(wù)的專用服務(wù)器。

          共享存儲:可以是數(shù)據(jù)庫系統(tǒng),網(wǎng)絡(luò)文件系統(tǒng)或分布式文件系統(tǒng)。服務(wù)器節(jié)點需要動態(tài)更新的數(shù)據(jù)應存儲在基于數(shù)據(jù)的系統(tǒng)中,當服務(wù)器節(jié)點并行在數(shù)據(jù)庫系統(tǒng)中讀寫數(shù)據(jù)時,數(shù)據(jù)庫系統(tǒng)可以保證并發(fā)數(shù)據(jù)訪問的一致性。

          靜態(tài)數(shù)據(jù)通常保存在網(wǎng)絡(luò)文件系統(tǒng)(例如 NFS 和 CIFS)中,以便可以由所有服務(wù)器節(jié)點共享數(shù)據(jù)。

          但是,單個網(wǎng)絡(luò)文件系統(tǒng)的可伸縮性受到限制,例如,單個 NFS / CIFS 只能支持 4 到 8 個服務(wù)器的數(shù)據(jù)訪問。

          對于大型集群系統(tǒng),分布式/集群文件系統(tǒng)可以用于共享存儲,例如 GPFS,Coda 和 GFS,然后共享存儲也可以根據(jù)系統(tǒng)需求進行擴展。

          LVS 負載均衡的基本原理

          Netfilter 的基本原理

          在介紹 LVS 負載均衡基本原理之前,先說一下 Netfilter 的基本原理。因為 LVS 是基于 Linux 內(nèi)核中 Netfilter 框架實現(xiàn)的負載均衡系統(tǒng)。

          Netfilter 其實很復雜也很重要,平時說的 Linux 防火墻就是 Netfilter,不過我們操作的還是 iptables,iptables 和 Netfilter 是 Linux 防火墻組合工具,是一起來完成系統(tǒng)防護工作的。

          iptables 是位于用戶空間,而 Netfilter 是位于內(nèi)核空間。iptables 只是用戶空間編寫和傳遞規(guī)則的工具而已,真正工作的還是 Netfilter。

          兩者間的區(qū)別:Netfilter 是內(nèi)核態(tài)的 Linux 防火墻機制,它作為一個通用、抽象的框架,提供了一整套的 hook 函數(shù)管理機制,提供數(shù)據(jù)包過濾、網(wǎng)絡(luò)地址轉(zhuǎn)換、基于協(xié)議類型的連接跟蹤的功能,可在數(shù)據(jù)包流經(jīng)過程中,根據(jù)規(guī)則設(shè)置若干個關(guān)卡(hook 函數(shù))來執(zhí)行相關(guān)操作。

          它共設(shè)置了 5 個點,包括:

          • prerouting:在對數(shù)據(jù)包做路由選擇之前,將應用此鏈中的規(guī)則。
          • input:當收到訪問防火墻本機地址的數(shù)據(jù)包時,將應用此鏈中的規(guī)則。
          • forward:當收到需要通過防火中轉(zhuǎn)發(fā)給其他地址的數(shù)據(jù)包時,將應用此鏈中的規(guī)則。
          • output:當防火墻本機向外發(fā)送數(shù)據(jù)包時,將應用此鏈中的規(guī)則。
          • postrouting:在對數(shù)據(jù)包做路由選擇之后,將應用此鏈中的規(guī)則。

          iptable 是用戶層的工具,提供命令行接口,能夠向 Netfilter 中添加規(guī)則策略,從而實現(xiàn)報文過濾,修改等功能。

          通過下圖我們可以來了解下 Netfilter 的工作機制:

          當數(shù)據(jù)包通過網(wǎng)絡(luò)接口進入時,經(jīng)過鏈路層之后進入網(wǎng)絡(luò)層到達PREROUTING,然后根據(jù)目標 IP 地址進行查找路由。

          如目標 IP 是本機,數(shù)據(jù)包會傳到 INPUT 上,經(jīng)過協(xié)議棧后根據(jù)端口將數(shù)據(jù)送到相應的應用程序;應用程序?qū)⒄埱筇幚砗蟀秧憫獢?shù)據(jù)包發(fā)送至 OUTPUT 里,最終通過 POSTROUTING 后發(fā)送出網(wǎng)絡(luò)接口。

          如目標 IP 不是本機,并且服務(wù)器開啟了 FORWARD 參數(shù),這時會將數(shù)據(jù)包遞送給 FORWARD,最后通過 POSTROUTING 后發(fā)送出網(wǎng)絡(luò)接口。

          LVS 的基本原理

          LVS 基于 Netfilter 框架,工作在 INPUT 鏈上,在 INPUT 鏈上注冊 ip_vs_in HOOK 函數(shù),進行 IPVS 相關(guān)主流程。

          詳細原理概述如下:

          ①當客戶端用戶訪問 www.baidu.com 網(wǎng)站時,用戶訪問請求通過層層網(wǎng)絡(luò),最終通過交換機進入 LVS 服務(wù)器網(wǎng)卡進入內(nèi)核空間層。

          ②進入 PREROUTING 后通過查找路由,確定訪問目的 VIP 是本機 IP 地址的話,數(shù)據(jù)包將進入 INPUT 鏈中。

          ③因為 IPVS 工作在 INPUT 鏈上,會根據(jù)訪問的 VIP 和端口判斷請求是否為 IPVS 服務(wù),是的情況下,則調(diào)用注冊的 IPVS HOOK 函數(shù),進行 IPVS 相關(guān)流程,并強制修改數(shù)據(jù)包的相關(guān)數(shù)據(jù),并將數(shù)據(jù)包發(fā)往 POSTROUTING 鏈中。

          ④POSTROUTING 鏈收到數(shù)據(jù)包后,將根據(jù)目標 IP 地址服務(wù)器,通過路由選路,將數(shù)據(jù)包最終發(fā)送至后端真實服務(wù)器中。

          上面就是我們所介紹的 LVS 的工作原理,那么 LVS 負載均衡還包括三種工作模式,且每種模式工作原理都有所不同,適用于不同應用場景,其最終目的都是能實現(xiàn)均衡的流量調(diào)度和良好的擴展性。

          LVS 負載均衡的三種工作模式

          群集的負載調(diào)度技術(shù),可基于 IP、端口、內(nèi)容等進行分發(fā),其中基于 IP 的負載均衡是效率最高的。

          基于 IP 的負載均衡模式,常見的有地址轉(zhuǎn)換(NAT)、IP 隧道(TUN)和直接路由(DR)三種工作模式。

          NAT 模式

          地址轉(zhuǎn)換:Network Address Translation,簡稱:NAT 模式,類似于防火墻的私有網(wǎng)絡(luò)結(jié)構(gòu),負載調(diào)度器作為所有服務(wù)器節(jié)點的網(wǎng)關(guān),作為客戶機的訪問入口,也是各節(jié)點回應客戶機的訪問出口,服務(wù)器節(jié)點使用私有 IP 地址,與負載調(diào)度器位于同一個物理網(wǎng)絡(luò),安全性要優(yōu)于其他兩種方式。

          NAT 實現(xiàn)原理過程如下:

          ①客戶端發(fā)出的請求數(shù)據(jù)包經(jīng)過網(wǎng)絡(luò)到達 LVS 網(wǎng)卡,數(shù)據(jù)包源 IP 為 CIP,目的 IP 為 VIP。

          ②然后進入 PREROUTING 鏈中,根據(jù)目的 IP 查找路由,確定是否為本機 IP 地址,隨后將數(shù)據(jù)包轉(zhuǎn)發(fā)至 INPUT 鏈中,源 IP 和 目的 IP 不變。

          ③到達 LVS 后,通過目的 IP 和目的 PORT 查找是否為 IPVS 服務(wù),如是 IPVS 服務(wù),將會選擇一個 RS 來作為后端服務(wù)器,數(shù)據(jù)包的目的 IP 地址將會修改為 RIP,這時并以 RIP 為目的 IP 去查找路由,確定下一跳及 PORT 信息后,數(shù)據(jù)包將會轉(zhuǎn)發(fā)至 OUTPUT 鏈中。

          ④被修改過的數(shù)據(jù)包經(jīng)過 POSTROUTING 鏈后,到達 RS 服務(wù)器,數(shù)據(jù)包源 IP 為 CIP,目的 IP 為 RIP。

          ⑤RS 服務(wù)器經(jīng)過處理后,將會把數(shù)據(jù)包發(fā)送至用戶空間的應用程序,待處理完成后,發(fā)送響應數(shù)據(jù)包,RS 服務(wù)器的默認網(wǎng)關(guān)為 LVS 的 IP,應用程序?qū)褦?shù)據(jù)包轉(zhuǎn)發(fā)至下一跳 LVS 服務(wù)器,數(shù)據(jù)包源 IP 為 RIP,目的 IP 為 CIP。

          ⑥LVS 服務(wù)器收到 RS 服務(wù)器響應的數(shù)據(jù)包后,查找路由,目的 IP 不是本機 IP并且 LVS 服務(wù)器開啟了 FORWARD 模式,會將數(shù)據(jù)包轉(zhuǎn)發(fā)給它,數(shù)據(jù)包不變。

          ⑦LVS 服務(wù)器收到響應數(shù)據(jù)包后,根據(jù)目的 IP 和 目的 PORT 查找相應的服務(wù),這時,源 IP 為 VIP,通過查找路由,確定下一跳信息并將數(shù)據(jù)包發(fā)送至網(wǎng)關(guān),最終回應給客戶端用戶。

          NAT 模式的優(yōu)點:

          • 支持 Windows 操作系統(tǒng)。
          • 支持端口映射,如 RS 服務(wù)器 PORT 與 VPORT 不一致的話,LVS 會修改目的 IP 地址和 DPORT 以支持端口映射。

          NAT 模式的缺點:

          • RS 服務(wù)器需配置網(wǎng)關(guān)。
          • 雙向流量對 LVS 會產(chǎn)生較大的負載壓力。

          NAT 模式的使用場景:對 Windows 操作系統(tǒng)的用戶比較友好,使用 LVS ,必須選擇 NAT 模式。

          TUN 模式

          IP 隧道:IP Tunnel,簡稱:TUN 模式,采用開放式的網(wǎng)絡(luò)結(jié)構(gòu),負載調(diào)度器作為客戶機的訪問入口,各節(jié)點通過各自的 Internet 連接直接回應給客戶機,而不經(jīng)過負載調(diào)度器,服務(wù)器節(jié)點分散在互聯(lián)網(wǎng)中的不同位置,有獨立的公網(wǎng) IP 地址,通過專用 IP 隧道與負載調(diào)度器相互通信。

          TUN 實現(xiàn)原理過程如下:

          ①客戶端發(fā)送數(shù)據(jù)包經(jīng)過網(wǎng)絡(luò)后到 LVS 網(wǎng)卡,數(shù)據(jù)包源 IP 為 CIP,目的 IP 為 VIP。

          ②進入 PREROUTING 鏈后,會根據(jù)目的 IP 去查找路由,確定是否為本機 IP,數(shù)據(jù)包將轉(zhuǎn)發(fā)至 INPUT 鏈中,到 LVS,源 IP 和 目的 IP 不變。

          ③到 LVS 后,通過目的 IP 和目的 PORT 查找是否為 IPVS 服務(wù),如是 IPVS 服務(wù),將會選擇一個 RS 后端服務(wù)器, 源 IP 為 DIP,目標 IP 為 RIP,數(shù)據(jù)包將會轉(zhuǎn)發(fā)至 OUTPUT 鏈中。

          ④數(shù)據(jù)包根據(jù)路由信息到達 LVS 網(wǎng)卡,發(fā)送至路由器網(wǎng)關(guān),最終到達后端服務(wù)器。

          ⑤后端服務(wù)器收到數(shù)據(jù)包后,會拆掉最外層的 IP 地址后,會發(fā)現(xiàn)還有一層 IP 首部,源 IP 為 CIP,目的 IP 為 VIP,TUNL0 上配置 VIP,查找路由后判斷為本機 IP 地址,將會發(fā)給用戶空間層的應用程序響應后 VIP 為源 IP,CIP 為目的 IP 數(shù)據(jù)包發(fā)送至網(wǎng)卡,最終返回至客戶端用戶。

          TUN 模式的優(yōu)點:

          • 單臂模式,LVS 負載壓力小。
          • 數(shù)據(jù)包修改小,信息完整性高。
          • 可跨機房。

          TUN 模式的缺點:

          • 不支持端口映射。
          • 需在 RS 后端服務(wù)器安裝模塊及配置 VIP。
          • 隧道頭部 IP 地址固定,RS 后端服務(wù)器網(wǎng)卡可能會不均勻。
          • 隧道頭部的加入可能會導致分片,最終會影響服務(wù)器性能。

          TUN 模式的使用場景:如對轉(zhuǎn)發(fā)性要求較高且具有跨機房需求的,可選擇 TUN 模式。

          DR 模式

          直接路由:Direct Routing,簡稱 DR 模式,采用半開放式的網(wǎng)絡(luò)結(jié)構(gòu),與 TUN 模式的結(jié)構(gòu)類似,但各節(jié)點并不是分散在各個地方,而是與調(diào)度器位于同一個物理網(wǎng)絡(luò),負載調(diào)度器與各節(jié)點服務(wù)器通過本地網(wǎng)絡(luò)連接,不需要建立專用的 IP 隧道。它是最常用的工作模式,因為它的功能性強大。

          DR 實現(xiàn)原理過程如下:

          ①當客戶端用戶發(fā)送請求給 www.baidu.com 網(wǎng)站時,首先經(jīng)過 DNS 解析到 IP 后并向百度服務(wù)器發(fā)送請求,數(shù)據(jù)包經(jīng)過網(wǎng)絡(luò)到百度 LVS 負載均衡服務(wù)器。

          這時到達 LVS 網(wǎng)卡時的數(shù)據(jù)包包括:源 IP 地址(客戶端地址)、目的 IP 地址(百度對外服務(wù)器 IP 地址,也就是 VIP)、源 MAC 地址(CMAC / LVS 連接路由器的 MAC 地址)、目標 MAC 地址(VMAC / VIP 對應的 MAC 地址)。

          ②數(shù)據(jù)包到達網(wǎng)卡后,經(jīng)過鏈路層到達 PREROUTING 鏈,進行查找路由,發(fā)現(xiàn)目的 IP 是 LVS 的 VIP,這時就會發(fā)送至 INPUT 鏈中并且數(shù)據(jù)包的 IP 地址、MAC 地址、Port 都未經(jīng)過修改。

          ③數(shù)據(jù)包到達 INPUT 鏈中,LVS 會根據(jù)目的 IP 和 Port(端口)確認是否為 LVS 定義的服務(wù)。

          如是定義過的 VIP 服務(wù),會根據(jù)配置的服務(wù)信息,從 RealServer 中選擇一個后端服務(wù)器 RS1,然后 RS1 作為目標出方向的路由,確定下一跳信息及數(shù)據(jù)包通過具體的哪個網(wǎng)卡發(fā)出,最好將數(shù)據(jù)包通過 INET_HOOK 到 OUTPUT 鏈中。

          ④數(shù)據(jù)包通過 POSTROUTING 鏈后,目的 MAC 地址將會修改為 RealServer 服務(wù)器 MAC 地址(RMAC)源 MAC 地址修改為 LVS 與 RS 同網(wǎng)段的 IP 地址的 MAC 地址(DMAC)此時,數(shù)據(jù)包將會發(fā)至 RealServer 服務(wù)器。

          ⑤數(shù)據(jù)包到達 RealServer 服務(wù)器后,發(fā)現(xiàn)請求報文的 MAC 地址是自己的網(wǎng)卡 MAC 地址,將會接受此報文,待處理完成之后,將響應報文通過 lo 接口傳送給 eth0 網(wǎng)卡然后向外發(fā)出。

          此時的源 IP 地址為 VIP,目標 IP 為 CIP,源 MAC 地址為 RS1 的 RMAC,目的 MAC 地址為下一跳路由器的 MAC 地址(CMAC),最終數(shù)據(jù)包通過 RS 相連的路由器轉(zhuǎn)發(fā)給客戶端。

          DS 模式的優(yōu)點:

          • 響應數(shù)據(jù)不經(jīng)過 LVS,性能高。
          • 對數(shù)據(jù)包修改小,信息完整性好。

          DS 模式的缺點:

          • LVS 與 RS 必須在同一個物理網(wǎng)絡(luò)。
          • RS 上必須配置 lo 和其他內(nèi)核參數(shù)。
          • 不支持端口映射。

          DS 模式的使用場景:對性能要求高的,可首選 DR 模式,還可透傳客戶端源 IP 地址。

          NAT 模式:只需一個公網(wǎng) IP 地址,是最易用的一種負載均衡模式,安全性較好。

          TUN 模式 和 DR 模式:負載能力強大、適用范圍廣、節(jié)點安全性較差。

          LVS 的十種負載調(diào)度算法

          LVS 的十種負載調(diào)度算法如下:

          ①輪詢:Round Robin,將收到的訪問請求按順序輪流分配給群集中的各節(jié)點真實服務(wù)器中,不管服務(wù)器實際的連接數(shù)和系統(tǒng)負載。

          ②加權(quán)輪詢:Weighted Round Robin,根據(jù)真實服務(wù)器的處理能力輪流分配收到的訪問請求,調(diào)度器可自動查詢各節(jié)點的負載情況,并動態(tài)跳轉(zhuǎn)其權(quán)重,保證處理能力強的服務(wù)器承擔更多的訪問量。

          ③最少連接:Least Connections,根據(jù)真實服務(wù)器已建立的連接數(shù)進行分配,將收到的訪問請求優(yōu)先分配給連接數(shù)少的節(jié)點,如所有服務(wù)器節(jié)點性能都均衡,可采用這種方式更好的均衡負載。

          ④加權(quán)最少連接:Weighted Least Connections,服務(wù)器節(jié)點的性能差異較大的情況下,可以為真實服務(wù)器自動調(diào)整權(quán)重,權(quán)重較高的節(jié)點將承擔更大的活動連接負載。

          ⑤基于局部性的最少連接:LBLC,基于局部性的最少連接調(diào)度算法用于目標 IP 負載平衡,通常在高速緩存群集中使用。

          如服務(wù)器處于活動狀態(tài)且處于負載狀態(tài),此算法通常會將發(fā)往 IP 地址的數(shù)據(jù)包定向到其服務(wù)器;如果服務(wù)器超載(其活動連接數(shù)大于其權(quán)重),并且服務(wù)器處于半負載狀態(tài),則將加權(quán)最少連接服務(wù)器分配給該 IP 地址。

          ⑥復雜的基于局部性的最少連接:LBLCR,具有復雜調(diào)度算法的基于位置的最少連接也用于目標 IP 負載平衡,通常在高速緩存群集中使用。

          與 LBLC 調(diào)度有以下不同:負載平衡器維護從目標到可以為目標提供服務(wù)的一組服務(wù)器節(jié)點的映射。對目標的請求將分配給目標服務(wù)器集中的最少連接節(jié)點。

          如果服務(wù)器集中的所有節(jié)點都超載,則它將拾取群集中的最少連接節(jié)點,并將其添加到目標服務(wù)器群中;如果在指定時間內(nèi)未修改服務(wù)器集群,則從服務(wù)器集群中刪除負載最大的節(jié)點,以避免高度負載。

          ⑦目標地址散列調(diào)度算法:DH,該算法是根據(jù)目標 IP 地址通過散列函數(shù)將目標 IP 與服務(wù)器建立映射關(guān)系,出現(xiàn)服務(wù)器不可用或負載過高的情況下,發(fā)往該目標 IP 的請求會固定發(fā)給該服務(wù)器。

          ⑧源地址散列調(diào)度算法:SH,與目標地址散列調(diào)度算法類似,但它是根據(jù)源地址散列算法進行靜態(tài)分配固定的服務(wù)器資源。

          ⑨最短延遲調(diào)度:SED,最短的預期延遲調(diào)度算法將網(wǎng)絡(luò)連接分配給具有最短的預期延遲的服務(wù)器。

          如果將請求發(fā)送到第 i 個服務(wù)器,則預期的延遲時間為(Ci +1)/Ui,其中 Ci 是第 i 個服務(wù)器上的連接數(shù),而 Ui 是第 i 個服務(wù)器的固定服務(wù)速率(權(quán)重) 。

          ⑩永不排隊調(diào)度:NQ,從不隊列調(diào)度算法采用兩速模型。當有空閑服務(wù)器可用時,請求會發(fā)送到空閑服務(wù)器,而不是等待快速響應的服務(wù)器。

          如果沒有可用的空閑服務(wù)器,則請求將被發(fā)送到服務(wù)器,以使其預期延遲最小化(最短預期延遲調(diào)度算法)。

          LVS 涉及相關(guān)的術(shù)語及說明

          上述內(nèi)容中涉及到很多術(shù)語或縮寫,這里簡單解釋下具體的含義,便于理解:

          • DS:Director Server,前端負載均衡節(jié)點服務(wù)器。
          • RS:Real Server,后端真實服務(wù)器。
          • CIP:Client IP,客戶端 IP 地址。
          • VIP:Virtual IP,負載均衡對外提供訪問的 IP 地址,一般負載均衡 IP 都會通過 Virtual IP 實現(xiàn)高可用。
          • RIP:RealServer IP,負載均衡后端的真實服務(wù)器 IP 地址。
          • DIP:Director IP,負載均衡與后端服務(wù)器通信的 IP 地址。
          • CMAC:客戶端 MAC 地址,LVS 連接的路由器的 MAC 地址。
          • VMAC:負載均衡 LVS 的 VIP 對應的 MAC 地址。
          • DMAC:負載均衡 LVS 的 DIP 對應的 MAC 地址。
          • RMAC:后端真實服務(wù)器的 RIP 地址對應的 MAC 地址。

          總結(jié)

          回顧下,通過本文你可學習到什么是 LVS、為什么要用 LVS、LVS 的組成及工作原理等。

          參考文獻:

          • http://www.linuxvirtualserver.org/
          • http://www.linuxvirtualserver.org/how.html
          • http://www.linuxvirtualserver.org/Documents.html

          主站蜘蛛池模板: 亚洲欧洲一区二区| 亚洲国产欧美国产综合一区| 精品人妻码一区二区三区| 亚洲av无码一区二区三区不卡| 亚洲一区二区在线视频| 午夜在线视频一区二区三区 | 久久无码精品一区二区三区| 亚洲AV本道一区二区三区四区| 日本一区二区高清不卡| 精品一区二区三区免费毛片爱 | 免费一区二区三区四区五区| 日韩好片一区二区在线看| 亚洲福利视频一区二区| 美日韩一区二区三区| av无码免费一区二区三区| 午夜福利av无码一区二区 | 国产成人无码一区二区在线播放| 搜日本一区二区三区免费高清视频 | 日韩精品人妻一区二区三区四区 | 免费无码AV一区二区| 亚洲av无码片vr一区二区三区 | 国产精品视频一区麻豆| 无码少妇精品一区二区免费动态| 精品久久国产一区二区三区香蕉 | 亚洲日本久久一区二区va| 日本一区二区免费看| 久久久久人妻精品一区三寸蜜桃 | 日本一区二区视频| 一区高清大胆人体| 天堂国产一区二区三区| 亚欧色一区W666天堂| 无码AV天堂一区二区三区| 日韩精品一区二区三区大桥未久| 国产在线视频一区二区三区98| 亚洲毛片不卡av在线播放一区| 一区二区三区电影网| 亚洲AV永久无码精品一区二区国产 | 精品亚洲福利一区二区| 欧美日韩精品一区二区在线观看| 国产一区二区三区影院| 影音先锋中文无码一区|