主頁 > 軟體設計 > Web服務器群集——企業級調度器LVS(LVS-NAT;LVS-DR負載均衡群集部署)

Web服務器群集——企業級調度器LVS(LVS-NAT;LVS-DR負載均衡群集部署)

2021-04-04 13:54:24 軟體設計

企業級調度器LVS(LVS-NAT;LVS-DR負載均衡群集部署)

    • 企業級調度器LVS(Linux Virtual Server)
      • 集群和分布式
        • 1.1 集群 Cluster
        • 1.2 分布式系統
        • 1.3 集群和分布式
        • 1.4 集群設計原則
        • 1.5 集群設計實作
          • 1.5.1 基礎設施層面
          • 1.5.2 業務層面
        • 1.6 LB Cluster 負載均衡集群
          • 1.6.1 按實作方式劃分
          • 1.6.2 基于作業的協議層次劃分
          • 1.6.3 負載均衡的會話保持
        • 1.7 HA Cluster 高可用集群實作
        • 1.8 HPC Cluster 高性能運算群集
      • Linux Virtual Server簡介
        • 2.1 LVS介紹
        • 2.2 LVS作業原理
        • 2.3 LVS集群體系架構
        • 2.4 LVS功能及組織架構
          • 2.4.1 應用于高訪問量的業務
          • 2.4.2 擴展應用程式
          • 2.4.3 消除單點故障
          • 2.4.4 同城容災(多可用區容災)
          • 2.4.5 跨地域容災
        • 2.5 LVS集群型別中的術語
      • LVS 作業模式和相關命令
        • 3.1 LVS集群的作業模式
          • 3.1.1 LVS的NAT模式
          • 3.1.2 LVS的DR模式
          • 3.1.3 LVS的TUN模式
          • 3.1.4 LVS的FULLNAT模式
          • 3.1.5 LVS作業模式總結和比較
      • LVS 調度演算法
        • 4.1 靜態方法
        • 4.2 動態方法
        • 4.3 內核版本4.15版本后新增調度演算法:FO和OVF
      • LVS 相關軟體
        • 5.1 程式包:ipvsadm
        • 5.2 ipvsadm 命令
      • LVS實戰案例
        • 6.1 LVS-NAT模式案例
        • 6.2 LVS-DR模式案例
          • 準備作業
          • 配置網卡
          • 配置nfs服務
          • 配置lvs調度器
          • 配置節點服務器
        • 6.3 LVS-DR模式 使用腳本更簡單的實作方法
          • LVS配置
          • 節點配置

企業級調度器LVS(Linux Virtual Server)

  • 集群概念
  • LVS模型
  • LVS調度演算法
  • LVS實作

集群和分布式

系統性能擴展方式:

  • Scale UP:垂直擴展,向上擴展,增強,性能更強的計算機運行同樣的服務
  • Scale Out:水平擴展,向外擴展,增加設備,并行地運行多個服務調度分配問題,Cluster

隨著計算機性能的增長,其價格會成倍增長
單臺計算機的性能是有上限的,不可能無限制地垂直擴展
多核CPU意味著即使是單臺計算機也可以并行的,

1.1 集群 Cluster

Cluster:集群,為解決某個特定問題將多臺計算機組合起來形成的單個系統

Cluster分為三種型別:

  • LB: Load Balancing,負載均衡,多個主機組成,每個主機只承擔一部分訪問請求

  • HA:High Availiablity,高可用,避免SPOF (single Point Of failure)

    • MTBF:Mean Time Between Failure 平均無故障時間,正常時間
    • MTTR:Mean Time To Restoration ( repair)平均恢復前時間,故障時間
    • A=MTBF/ (MTBF+MTTR)(0,1): 99%,99.5%,99.9%,99.99%,99.999%
  • SLA:服務等級協議(簡稱: SLA,全稱: service level agreement),是在一定開銷下為保障服務的性能和可用性,服務提供商與用戶間定義的一種雙方認可的協定,通常這個開銷是驅動提供服務質量的主要因素,在常規的領域中,總是設定所謂的三個9,四個9來進行表示,當沒有達到這種水平的時候,就會有一些列的懲罰措施,而運維,最主要的目標就是達成這種服務水平,

  1年 = 365天 = 8760小時
  99.9 = 8760 * 0.1% = 8760 * 0.001 = 8.76小時
  99.99 = 876 * 0.0001 = 0.876小時 = 0.876 * 60 = 52.6分鐘
  99.999 = 8760 * 0.00001 = 0.0876小時 = 0.0876 * 60 = 5.26分鐘

停機時間又分為兩種,一種是計劃內停機時間,一種是計劃外停機時間,而運維則主要關注計劃外停機時間,

  • HPC:Hgih-performance computing,高性能 超級計算機

1.2 分布式系統

? 分布式存盤: Ceph,GlusterFS,FastDFS,MogileFs

? 分布式計算: hadoop,Spark

? 分布式常見應用

  • 分布式應用-服務按照功能拆分,使用微服務
  • 分布式靜態資源–靜態資源放在不同的存盤集群上
  • 分布式資料和存盤–使用key-value快取系統
  • 分布式計算–對特殊業務使用分布式計算,比如Hadoop集群

1.3 集群和分布式

集群:同一個業務系統,部署在多臺服務器上,集群中,每一臺服務器實作的功能沒有差別,資料和代碼都是一樣的

分布式:一個業務被拆成多個子業務,或者本身就是不同的業務,部署在多臺服務器上,分布式中,每一臺服務器實作的功能是有差別的,資料和代碼也是不一樣的,分布式每臺服務器功能加起來,才是完整的業務

