LVS負載均衡集羣

title.jpg

本章內容

集羣概念

LVS介紹

LVS-NAT模式的實現

LVS-DR模式的實現

ldirectord


Cluster概念

系統擴展方式:

Scale UP:向上擴展,增強

Scale Out:向外擴展,增加設備,調度分配問題,Cluster

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

Linux Cluster類型:

LBLoad Balancing,負載均衡

HAHigh Availiablity,高可用,SPOFsingle 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%

HPCHigh-performance computing,高性能 www.top500.org

分佈式系統:

分佈式存儲:雲盤

分佈式計算:hadoopSpark

 

集羣和分佈式

 集羣和分佈式.png 

Cluster分類

LB Cluster的實現

硬件

F5 Big-IP

Citrix Netscaler

A10 A10

軟件

lvsLinux Virtual Server

nginx:支持七層調度

haproxy:支持七層調度

atsapache traffic serveryahoo捐助

perlbalPerl 編寫

pound

 

Cluster分類

基於工作的協議層次劃分:

傳輸層(通用):DPORT

LVS

nginxstream

haproxymode tcp

應用層(專用):針對特定協議,自定義的請求模型分類

proxy server

httpnginx, httpd, haproxy(mode http), ...

fastcginginx, httpd, ...

mysqlmysql-proxy, ...

 

Cluster相關

會話保持:負載均衡

(1) session sticky:同一用戶調度固定服務器

Source IPLVS sh算法(對某一特定服務而言)

Cookie

(2) session replication:每臺服務器擁有全部session

session multicast cluster

(3) session server:專門的session服務器

MemcachedRedis

HA集羣實現方案

keepalived:vrrp協議

ais:應用接口規範

heartbeat

cman+rgmanager(RHCS)

coresync_pacemaker

 

LVS介紹

LVSLinux Virtual Server,負載調度器,集成內核 章文嵩 阿里

官網:http://www.linuxvirtualserver.org/,最新更新在2012

LVS被紅帽收購,已經集成在內核裏,不用額外裝包

VS: Virtual Server,負責調度

RS: Real Server,負責真正提供服務

L4:四層路由器或交換機

工作原理:VS根據請求報文的目標IP和目標協議及端口將其調度轉發至某RS,根據調度算法來挑選RS

iptables/netfilter

iptables:用戶空間的管理工具

netfilter:內核空間上的框架

流入:PREROUTING --> INPUT

流出:OUTPUT --> POSTROUTING

轉發:PREROUTING --> FORWARD --> POSTROUTING

DNAT:目標地址轉換; PREROUTING

 

LVS集羣體系結構

LVS集羣體系結構.png 

LVS概念

lvs集羣類型中的術語:

VSVirtual ServerDirector Server(DS)

Dispatcher(調度器)Load Balancer

RSReal Server(lvs), upstream server(nginx)

backend server(haproxy)

CIPClient IP

VIP: Virtual serve IP VS外網的IP

DIP: Director IP VS內網的IP

RIP: Real server IP

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

 

lvs集羣的類型

lvs: ipvsadm/ipvs

ipvsadm:用戶空間的命令行工具,規則管理器

用於管理集羣服務及RealServer

ipvs:工作於內核空間netfilterINPUT鉤子上的框架

lvs集羣的類型:

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

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

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

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

重點掌握natdrtunfullnat瞭解即可

 

lvs-nat模式

lvs-nat

本質是多目標IPDNAT,通過將請求報文中的目標地址和目標端口修改爲某挑出的RSRIPPORT實現轉發

1RIPDIP應在同一個IP網絡,且應使用私網地址;RS的網關要指向DIPRIPDIP也可以不在同一個IP網絡,中間用路由器,不過一般不這麼做,因路由器帶寬有限 ;也可以不用私網地址,但沒必要,但對互聯網用戶來說不可見;如果用路由器的話,RS的網關要指向路由器)

2)請求報文和響應報文都必須經由Director轉發,Director易於成爲系統瓶頸

3)支持端口映射,可修改請求報文的目標PORT

