Linux 叢集化

路人甲_passerby發表於2020-12-20

一、叢集概述

1.1 叢集是什麼?

定義: 叢集是一組協同工作的伺服器,各有分工,對外表現為一個整體

叢集的意義: 更好的利用現有資源實現服務的高度可用

叢集擴充套件方式

  • 垂直擴充套件:更換伺服器硬體
  • 水平擴充套件:新增更多的伺服器節點

叢集與分散式的區別

分散式: 多臺計算機幹一件事,服務是分散部署在不同的機器上,多臺伺服器合起來跑的才是一套完整程式碼,這就叫分散式。

叢集: 多臺計算機幹同樣的事,多臺伺服器跑的都是一套完整的程式碼,這就叫叢集

  • 相同點:分散式和叢集都是需要有很多節點伺服器通過網路協同工作完成整體的任務目標。
  • 不同點:分散式是指將業務系統進行拆分,即分散式的每一個節點都是實現不同的功能。而叢集每個節點做的是同一件事情。

常見的叢集拓撲

在這裡插入圖片描述

1.2 叢集的分類

負載均衡叢集 – LBC: 分擔服務的總體壓力
高可用叢集 – HAC: 儘可能的保障服務狀態的可用性
高效能運算叢集 – HPC: 提供單臺伺服器提供不了的計算能力

1.2.1 負載均衡叢集 – LBC

使用意圖: 減輕單臺伺服器的壓力,將使用者請求分擔給多臺主機一起處理

實現方法

  • 軟體:LVS、 RAC、 Nginx
  • 硬體:F5、 BIG-IP

負載均衡叢集架構拓撲
在這裡插入圖片描述

排程器分類

  • 觸發條件不同
    • 四層:傳輸層 IP+PORT
    • 七層:應用層 URL
  • 實現原理不同
    • 四層:TCP 連線只建立一次,客戶端和正式伺服器
    • 七層:TCP 連線建立兩次,客戶端和負載排程器 負載排程器和真實伺服器
  • 實現場景不同
    • 四層:TCP 應用 如:基於 C/S 機構的 ERP 系統
    • 七層:HTTP 應用 如:根據使用者訪問域名的方式,判斷使用者語言
  • 安全性不同
    • 四層:轉發 SYN 攻擊
    • 七層:可以攔截 SYN 攻擊

在這裡插入圖片描述
資料鏈路層(F5),傳輸層,應用層可以進行負載均衡。

使用範圍: 業務併發較大的應用程式


1.2.2 高可用叢集 – HAC

使用意圖: 最大限度的保證使用者的應用持久,不間斷的提供服務

最大限度
99%            99            87.6 小時
99.9%         999          8.8 小時
99.99%       9999        53 分鐘
99.999%     99999      5 分鐘

實現原理: 心跳檢測

實現方法

  • 軟體:
    • heartbeat linux-HA
    • RHCS
    • ROSE
    • keepalived
  • 硬體:
    • F5

特殊情況: 腦分裂

  • 可能出現的問題:資料不完整、資料不可訪問
  • 解決方法:預防:冗餘、強制隔離:電源交換機

使用範圍: 需要持續提供服務的應用程式


1.2.3 高效能運算叢集 – HPC

使用意圖: 提供單臺計算機所不具備的計算能力

LBC 與 HAC 的原理對比:

  • 負載均衡叢集通過提高單位時間內執行的任務數來提升效率
  • 高效能運算叢集通過縮短單個任務的執行時間來提高效率

使用範圍: 天氣計算、火箭彈道演算


二、負載均衡叢集

2.1 LVS 相關原理

LVS簡介
  LVS(Linux Virtual Server)即Linux虛擬伺服器,是由章文嵩博士主導的開源負載均衡專案,目前LVS已經被整合到Linux核心模組中。該專案在Linux核心中實現了基於IP的資料請求負載均衡排程方案,LVS在四層傳出層

LVS 的組成

  • IPVS:執行在核心空間 (ipvs稱之為IP虛擬伺服器(IP Virtual Server,簡寫為IPVS)。是執行在LVS下的提供負載平衡功能的一種技術。)主要用於使使用者定義的策略生效
  • IPVSADM:執行在使用者空間,管理叢集服務的命令列工具