分布式是以縮短單個任務的執行時間來提升效率的,而集群則是通過提高單位時間內執行的任務數來提升效率,

對于大型網站,訪問用戶很多,實作一個群集,在前面部署一個負載均衡服務器,后面幾臺服務器完成同一業務,如果有用戶進行相應業務訪問時,負載均衡器根據后端哪臺服務器的負載情況,決定由給哪一臺去完成回應,并且一臺服務器垮了,其它的服務器可以頂上來,分布式的每一個節點,都完成不同的業務,如果一個節點垮了,那這個業務可能就會失敗

1.4 集群設計原則

可擴展性 集群的橫向擴展能力

可用性 無故障時間

性能 訪問回應時間

容量 單位時間內的最大并發吞吐量(C10K 并發問題)

1.5 集群設計實作

1.5.1 基礎設施層面

提升硬體資源性能 從入口防火墻到后端web server均使用更高性能的硬體資源

多域名—DNS輪詢A記錄決議

多入口一將A記錄決議到多個公網IP入口

多機房―同城+異地容災

CDN(Content Delivery Network)—基于GSLB(Global Server Load Balance)實作全域負載均衡,如:DNS

1.5.2 業務層面

分層:安全層、負載層、靜態層、動態層、(快取層、存盤層)持久化與非持久化

分割:基于功能分割大業務為小服務

分布式:對于特殊場景的業務,使用分布式計算

1.6 LB Cluster 負載均衡集群

  • 以提高應用系統的回應能力、盡可能處理更多的訪問請求、減少延遲為目標,獲得高并發、高負載(LB)的整體性能
  • LB的負載分配依賴于主節點的分流演算法
1.6.1 按實作方式劃分
  • 硬體

    F5 Big-IP

    Citrix Netscaler

    A10 A10

  • 軟體

    lvs:linux virtual server,阿里四層SLB(Server Load Balance)使用

    nginx:支持七層調度,阿里七層SLB使用Tengine

    haproxy:支持七層調度

1.6.2 基于作業的協議層次劃分
  • 傳輸層(通用): DNAT和DPORT
    LVS:

    nginx: stream

    haproxy: mode tcp

  • 應用層(專用):針對特定協議,常稱為proxy server
    http: nginx, httpd, haproxy(mode http), …

    fastcgi: nginx,httpd, …

    mysql: mysql-proxy,…

1.6.3 負載均衡的會話保持
  1. session sticky:同一用戶調度固定服務器

Source lP: LVS sh演算法(對某一特定服務而言)

Cookie

  1. session replication:每臺服務器擁有全部session

session multicast cluster

  1. session server:專門的session服務器

Memcached,Redis

1.7 HA Cluster 高可用集群實作

  • 以提高應用系統的可靠性、盡可能地減少中斷時間為目標,確保服務的連續性,達到高可用(HA)的容錯效果
  • HA的作業方式包括雙工和主從兩種模式

keepalived: vrrp協議

Ais :應用介面規范
heartbeat

? cman+rgmanager(RHCS)

? coresync_pacemaker

1.8 HPC Cluster 高性能運算群集

  • 以提高應用系統的CPU運算速度、擴展硬體資源和分析能力為目標,獲得相當于大型、超級計算機的高性能運算(HPC)能力
  • 高性能運算群集的高性能依賴于“分布式運算”、“并行計算”,通過專用硬體和軟體將多個服務器的CPU、記憶體等資源整合在一起,實作只有大型、超級計算機才具備的計算能力

Linux Virtual Server簡介

2.1 LVS介紹

LVS: Linux Virtual Server,負載調度器,內核集成,章文嵩,阿里的四層SLB(Server LoadBalance)是基于LVS+keepalived實作

LVS官網: http://www.linuxvirtualserver.org/

LVS相關術語
VS: Virtual Server,負責調度
RS: Real Server,負責真正提供服務

2.2 LVS作業原理

VS根據請求報文的目標IP和目標協議及埠將其調度轉發至某RS,根據調度演算法來挑選RS,LVS是內核級功能, 作業在INPUT鏈的位置,將發往INPUT的流量進行“處理”

范例:查看內核支持LVS

[root@lnmp ~]# grep -i -C 10 ipvs /boot/config-3.10.0-862.el7.x86_64
...
# 顯示LVS支持哪些協議
# IPVS transport protocol load balancing support
#
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y

# LVS的調度演算法
# IPVS scheduler
#
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m

2.3 LVS集群體系架構

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-x1VH9ahN-1617386259156)(C:\Users\StanZ\AppData\Roaming\Typora\typora-user-images\image-20210331202209337.png)]

從互聯網上發請求過來 到達防火墻經過路由器 路由器

2.4 LVS功能及組織架構

負載均衡的應用場景為高訪問量的業務,提高應用程式的可用性和可靠性,

2.4.1 應用于高訪問量的業務

如果您的應用訪問量很高,可以通過配置監聽規則將流量分發到不同的云服務器ECS (Elastic Compute Service彈性計算服務)實體上,此外,可以使用會話保持功能將同一客戶端的請求轉發到同一臺后端ECS

2.4.2 擴展應用程式

可以根據業務發展的需要,隨時添加和移除ECS實體來擴展應用系統的服務能力,適用于各種Web服務器和App服務器,

2.4.3 消除單點故障

可以在負載均衡實體下添加多臺ECS實體,當其中一部分ECS實體發生故障后,負載均衡會自動屏蔽故障的ECS實體,將請求分發給正常運行的ECS實體,保證應用系統仍能正常作業

2.4.4 同城容災(多可用區容災)