4VS必須是Linux系統(因lvs集成在Linux內核中),RS可以是任意OS系統

 

NAT模式,VS能否只有一張網卡?是可以的,在單網卡上配兩個IPVIPDIPDIP作爲RS的網關

 

VS/NAT的體系結構

  VS NAT的體系結構.png

NAT模式IP包調度過程

NAT模式IP包調度過程.png 

NAT模式

NAT模式.png

LVS-DR模式

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

1 Director和各RS都配置有VIP

2 確保前端路由器將目標IPVIP的請求報文發往Director

在前端網關做靜態綁定VIPDirectorMAC地址(一般不用)

RS上使用arptables工具(一般也不用)

arptables -A IN -d $VIP -j DROP

arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP

RS上修改內核參數以限制arp通告及應答級別(一般用這種方法)

/proc/sys/net/ipv4/conf/all/arp_ignore

/proc/sys/net/ipv4/conf/all/arp_announce

3RSRIP可以使用私網地址,也可以是公網地址;RIPDIP在同一IP網絡;RIP的網關不能指向DIP,以確保響應報文不會經由Director

4RSDirector要在同一個物理網絡

5)請求報文要經由Director,但響應報文不經由Director,而由RS直接發往Client

6)不支持端口映射(端口不能修改)

7RS可使用大多數OS系統

 

VS/DR體系結構

VS DR體系結構.png

DR模式IP包調度過程

DR模式IP包調度過程.png

DR模式

DR模式01_small.jpg

lvs-tun模式

lvs-tun

轉發方式:不修改請求報文的IP首部(源IPCIP,目標IPVIP),而在原IP報文之外再封裝一個IP首部(源IPDIP,目標IPRIP),將報文發往挑選出的目標RSRS直接響應給客戶端(源IPVIP,目標IPCIP

(1) DIP, VIP, RIP都應該是公網地址(DIPRIP可以是私網地址,拉專線的話)

(2) RS的網關一般不能指向DIP

(3) 請求報文要經由Director,但響應不能經由Director

(4) 不支持端口映射

(5) RSOS須支持隧道功能

可以跨異地

 

VS/TUN體系結構

VS TUN體系結構.png

TUN模式IP包調度過程

TUN模式IP包調度過程.png

lvs-fullnat模式

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

CIP --> DIP

VIP --> RIP

(1) VIP是公網地址,RIPDIP是私網地址,且通常不在同一IP網絡;因此,RIP的網關一般不會指向DIP

(2) RS收到的請求報文源地址是DIP,因此,只需響應給DIP;但Director還要將其發往Client

(3) 請求和響應報文都經由Director

(4) 支持端口映射

注意:此類型kernel默認不支持,需要從新編譯

可以跨異地

 

LVS工作模式總結

lvs-natlvs-fullnat:請求和響應報文都經由Director

lvs-natRIP的網關要指向DIP

lvs-fullnatRIPDIP未必在同一IP網絡,但要能通信

lvs-drlvs-tun:請求報文要經由Director,但響應報文由RS直接發往Client

lvs-dr:通過封裝新的MAC首部實現,通過MAC網絡轉發

lvs-tun:通過在原IP報文外封裝新IP頭實現轉發,支持遠距離通信

 

ipvs scheduler

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

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

靜態方法:僅根據算法本身進行調度

1RRroundrobin,輪詢

2WRRWeighted RR,加權輪詢

3SHSource Hashing,實現session sticky,源IP地址hash;將來自於同一個IP地址的請求始終發往第一次挑中的RS,從而實現會話綁定

4DHDestination Hashing;目標地址哈希,將發往同一個目標地址的請求始終轉發至第一次挑中的RS,典型使用場景是正向代理緩存場景中的負載均衡,如:寬帶運營商(基於VIP,而不是URL,因爲LVS只在4層以下起作用)

 

ipvs scheduler

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

1LCleast connections 適用於長連接應用

Overhead=activeconns*256+inactiveconns

2WLCWeighted LC默認調度方法

Overhead=(activeconns*256+inactiveconns)/weight

3SEDShortest Expection Delay,初始連接高權重優先

Overhead=(activeconns+1)*256/weight

4NQNever Queue,第一輪均勻分配,後續SED

5LBLCLocality-Based LC,動態的DH算法,使用場景:根據負載狀態實現正向代理

6LBLCRLBLC with Replication,帶複製功能的LBLC

解決LBLC負載不均衡問題,從負載重的複製到負載輕的RS

LBLCLBLCR一般也是電信運營商用得多一些

 

ipvs

ipvsadm/ipvs

ipvs

grep -i -C 10 "ipvs" /boot/config-VERSION-RELEASE.x86_64

支持的協議:TCP UDP AH ESP AH_ESP, SCTP

ipvs集羣:

管理集羣服務

管理服務上的RS

 

ipvsadm包構成

ipvsadm

程序包:ipvsadm

Unit File: ipvsadm.service

主程序:/usr/sbin/ipvsadm

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

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

配置文件:/etc/sysconfig/ipvsadm-config

 

ipvsadm命令

ipvsadm命令:

核心功能:

集羣服務管理:增、刪、改

集羣服務的RS管理:增、刪、改

查看

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]

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