LVS 的原理: 根據使用者請求的套接字判斷,分流至真實伺服器的工作模組
在這裡插入圖片描述
LVS只做了簡單的地址資訊的更改,並沒有涉及真實的流量轉發

  1. 當使用者向負載均衡排程器(Director Server)發起請求,排程器將請求發往至核心空間
  2. PREROUTING鏈首先會接收到使用者請求,判斷目標IP確定是本機IP,將資料包發往INPUT鏈
  3. IPVS是工作在INPUT鏈上的,當使用者請求到達INPUT時,IPVS會將使用者請求和自己已定義好的叢集服務進行比對,如果使用者請求的就是定義的叢集服務,那麼此時IPVS會強行修改資料包裡的目標IP地址及埠,並將新的資料包發往POSTROUTING鏈
  4. POSTROUTING連結收資料包後發現目標IP地址剛好是自己的後端伺服器,那麼此時通過選路,將資料包最終傳送給後端的伺服器

2.2 LVS 工作方式

在這裡插入圖片描述
首先掌握幾個術語,方便下邊的理解:

DS:(director server)負載均衡伺服器

RS:(real server)真實伺服器

DIR: (director server IP)地址

VIP: (外部網路訪問的IP地址)虛擬IP地址

RIP:(real server IP)真實伺服器IP地址

CIP: 客戶端IP地址

2.2.1 LVS – DR(Direct Routing)直接路由模式

  DR模式是通過改寫請求報文的目標MAC地址,將請求發給真實伺服器的,而真實伺服器響應後的處理結果直接返回給客戶端使用者

工作邏輯圖
在這裡插入圖片描述
工作原理:

DR模式將報文直接路由給目標真實伺服器。

  1. 在DR模式中,排程器根據各個真實伺服器的負載情況,連線數多少等,動態地選擇一臺伺服器,不修改目標IP地址和目標埠,也不封裝IP報文,而是將請求報文的資料幀的目標MAC地址改為真實伺服器的MAC地址。
  2. 然後再將修改的資料幀在伺服器組的區域網上傳送。因為資料幀的MAC地址是真實伺服器的MAC地址,並且又在同一個區域網。那麼根據區域網的通訊原理,真實復位是一定能夠收到由LB發出的資料包。真實伺服器接收到請求資料包的時候,解開IP包頭檢視到的目標IP是VIP。(此時只有自己的IP符合目標IP才會接收進來,所以我們需要在本地的迴環藉口上面配置VIP。另:由於網路介面都會進行ARP廣播響應,但叢集的其他機器都有這個VIP的lo介面,都響應就會衝突。所以我們需要把真實伺服器的lo介面的ARP響應關閉掉。)
  3. 然後真實伺服器做成請求響應,之後根據自己的路由資訊將這個響應資料包傳送回給客戶,並且源IP地址還是VIP。

模式特點

  • 叢集節點,必須在一個網路中
  • 真實伺服器閘道器指向路由器
  • RIP 既可以是私網地址,又可以是公網地址
  • 負載排程器只負責入站請求
  • 大大減輕負載排程器壓力,支援更多的伺服器節點

2.2.2 LVS – NAT(隧道)模式

在這裡插入圖片描述

  通過網路地址轉換的方法來實現排程的。首先排程器(LB)接收到客戶的請求資料包時(請求的目的IP為VIP),根據排程演算法決定將請求傳送給哪個後端的真實伺服器(RS)。然後排程就把客戶端傳送的請求資料包的目標IP地址及埠改成後端真實伺服器的IP地址(RIP),這樣真實伺服器(RS)就能夠接收到客戶的請求資料包了。真實伺服器響應完請求後,檢視預設路由(NAT模式下我們需要把RS的預設路由設定為LB伺服器。)把響應後的資料包傳送給LB,LB再接收到響應包後,把包的源地址改成虛擬地址(VIP)然後傳送回給客戶端。