為了提供更加穩定可靠的負載均衡服務,阿里云負載均衡已在各地域部署了多可用區以實作同地域容災,當主可用區出現機房故障或不可用時,負載均衡仍然有能力在非常短的時間內(如:大約30s中斷)切換到另外一個備可用區恢復服務能力;當主可用區恢復時,負載均衡同樣會自動切換到主可用區提供服務,

使用負載均衡時,您可以將負載均衡實體部署在支持多可用區的地域以實作同城容災,此外,建議您結合自身的應用需要,綜合考慮后端服務器的部署,如果您的每個可用區均至少添加了一臺ECS實體,那么此種部署模式下的負載均衡服務的效率是最高的,

如下圖所示,在負載均衡實體下系結不同可用區的ECS實體,正常情況下,用戶訪問流量將同時轉至發主、備可用區內的ECS實體;當可用區A發生故障時,用戶訪問流量將只轉發至備可用區內的ECS實體,此種部署既可以避免因為單個可用區的故障而導致對外服務的不可用,也可以通過不同產品間可用區的選擇來降低延遲,

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FiBQAvMl-1617386259165)(C:\Users\StanZ\AppData\Roaming\Typora\typora-user-images\image-20210331202941096.png)]

如果采取如下圖所示的部署方案,即在負載均衡實體的主可用區下系結多臺ECS實體,而在備可用區沒有任何ECS實體,當主可用區發生故障時會造成業務中斷,因為備可用區沒有ECS實體來接收請求,這樣的部署方式很明顯是以犧牲高可用性為代價來獲取低延時,

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ZWIr3Tke-1617386259166)(C:\Users\StanZ\AppData\Roaming\Typora\typora-user-images\image-20210331203014447.png)]

2.4.5 跨地域容災

您可以在不同地域下部署負載均衡實體,并分別掛載相應地域內不同可用區的ECS,上層利用云決議做智能DNS,將域名決議到不同地域的負載均衡實體服務地址下,可實作全域負載均衡,當某個地域出現不可用時,暫停對應決議即可實作所有用戶訪問不受影響,

在這里插入圖片描述

2.5 LVS集群型別中的術語

VS: Virtual Server,Director Server(DS), Dispatcher(調度器),Load Balancer

RS: 后端服務器 Real Server(lvs), upstream server(nginx), backend server(haproxy)

CIP:客戶端IP (Client lP) 用戶記錄發送給集群的源IP地址

VIP:: 虛擬IP (Virtual serve lP VS外網的IP) 用于Director對外提供服務的IP地址

DIP:Director lP VS內網的IP Director用于連接內外網路的IP地址,即負載均衡器上的IP地址

RIP: 真實IP (Real server IP) 集群中真實服務器的物理 IP 地址

LIP:LVS內部IP(Local IP Address) LVS集群的內部通信IP

訪問流程:CIP<–>VIP == DIP<–>RIP

LVS 作業模式和相關命令

3.1 LVS集群的作業模式

lvs-nat:修改請求報文的目標IP,多目標IP的DNAT

lvs-dr:操縱封裝新的MAC地址

lvs-tun:在原請求IP報文之外新加一個IP首部

lvs-fullnat:修改請求報文的源和目標IP

3.1.1 LVS的NAT模式

地址轉換(Network Address Translation)

  • 簡稱NAT模式,類似于防火墻的私有網路結構,負載調度器作為所有服務器節點的網關,即作為客戶機的訪問入口,也是各節點回應客戶機的訪問出口
  • 服務器節點使用私有IP地址,與負載調度器位于同一個物理網路,安全性要優于其他兩種方式
  1. RIP和DIP應在同一個IP網路,且應使用私網地址;RS的網關要指向DIP
  2. 請求報文和回應報文都必須經由Director轉發,Director易于成為系統瓶頸
  3. 支持埠映射,可修改請求報文的目標PORT
  4. VS必須是Linux系統,RS可以是任意OS系統

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-wI0cJovU-1617386259169)(C:\Users\StanZ\AppData\Roaming\Typora\typora-user-images\image-20210331204832996.png)]

3.1.2 LVS的DR模式

直接路由(Direct Routing)

  • 簡稱DR模式,采用半開放式的網路結構,與TUN模式的結構類似,但各節點并不是分散在各地,而是與調度器位于同一個物理網路
  • 負載調度器與各節點服務器通過本地網路連接,不需要建立專用的IP隧道

LVS-DR: Direct Routing,直接路由,LVS默認模式,應用最廣泛,通過為請求報文重新封裝一個MAC首部進行轉發,源MAC是DIP所在的介面的MAC,目標MAC是某挑選出的RS的RIP所在介面的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-6Ic7RZEN-1617386259170)(C:\Users\StanZ\AppData\Roaming\Typora\typora-user-images\image-20210331212354353.png)]

DR模式的特點:

  1. Director和各RS都配置有VIP

  2. 確保前端路由器將目標IP為VIP的請求報文發往Director

    在前端網關做靜態系結VIP和Director的MAC地址

    在RS上使用 arptables工具

    arptables -A IN -d $VIP -j DROP
    arptables -A OUT -s $VIP -j mangle --mgngle-ip-s $RIP
    

    在RS上修改內核引數以限制arp通告及應答級別

    cat /proc/sys/net/ipv4/conf/all/arp_announce 
    
    cat /proc/sys/net/ipv4/conf/all/arp_announce 
    
    1. RS的RIP可以使用私網地址,也可以是公網地址;RIP與DIP在同—IP網路;RIP的網關不能指向DiIP,以確保回應報文不會經由Director
    2. RS和Director要在同一個物理網路
    3. 請求報文要經由Director,但回應報文不經由Director,而由RS直接發往Client
    4. 不支持埠映射(埠不能修改)
    5. 無需開啟 ip_forward
    6. RS可使用大多數OS系統
