Q1、簡述lvs四種集群特點及使用場景
-
lvs-nat:修改請求報文的目標IP,多目標IP的DNAT
本質(zhì)是多目標IP的DNAT,通過將請求報文中的目標地址和目標端口修改為某挑出的RS的RIP和PORT實現(xiàn)轉(zhuǎn)發(fā)
(1)RIP和DIP應(yīng)在同一個IP網(wǎng)絡(luò),且應(yīng)使用私網(wǎng)地址;RS的網(wǎng)關(guān)要指向DIP
(2)請求報文和響應(yīng)報文都必須經(jīng)由Director轉(zhuǎn)發(fā),Director易于成為系統(tǒng)瓶頸
(3)支持端口映射,可修改請求報文的目標PORT
(4)VS必須是Linux系統(tǒng),RS可以是任意OS系統(tǒng)此集群類型的優(yōu)點在于RS可支持任意TCP/IP操作系統(tǒng),且僅需一個合法的公網(wǎng)Ip即可部署。
-
lvs-dr:操縱封裝新的MAC地址
LVS-DR:Direct Routing,直接路由,LVS默認模式,應(yīng)用最廣泛,通過為請求報文重新封裝一個MAC首部進行轉(zhuǎn)發(fā),源MAC是DIP所在的接口的MAC,目標MAC是某挑選出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目標IP/PORT均保持不變
(1) Director和各RS都配置有VIP
(2) 確保前端路由器將目標IP為VIP的請求報文發(fā)往Director(3)RS的RIP可以使用私網(wǎng)地址,也可以是公網(wǎng)地址;RIP與DIP在同一IP網(wǎng)絡(luò);RIP的網(wǎng)關(guān)不能指向DIP,以確保響應(yīng)報文不會經(jīng)由Director
(4)RS和Director要在同一個物理網(wǎng)絡(luò)
(5)請求報文要經(jīng)由Director,但響應(yīng)報文不經(jīng)由Director,而由RS直接發(fā)往Client
(6)不支持端口映射(端口不能修?。?br> (7)RS可使用大多數(shù)OS系統(tǒng) -
lvs-tun:在原請求IP報文之外新加一個IP首部
轉(zhuǎn)發(fā)方式:不修改請求報文的IP首部(源IP為CIP,目標IP為VIP),而在原IP報文之外再封裝一個IP首部(源IP是DIP,目標IP是RIP),將報文發(fā)往挑選出的目標RS;RS直接響應(yīng)給客戶端(源IP是VIP,目標IP是CIP)
(1) DIP, VIP, RIP都應(yīng)該是公網(wǎng)地址
(2) RS的網(wǎng)關(guān)一般不能指向DIP
(3) 請求報文要經(jīng)由Director,但響應(yīng)不經(jīng)由Director
(4) 不支持端口映射
(5) RS的OS須支持隧道功能 -
lvs-fullnat:修改請求報文的源和目標IP
lvs-fullnat:通過同時修改請求報文的源IP地址和目標IP地址進行轉(zhuǎn)發(fā)
CIP --> DIP
VIP --> RIP
(1) VIP是公網(wǎng)地址,RIP和DIP是私網(wǎng)地址,且通常不在同一IP網(wǎng)絡(luò);因此,RIP的網(wǎng)關(guān)一般不會指向DIP
(2) RS收到的請求報文源地址是DIP,因此,只需響應(yīng)給DIP;但Director還要將其發(fā)往Client
(3) 請求和響應(yīng)報文都經(jīng)由Director
(4) 支持端口映射
注意:此類型kernel默認不支持
Q2、描述LVS-DR工作原理,并配置實現(xiàn)。
-
LVS-DR工作原理:客戶端向目標vip發(fā)起請求,lvs接收 ,LVS根據(jù)負載均衡算法選擇一臺活躍的的節(jié)點,將此節(jié)點的ip所在網(wǎng)卡的mac地址作為目標mac地址,發(fā)送到局域網(wǎng)里節(jié)點在局域網(wǎng)中收到這個幀,拆開后發(fā)現(xiàn)目標IP(VIP)與本地匹配,于是處理這個報文.隨后直接返回數(shù)據(jù)給客戶端.此時IP包的目標ip是客戶端,源ip是自己的vip地址。
#環(huán)境:5臺機器,Client:172.16.0.6 Router:172.16.0.7、192.168.37.7、10.0.0.200(2塊網(wǎng)卡,一塊NAT,一塊僅主機) LVS:192.168.37.17、10.0.0.100 RS1:192.168.37.27、10.0.0.100 RS2:192.168.37.37、10.0.0.100 1、router配置 [root@router ~]# nmcli connection modify eth0 ipv4.addresses 192.168.37.7/24 ipv4.gateway 192.168.37.2 ipv4.method manual [root@router ~]# nmcli connection modify eth0 +ipv4.addresses 10.0.0.200/8 [root@router ~]# nmcli connection modify eth1 ipv4.addresses 172.16.0.7/24 ipv4.method manual [root@router ~]# nmcli connection up eth0 && nmcli connection up eth1 [root@router ~]# echo "eth0 eth1" | xargs -n1 ip address show 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:2d:71:b8 brd ff:ff:ff:ff:ff:ff inet 192.168.37.7/24 brd 192.168.37.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet 10.0.0.200/8 brd 10.255.255.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet6 fe80::85ff:45b3:efd3:c838/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:2d:71:c2 brd ff:ff:ff:ff:ff:ff inet 172.16.0.7/24 brd 172.16.0.255 scope global noprefixroute eth1 valid_lft forever preferred_lft forever inet6 fe80::a5dc:4f4a:e48e:f712/64 scope link noprefixroute valid_lft forever preferred_lft forever 2、LVS [root@lvs ~]# yum install ipvsadm -y [root@lvs ~]# iptables -t mangle -A PREROUTING -d 10.0.0.100 -p tcp --dport 80 -j MARK --set-mark 1 [root@lvs ~]# ipvsadm -A -f 1 -s wrr [root@lvs ~]# ipvsadm -a -f 1 -r 192.168.37.27 -g -w 1 [root@lvs ~]# ipvsadm -a -f 1 -r 192.168.37.37 -g -w 1 [root@lvs ~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn FWM 1 wrr -> 192.168.37.27:0 Route 1 0 0 -> 192.168.37.37:0 Route 1 0 0 [root@lvs ~]# ip address add 10.0.0.100/24 dev eth0 label eth0:0 [root@lvs ~]# vim /etc/sysctl.conf net.ipv4.ip_forward = 1 [root@lvs ~]# sysctl -p [root@lvs ~]# route del default [root@lvs ~]# route add default gw 192.168.37.7 3、配置RS1、RS2(相同部分) [root@rs1 ~]# yum install -y httpd [root@rs1 ~]# ip address add 10.0.0.100/32 dev lo label lo:0 [root@rs1 ~]# vim /etc/sysctl.conf net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 [root@rs1 ~]# sysctl -p [root@rs1 ~]# systemctl start httpd [root@rs1 ~]# route del default [root@rs1 ~]# route add default gw 192.168.37.7 [root@rs1 ~]# echo RS1 > /var/www/html/index.html #rs2 [root@rs2 ~]# echo RS2 > /var/www/html/index.html 4、client [root@centos6 ~]$ vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes BOOTPROTO=none NAME="eth0" IPADDR=172.16.0.6 PREFIX=24 GATEWAY=172.16.0.7 [root@centos6 ~]$ service network restart root@centos6 ~]$ while :;do curl 10.0.0.100;sleep 0.5;done RS1 RS2 RS1 RS2 RS1 RS2 RS1 RS2
Q3、實現(xiàn)LVS+Keepalived高可用。
#環(huán)境:6臺機器,Client:172.16.0.6 Router:172.16.0.7、192.168.37.7、10.0.0.200(2塊網(wǎng)卡,一塊NAT,一塊僅主機) LVS1:192.168.37.17、10.0.0.100 RS1:192.168.37.27、10.0.0.100 RS2:192.168.37.37、10.0.0.100 LVs2:192.168.37.47
1、LVS配置
#LVS1
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ssh-keygen
[root@lvs ~]# ssh-copy-id 192.168.37.47
[root@lvs ~]# yum install keepalived httpd -y
[root@lvs ~]# echo "192.168.37.17 lvs" >> /etc/hosts
[root@lvs ~]# echo "192.168.37.47 lvs2" >> /etc/hosts
[root@lvs ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from lvs@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id lvs
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_iptables
vrrp_mcast_group4 224.0.0.100
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 10
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
10.0.0.100/32 dev eth0 label eth0:0
}
track_interface {
eth0
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
virtual_server 10.0.0.100 80 {
delay_loop 5
lb_algo wrr
lb_kind DR
persistence_timeout 50
protocol TCP
sorry_server 127.0.0.1 80
real_server 192.168.37.27 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.37.37 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@lvs ~]# vim /etc/keepalived/notify.sh
#!/bin/bash
contact='root@localhost'
notify() {
mailsubject="$(hostname) to be $1, vip floating"
mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac
[root@lvs ~]# scp /etc/keepalived/notify.sh lvs2:/etc/keepalived/
[root@lvs ~]# scp /etc/keepalived/keepalived.conf lvs2:/etc/keepalived/
[root@lvs ~]# echo "Sorry Server 1" > /var/www/html/index.html
#LVS2
[root@lvs2 ~]# route del default
[root@lvs2 ~]# route add default gw 192.168.37.7
[root@lvs2 ~]# ssh-keygen
[root@lvs2 ~]# ssh-copy-id 192.168.37.37
[root@lvs2 ~]# yum install keepalived httpd -y
[root@lvs2 ~]# echo "192.168.37.17 lvs" >> /etc/hosts
[root@lvs2 ~]# echo "192.168.37.47 lvs2" >> /etc/hosts
[root@lvs2 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
...
router_id lvs2
...
}
vrrp_instance VI_1 {
state BACKUP
priority 80
...
}
[root@lvs ~]# echo "Sorry Server 2" > /var/www/html/index.html
#LV1、LV2啟動keepalived
systemctl start keepalived httpd
2、配置RS1、RS2(相同部分)
[root@rs1 ~]# yum install -y httpd
[root@rs1 ~]# ip address add 10.0.0.100/32 dev lo label lo:0
[root@rs1 ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@rs1 ~]# sysctl -p
[root@rs1 ~]# systemctl start httpd
[root@rs1 ~]# route del default
[root@rs1 ~]# route add default gw 192.168.37.7
[root@rs1 ~]# echo RS1 > /var/www/html/index.html
#rs2
[root@rs2 ~]# echo RS2 > /var/www/html/index.html
3、client測試
[root@centos6 ~]$ while :;do curl 10.0.0.100;sleep 0.5;done
#RS1、RS2分別停止服務(wù)
systemctl stop httpd
#lvs停止服務(wù)查看sorry情況
systemctl stop keepalived