ipvsadm -C 清空

ipvsadm -R 重載

ipvsadm -S [-n] 保存(強烈建議加-n,否則會反向解析)

ipvsadm -a|e -t|u|f service-address -r server-address [options]

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

ipvsadm -L|l [options](建議加-n

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

 

管理集羣服務:增、改、刪

增、改:

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

刪除:

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

service-address

-t|u|f

-t: TCP協議的端口,VIP:TCP_PORT

-u: UDP協議的端口,VIP:UDP_PORT

-ffirewall MARK,標記,一個數字

[-s scheduler]:指定集羣的調度算法,默認爲wlc

 

管理集羣上的RS:增、改、刪

增、改:ipvsadm -a|e -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,不作端口映射

選項:

lvs類型:

-g: gateway, dr類型,默認

-i: ipip, tun類型

-m: masquerade, nat類型

-w weight:權重

 

清空定義的所有內容:ipvsadm -C

清空計數器:ipvsadm -Z [-t|u|f service-address]

查看:ipvsadm -L|l [options]

--numeric, -n:以數字形式輸出地址和端口號

--exact:擴展信息,精確值

--connection-c:當前IPVS連接輸出

--stats:統計信息

--rate :輸出速率信息

ipvs規則: /proc/net/ip_vs

ipvs連接:/proc/net/ip_vs_conn

 

保存及重載規則

保存:建議保存至/etc/sysconfig/ipvsadm

ipvsadm-save -n > /PATH/TO/IPVSADM_FILE

ipvsadm -Sn > /PATH/TO/IPVSADM_FILE

systemctl stop ipvsadm.service

重載:

ipvsadm-restore < /PATH/FROM/IPVSADM_FILE

ipvsadm -R < /PATH/FROM/IPVSADM_FILE

systemctl restart ipvsadm.service

 

LVS

負載均衡集羣設計時要注意的問題

(1) 是否需要會話保持

(2) 是否需要共享存儲

共享存儲:NAS SAN DS(分佈式存儲)

數據同步:

lvs-nat

設計要點:

(1) RIPDIP在同一IP網絡, RIP的網關要指向DIP

(2) 支持端口映射

(3) Director要打開核心轉發功能

 

實驗:NAT模型實現http負載均衡集羣

LVS-NAT模式下,RIPDIP應在同一個IP網絡,且應使用私網地址,但RIPDIP也可以不在同一個IP網絡,中間用路由器,這個實驗就來模擬增加路由器的情況。生產中沒有必要,僅實驗用。拓撲圖如下:

 NAT模式拓撲圖加路由器.jpg

VMware虛擬機上模擬的話,可以將172.20.0.0/16網段、192.168.0.0/24網段和192.168.30.0/24網段劃如不同的VMnet

本實驗中,172.20.0.0/16網段屬於橋接網段,192.168.0.0/24網段屬於VMnet6(僅主機模式),192.168.30.0/24網段屬於VMnet1(僅主機模式)

 

首先每臺服務器關閉SELinux,清空iptables,然後以下是各服務器配置

 

1、客戶端client

hostname client  #爲便於演示,更改一下主機名

IP172.20.61.2/16(橋接網卡)

網關GATEWAY172.20.61.3lvs服務器)  #可不配