工作原理:

  1. 客戶端請求資料,目標IP為VIP

  2. 請求資料到達LB伺服器,LB根據排程演算法將目的地址修改為RIP地址及對應埠(此RIP地址是根據排程演算法得出的。)並在連線HASH表中記錄下這個連線。

  3. 資料包從LB伺服器到達RS伺服器webserver,然後webserver進行響應。Webserver的閘道器必須是LB,然後將資料返回給LB伺服器。

  4. 收到RS的返回後的資料,根據連線HASH表修改源地址VIP&目標地址CIP,及對應埠80.然後資料就從LB出發到達客戶端。

  5. 客戶端收到的就只能看到VIP\DIP資訊。

模式特點

  • 叢集節點,必須在一個網路中
  • 真實伺服器必須將閘道器指向負載排程器
  • RIP 通常都是私有 IP,僅用於各個叢集節點通訊
  • 負載排程器必須位於客戶端和真實伺服器之間,充當閘道器
  • 支援埠對映
  • 負載排程器作業系統必須是 Linux ,真實伺服器可以使用任意系統
  • 進出資料包文都要經過負載排程器機器,壓力較大

2.2.3 LVS – TUN(網路地址轉換)模式

在這裡插入圖片描述

  採用NAT模式時,由於請求和響應的報文必須通過排程器地址重寫,當客戶請求越來越多時,排程器處理能力將成為瓶頸。為了解決這個問題,排程器把請求的報文通過IP隧道轉發到真實的伺服器。真實的伺服器將響應處理後的資料直接返回給客戶端。這樣排程器就只處理請求入站報文,由於一般網路服務應答資料比請求報文大很多,採用VS/TUN模式後,叢集系統的最大吞吐量可以提高10倍。

工作原理:

  1. 客戶請求資料包,目標地址VIP傳送到LB上。

  2. LB接收到客戶請求包,進行IP Tunnel封裝。即在原有的包頭加上IP Tunnel的包頭。然後傳送出去。

  3. RS節點伺服器根據IP Tunnel包頭資訊(此時就又一種邏輯上的隱形隧道,只有LB和RS之間懂)收到請求包,然後解開IP Tunnel包頭資訊,得到客戶的請求包並進行響應處理。

  4. 響應處理完畢之後,RS伺服器使用自己的出公網的線路,將這個響應資料包傳送給客戶端。源IP地址還是VIP地址。

模式特點

  • 叢集節點不必位於同一個物理網路但必須都擁有公網 IP(或都可以被路由)
  • 真實伺服器不能將網管指向負載排程器
  • RIP 必須是公網地址
  • 負載排程器只負責入站請求
  • 不支援埠對映功能
  • 傳送方和接收方必須支援隧道功能

2.3 LVS 實驗構建

環境構建

ip地址網段 10.10.10.0/24 255.255.255.0
10.10.10.11 12 依次排列 共6臺

VMware
網路型別: 僅主機

【編輯】----【虛擬網路編輯器】----【新增網路】新增一塊僅主機的網路卡。關閉DHCP服務,子網改成10.10.10.0,然後將虛擬機器選擇此網路卡,新增兩塊網路卡,雙網路卡僅主機型別,安裝圖形介面
在這裡插入圖片描述
在這裡插入圖片描述

作業系統
centos6.8

ip地址修改

[root@localhost ~]$ echo "root" | passwd --stdin root #修改密碼為root

[root@localhost ~]$ vim /etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE=eth0  
HWADDR=00:0C:29:5F:75:3B    
TYPE=Ethernet 
UUID=8ad7de61-0b7c-433c-b7c0-03dd42eec9ea
ONBOOT=yes  #開機自啟,改為yes  
NM_CONTROLLED=yes
BOOTPROTO=static #修改此處,改為static
IPADDR=10.10.10.11  #ip地址,12,13,14依次排列
NETMASK=255.255.255.0 #子網掩碼

調成字元頁面,ctrl+alt+f3,有的還需要加個fn

預設啟動字元介面

[root@localhost ~]$ vim /etc/inittab
...
# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 
id:3:initdefault:  #5改為3

關閉防火牆

[root@localhost ~]$ iptables -F  &&  service iptables save && chkconfig iptables off
[root@localhost ~]$ iptables -L

