第十七章 Linux叢集架構(二)
八、LVS DR模式搭建
九、keepalived + LVS
十、擴充套件
八、LVS DR模式搭建
實驗環境
三臺虛擬機器,都需要關閉firewalld服務, 並且安裝iptables-serives服務, 啟動iptables服務,並清空iptables規則
分發器,也叫排程器(簡寫為dir)
主機名:lvs-lb
內網:192.168.239.133
主機名:rs1
內網:192.168.239.137
主機名:rs2
內網:192.168.239.139
最好再加一臺,作為client測試時使用。 IP:192.168.239.128
修改nginx預設主頁的內容為IP地址,方便測試時判斷。
DR模式比NAT模式多了一個VIP,虛擬IP ,分發器和 rs 都需要繫結這個VIP
VIP:192.168.239.111
1. 在三臺虛擬機器上停用firewalld,啟用iptables
//停用firewalld
systemctl stop firewalld
systemctl disable firewalld
//如果未安裝iptables,用yum安裝一下
yum -y install iptables-services
systemctl start iptables-services
//清空、儲存規則
iptables -F; service iptables save
2. 在分發器上安裝ipvsdam
[[email protected] ~]# yum install -y ipvsdam
3. 在director上配置指令碼,vim /usr/local/sbin/lvs_nat.sh 內容如下
[[email protected] ~]# vim /usr/local/sbin/lvs_dr.sh
#! /bin/bash
#開啟轉發
echo 1 > /proc/sys/net/ipv4/ip_forward
# 設定變數
ipv=/usr/sbin/ipvsadm
vip=192.168.239.111
rs1=192.168.239.137
rs2=192.168.239.139
# 繫結VIP ,注意這裡的網絡卡名字,需要用自己的網絡卡名
ifdown ens33
ifup ens33
ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up
#設定路由
route add -host $vip dev ens33:2
# 配置LVS規則
$ipv -C
$ipv -A -t $vip:80 -s wrr # 加權輪循模式的LVS虛擬伺服器
$ipv -a -t $vip:80 -r $rs1:80 -g -w 2 # -g 使用DR模式,-t 指定的IP為VIP ,權重為2
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
給指令碼賦予755許可權,執行指令碼,使用ipvsadm -ln 命令檢視ipvsadm規則
[[email protected] ~]# chmod 755 /usr/local/sbin/lvs_dr.sh
[[email protected] ~]# sh /usr/local/sbin/lvs_dr.sh
[[email protected] ~]# ipvsadm -L -n
4. 在兩個rs上配置指令碼,vim /usr/local/sbin/lvs_rs.sh 內容如下
[[email protected] ~]# vim /usr/local/sbin/lvs_rs.sh
#/bin/bash
vip=192.168.239.111
#把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地址給客戶端
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
給指令碼賦予755許可權,執行指令碼
[[email protected] ~]# vim /usr/local/sbin/lvs_rs.sh
[[email protected] ~]# chmod 755 /usr/local/sbin/lvs_rs.sh
[[email protected] ~]# sh /usr/local/sbin/lvs_rs.sh
5. 測試
當前採用的是rr排程演算法,2:1的權重輪循演算法測試結果OK
[[email protected] ~]# curl 192.168.239.111
九、keepalived + LVS
LVS可以實現負載均衡,但是不能夠進行健康檢查,如一個rs出現故障,LVS 仍然會把請求轉發給故障的rs伺服器,這就會導致請求的無效性。keepalive 軟體可以進行健康檢查,而且能同時實現 LVS 的高可用性,解決 LVS 單點故障的問題,其實 keepalive 就是為 LVS 而生的。
keepalived + LVS實驗環境說明:
完整架構需要兩臺伺服器(角色為dir)分別安裝keepalived軟體,目的是實現高可用,
但keepalived本身也有負載均衡的功能,所以本次實驗可以只安裝一臺keepalived
keepalived內建了ipvsadm的功能,所以不需要再安裝ipvsadm包,也不用編寫和執行那個lvs_dir的指令碼
分發器,也叫排程器(簡寫為dir)
主機名:lvs-lb
內網:192.168.239.133(安裝keepalived)
主機名:rs1
內網:192.168.239.137
主機名:rs2
內網:192.168.239.139
修改nginx預設主頁的內容為IP地址,方便測試時判斷。
VIP:192.168.239.111
1. dir上安裝keepalived
[[email protected] ~]# yum install keepalived -y
2. dir上編輯keepalived配置檔案 vim /etc/keepalived/keepalived.conf
內容參考:https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/lvs_keepalived.conf
[[email protected] ~]# vim /etc/keepalived/keepalived.conf
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 wenyang
}
virtual_ipaddress {
192.168.239.111
}
}
virtual_server 192.168.239.111 80 {
#(每隔10秒查詢realserver狀態)
delay_loop 10
#(lvs 演算法)
lb_algo wlc
#(DR模式)
lb_kind DR
#(同一IP的連線60秒內被分配到同一臺real server)
persistence_timeout 60
#(用TCP協議檢查realserver狀態)
protocol TCP
real_server 192.168.239.137 80 {
#(權重)
weight 100
TCP_CHECK {
#(10秒無響應超時)
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.239.139 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
##注意根據自己的ip來配置
3. 清空之前的ipvsadm規則和VIP
[[email protected] ~]# ipvsadm -C
[[email protected] ~]# systemctl restart network
#最好每個主機都執行一遍
兩臺rs上,依然要執行/usr/local/sbin/lvs_rs.sh指令碼
[[email protected] ~]# sh /usr/local/sbin/lvs_rs.sh
[[email protected] ~]# sh /usr/local/sbin/lvs_rs.sh
然後啟動dir上的keepalived:
[[email protected] ~]# systemctl start keepalived
[[email protected] ~]# ps -ef | grep keep
4. 測試
檢視ipvsadm規則,可以看到目前有兩臺 rs
[[email protected] ~]# ipvsadm -L -n
①模擬故障,關閉rs1上的nginx
[[email protected] ~]# netstat -lntp|grep 80
再次檢視 dir 上的 ipvsadm 規則,只有一臺 rs 的規則了。 可能需要過幾秒鐘才會有變化
在客戶端上訪問,結果正常,只是不會出現訪問192.168.239.137節點,一直訪問192.168.239.139節點
②重啟rs1上的nginx
[[email protected] ~]# /usr/local/nginx/sbin/nginx
再檢視 dir 的 ipvsadm規則,可以看到又有了兩臺 rs
在客戶端上訪問,結果正常,按照正常排程演算法訪問192.168.239.137和192.168.239.139
十、擴充套件
heartbeat和keepalived比較http://blog.csdn.net/yunhua_lee/article/details/9788433
DRBD工作原理和配置 http://502245466.blog.51cto.com/7559397/1298945
mysql+keepalived : http://lizhenliang.blog.51cto.com/7876557/1362313
lvs 三種模式詳解 http://www.it165.net/admin/html/201401/2248.html
lvs幾種演算法 http://www.aminglinux.com/bbs/thread-7407-1-1.html
關於arp_ignore和 arp_announce http://www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
lvs原理相關的 http://blog.csdn.net/pi9nc/article/details/23380589
haproxy+keepalived http://blog.csdn.net/xrt95050/article/details/40926255
nginx、lvs、haproxy比較 http://www.csdn.net/article/2014-07-24/2820837
keepalived中自定義指令碼 vrrp_script http://my.oschina.net/hncscwc/blog/158746
lvs dr模式只使用一個公網ip的實現方法 http://storysky.blog.51cto.com/628458/338726