NAT模式拓撲圖加路由器 01 client.jpg 

2lvs服務器

hostname lvs

IP1(VIP)172.20.61.3/16(橋接網卡)

IP2(DIP)192.168.0.3/24VMnet6),網關GATEWAY192.168.30.5(路由器)

NAT模式拓撲圖加路由器 02 lvs 01.jpg

vim /etc/sysctl.conf

       net.ipv4.ip_forward = 1  #啓用IP包轉發

NAT模式拓撲圖加路由器 02 lvs 02.jpg

sysctl -p

ipvsadm -A -t 172.20.61.3:80 -s wrr

ipvsadm -a -t 172.20.61.3:80 -r 192.168.30.6:80 -m -w 2  #權重爲2

ipvsadm -a -t 172.20.61.3:80 -r 192.168.30.7:80 -m  #權重不寫默認爲1

NAT模式拓撲圖加路由器 02 lvs 03.jpg 

3、路由器

hostname router

IP1192.168.0.5/24VMnet6),網關GATEWAY192.168.0.3lvs服務器)

IP2192.168.30.5/24VMnet1

NAT模式拓撲圖加路由器 03 路由器 01.jpg

vim /etc/sysctl.conf

       net.ipv4.ip_forward = 1  #啓用IP包轉發

sysctl -p

 

4web服務器rs1

hostname rs1

IP(RIP1)192.168.30.6/24VMnet1),網關GATEWAY192.168.30.5(路由器)

yum -y install httpd  #安裝httpd服務

echo RS1 > /var/www/html/index.html

systemctl start httpd

curl 127.0.0.1  #自測http服務,啓動成功

NAT模式拓撲圖加路由器 04 rs1.jpg

5web服務器rs2

hostname rs2

IP(RIP2)192.168.30.7/24VMnet1),網關GATEWAY192.168.30.5(路由器)

yum -y install httpd  #安裝httpd服務

echo RS1 > /var/www/html/index.html

systemctl start httpd

curl 127.0.0.1  #自測http服務,啓動成功

NAT模式拓撲圖加路由器 05 rs2.jpg

最後,在客戶端訪問lvs服務器的80端口,發現RS1RS22:1的比例輪詢,實驗成功

NAT模式拓撲圖加路由器 06 客戶端測試結果.jpg

LVS-DR

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

(1) 在前端網關做靜態綁定

(2) 在各RS使用arptables

(3) 在各RS修改內核參數,來限制arp響應和通告的級別

限制響應級別:arp_ignore

0:默認值,表示可使用本地任意接口上配置的任意地址進行響應

1: 僅在請求的目標IP配置在本地主機的接收到請求報文的接口上時,纔給予響應

限制通告級別:arp_announce

0:默認值,把本機所有接口的所有信息向每個接口的網絡進行通告

1:儘量避免將接口信息向非直接連接網絡進行通告

2:必須避免將接口信息向非本網絡進行通告

 

實驗:用LVS-DR實現基於NFSwordpress的負載均衡

一、拓撲圖和環境說明

拓撲圖如下:

DR模式拓撲圖.jpg.jpeg

不算交換機的話,共需8臺虛擬機,wordpress的文件在NFS服務器上,共享給兩臺web服務器,wordpressMySQL數據庫獨立在1MySQL服務器上,然後兩臺web服務器通過1lvs服務器實現負載均衡,由1臺服務器模擬的路由器連接外網,外網上模擬1臺客戶端通過DNS服務器解析訪問wordpress

VMware模擬的話,可以將172.20.0.0/16網段劃作一個VMnet192.168.30.0/24網段和10.0.0.0/8網段劃在另一個VMnet中。