3.1.3 LVS的TUN模式

IP隧道(IP Tunnel)

  • 簡稱TUN模式,采用開放式的網路結構,負載調度器僅作為客戶機的訪問入口,各節點通過各自的Internet連接直接回應客戶機,而不再經過負載調度器
  • 服務器節點分散在互聯網中的不同位置,具有獨立的公網IP地址,通過專用IP隧道與負載調度器相互通信

在這里插入圖片描述

轉發方式:不修改請求報文的IP首部(源IP為CIP,目標IP為VIP),而在原報文之外再封裝一個Ip首部(源IP是DIP,目標IP是RIP),將報文發往挑選出的目標RS;RS直接回應給客戶端(源IP是VIP,目標IP是CIP)

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FJbnHFl5-1617386259172)(C:\Users\StanZ\AppData\Roaming\Typora\typora-user-images\image-20210401084505911.png)]

TUN模式特點:

  1. RIP和DIP可以不處于同一物理網路中,RS的網關一般不能指向DIP,且kIP可以和公網通信,也就是說集群節點可以跨互聯網實作,DIP, VIP,RIP可以是公網地址

  2. RealServer的tun介面上需要配置VIP地址,以便接收director轉發過來的資料包,以及作為回應的報文源IP

  3. Director轉發給RealServer時需要借助隧道,隧道外層的IP頭部的源IP是DIP,目標IP是RIP,而RealServer回應給客戶端的IP頭部是根據隧道內層的IP頭分析得到的,源IP是VIP,目標IP是CIP

  4. 請求報文要經由Director,但回應不經由Director,回應由RealServer自己完成

  5. 不支持埠映射

  6. RS的OS須支持隧道功能

應用場景:

一般來說,TUN模式常會用來負載調度快取服務器組,這些快取服務器一般放置在不同的網路環境,可以就近折返給客戶端,在請求物件不在Cache服務器本地命中的情況下,Cache服務器要向源服務器發送請求,將結果取回,最后將結果回傳給用戶,

LAN環境一般多采用DR模式,WAN環境雖然可以用TUN模式,但是一般在WAN環境下,請求轉發更多的被 haproxy/nginx/DNS 等實作,因此,TUN模式實際應用的很少,跨機房的應用一般專線光纖連接或DNS調度

3.1.4 LVS的FULLNAT模式

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xmkQHckA-1617386259172)(C:\Users\StanZ\AppData\Roaming\Typora\typora-user-images\image-20210401153955294.png)]

通過同時修改請求報文的源IP地址和目標P地址進行轉發

CIP --> DIP

VIP -->RIP

fullnat模式特點:

  1. VIP是公網地址,RIP和DIP是私網地址,且通常不在同一IP網路;因此,RIP的網關一般不會指向DIP
  2. RS收到的請求報文源地址是DIP,因此,只需回應給DIP;但Director還要將其發往Client
  3. 請求和回應報文都經由Director
  4. 相對NAT模式,可以更好的實作LVS-RealServer間跨VLAN通訊
  5. 支持埠映射

注意:此型別kernel默認不支持

3.1.5 LVS作業模式總結和比較
NATTUNDR
Real ServeranyTunnelingNon-arp device
Real server networkprivate(私網)LAN/WAN(跨公網)LAN(局域網)
Real server numberlow (10-20)High (100)High (100)
Real server gatewayload balancerown routerown router
優點埠轉換WAN (跨廣域網)性能最好
缺點性能瓶頸啟用隧道(性能受影響)不支持跨網段

lvs-nat與lvs-fullnat:

  • 請求和回應報文都經由Director
  • lvs-nat: RIP的網關要指向DIP
  • lvs-fullnat: RIP和DIP未必在同一IP網路,但要能通信

lvs-dr與lvs-tun:

  • 請求報文要經由Director,但回應報文由RS直接發往Client
  • lvs-dr:通過封裝新的MAC首部實作,通過MAC網路轉發
  • lvs-tun:通過在原IP報文外封裝新IP頭實作轉發,支持遠距離通信

LVS 調度演算法

ipvs scheduler:根據其調度時是否考慮各RS當前的負載狀態

分為兩種:靜態方法和動態方法

4.1 靜態方法

僅根據演算法本身進行調度

  1. RR: roundrobin,輪詢,較常用

    • 將收到的訪問請求按照順序輪流分配給群集中的各節點(真實服務器),均等地對待每一臺服務器,而不管服務器實際的連接數和系統負載
  2. WRR: Weighted RR,加權輪詢,較常用

    • 根據真實服務器的處理能力輪流分配收到的訪問請求,調度器可以自動查詢各節點的負載情況,并動態調整其權重
    • 保證處理能力強的服務器承擔更多的訪問流量
  3. SH:Source Hashing(源地址哈希),實作session sticky,源IP地址hash;將來自于同一個IP地址的請求始終發往第一次挑中的RS,從而實作會話系結

  4. DH:Destination Hashing(目標地址哈希),第一次輪詢調度至RS,后續將發往同一個目標地址的請求始終轉發至第一次挑中的RS,典型使用場景是正向代理快取場景中的負載均衡,如: Web快取

4.2 動態方法

