本章內容
集羣概念
LVS介紹
LVS-NAT模式的實現
LVS-DR模式的實現
ldirectord
Cluster概念
系統擴展方式:
Scale UP:向上擴展,增強
Scale Out:向外擴展,增加設備,調度分配問題,Cluster
Cluster:集羣,爲解決某個特定問題將多臺計算機組合起來形成的單個系統
Linux 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%
HPC:High-performance computing,高性能 www.top500.org
分佈式系統:
分佈式存儲:雲盤
分佈式計算:hadoop,Spark
集羣和分佈式
Cluster分類
LB Cluster的實現
硬件
F5 Big-IP
Citrix Netscaler
A10 A10
軟件
lvs:Linux Virtual Server
nginx:支持七層調度
haproxy:支持七層調度
ats:apache traffic server,yahoo捐助
perlbal:Perl 編寫
pound
Cluster分類
基於工作的協議層次劃分:
傳輸層(通用):DPORT
LVS:
nginx:stream
haproxy:mode tcp
應用層(專用):針對特定協議,自定義的請求模型分類
proxy server:
http:nginx, httpd, haproxy(mode http), ...
fastcgi:nginx, httpd, ...
mysql:mysql-proxy, ...
Cluster相關
會話保持:負載均衡
(1) session sticky:同一用戶調度固定服務器
Source IP:LVS sh算法(對某一特定服務而言)
Cookie
(2) session replication:每臺服務器擁有全部session
session multicast cluster
(3) session server:專門的session服務器
Memcached,Redis
HA集羣實現方案
keepalived:vrrp協議
ais:應用接口規範
heartbeat
cman+rgmanager(RHCS)
coresync_pacemaker
LVS介紹
LVS:Linux 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概念
lvs集羣類型中的術語:
VS:Virtual Server,Director Server(DS)
Dispatcher(調度器),Load Balancer
RS:Real Server(lvs), upstream server(nginx)
backend server(haproxy)
CIP:Client 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:工作於內核空間netfilter的INPUT鉤子上的框架
lvs集羣的類型:
lvs-nat:修改請求報文的目標IP,多目標IP的DNAT
lvs-dr:操縱封裝新的MAC地址
lvs-tun:在原請求IP報文之外新加一個IP首部
lvs-fullnat:修改請求報文的源和目標IP
重點掌握nat和dr,tun和fullnat瞭解即可
lvs-nat模式
lvs-nat:
本質是多目標IP的DNAT,通過將請求報文中的目標地址和目標端口修改爲某挑出的RS的RIP和PORT實現轉發
(1)RIP和DIP應在同一個IP網絡,且應使用私網地址;RS的網關要指向DIP(RIP和DIP也可以不在同一個IP網絡,中間用路由器,不過一般不這麼做,因路由器帶寬有限 ;也可以不用私網地址,但沒必要,但對互聯網用戶來說不可見;如果用路由器的話,RS的網關要指向路由器)
(2)請求報文和響應報文都必須經由Director轉發,Director易於成爲系統瓶頸
(3)支持端口映射,可修改請求報文的目標PORT
(4)VS必須是Linux系統(因lvs集成在Linux內核中),RS可以是任意OS系統
NAT模式,VS能否只有一張網卡?是可以的,在單網卡上配兩個IP,VIP和DIP,DIP作爲RS的網關
VS/NAT的體系結構
NAT模式IP包調度過程
NAT模式
LVS-DR模式
LVS-DR:Direct Routing,直接路由,LVS默認模式,應用最廣泛,通過爲請求報文重新封裝一個MAC首部進行轉發,源MAC是DIP所在的接口的MAC,目標MAC是某挑選出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變
(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 --mangle-ip-s $RIP
在RS上修改內核參數以限制arp通告及應答級別(一般用這種方法)
/proc/sys/net/ipv4/conf/all/arp_ignore
/proc/sys/net/ipv4/conf/all/arp_announce
(3)RS的RIP可以使用私網地址,也可以是公網地址;RIP與DIP在同一IP網絡;RIP的網關不能指向DIP,以確保響應報文不會經由Director
(4)RS和Director要在同一個物理網絡
(5)請求報文要經由Director,但響應報文不經由Director,而由RS直接發往Client
(6)不支持端口映射(端口不能修改)
(7)RS可使用大多數OS系統
VS/DR體系結構
DR模式IP包調度過程
DR模式
lvs-tun模式
lvs-tun:
轉發方式:不修改請求報文的IP首部(源IP爲CIP,目標IP爲VIP),而在原IP報文之外再封裝一個IP首部(源IP是DIP,目標IP是RIP),將報文發往挑選出的目標RS;RS直接響應給客戶端(源IP是VIP,目標IP是CIP)
(1) DIP, VIP, RIP都應該是公網地址(DIP和RIP可以是私網地址,拉專線的話)
(2) RS的網關一般不能指向DIP
(3) 請求報文要經由Director,但響應不能經由Director
(4) 不支持端口映射
(5) RS的OS須支持隧道功能
可以跨異地
VS/TUN體系結構
TUN模式IP包調度過程
lvs-fullnat模式
lvs-fullnat:通過同時修改請求報文的源IP地址和目標IP地址進行轉發
CIP --> DIP
VIP --> RIP
(1) VIP是公網地址,RIP和DIP是私網地址,且通常不在同一IP網絡;因此,RIP的網關一般不會指向DIP
(2) RS收到的請求報文源地址是DIP,因此,只需響應給DIP;但Director還要將其發往Client
(3) 請求和響應報文都經由Director
(4) 支持端口映射
注意:此類型kernel默認不支持,需要從新編譯
可以跨異地
LVS工作模式總結
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頭實現轉發,支持遠距離通信
ipvs scheduler
ipvs scheduler:根據其調度時是否考慮各RS當前的負載狀態
分爲兩種:靜態方法和動態方法
靜態方法:僅根據算法本身進行調度
1、RR:roundrobin,輪詢
2、WRR:Weighted RR,加權輪詢
3、SH:Source Hashing,實現session sticky,源IP地址hash;將來自於同一個IP地址的請求始終發往第一次挑中的RS,從而實現會話綁定
4、DH:Destination Hashing;目標地址哈希,將發往同一個目標地址的請求始終轉發至第一次挑中的RS,典型使用場景是正向代理緩存場景中的負載均衡,如:寬帶運營商(基於VIP,而不是URL,因爲LVS只在4層以下起作用)
ipvs scheduler
動態方法:主要根據每RS當前的負載狀態及調度算法進行調度Overhead=value 較小的RS將被調度
1、LC:least connections 適用於長連接應用
Overhead=activeconns*256+inactiveconns
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算法,使用場景:根據負載狀態實現正向代理
6、LBLCR:LBLC with Replication,帶複製功能的LBLC
解決LBLC負載不均衡問題,從負載重的複製到負載輕的RS
LBLC和LBLCR一般也是電信運營商用得多一些
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
-f:firewall 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) RIP與DIP在同一IP網絡, RIP的網關要指向DIP
(2) 支持端口映射
(3) Director要打開核心轉發功能
實驗:NAT模型實現http負載均衡集羣
LVS-NAT模式下,RIP和DIP應在同一個IP網絡,且應使用私網地址,但RIP和DIP也可以不在同一個IP網絡,中間用路由器,這個實驗就來模擬增加路由器的情況。生產中沒有必要,僅實驗用。拓撲圖如下:
在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 #爲便於演示,更改一下主機名
IP:172.20.61.2/16(橋接網卡)
網關GATEWAY:172.20.61.3(lvs服務器) #可不配
2、lvs服務器
hostname lvs
IP1(VIP):172.20.61.3/16(橋接網卡)
IP2(DIP):192.168.0.3/24(VMnet6),網關GATEWAY:192.168.30.5(路由器)
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 #啓用IP包轉發
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
3、路由器
hostname router
IP1:192.168.0.5/24(VMnet6),網關GATEWAY:192.168.0.3(lvs服務器)
IP2:192.168.30.5/24(VMnet1)
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 #啓用IP包轉發
sysctl -p
4、web服務器rs1
hostname rs1
IP(RIP1):192.168.30.6/24(VMnet1),網關GATEWAY:192.168.30.5(路由器)
yum -y install httpd #安裝httpd服務
echo RS1 > /var/www/html/index.html
systemctl start httpd
curl 127.0.0.1 #自測http服務,啓動成功
5、web服務器rs2
hostname rs2
IP(RIP2):192.168.30.7/24(VMnet1),網關GATEWAY:192.168.30.5(路由器)
yum -y install httpd #安裝httpd服務
echo RS1 > /var/www/html/index.html
systemctl start httpd
curl 127.0.0.1 #自測http服務,啓動成功
最後,在客戶端訪問lvs服務器的80端口,發現RS1和RS2以2:1的比例輪詢,實驗成功
LVS-DR
DR模型中各主機上均需要配置VIP,解決地址衝突的方式有三種:
(1) 在前端網關做靜態綁定
(2) 在各RS使用arptables
(3) 在各RS修改內核參數,來限制arp響應和通告的級別
限制響應級別:arp_ignore
0:默認值,表示可使用本地任意接口上配置的任意地址進行響應
1: 僅在請求的目標IP配置在本地主機的接收到請求報文的接口上時,纔給予響應
限制通告級別:arp_announce
0:默認值,把本機所有接口的所有信息向每個接口的網絡進行通告
1:儘量避免將接口信息向非直接連接網絡進行通告
2:必須避免將接口信息向非本網絡進行通告
實驗:用LVS-DR實現基於NFS的wordpress的負載均衡
一、拓撲圖和環境說明
拓撲圖如下:
不算交換機的話,共需8臺虛擬機,wordpress的文件在NFS服務器上,共享給兩臺web服務器,wordpress的MySQL數據庫獨立在1臺MySQL服務器上,然後兩臺web服務器通過1臺lvs服務器實現負載均衡,由1臺服務器模擬的路由器連接外網,外網上模擬1臺客戶端通過DNS服務器解析訪問wordpress。
在VMware模擬的話,可以將172.20.0.0/16網段劃作一個VMnet,192.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(僅主機模式)。
本實驗的難點主要在於網絡環境搭建,對網絡熟悉一些做起來會容易些。接下來是實驗步驟:
二、準備兩個配置腳本
腳本里的變量按自己的環境情況修改:
1、RS的配置腳本
#!/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
2、VS的配置腳本
#!/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
三、配置各服務器
1、MySQL服務器
hostname mysql #爲便於演示,更改一下主機名
IP:192.168.30.9/24(VMnet1)
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字符集
systemctl start mariadb #啓動數據庫
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; #刷新數據庫權限
2、NFS服務器
hostname nfs #爲便於演示,更改一下主機名
IP:192.168.30.8/24(VMnet1)
mkdir /data
下載wordpress:https://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
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配置文件
vim /etc/exports #配置NFS服務,添加以下這一行
/data/wordpress 192.168.30.0/24(rw)
systemctl start nfs-server #啓動NFS服務
exportfs -r #重讀NFS配置文件,並共享目錄
exportfs -v #查看本機的所有NFS共享
3、web服務器rs1
hostname rs1
IP(RIP1):192.168.30.6/24(VMnet1),網關GATEWAY:192.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配置頁成功
填寫資料,點擊安裝wordpress,安裝完畢後登錄,進入主頁成功
配置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 #添加這行,以使腳本開機自動運行
4、web服務器rs2
按照web服務器rs1相同的方式再配置一遍
hostname rs2
IP(RIP2):192.168.30.7/24(VMnet1),網關GATEWAY:192.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主頁成功
配置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追加這行,以使腳本開機自動執行
5、lvs服務器
hostname lvs
IP:192.168.30.5/24(VMnet1),網關GATEWAY:192.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追加這行,以使腳本開機自動執行
6、路由器
hostname router
IP1:172.20.61.4/16(橋接網卡)
IP2:192.168.30.254/24(VMnet1)
IP2:2:10.0.0.200/8(VMnet1,跟192.168.30.254配在同一個網口上)
vim /etc/sysctl.conf #添加下面這一行,啓用IP包轉發
net.ipv4.ip_forward = 1
sysctl -p
7、DNS服務器
hostname dns
IP1:172.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; };
vim /etc/named.rfc1912.zones #添加如下內容
zone "wind.com" IN {
type master;
file "wind.com.zone";
};
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
systemctl restart named #啓動DNS服務
dig www.wind.com @127.0.0.1 #本地自己查詢DNS成功
8、客戶端client
hostname client #爲便於演示,更改一下主機名
配置IP:172.20.61.2/16(橋接網卡),網關GATEWAY:172.20.61.4(路由器router)
vim /etc/resolv.conf #配置DNS,清空並只留一行
nameserver 172.20.61.3
dig www.wind.com #查詢www.wind.com的IP地址成功
打開火狐瀏覽器,輸入www.wind.com,打開wordpress主頁成功
四、lvs負載均衡測試
1、在web服務器rs1和rs2上分別清空http訪問日誌
2、在客戶機上打開wordpress主頁,多點幾次刷新
3、在兩臺web服務器上查看http訪問日誌,發現兩臺都收到了http請求,實驗成功
實驗結束
FireWall Mark
FWM:FireWall 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.6和192.168.30.7上輪詢,實現了http和https同一個集羣
持久連接
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任何端口都會調度到後端的同一端口,如22或3306,表示把所有端口都發布了出去,不要做)
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 #down時yes權重設爲0,no爲刪除
virtual=10.0.0.100:80 #指定VS的FWM或IP:port
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了
systemctl enable ldirectord #設爲開機啓動
vim /etc/rc.d/rc.local #把添加VIP的語句添加到/etc/rc.d/rc.local中,或者寫進網卡配置文件裏
systemctl start ldirectord #啓動服務後,ipvs規則會自動添加
在客戶機上訪問web服務,看到兩臺web服務器RS1和RS2以2:1的權重被訪問,符合配置
RS服務器宕機後,ipvs規則會馬上自動刪除,RS服務器修復一臺後,會馬上添加ipvs規則
RS服務器全宕了的話,會顯示sorry server
需事先在lvs本機上安裝httpd服務
yum -y install httpd
echo sorry server > /var/www/html/index.html
systemctl start httpd