1. 程式人生 > >負載均衡(LVS DR模式搭建,DR只用一個公網ip,Keepalived+LVS DR)

負載均衡(LVS DR模式搭建,DR只用一個公網ip,Keepalived+LVS DR)

manage 出現 backup wan ria 文件 重復 ipv4 簡單

一、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 {

[email protected]

}


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)