本實驗中,172.20.0.0/16網段屬於橋接網段,192.168.0.0/24網段和10.0.0.0/8網段屬於VMnet1(僅主機模式)。

本實驗的難點主要在於網絡環境搭建,對網絡熟悉一些做起來會容易些。接下來是實驗步驟:

 

二、準備兩個配置腳本

腳本里的變量按自己的環境情況修改:

1RS的配置腳本

#!/bin/bash;

#FileName: lvs_dr_rs.sh

vip=10.0.0.100

mask='255.255.255.255‘

dev=lo:1

case $1 in

start)

              echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

              echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

              echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

              echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

              ifconfig $dev $vip netmask $mask #broadcast $vip up

              #route add -host $vip dev $dev

              ;;

stop)

              ifconfig $dev down

              echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore

              echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore

              echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce

              echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

              ;;

*)

              echo "Usage: $(basename $0) start|stop"

              exit 1

              ;;

esac

#File End

 

2VS的配置腳本

#!/bin/bash

#FileName: lvs_dr_vs.sh

vip='10.0.0.100'

iface='lo:1'

mask='255.255.255.255'

port='80'

rs1='192.168.30.6'

rs2='192.168.30.7'

scheduler='wrr'

type='-g'

case $1 in

start)

              ifconfig $iface $vip netmask $mask #broadcast $vip up

              iptables -F

              ipvsadm -A -t ${vip}:${port} -s $scheduler

              ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1

              ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1

              ;;

stop)

              ipvsadm -C

              ifconfig $iface down

              ;;

*)

              echo "Usage $(basename $0) start|stop“

              exit 1

esac

#File End

 

三、配置各服務器

1MySQL服務器

hostname mysql  #爲便於演示,更改一下主機名

IP192.168.30.9/24VMnet1

yum -y install mariadb-server  #安裝數據庫

mkdir -pv /data/mysqllog/{bin_log,transaction_log}

#創建二進制日誌目錄和事務日誌目錄

chown -R mysql.mysql /data/mysqllog  #更改目錄權限

vim /etc/my.cnf  #配置數據庫

log_bin=/data/mysqllog/bin_log/mysql-bin  #指定二進制日誌目錄

binlog_format=row  #二進制日誌基於行記錄

innodb_log_group_home_dir=/data/mysqllog/transaction_log/ 

#指定事務日誌存放目錄

skip_name_resolve=on  #禁止名字解析

character_set_server=utf8  #設爲utf8字符集

DR跨網絡模式 01 mysql 01 my.cnf.jpg

systemctl start mariadb  #啓動數據庫

DR跨網絡模式 01 mysql 02 tree.jpg

mysql> create database wpdb;  #創建wordpress數據庫wpdb

mysql> grant all privileges on wpdb.* to wpuser@'192.168.30.%' identified by "centos";  #創建wordpress用戶wpuser,密碼是centos

mysql> flush privileges;  #刷新數據庫權限

 

2NFS服務器

hostname nfs  #爲便於演示,更改一下主機名

IP192.168.30.8/24VMnet1

mkdir /data

下載wordpresshttps://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz,傳到服務器上的/data目錄下

yum -y install nfs-utils php php-mysql  #安裝軟件包

cd /data/

tar xf wordpress-4.9.4-zh_CN.tar.gz  #解壓wordpress

DR跨網絡模式 02 nfs 01 tar xf.jpg

setfacl -m u:apache:rwx /data/wordpress  #設置acl允許httpd服務所用的的apache用戶

cd wordpress

cp -a wp-config-sample.php wp-config.php

vim wp-config.php  #修改wordpress配置文件

DR跨網絡模式 02 nfs 02 wp-config.php.jpg

vim /etc/exports  #配置NFS服務,添加以下這一行

       /data/wordpress 192.168.30.0/24(rw)

systemctl start nfs-server  #啓動NFS服務

exportfs -r  #重讀NFS配置文件,並共享目錄

exportfs -v  #查看本機的所有NFS共享

DR跨網絡模式 02 nfs 03 exportfs -v.jpg 