主要根據每RS當前的負載狀態及調度演算法進行調度Overhead=value 較小的RS將被調度

  1. LC: least connections(最少連接)適用于長連接應用

    • 根據真實服務器已建立的連接數進行分配,將收到的訪問請求優先分配給連接數最少的節點
    overhead=activeconns*256+inactiveconns	活動的連接數*256+非活動連接數
    
  2. WLC: Weighted LC(加權最少連接),默認調度方法,較常用

    • 在服務器節點的性能差異較大的情況下,可以為真實服務器自動調整權重
    • 權重較高的節點將承擔更大比例的活動連接負載
    overhead=(activeconns*256+inactiveconns)/weight*
    
  3. SED: Shortest Expection Delay,初始連接高權重優先,只檢查活動連接,而不考慮非活動連接

    overhead=(activeconns+1)*256/weight
    
  4. NQ: Never Queue,第一輪均勻分配,后續SED

  5. LBLC: Locality-Based LC,動態的DH演算法,使用場景:根據負載狀態實作正向代理,實作Web Cache等

  6. LBLCR: LBLC with Replication,帶復制功能的LBLC,解決LBLC負載不均衡問題,從負載重的復制到負載輕的RS,實作Web Cache等

4.3 內核版本4.15版本后新增調度演算法:FO和OVF

FO (Weighted Fail Over)調度演算法,在此FO演算法中,遍歷虛擬服務所關聯的真實服務器鏈表,找到還未過載(未設定IP_VS_DEST_F_OVERLOAD標志)的且權重最高的真實服務器,進行調度

OVF (Overflow-connection)調度演算法,基于真實服務器的活動連接數量和權重值實作,將新連接調度到權重值最高的真實服務器,直到其活動連接數量超過權重值,之后調度到下一個權重值最高的真實服務器,在此OVF演算法中,遍歷虛擬服務相關聯的真實服務器鏈表,找到權重值最高的可用真實服務器,一個可用的真實服務器需要同時滿足以下條件:

  • 未過載(未設定IP_VS_DEST_F_OVERLOAD標志)
  • 真實服務器當前的活動連接數量小于其權重值
  • 其權重值不為零

LVS 相關軟體

5.1 程式包:ipvsadm

Unit File: ipvsadm.service

主程式:/usr/sbin/ipvsadm
規則保存工具:/usr/sbin/ipvsadm-save

規則多載工具:/usr/sbin/ipvsadm-restore

組態檔:/etc/sysconfig/ipvsadm-config

ipvs調度規則檔案: /etc/sysconfig/ipvsadm

5.2 ipvsadm 命令

ipvsadm 核心功能:

  • 集群服務管理:增 刪 改
  • 集群服務的RS管理:增 刪 改
  • 查看

ipvsadm 工具用法:

# 管理集群服務
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-bsched-f1ags]

-A	增加一臺新的虛擬服務器
-E	編輯內核虛擬服務器表中的一條虛擬服務器記錄
-t 	說明虛擬服務器提供的是tcp 的服務
-u	說明虛擬服務器提供的是udp 的服務
-f	使用防火墻標記表示虛擬服務
-s	調度演算法

ipvsadm -D -t|u|f service-addr ess #洗掉

-D	洗掉內核虛擬服務器表中的一條虛擬服務器記錄,并洗掉所有與該虛擬服務器相關聯的真實服務器

ipvsadm -C	#清空
ipvsadm -R 	#多載,相當于ipvsadm-restore
ipvsadm -s [-n]	#保存,相當于ipvsadm-save

# 管理集群中的RS
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

-a	在一個虛擬服務器中增加一臺新的真實服務器
-e	編輯一條虛擬服務器記錄中的某條真實服務器記錄

ipvsadm -d -t|u|f service-address -r server-address

-d	洗掉一條虛擬服務器記錄中的某條真實服務器記錄

ipvsadm -L|l [options]
ipvsadm -z [-t|u|f service-address]

洗掉:

ipvsadm -D -t|u|f service-address

管理集群上的RS:增 刪 改

增,改:

ipvsadm -ale -t|u|f service-address -r server-address [-g|i|m][-w weight]

刪:

ipvsadm -d -t|u|f service-address -r server-address
server -address:
	rip[ :port]如省略port,不作埠映射
選項:
1vs型別:
	-g: gateway ,dr型別,默認
	-i: ipip,tun型別
	-m: masquerade,nat型別
-w weight:權重
ipvsadm -a -t 10.0.0.8:80 -r 192.168.188.188:8080 -m -w 3 

清空定義的所有內容:

ipvsadm -C

清空計數器:

ipvsadm -Z [-t|u|f service-address]

查看:

ipvsadm -L|l [options]
-L -l	列出虛擬服務器表
一般ipvsadm -ln
--numeric, -n: 以數字形式輸出地址和埠號
--exact: 擴展資訊,精確值
--connection,-c: 當前IPVS連接輸出
--stats: 統計資訊
--rate : 輸出速率資訊

LVS實戰案例

6.1 LVS-NAT模式案例

在這里插入圖片描述

我們使用四臺本地虛擬機做lvs-nat集群

主機公網ip/私網ip私網網關功能
lvs調度器192.168.188.100 / 192.168.79.100不需要負載均衡/路由轉發
nfs192.168.79.10192.168.79.100nfs共享存盤
httpd192.168.79.20192.168.79.100web服務器
httpd192.168.79.21192.168.79.100web服務器

每臺服務器關閉防火墻和selinux安全中心

systemctl stop firewalld
systemctl disable firewalld

setenforce 0
sed -ri '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
getenforce

搭建nfs服務

添加一個新的磁盤

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-rYy3zcWJ-1617386259174)(C:\Users\StanZ\AppData\Roaming\Typora\typora-user-images\image-20210401231411591.png)]

在nfs服務器上創建新的磁盤磁區
fdisd -l	# 查看新加入的磁盤
fdisk /dev/sdb	# 磁區

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10485759     5241856   83  Linux