關閉selinux

[root@localhost ~]$ setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
[root@localhost ~]$ getenforce

配置yum源

設定yum源可以參考之前的文章
https://blog.csdn.net/w918589859/article/details/109191537

右擊虛擬機器——進入“虛擬機器設定”——點選“CD/DVD(IDE)”——點選“瀏覽”——選中安裝時的映象——勾選上“已連線”——確定

[root@localhost ~]$ mkdir /mnt/cdrom
[root@localhost ~]$ mount -t iso9660 /dev/cdrom /mnt/cdrom
mount: block device /dev/sr0 is write-protected, mounting read-only
#出現這個表示成功

[root@localhost ~]$ cd /etc/yum.repos.d/
[root@localhost ~]$ mkdir back && mv * back
[root@localhost ~]$ cp -a back/CentOS-Media.repo .
[root@localhost ~]$ vim CentOS-Media.repo
[c6-media]
name=CentOS-$releasever - Media
baseurl=file:///mnt/cdrom
#只保留一個即可,多餘的可以刪除

gpgcheck=0
enabled=1
#把enabled=0改為enabled=1,讓這個yum源配置檔案生效
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6


[root@localhost ~]$ yum clean all
[root@localhost ~]$ yum update
[root@localhost ~]$ yum -y install gcc* lrzsz


如果複製的虛擬機器啟動網路卡報錯 no device found for connection 'System eth0'

解決辦法

[root@localhost ~]$ vim /etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE=eth0  
#HWADDR=00:0C:29:5F:75:3B    刪除mac地址
TYPE=Ethernet 
UUID=8ad7de61-0b7c-433c-b7c0-03dd42eec9ea
ONBOOT=yes  #開機自啟,改為yes  
NM_CONTROLLED=yes
BOOTPROTO=static #修改此處,改為static
IPADDR=10.10.10.12  #ip地址,12,13,14依次排列
NETMASK=255.255.255.0 #子網掩碼

[root@localhost ~]$ rm -f /etc/udev/rules.d/70-persistent-net.rules
#刪除這個檔案,重啟即可

三臺機器在虛擬機器都儲存一個快照

2.3.1 LVS – DR 模式叢集構建

實驗架構圖

在這裡插入圖片描述
大致流程

c傳送一個資料包,源地址是10.10.10.240,目標地址是10.10.10.100,在當前廣播域中,資料包會被髮送到負載排程器,負載排程器會根據演算法進行修改DMAC(目的MAC),修改完之後會被扔回廣播域,回到RS1,為了使RS1能夠接受資料,開啟一個lo:0 10.10.10.100的介面(相當於起了個小名),這樣的話,當前廣播域中會存在多個相同的ip地址,會引起ip地址衝突,為了解決這個問題,可以修改ARP(地址解析協議,根據IP地址獲取實體地址的一個TCP/IP協議)的通訊行為,然後 lo 配置路由規則拿到資料包文,回信給客戶端




ARP修改

ARP響應級別
  arp-ignore
    0只要本機配置有相應IP地址就響應
    1僅在請求的目標地址配置在請求到達的網路介面上時,才給予響應

ARP通告行為
  arp-announce
    0將本機任何網路介面上的任何地址都向外通告
    1儘可能避免像目標網路通告與其網路不匹配的地址資訊表2僅向目標網路通告與其網路相匹配的地址資訊




此次試驗需要配置三臺伺服器

10.10.10.11
10.10.10.12
10.10.10.13

本機地址

10.10.10.240



2.3.1.1 負載排程器 (10.10.10.11)

#這兩條命令三臺伺服器都執行,最小化安裝沒有此服務
[root@localhost ~]$ service NetworkManager stop # 關閉網路卡守護程式
[root@localhost ~]$ chkconfig NetworkManager off

開啟子介面

[root@localhost ~]$ cd /etc/sysconfig/network-scripts/
[root@localhost ~]$ cp -a ifcfg-eth0 ifcfg-eth0:0 
# 拷貝 eth0 網路卡子介面充當叢集入口介面

