一、ipvs相關(guān)和安裝:
首先查看內(nèi)核ipvs相關(guān)
[root@C712 ~]# cd /boot
[root@C712 boot]# ls
config-3.10.0-693.el7.x86_64
[root@C712 boot]# grep -i 'ipvs' -C 10 config-3.10.0-693.el7.x86_64
.....
CONFIG_NETFILTER_XT_MATCH_IPVS=m #編譯到內(nèi)核
......
CONFIG_IP_VS_PROTO_TCP=y#對tcp支持
CONFIG_IP_VS_PROTO_UDP=y#對udp支持
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
#
# 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
[root@C712 boot]# yum install ipvsadm -y #安裝ipvsadm
ipvsadm:
- 程序包:ipvsadm
- Unit File: ipvsadm.service
- 主程序:/usr/sbin/ipvsadm
- 規(guī)則保存工具:/usr/sbin/ipvsadm-save
- 規(guī)則重載工具:/usr/sbin/ipvsadm-restore
- 配置文件:/etc/sysconfig/ipvsadm-config
ipvsadm命令:
核心功能:有兩個
1、集群服務(wù)管理:增、刪、改;
2、集群服務(wù)的RS管理:增、刪、改;
查看:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]#新增或修改一個集群服務(wù)
ipvsadm -D -t|u|f service-address#刪除一個集群服務(wù)
ipvsadm -C#清空所有的
ipvsadm -R#恢復(fù)和重載規(guī)則
ipvsadm -S [-n]#保存規(guī)則
ipvsadm -a|e -t|u|f service-address -r server-address [options]#向一個已有的集群服務(wù)添加或修改一個server
ipvsadm -d -t|u|f service-address -r server-address向一個已有的集群服務(wù)刪除一個server
ipvsadm -L|l [options]#查看集群服務(wù)
ipvsadm -Z [-t|u|f service-address]#清空計數(shù)器
二、管理集群服務(wù):增、改、刪;
1、管理集群服務(wù)增加和修改:
格式:ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
2、刪除:
格式:ipvsadm -D -t|u|f service-address
3、地址格式:
service-address:
-t|u|f:
-t: TCP協(xié)議的端口,VIP:TCP_PORT
-u: UDP協(xié)議的端口,VIP:UDP_PORT
-f:firewall MARK,是一個數(shù)字;
4、調(diào)度算法格式
[-s scheduler]:指定集群的調(diào)度算法,默認(rèn)為wlc;
三、管理集群上的RS:增、改、刪;
1、管理集群上的RS增加和修改:
格式:ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
2、管理集群上的RS刪除:
格式:ipvsadm -d -t|u|f service-address -r server-address
3、地址格式:
server-address:
rip[:port]:rip地址加端口
四、命令選項:
1、lvs類型:
-g: gateway, dr類型
-i: ipip, tun類型
-m: masquerade, nat類型
-w weight:權(quán)重;
2、清空定義的所有內(nèi)容:
ipvsadm -C
3、 查看:
ipvsadm -L|l [options]
--numeric, -n:numeric output of addresses and ports#數(shù)字格式顯示地址和端口,不要反解
--exact:expand numbers (display exact values)#精確顯示計數(shù)器的值
--connection, -c:output of current IPVS connections#當(dāng)前活動和非活動連接
--stats:output of statistics information#統(tǒng)計數(shù)據(jù)
--rate :output of rate information#速率
4、保存和重載:
ipvsadm -S = ipvsadm-save#保存
ipvsadm -R = ipvsadm-restore#重載
五、設(shè)計與實現(xiàn)
1、負(fù)載均衡集群設(shè)計時要注意的問題:
- (1) 是否需要會話保持;
- (2) 是否需要共享存儲;
- 共享存儲:NAS, SAN, DS(分布式存儲)
2、設(shè)計要點和環(huán)境:
設(shè)計要點:
(1) RIP與DIP在同一IP網(wǎng)絡(luò), RIP的網(wǎng)關(guān)要指向DIP;
(2) 支持端口映射;
(3) Director要打開核心轉(zhuǎn)發(fā)功能;
集群環(huán)境
實驗環(huán)境 四臺centos7虛擬機(jī),分別是vs調(diào)度器、rs1后端服務(wù)器、rs2后端服務(wù)器、client客戶端