3web服務器rs1

hostname rs1

IP(RIP1)192.168.30.6/24VMnet1),網關GATEWAY192.168.30.200(路由器router

yum -y install httpd  #安裝httpd服務

showmount -e 192.168.30.8  #查看NFS服務器192.168.30.8是否成功共享目錄

vim /etc/fstab  #添加以下一行

       192.168.30.8:/data/wordpress /var/www/html nfs defaults 0 0

mount -a  #按照/etc/fstab自動掛載

df -Th  #查看掛載是否成功,如果不成功,則檢查一下前邊的各配置

DR跨網絡模式 03 web1 01 掛載NFS目錄.jpg

systemctl start httpd

在瀏覽器上測試,打開wordpress配置頁成功

DR跨網絡模式 03 web1 02 打開wordpress配置頁成功.jpg

填寫資料,點擊安裝wordpress,安裝完畢後登錄,進入主頁成功

DR跨網絡模式 03 web1 03 打開wordpress主頁成功.jpg

配置web服務器作爲lvs集羣中的RS服務器:

在服務器上新建一個腳本文件lvs_dr_rs.sh,將上邊的RS配置腳本複製進去,然後

chmod +x /root/bin/lvs_dr_rs.sh  #給腳本增加執行權限

lvs_dr_rs.sh start  #運行腳本

vim /etc/rc.d/rc.local

       lvs_dr_rs.sh start  #添加這行,以使腳本開機自動運行

 

4web服務器rs2

按照web服務器rs1相同的方式再配置一遍

hostname rs2

IP(RIP2)192.168.30.7/24VMnet1),網關GATEWAY192.168.30.200(路由器router

yum -y install httpd  #安裝httpd服務

showmount -e 192.168.30.8  #查看NFS服務器192.168.30.8是否成功共享目錄

vim /etc/fstab  #添加以下一行

       192.168.30.8:/data/wordpress /var/www/html nfs defaults 0 0

mount -a  #按照/etc/fstab自動掛載

df -Th  #查看掛載是否成功,如果不成功,則檢查一下前邊的各配置

systemctl start httpd

在瀏覽器上測試,打開wordpress主頁成功

DR跨網絡模式 04 web2 01 打開wordpress主頁成功.jpg

配置web服務器作爲lvs集羣中的RS服務器:

在服務器上新建一個腳本文件lvs_dr_rs.sh,將上邊的RS配置腳本複製進去

本實驗將lvs_dr_rs.sh放在/root/bin目錄下,然後

chmod +x /root/bin/lvs_dr_rs.sh  #給腳本增加執行權限

lvs_dr_rs.sh start  #執行腳本

echo 'lvs_dr_rs.sh start' >> /etc/rc.d/rc.local  #rc.local追加這行,以使腳本開機自動執行

 

5lvs服務器

hostname lvs

IP192.168.30.5/24VMnet1),網關GATEWAY192.168.30.200(路由器router

yum -y install ipvsadm

在服務器上新建一個腳本文件lvs_dr_vs.sh,將上邊的VS配置腳本複製進去,然後

本實驗將lvs_dr_vs.sh放在/root/bin目錄下,然後

chmod +x /root/bin/lvs_dr_rs.sh  #給腳本增加執行權限

lvs_dr_vs.sh start  #執行腳本

echo 'lvs_dr_vs.sh start' >> /etc/rc.d/rc.local  #rc.local追加這行,以使腳本開機自動執行

DR跨網絡模式 05 lvs 02 VS腳本執行.jpg

6、路由器

hostname router

IP1172.20.61.4/16(橋接網卡)

IP2192.168.30.254/24VMnet1

IP2:210.0.0.200/8VMnet1,跟192.168.30.254配在同一個網口上)

vim /etc/sysctl.conf  #添加下面這一行,啓用IP包轉發

       net.ipv4.ip_forward = 1

sysctl -p

 

7DNS服務器

hostname dns

IP1172.20.61.3/16(橋接網卡)

yum -y install named  #安裝DNS服務

vim /etc/named.conf  #註釋掉以下兩行