[root@localhost ~]$ vim ifcfg-eth0:0  #vim !$ 上一個命令最後一條引數
#修改成下面一樣
DEVICE=eth0:0
ONBOOT=yes
BOOTPROTO=static
IPADDR=10.10.10.100
NETMASK=255.255.255.0
#當做叢集的ip,VIP,提供給web使用者訪問的介面

[root@localhost ~]$ service network restart
正在關閉介面 eth0:                                        [確定]
關閉環回介面:                                             [確定]
彈出環回介面:                                             [確定]
彈出介面 eth0: Determining if ip address 10.10.10.11 is already in use for device eth0...
Determining if ip address 10.10.10.100 is already in use for device eth0...
                                                           [確定]


修改核心配置檔案

[root@localhost ~]$ vim /etc/sysctl.conf # 關閉網路卡重定向功能 
#最後一行新增
net.ipv4.conf.all.send_redirects = 0 
net.ipv4.conf.default.send_redirects = 0 
net.ipv4.conf.eth0.send_redirects = 0 

[root@localhost ~]$ sysctl -p #重新載入配置檔案

安裝ipvsadm

[root@localhost ~]$ yum  -y install ipvsadm #報錯的話重新掛載映象
[root@localhost ~]$ ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

新增ipvs規則

[root@localhost ~]$ ipvsadm -v # 檢視當前 ipvs 叢集內容  
#ipvsadm -A -t 虛擬 IP:80 -s rr 
#新增 ipvs TCP 叢集,-A新增一個叢集,-t TCP協議,-s 指定演算法,rr輪詢
[root@localhost ~]$ ipvsadm -A -t 10.10.10.100:80 -s rr

#ipvsadm -a -t 虛擬 IP:80 -r 網站1:80 -g 
#新增 ipvsadm 叢集子節點 ,-a 叢集子節點,-r 真實伺服器,-g DR模式
#ipvsadm -a -t 虛擬 IP:80 -r 網站2:80 -g 
[root@localhost ~]$ ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.12:80 -g
[root@localhost ~]$ ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.13:80 -g

[root@localhost ~]$ ipvsadm -Ln  #檢視叢集
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.10.10.100:80 rr
  -> 10.10.10.12:80               Route   1      0          0         
  -> 10.10.10.13:80               Route   1      0          0


[root@localhost ~]$ service ipvsadm save # 儲存 ipvs 叢集內容至檔案,進行持久化儲存 
[root@localhost ~]$ chkconfig ipvsadm on # 設定為開機自啟

[root@localhost ~]$ ipvsadm -Ln --stats #檢視狀態

2.3.1.2 真實伺服器(10.10.10.12 13 )

兩臺伺服器做相同的步驟

[root@localhost ~]$ service httpd start  #啟動apache伺服器
[root@localhost ~]$ echo "this is server 1" >> /var/www/html/index.html 
#另一臺服務是this is server 2
[root@localhost ~]$ curl localhost
this is server 1
#生產環境兩臺伺服器的網頁內容是一樣的

開啟迴環網路卡介面

# 關閉網路卡守護程式
[root@localhost ~]$ service NetworkManager stop && chkconfig NetworkManager off
[root@localhost ~]$ cd /etc/sysconfig/network-scripts/
[root@localhost ~]$ cp -a ifcfg-lo ifcfg-lo:0
# 拷貝迴環網路卡子介面

[root@localhost ~]$ vim ifcfg-lo:0  #vim !$ 上一個命令最後一條引數
#修改成下面一樣
DEVICE=lo:0    #修改這裡
IPADDR=10.10.10.100 #修改這裡
NETMASK=255.255.255.255  #修改這裡
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback


修改核心配置檔案

[root@localhost ~]$ vim /etc/sysctl.conf #關閉對應 ARP 響應及公告功能
#最後一行新增
# LVS - ARP
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2


[root@localhost ~]$ sysctl -p #重新載入配置檔案

[root@localhost ~]$ ifup lo:0  #啟動迴環網路卡

[root@localhost ~]$ ifconfig
...
lo:0      Link encap:Local Loopback  
          inet addr:10.10.10.100  Mask:255.255.255.255
          UP LOOPBACK RUNNING  MTU:65536  Metric:1