rs1和rs2分別關(guān)閉防火墻,安裝httpd和telnet-server,更改ip地址,網(wǎng)關(guān)指向vs調(diào)度服務(wù)器的DIP網(wǎng)卡172.16.1.254
配置測試頁面:
[root@rs1 ~]# vim /var/www/html/test.html#rs1服務(wù)器
<h1>RS1 172.16.1.11</h1>
[root@rs1 ~]#systemctl start httpd
[root@rs2 ~]# vim /var/www/html/test.html#rs2服務(wù)器
<h1>RS2 172.16.1.12</h1>
[root@rs2 ~]#systemctl start httpd
并把虛擬機(jī)網(wǎng)絡(luò)連接模式改成僅主機(jī)模式,來模擬內(nèi)網(wǎng)環(huán)境。

vs調(diào)度服務(wù)器配置:
關(guān)閉防火墻和selinux,添加一個網(wǎng)卡

[root@vs ~]# nmtui#設(shè)置網(wǎng)卡命令
[root@vs ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.6 netmask 255.255.255.0 broadcast 192.168.1.255
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.1.254 netmask 255.255.255.0 broadcast 172.16.1.255
然后將ens37網(wǎng)卡設(shè)置成僅主機(jī)模式,使其與rs1、rs2同一網(wǎng)段:

3、實現(xiàn) LVS-NAT
[root@vs ~]# ipvsadm -A -t 192.168.1.6:80 -s rr #設(shè)置調(diào)度服務(wù)器規(guī)則,rr是輪詢調(diào)度
[root@vs ~]# 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.1.6:80 rr
[root@vs ~]# ipvsadm -a -t 192.168.1.6:80 -r 172.16.1.11 -m#把rs1服務(wù)器加入規(guī)則里
[root@vs ~]# ipvsadm -a -t 192.168.1.6:80 -r 172.16.1.12 -m#把rs1服務(wù)器加入規(guī)則里
[root@vs ~]# 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.1.6:80 rr
-> 172.16.1.11:80 Masq 1 0 0
-> 172.16.1.12:80 Masq 1 0 0
[root@vs ~]# sysctl -w net.ipv4.ip_forward=1#打開核心轉(zhuǎn)發(fā)
net.ipv4.ip_forward = 1
客戶端測試:
[root@bogon ~]# for i in {1..10}; do curl http://192.168.1.6/test.html;done
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
vs服務(wù)器端:
[root@vs ~]# ipvsadm -E -t 192.168.1.6:80 -s wrr#修改為加權(quán)輪詢模式
[root@vs ~]# ipvsadm -e -t 192.168.1.6:80 -r 172.16.1.12 -m -w 2#修改加權(quán)輪詢
[root@vs ~]# ipvsadm -e -t 192.168.1.6:80 -r 172.16.1.11 -m -w 3#修改加權(quán)輪詢
[root@vs ~]# 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.1.6:80 rr
-> 172.16.1.11:80 Masq 3 0 5
-> 172.16.1.12:80 Masq 2 0 5
客戶端測試:
[root@bogon ~]# for i in {1..10}; do curl http://192.168.1.6/test.html;done
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
[root@vs ~]# ipvsadm -E -t 192.168.1.6:80 -s sh #把來自于同一地址的ip發(fā)往同一個rs服務(wù)器
[root@vs ~]# ipvsadm -ln --stats#統(tǒng)計數(shù)據(jù)
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.1.6:80 32 192 128 16032 15424
-> 172.16.1.11:80 17 102 68 8517 8194
-> 172.16.1.12:80 15 90 60 7515 7230
[root@vs ~]# ipvsadm -ln -c#追蹤訪問源地址
IPVS connection entries
pro expire state source virtual destination
TCP 01:55 TIME_WAIT 192.168.1.10:34606 192.168.1.6:80 172.16.1.11:80
4、lvs-dr的實現(xiàn):

dr模型中,各主機(jī)上均需要配置VIP,解決地址沖突的方式有三種:
(1) 在前端網(wǎng)關(guān)做靜態(tài)綁定;
(2) 在各RS使用arptables;
(3) 在各RS修改內(nèi)核參數(shù),來限制arp響應(yīng)和通告的級別;
限制響應(yīng)級別:arp_ignore
0:默認(rèn)值,表示可使用本地任意接口上配置的任意地址進(jìn)行響應(yīng);
1: 僅在請求的目標(biāo)IP配置在本地主機(jī)的接收到請求報文接口上時,才給予響應(yīng);
限制通告級別:arp_announce
0:默認(rèn)值,把本機(jī)上的所有接口的所有信息向每個接口上的網(wǎng)絡(luò)進(jìn)行通告;
1:盡量避免向非直接連接網(wǎng)絡(luò)進(jìn)行通告;
2:必須避免向非本網(wǎng)絡(luò)通告;
- rs1和rs2分別關(guān)閉防火墻,安裝httpd和telnet-server,更改ip地址,網(wǎng)關(guān)指向路由器。
rs1服務(wù)器配置
配置測試頁面:
[root@rs1 ~]# vim /var/www/html/test.html#rs1服務(wù)器
<h1>RS1 172.16.1.11</h1>
[root@rs1 ~]# vim /var/www/html/phpinfo.php
<h1>RS1</h1>#rs1php測試信息頁
<?php
phpinfo();
?>
[root@rs1 ~]# vim setparam.sh#編輯腳本
#!/bin/bash
#
vip=192.168.1.99
mask='255.255.255.255'
case $1 in
start)#開始設(shè)置值
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 lo:0 $vip netmask $mask broadcast $vip up
route add -host $vip dev lo:0#設(shè)置本地地址廣播
;;
stop)#停止還原成0值
ifconfig lo:0 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
[root@rs1 ~]# bash -n setparam.sh #檢查腳本語法
[root@rs1 ~]# bash -x setparam.sh start#啟動腳本
+ vip=192.168.1.99
+ mask=255.255.255.255
+ case $1 in
+ echo 1
+ echo 1
+ echo 2
+ echo 2
+ ifconfig lo:0 192.168.1.99 netmask 255.255.255.255 broadcast 192.168.1.99 up
+ route add -host 192.168.1.99 dev lo:0
[root@rs1 ~]# scp setparam.sh 192.168.1.12:/tmp#把腳本傳給rs2服務(wù)器
[root@rs1 ~]#systemctl start httpd
rs2服務(wù)器配置
[root@rs2 ~]# vim /var/www/html/test.html#rs2服務(wù)器
<h1>RS2 172.16.1.12</h1>
[root@rs2 ~]# vim /var/www/html/phpinfo.php
<h1>RS2</h1>#rs2php測試信息頁
<?php
phpinfo();
?>
[root@rs2 ~]# cd /tmp
[root@rs2 tmp]# ls
setparam.sh
[root@rs2 tmp]# bash -x setparam.sh start#執(zhí)行腳本
+ vip=192.168.1.99
+ mask=255.255.255.255
+ case $1 in
+ echo 1
+ echo 1
+ echo 2
+ echo 2
+ ifconfig lo:0 192.168.1.99 netmask 255.255.255.255 broadcast 192.168.1.99 up
+ route add -host 192.168.1.99 dev lo:0
[root@rs2 ~]#systemctl start httpd
設(shè)置vs調(diào)度服務(wù)器:
[root@vs ~]# ifconfig ens33:0 192.168.1.99 netmask 255.255.255.255 broadcast 192.168.1.99 up#設(shè)置廣播地址
[root@vs ~]# ifconfig
.......
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.99 netmask 255.255.255.255 broadcast 192.168.1.99
ether 00:0c:29:8e:29:6a txqueuelen 1000 (Ethernet)
......
[root@vs ~]# yum -y install ipvsadm#安裝lvs
[root@vs ~]# ipvsadm -A -t 192.168.1.99:80 -s rr#設(shè)定輪詢規(guī)則
[root@vs ~]# 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.1.99:80 rr
[root@vs ~]# ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.11 -g#給規(guī)則加入rs1服務(wù)器
[root@vs ~]# ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.12 -g#給規(guī)則加入rs2服務(wù)器
[root@vs ~]# 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.1.99:80 rr
-> 192.168.1.11:80 Route 1 0 0
-> 192.168.1.12:80 Route 1 0 0
客戶端測試:
[root@bogon ~]# for i in {1..10}; do curl http://192.168.1.99/test.html;done
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>
<h1>RS2 172.16.1.12</h1>
<h1>RS1 172.16.1.11</h1>