創建檔案系統(格式化)
mkfs.xfs /dev/sdb1

創建nfs掛載目錄
mkdir /mynfs

掛載
vim /etc/fstab 

最后一行添加
/dev/sdb1       /mynfs                          xfs     defaults        0 0

加載掛載資訊
mount -a

查看
df -hT
/dev/sdb1               xfs       5.0G   33M  5.0G   1% /mynfs

安裝nfs所需軟體
yum install -y nsf-utils rpcbind

配置nfs共享目錄
vim /etc/exports
# 添加
/mynfs  192.168.79.0/24(rw,sync,no_root_squash)

開啟服務
systemctl start nfs
systemctl start rpcbind

驗證
[root@nfs ~]# showmount -e
Export list for nfs:
/mynfs 192.168.79.0/24

[root@nfs ~]# exportfs -v
/mynfs        	192.168.79.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)

搭建httpd

測驗

在這里插入圖片描述

然后配置網卡資訊 lvs上增加一塊新的網卡 其余服務器的網卡都改成僅主機模式的私網地址

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ivpXjLuS-1617386259175)(C:\Users\StanZ\AppData\Roaming\Typora\typora-user-images\image-20210401234641484.png)]

ip addr
查看發現多了一張ens37

查看網卡UUID
[root@lvs ~]# nmcli con show
NAME                UUID                                  TYPE      DEVICE 
Wired connection 1  640144f5-6ba4-3936-81e8-245ddfff309d  ethernet  ens37  
ens33               0630fb8a-d714-40a6-92c2-3d4cb3d51901  ethernet  ens33

配置ens37網卡
[root@lvs network-scripts]# cp ifcfg-ens33 ifcfg-ens37
[root@lvs network-scripts]# vim ifcfg-ens37

修改NAME和DEVICE為ens37	
同時修改UUID為nmcli con show查看的ens37 UUID
更改 IPADDR=192.168.79.100
只需要一個NETMASK=255.255.255.0
GATEWAY和DNS1刪掉

接著配置nfs和web服務器網卡ens33
IPADDR=192.168.79.
GATEWAY和DNS1都是192.168.79.100

ip addr檢查inet
如果調度器ens37沒有ip 
則
systemctl stop NetworkManager
systemctl start NetworkManager

在這里插入圖片描述

ping 192.168.79.100
測驗能不能ping通網關

如果不能ping通說明網卡設定錯誤
web服務器上配置nfs
yum install -y rpcbind nfs-utils

systemctl enable rpcbind
systemctl start rpcbind

[root@localhost ~]# showmount -e 192.168.79.10
Export list for 192.168.79.10:
/mynfs 192.168.79.0/24

永久掛載
vim /etc/fstab
192.168.79.10:/mynfs    /var/www/html                   nfs     defaults,_netdev        0 0

打開網頁測驗

在這里插入圖片描述

搭建lvs-nat負載均衡集群

加載ip_vs模塊
modprobe ip_vs

查看ip_vs版本資訊
cat /proc/net/ip_vs

安裝ipvsadm工具
yum -y install ipvsadm

查看版本
ipvsadm -v   

配置負載調度器
vi /etc/sysctl.conf 
net.ipv4.ip_forward = 1    //開啟路由轉發規則

重新載入sysctl變數
sysctl -p

配置負載分配策略

清除原有策略
ipvsadm -C

添加虛擬服務器,VIP為192.168.188.100:80,負載調度演算法為rr(輪詢)
ipvsadm -A -t 192.168.188.100:80 -s rr

添加真實服務器
[root@lvs network-scripts]# ipvsadm -a -t  192.168.188.100:80 -r  192.168.79.20:80 -m -w 1
[root@lvs network-scripts]# ipvsadm -a -t  192.168.188.100:80 -r  192.168.79.21:80 -m -w 1
[root@lvs network-scripts]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.188.100:80 rr
  -> 192.168.79.20:80             Masq    1      0          0         
  -> 192.168.79.21:80             Masq    1      0          0   

  

在這里插入圖片描述

重繪網頁之后

ipvsadm -ln來查看群集節點狀態
在這里插入圖片描述

我們在測驗一遍 將/mynfs里面的網頁更改

清除瀏覽器快取之后再次重繪

在這里插入圖片描述

6.2 LVS-DR模式案例

DR模型中各主機上均需要配置VIP,解決地址沖突的方式有三種:

  1. 在前端網關做靜態系結
  2. 在各RS使用arptables
  3. 在各RS修改內核引數,來限制arp回應和通告的級別

限制回應級別: arp_ignore

  • 0: 默認值,表示可使用本地任意介面上配置的任意地址進行回應
  • 1: 僅在請求的目標IP配置在本地主機的接收到請求報文的口上時,才給予回應

限制通告級別: arp_announce

  • 0: 默認值,把本機所有介面的所有資訊向每個介面的網路進行通告
  • 1: 盡量避免將介面資訊向非直接連接網路進行通告
  • 2: 必須避免將介面資訊向非本網路進行通告

配置要點

  1. Director服務器采用雙IP橋接網路,一個是VIP,一個DIP
  2. Web服務器采用和DIP相同的網段和Director連接
  3. 每個Web服務器配置VIP
  4. 每個web服務器可以出外網

拓撲圖

我們使用五臺本地虛擬機做lvs-dr集群

準備作業
在lvs服務器上面安裝所需軟體
yum install -y ipvsadm

在web服務器上面安裝所需軟體
yum install -y httpd
yum install -y rpcbind nfs-utils

在nfs服務器上面安裝所需軟體
yum install -y rpcbind nfs-utils
配置網卡