新增路由記錄,當訪問 VIP 交給 lo:0 網路卡接受

[root@localhost ~]$ route add -host 10.10.10.100 dev lo:0
[root@localhost ~]$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.10.10.100    0.0.0.0         255.255.255.255 UH    0      0        0 lo
10.10.10.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0

#新增到開機自啟,防止失效
[root@localhost ~]$ echo "route add -host 10.10.10.100 dev lo:0" >> /etc/rc.local

瀏覽器輸入10.10.10.100訪問
在這裡插入圖片描述

在這裡插入圖片描述

2.3.2 LVS – NAT 模式叢集構建

實驗架構圖在這裡插入圖片描述
c傳送一個資料包,源地址是20.20.20.22,目標地址是20.20.20.11,負載排程器LVS元件會根據DNAT轉換把ip地址修改為伺服器的地址,RS1收到資料包後,回信給閘道器負載排程器10.10.10.11,為了保證源地址一致性,採用了SNAT轉換

修改客戶端的ip

【網路介面卡】—找到VMnet1的網路卡【屬性】–【IPv4協議】—【高階】—新增一個20.20.20.22的ip地址

三臺虛擬機器都恢復快照

2.3.2.1 負載排程器(10.10.10.11)

[root@localhost ~]$ service NetworkManager stop && chkconfig NetworkManager off# 關閉網路卡守護程式 
[root@localhost ~]$ cd /etc/sysconfig/network-scripts/
[root@localhost ~]$ vim ifcfg-eth1
DEVICE=eth1
HWADDR=00:0C:29:0A:56:38
TYPE=Ethernet
UUID=ea68e93b-9aff-4379-b5a8-abac819dcd3b
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=10.10.10.11
NETMASK=255.255.255.0



[root@localhost ~]$ vim ifcfg-eth0
DEVICE=eth0
HWADDR=00:0C:29:0A:56:2E
TYPE=Ethernet
UUID=b1f0c82e-6315-4827-91f7-8a5f8fa0b929
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=20.20.20.11
NETMASK=255.255.255.0

[root@localhost ~]$ service network restart
[root@localhost ~]$ ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:0A:56:2E  
          inet addr:20.20.20.11  Bcast:20.20.20.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe0a:562e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:987 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1109 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:84594 (82.6 KiB)  TX bytes:204436 (199.6 KiB)