//      listen-on port 53 { localhost; };

//      allow-query     { 192.168.30.6;192.168.30.7; };

DR跨網絡模式 07 dns 01 named.conf.jpg

vim /etc/named.rfc1912.zones  #添加如下內容

zone "wind.com" IN {

        type master;

        file "wind.com.zone";

};

DR跨網絡模式 07 dns 02 named.rfc1912.zones.jpg

vim /var/named/wind.com.zone  #添加以下內容

$TTL 1D

@       IN SOA   dns1.wind.com. admin.wind.com. (

                                        1       ; serial

                                        1D      ; refresh

                                        1H      ; retry

                                        1W      ; expire

                                        3H )    ; minimum

        NS      dns1.wind.com.

dns1    A       172.20.61.3

www     A       10.0.0.100

DR跨網絡模式 07 dns 03 wind.com.zone.jpg

systemctl restart named  #啓動DNS服務

dig www.wind.com @127.0.0.1  #本地自己查詢DNS成功

DR跨網絡模式 07 dns 04 本地自詢成功.jpg 

8、客戶端client

hostname client  #爲便於演示,更改一下主機名

配置IP172.20.61.2/16(橋接網卡),網關GATEWAY172.20.61.4(路由器router

vim /etc/resolv.conf  #配置DNS,清空並只留一行

       nameserver 172.20.61.3

dig www.wind.com  #查詢www.wind.comIP地址成功

DR跨網絡模式 08 client 01 dig成功.jpg

打開火狐瀏覽器,輸入www.wind.com,打開wordpress主頁成功

DR跨網絡模式 08 client 02 打開wordpress首頁成功.jpg

 

四、lvs負載均衡測試

1、在web服務器rs1rs2上分別清空http訪問日誌

DR跨網絡模式 09 測試 01 清空httpd日誌.jpg

2、在客戶機上打開wordpress主頁,多點幾次刷新

DR跨網絡模式 09 測試 02 client上刷新網頁10次.jpg

3、在兩臺web服務器上查看http訪問日誌,發現兩臺都收到了http請求,實驗成功

DR跨網絡模式 09 測試 03 兩臺機上都收到了http請求.jpg

實驗結束

  

FireWall Mark

FWMFireWall Mark

MARK target 可用於給特定的報文打標記

--set-mark value

其中:value 可爲0xffff格式,表示十六進制數字

藉助於防火牆標記來分類報文,而後基於標記定義集羣服務;可將多個不同的應用使用同一個集羣服務進行調度

實現方法:

Director主機打標記:

iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports $port1,$port2,… -j MARK --set-mark NUMBER

Director主機基於標記定義集羣服務:

ipvsadm -A -f NUMBER [options]

 

例:

Director主機:

iptables -t mangle -A PREROUTING -d 10.0.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 10

ip addr add 10.0.0.100/32 dev lo:0

ipvsadm -A -f 10 -s rr

ipvsadm -a -f 10 -r 192.168.30.6 -g

ipvsadm -a -f 10 -r 192.168.30.7 -g

curl http://10.0.0.100/; curl -k https://10.0.0.100/;,則會在192.168.30.6192.168.30.7上輪詢,實現了httphttps同一個集羣

 

持久連接

session 綁定:對共享同一組RS的多個集羣服務,需要統一進行綁定,lvs sh算法無法實現

持久連接( lvs persistence )模板:實現無論使用任何調度算法,在一段時間內(默認360s ),能夠實現將來自同一個地址的請求始終發往同一個RS

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

持久連接實現方式:

每端口持久(PPC):每個端口對應定義爲一個集羣服務,每集羣服務單獨調度

每防火牆標記持久(PFWMC):基於防火牆標記定義集羣服務;可實現將多個端口上的應用統一調度,即所謂的port Affinity

每客戶端持久(PCC):基於0端口(表示所有服務)定義集羣服務,即將客戶端對所有應用的請求都調度至後端主機,必須定義爲持久模式(表示客戶端訪問VIP任何端口都會調度到後端的同一端口,如223306,表示把所有端口都發布了出去,不要做)

ipvsadm -A -t 10.0.0.100:0

 

例:

ip addr add 10.0.0.100/32 dev lo:0

ipvsadm -A -f 10 -s rr -p

  


LVS高可用性

1 Director不可用,整個系統將不可用;SPoF Single Point of Failure

解決方案:高可用

keepalived heartbeat/corosync

2 RS不可用時,Director依然會調度請求至此RS

解決方案: Director對各RS健康狀態進行檢查,失敗時禁用,成功時啓用

keepalived heartbeat/corosync ldirectord

檢測方式:

(a) 網絡層檢測,icmp

(b) 傳輸層檢測,端口探測

(c) 應用層檢測,請求某關鍵資源

RS全不用時:backup server, sorry server

       ipvsadm -a -f 10 -r 127.0.0.1

檢查可以寫個死循環腳本, 5秒檢查一次:

#!/bin/bash

#FileName: checkrs.sh

while true; do

       curl RIP1 &> /dev/null || ipvsadm -d -t VIP:PORT -r RIP1

       curl RIP2 &> /dev/null || ipvsadm -d -t VIP:PORT -r RIP2

       sleep 5

done;

 

ldirectord

ldirectord:監控和控制LVS守護進程,可管理LVS規則

包名:ldirectord-4.1.1-1.fc29.1.x86_64.rpm 光盤源和EPEL源都沒有,要從網上下載:

http://www.rpmfind.net/linux/fedora/linux/development/rawhide/Everything/x86_64/os/Packages/l/ldirectord-4.1.1-1.fc29.1.x86_64.rpm

安裝:yum -y install ldirectord-4.1.1-1.fc29.1.x86_64.rpm

文件:

/etc/ha.d/ldirectord.cf 主配置文件

/usr/share/doc/ldirectord-3.9.6/ldirectord.cf 配置模版

/usr/lib/systemd/system/ldirectord.service 服務

/usr/sbin/ldirectord 主程序

/var/log/ldirectord.log 日誌

/var/run/ldirectord.ldirectord.pid pid文件

 

Ldirectord配置文件示例

cp /usr/share/doc/ldirectord-3.9.6/ldirectord.cf /etc/ha.d/ldirectord.cf

vim /etc/ha.d/ldirectord.cf

checktimeout=3

checkinterval=1

autoreload=yes

logfile="/var/log/ldirectord.log"    #日誌文件

quiescent=no                                  #downyes權重設爲0no爲刪除

virtual=10.0.0.100:80                                          #指定VSFWMIPport

              real=192.168.30.6:80 gate 2  #gate表示dr模式,後邊數字表示權重

              real=192.168.30.7:80 gate 1

              fallback=127.0.0.1:80 gate      #sorry server

              service=http

              scheduler=wrr

              #protocal=fwm

              checktype=negotiate

              checkport=80

              request="index.html"

              receive=“Test Ldirectord"  #訪問index.html時若沒有出現Test Ldirectord字樣則視爲該機已經down

Ldirectord 01 ldirectord.cf.jpg

systemctl enable ldirectord  #設爲開機啓動

vim /etc/rc.d/rc.local  #把添加VIP的語句添加到/etc/rc.d/rc.local中,或者寫進網卡配置文件裏

systemctl start ldirectord  #啓動服務後,ipvs規則會自動添加

Ldirectord 02 啓動服務後,ipvs規則會自動添加.jpg

在客戶機上訪問web服務,看到兩臺web服務器RS1RS22:1的權重被訪問,符合配置

Ldirectord 03 在客戶端上訪問web服務器2比1輪詢.jpg

RS服務器宕機後,ipvs規則會馬上自動刪除,RS服務器修復一臺後,會馬上添加ipvs規則

Ldirectord 04 down並up一臺RS.jpg

RS服務器全宕了的話,會顯示sorry server

需事先在lvs本機上安裝httpd服務

yum -y install httpd

echo sorry server > /var/www/html/index.html

systemctl start httpd

Ldirectord 05 sorry server.jpg

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章