lvs服務器需要兩張網卡 一張網卡配置為NAT模式 一張網卡配置為僅主機模式

web服務器需要兩張網卡 一張網卡配置為NAT模式 一張網卡配置為僅主機模式

nfs服務器需要一張網卡 配置為僅主機模式

在這里插入圖片描述

進入各個服務器配置網卡為實驗ip(如上面圖中所示)

在配置ens37網卡的時候需要注意 要將uuid改了
查看網卡UUID
[root@lvs ~]# nmcli con show
NAME   UUID                                  TYPE      DEVICE 
ens33  0630fb8a-d714-40a6-92c2-3d4cb3d51901  ethernet  ens33  
ens37  640144f5-6ba4-3936-81e8-245ddfff309d  ethernet  ens37

然后
cp ifcfg-ens33 ifcfg-ens37

修改 
NAME=ens37
UUID=640144f5-6ba4-3936-81e8-245ddfff309d
DEVICE=ens37
IPADDR=192.168.79.10
NETMASK=255.255.255.0

修改完之后重啟網路
systemctl restart network

查看ip是否正確

如果ens37私網地址消失
執行這條命令 重啟網路管理
systemctl restart NetworkManager

一定要ip addr查看ip是否配置正確

配置nfs服務
詳細步驟在上面NAt的案例里面
我這里就寫一些重要的點
vim /etc/exports
/mynfs  192.168.79.0/24(rw,sync,no_root_squash)

[root@nfs ~]# showmount -e
Export list for nfs:
/mynfs 192.168.79.0/24

然后再web服務器上面
開啟rpc
systemctl start rpcbind

[root@localhost ~]# showmount -e 192.168.79.200
Export list for 192.168.79.200:
/mynfs 192.168.79.0/24

vim /etc/fstab
192.168.79.200:/mynfs    /var/www/html                   nfs     defaults,_netdev        0 0

添加完畢之后加載掛載
mount -a

df -hT 來查看掛載是否成功
[root@localhost ~]# df -hT
Filesystem              Type      Size  Used Avail Use% Mounted on
/dev/mapper/centos-root xfs        17G  1.8G   16G  11% /
devtmpfs                devtmpfs  980M     0  980M   0% /dev
tmpfs                   tmpfs     992M     0  992M   0% /dev/shm
tmpfs                   tmpfs     992M  9.5M  982M   1% /run
tmpfs                   tmpfs     992M     0  992M   0% /sys/fs/cgroup
/dev/sda1               xfs      1014M  130M  885M  13% /boot
tmpfs                   tmpfs     199M     0  199M   0% /run/user/0
192.168.79.200:/mynfs   nfs4      5.0G   44M  5.0G   1% /var/www/html

然后我們去nfs服務器的/mynf目錄下添加網頁
通過瀏覽器測驗

配置lvs調度器
  1. 在lvs服務器的ens33:0網卡上面配置VIP地址(虛擬地址)
[root@lvs ~]# cd /etc/sysconfig/network-scripts/
[root@lvs network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33:0
[root@lvs network-scripts]# vim ifcfg-ens33:0

需要修改的就是NAME	DEVICE	IPADDR(寫虛擬地址)	NETMASK
NAME=ens33:0
UUID=0630fb8a-d714-40a6-92c2-3d4cb3d51901
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.188.188
NETMASK=255.255.255.0

打開網卡
ifup ens33:0

在這里插入圖片描述

  1. 加載模塊和修改引數
加載ip_vs模塊
modprobe ip_vs

查看lvs模塊的版本
cat /proc/net/ip_vs   

LVS服務器關閉路由轉發,關閉重定向
[root@lvs network-scripts]# vim /etc/sysctl.conf 
# net.ipv4.ip_forward = 1	注釋路由轉發

# DR模式,LVS負載調度器和各節點需要共用VIP地址,應該關閉Linux內核的重定向引數回應(不關閉重定向,調度器將把請求轉發到網關)
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

重新載入sysctl變數
[root@lvs network-scripts]# sysctl -p
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
  1. 配置負載分配策略
首先清除原有策略
[root@lvs network-scripts]# ipvsadm -C
[root@lvs network-scripts]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
  
添加虛擬服務器 VIP為192.168.188.188:80,負載調度演算法為rr(輪詢)
[root@lvs ~]# ipvsadm -A -t 192.168.188.188:80 -s rr
-A 添加虛擬服務器記錄 -t 設定VIP地址,-s 調度演算法 rr輪詢

添加真實服務器 作業模式為DR
[root@lvs ~]# ipvsadm -a -t 192.168.188.188:80 -r 192.168.188.100:80 -g -w 1
-a 添加真實服務器記錄 -t 設定vip地址 -r 設定真實ip地址 -g選擇DR群集模式 -w權重

[root@lvs ~]# ipvsadm -a -t 192.168.188.188:80 -r 192.168.188.101:80 -g -w 1

保存負載分配策略
[root@lvs ~]# ipvsadm-save > /etc/sysconfig/ipvsadm

開啟ivpsadm
systemctl enable ipvsadm
systemctl start ipvsadm
配置節點服務器
  1. 在節點服務器的lo:0網卡上面配置VIP地址(虛擬地址)
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]# vim ifcfg-lo:0

需要修改的是DEVICE	IPADDR寫VIP	BROADCAST也可以寫VIP	NETMASK全寫255
DEVICE=lo:0
IPADDR=192.168.188.188
NETMASK=255.255.255.255
BROADCAST=192.168.188.188
ONBOOT=yes
NAME=loopback


打開網卡
ifup lo:0