eth1      Link encap:Ethernet  HWaddr 00:0C:29:0A:56:38  
          inet addr:10.10.10.11  Bcast:10.10.10.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe0a:5638/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:45 errors:0 dropped:0 overruns:0 frame:0
          TX packets:27 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:3570 (3.4 KiB)  TX bytes:3512 (3.4 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1000 (1000.0 b)  TX bytes:1000 (1000.0 b)


安裝 ipvsadm 命令列工具

[root@localhost ~]$ mount -t iso9660 /dev/cdrom /mnt/cdrom #掛載光碟
[root@localhost ~]$ yum -y install ipvsadm

[root@localhost ~]$ vim /etc/sysctl.conf # 開啟路由轉發功能 
# Controls IP packet forwarding
#修改此處
net.ipv4.ip_forward = 1


[root@localhost ~]$ sysctl -p


修改防火牆

[root@localhost ~]$ service iptables start && chkconfig iptables on
[root@localhost ~]$ iptables -F #清空規則
[root@localhost ~]$ iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j SNAT --to-source 20.20.20.11 
# 新增防火牆記錄,當源地址是 內網網段 並且出口網路卡為 eth0 的時候進行 SNAT 轉換, 轉換源地址為外網路卡地址

[root@localhost ~]$ iptables -t nat -L # 檢視記錄是否儲存成功
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  10.10.10.0/24        anywhere            to:20.20.20.11 


Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 

[root@localhost ~]$ service iptables save

[root@localhost ~]$ iptables -t nat -D POSTROUTING 1 #刪除規則

新增ipvs規則

[root@localhost ~]$ ipvsadm -A -t 20.20.20.11:80 -s rr 
# 新增 ipvsadm TCP 叢集 

[root@localhost ~]$ ipvsadm -a -t 20.20.20.11:80 -r 10.10.10.12:80 -m 
[root@localhost ~]$ ipvsadm -a -t 20.20.20.11:80 -r 10.10.10.13:8080 -m 
# 新增 ipvsadm 節點,-m nat模式

[root@localhost ~]$ ipvsadm -Ln 
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  20.20.20.11:80 rr
  -> 10.10.10.12:80               Masq    1      0          0         
  -> 10.10.10.13:8080             Masq    1      0          0 


[root@localhost ~]$ service ipvsadm save # 儲存 ipvs 叢集設定到檔案進行持久化 
[root@localhost ~]$ service ipvsadm start && chkconfig ipvsadm on

2.3.2.2 真實伺服器(10.10.10.12 13)

兩臺真實伺服器都需要操作

[root@localhost ~]$ service NetworkManager stop && chkconfig NetworkManager off
[root@localhost ~]$ echo "GATEWAY=10.10.10.11" >> /etc/sysconfig/network-scripts/ifcfg-eth0


#新增閘道器指向負載排程器

[root@localhost ~]$ service network restart
[root@localhost ~]$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use 
0.0.0.0         10.10.10.11     0.0.0.0         UG    0      0        0 eth0
#去任何地址都交給10.10.10.11


[root@localhost ~]$ service httpd start  && chkconfig httpd on # 開啟 Apache 伺服器

[root@localhost ~]$ echo "111111" >> /var/www/html/index.html
# echo "222222" >> /var/www/html/index.html 10.13服務的是222222

修改10.10.10.13伺服器的httpd.conf檔案

[root@localhost ~]$ vim /etc/httpd/conf/httpd.conf
#Listen 12.34.56.78:80
Listen 8080   #修改成8080
[root@localhost ~]$ service httpd restart

瀏覽器輸入20.20.20.11訪問或者使用curl 20.20.20.11

在這裡插入圖片描述

TUN 模式不常用,這裡就不做實驗了,構建可自行百度


2.4 負載均衡叢集相關排程演算法

2.4.1 靜態排程演算法

特點: 只根據演算法本身去排程,不考慮伺服器本身(伺服器壓力,效能)

演算法說明

  • RR 輪詢: 將每次使用者的請求分配給後端的伺服器,從第一臺伺服器開始到第 N 臺結束, 然後迴圈
  • WRR 加權輪詢: 按照權重的比例實現在多臺主機之間進行排程 ,當前連線數除以權重,權重相當於分母
  • SH(source hash)源地址雜湊: 將同一個 IP 的使用者請求,傳送給同一個伺服器
  • DH(destination hash)目標地址雜湊: 將同一個目標地址的使用者請求傳送給同一個真實服務 器(常見在快取伺服器使用,提高快取的命中率)

2.4.2 動態排程演算法

http 連線
  活動連線
   正在傳輸資料

  非活動連線
   剛建立握手還沒有傳輸資料
   傳輸資料完畢,還沒有來的及斷開


特點: 除了考慮演算法本身,還要考慮伺服器狀態

演算法說明

  • LC(lest-connection)最少連線: 將新的連線請求,分配給連線數最少的伺服器 活動連線 × 256 + 非活動連線
  • WLC 加權最少連線: 特殊的最少連線演算法,權重越大承擔的請求數越多 (活 動連線 × 256 + 非活動連線 ) / 權重
  • SED 最短期望延遲: 特殊的 WLC 演算法 (活動連線 + 1) * 256 / 權重
  • NQ 永不排隊: 特殊的 SED 演算法,無需等待,如果有真實伺服器的連線數等於 0 那就直接 分配不需要運算
  • LBLC 特殊的 DH 演算法: 即能提高快取命中率,又要考慮伺服器效能
  • LBLCR LBLC+快取: 儘可能提高負載均衡和快取命中率的折中方案

2.5 LVS 持久連線


2.5.1 持久客戶端連線


2.5.2 持久埠連線


2.5.3 持久防火牆標記連線


三、高可用叢集

3.1 Keepalived 相關說明


3.2 Keepalived + LVS 高可用實驗構建


3.3 HeartBeat + Nginx 實驗構建

相關文章