負載均衡(LVS DR模式搭建,DR只用一個公網ip,Keepalived+LVS DR)
準備工作
三臺機器:
分發器,dir:192.168.52.100
rs1:192.168.52.101 (網關改回來,之前nat模式改成100)
rs2: 192.168.52.102 (網關改回來,之前nat模式改成100)
vip:192.168.52.200 (這個虛擬ip需要綁定在每臺機器上)
分發器dir上:
[root@congji ~]# iptables -F
[root@congji ~]# vim /usr/local/sbin/lvs.dr.sh
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/usr/sbin/ipvsadm
vip=192.168.52.200
rs1=192.168.52.101
rs2=192.168.52.102
#註意這裏的網卡名字
ifdown ens33
ifup ens33
ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev ens33:2
$ipv -C
$ipv -A -t $vip:80 -s wrr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
[root@congji ~]# sh /usr/local/sbin/lvs.dr.sh
成功斷開設備 'ens33'。
成功激活的連接(D-Bus 激活路徑:/org/freedesktop/NetworkManager/ActiveConnection/1)
rs1:192.168.52.101和rs2:192.168.52.102都執行以下腳本
[root@zhuji ~]# vim /usr/local/sbin/lvs_rs.sh
#/bin/bash
vip=192.168.52.200
#把vip綁定在lo上,是為了實現rs直接把結果返回給客戶端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作為更改arp內核參數,目的是為了讓rs順利發送mac地址給客戶端
#參考文檔www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
[root@zhuji ~]# sh /usr/local/sbin/lvs_rs.sh
測試:DR模式是沒有辦法用瀏覽器顯著的看出結果,也不能用rs1,rs2訪問,因為vip綁定在lo上,他們會默認訪問自己,最好的辦法就是從新開啟一個虛擬機,ip設置在同一網段,用curl查看。
二、DR模式只用一個IP實現
在前面加一個路由器,原理就是讓 路由器把所有的80端口請求都分給VIP,分發器再分給每個web服務器,而web服務器處理完請求後跟客戶連接就不走分發器了,直接通過路由器去外網了,這樣就實現了只用一個公網IP也能用DR模式
先從內網找了三臺服務器分別是:
192.168.1.166 web1
192.168.1.167 web2
192.168.1.160 分發器
192.168.1.169 VIP
192.168.1.1 路由器內網ip(網關) 路由器是隨便找的一臺tplink adal路由器,湊合著測試用的
211.83.113.119 路由器的WAN口IP (隨便蒙的,重復莫怪)
先安裝ipvsadm 直接yum install ipvsadm就行了,不多說
分發器上的設置
global_defs {
notification_email {
}
notification_email_from [email protected]
smtp_server smtp.qq.com
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_sync_group VG1 {
group{
VI_1
}
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 33210
}
virtual_ipaddress {
192.168.1.169
}
virtual_server 192.168.1.169 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.1.166 80 {
weight 1
inhibit_on_failure
TCP_CHECK {
connect_timeout 5
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.1.167 80 {
weight 1
inhibit_on_failure
TCP_CHECK {
connect_timeout 5
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
配置文件寫完了,然後就是
mkdir /etc/keepalived #系統默認會到這裏去找配置文件
cp /usr/local/keepalive/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalive/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalive/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalive/sbin/keepalived /bin/ #將可執行程序放入sbin 或者 bin目錄裏
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
保存退出 後執行sysctl -p
route add defaule gw 192.168.1.1 把路由內網地址添加為默認網關
web服務器設置
兩臺web服務器也要修改 /etc/sysctl.conf 修改內容如下
vim /etc/sysctl.conf
# LVS
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
sysctl -p
之後還要增加vip
ifconfig lo:1 192.168.1.169 netmask 255.255.255.255 別忘了加到rc.local裏面
route add defaule gw 192.168.1.1 把路由內網地址添加為默認網關
路由器設置
路由器的設置沒什麽好說的,除了上網設置以外還要做一個端口映射,就是把80端口映射到 vip上也就是192.168.1.169
現在啟動keepalived吧
/etc/init.d/keepalived start
開始的時候比較慢,大概1分鐘後系統日誌裏面出現下面這條記錄就OK了
avahi-daemon[3012]: Registering new address record for 192.168.1.169 on eth0
我們訪問一下 http://211.83.113.119
我把我們的應用程序放到了上面跑了一下,呵呵測試成功
ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.169:80 rr
-> 192.168.1.166:80 Route 1 5 6
-> 192.168.1.167:80 Route 1 3 9
後來遇到了一個問題,由於這套應用處在一個大網站的後臺,所以大部分的請求都來自同一個IP地址,而有一部分程序需要給每個連接做session粘滯,
這樣我就不能用lvs 的-p參數來設置ip粘滯時間,如果用lvs的粘滯時間的話大部分的請求都將分給同一臺web服務器(註意:這裏是session粘滯而不是IP粘滯),
lvs可做不到這點,怎麽辦呢?
在cu論壇上詢問後得知有很多朋友做過類似的項目,他們的解決辦法是 將session共享,共享到什麽地方就有很多選擇了
我們是把所有web服務器的php session都給memcached ,這樣你不管分發器把 ip連接分給哪個web服務器都不會有問題了,配置方法很簡單,就在php的配置文件內
增加一條語句就可以了,不過前提你需要裝好memcache模塊
[Session]
; Handler used to store/retrieve data.
session.save_handler = memcache
session.save_path = "tcp://192.168.1.161:11213"
三、keepalived + LVS DR
1.完整架構需要兩臺分發器(角色為dir),兩臺dir上要安裝keepalived軟件,目的是實現高可用,但keepalived本身也有負載均衡的功能,所以當一臺分發器宕機後,不會影響工作,本次實驗裝一臺Keeplived
2.keepalived內置了ipvsadm的功能,所以不需要暗轉ipvsadm包,也不用編寫和執行dir上的腳本,但是兩臺rs上的腳本還是要編寫和執行的。
3.keepalived有一個較好的功能,如果後臺一臺rs宕機,便不會再把請求發送過去。
4.在進行實驗之前,需要執行2條命令,把之前ipvsadm規則清空掉,重新加載網卡,把之前設置的vip清空掉。
[root@congji ~]# ipvsadm -C
[root@congji ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@congji ~]# systemctl restart network
配置:
編寫dir上keepalived的配置文件如下:
vrrp_instance VI_1 {
#備用服務器上為 BACKUP
state MASTER
#綁定vip的網卡為ens33,你的網卡可能不一樣
interface ens33
virtual_router_id 51
#備用服務器上為90
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux
}
#設置vip
virtual_ipaddress {
192.168.52.200
}
}
virtual_server 192.168.52.200 80 {
#(每隔10秒查詢realserver狀態)
delay_loop 10
#(lvs 算法)
lb_algo rr
#(DR模式)
lb_kind DR
#(同一IP的連接60秒內被分配到同一臺realserver)
persistence_timeout 60
#(用TCP協議檢查realserver狀態)
protocol TCP
real_server 192.168.52.101 80 {
#(權重)
weight 100
TCP_CHECK {
#(10秒無響應超時)
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.52.102 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
配置兩臺rs的配置文件如下:
rs1:192.168.52.101和rs2:192.168.52.102都執行以下腳本
[root@zhuji ~]# vim /usr/local/sbin/lvs_rs.sh
#/bin/bash
vip=192.168.52.200
#把vip綁定在lo上,是為了實現rs直接把結果返回給客戶端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作為更改arp內核參數,目的是為了讓rs順利發送mac地址給客戶端
#參考文檔www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
[root@zhuji ~]# sh /usr/local/sbin/lvs_rs.sh
測試:在dir上啟動keepalived,查看Ipvsadm的規則。和LVS DR模式一樣,需要配置一臺同網段的虛擬機測試,瀏覽器看不出結果。
[root@congji ~]# systemctl start keepalived
[root@congji ~]# 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.52.200:80 rr persistent 60
-> 192.168.52.101:80 Route 100 0 0
-> 192.168.52.102:80 Route 100 0 0
負載均衡(LVS DR模式搭建,DR只用一個公網ip,Keepalived+LVS DR)