在這里插入圖片描述

  1. 配置路由和調整抑制ARP回應引數
先查看一下路由
[root@localhost network-scripts]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.188.2   0.0.0.0         UG    100    0        0 ens33
192.168.79.0    0.0.0.0         255.255.255.0   U     101    0        0 ens37
192.168.188.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33

添加一條路由設定將發送192.168.188.188的請求轉給環回虛介面
[root@localhost network-scripts]# route add -host 192.168.188.188 dev lo:0

[root@localhost network-scripts]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.188.2   0.0.0.0         UG    100    0        0 ens33
192.168.79.0    0.0.0.0         255.255.255.0   U     101    0        0 ens37
192.168.188.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.188.188 0.0.0.0         255.255.255.255 UH    0      0        0 lo

節點服務器配置抑制ARP回應
[root@localhost network-scripts]# vim /etc/sysctl.conf
# 添加
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

重新載入sysctl變數
[root@localhost network-scripts]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

重啟各項服務
systemctl restart network
ifup lo:0

驗證:
在這里插入圖片描述

查看ipvsadm活躍連接數

6.3 LVS-DR模式 使用腳本更簡單的實作方法

架構圖還是這樣

在這里插入圖片描述

LVS配置

兩臺LVS服務器都開啟路由轉發,關閉重定向

[root@lvs ~]# vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0


多載配置,使之生效
[root@lvs ~]# sysctl -p	
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

配置lvs的網卡資訊

[root@lvs ~]# cd /etc/sysconfig/network-scripts/
[root@lvs network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33:0
[root@lvs network-scripts]# vim ifcfg-ens33:0

需要修改的就是NAME	DEVICE	IPADDR(寫虛擬地址)	NETMASK
NAME=ens33:0
UUID=0630fb8a-d714-40a6-92c2-3d4cb3d51901
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.188.188
NETMASK=255.255.255.0

兩臺LVS服務器都創建腳本

[root@lvs network-scripts]# vim /etc/init.d/dr.sh
#!/bin/bash
VIP=192.168.188.188   # 虛擬ip
RIP1=192.168.188.100 # 真實web服務器ip
RIP2=192.168.188.101
case "$1" in
start)
           /sbin/ipvsadm --save > /etc/sysconfig/ipvsadm  # 保存配置
           systemctl start ipvsadm  # 啟動服務
           /sbin/ifconfig ens33:0 $VIP broadcast $VIP netmask 255.255.255.255 broadcast $VIP up  # 設定ens33:0地址,廣播地址,子網掩碼,并開啟

                /sbin/route add -host $VIP dev ens33:0  # 添加路由網段資訊
                /sbin/ipvsadm -A -t $VIP:80 -s rr # 指定虛擬服務訪問入口,指定輪詢演算法
                /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g -w 1	# -g 指定真實服務器,dr模式
                /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g -w 1
                echo "ipvsadm starting --------------------[ok]"
                ;;
stop)
                /sbin/ipvsadm -C   # 清空快取
                systemctl stop ipvsadm  # 關閉服務
                ifconfig ens33:0 down  # 關閉介面
                route del $VIP   # 洗掉路由資訊
                echo "ipvsamd stoped----------------------[ok]"
                 ;;
status)
                if [ ! -e /var/lock/subsys/ipvsadm ];then  # 判斷檔案存在與否決定狀態
                echo "ipvsadm stoped---------------"
                exit 1
                                else
                                echo "ipvsamd Runing ---------[ok]"
                fi
                ;;
*)
                echo "Usage: $0 {start|stop|status}"
                exit 1
esac
exit 0

[root@lvs network-scripts]# chmod +x /etc/init.d/dr.sh 

兩臺LVS服務器都重啟各項配置

[root@lvs network-scripts]# systemctl restart network
[root@lvs network-scripts]# ifup ens33:0
[root@lvs network-scripts]# service dr.sh start
ipvsadm starting --------------------[ok]
節點配置

配置節點的網卡資訊

[root@web network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@web network-scripts]# vim ifcfg-lo:0

需要修改的是DEVICE	IPADDR寫VIP	BROADCAST也寫VIP	NETMASK全寫255
DEVICE=lo:0
IPADDR=192.168.188.188
NETMASK=255.255.255.255
BROADCAST=192.168.188.188
ONBOOT=yes
NAME=loopback

節點服務器配置抑制ARP回應

配置抑制ARP腳本
[root@web network-scripts]# vim /etc/init.d/web.sh
#!/bin/bash
VIP=192.168.188.188
                case "$1" in
                start)
                                ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
                                /sbin/route add -host $VIP dev lo:0
                                echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore   
                                echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
                                echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
                                echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
                                sysctl -p >/dev/null 2>&1
                                echo "RealServer Start OK "
                                ;;
                stop)
                                ifconfig lo:0 down
                                route del $VIP /dev/null 2>&1
                                echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore 
                                echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
                                echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
                                echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
                                echo "RealServer Stopd"
                                ;;
                *)
                                echo "Usage: $0 {start|stop}"
                                exit 1
                esac
                exit 0
[root@web network-scripts]# chmod +x /etc/init.d/web.sh 

重啟各項服務

[root@web network-scripts]# systemctl restart network
[root@web network-scripts]# ifup lo:0
[root@web network-scripts]# service web.sh start
RealServer Start OK 
[root@web network-scripts]# systemctl start httpd

驗證:

在這里插入圖片描述
在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/272217.html

標籤:其他

上一篇:LAMP-2:配置php/整合資料庫/利用memcache實作nginx高效快取/nginx反向代理/平滑升級

下一篇:清明節,致敬兩位逝去的技術博主

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more