18.11 LVS DR模式搭建html
18.12 keepalived + LVS DRlinux
擴展nginx
haproxy+keepalived http://blog.csdn.net/xrt95050/article/details/40926255git
nginx、lvs、haproxy比較 http://www.csdn.net/article/2014-07-24/2820837算法
keepalived中自定義腳本 vrrp_script http://my.oschina.net/hncscwc/blog/158746vim
lvs dr模式只使用一個公網ip的實現方法 http://storysky.blog.51cto.com/628458/338726後端
18.11 LVS DR模式搭建:瀏覽器
在實際的生產環境中用的最多的就是DR模式。緩存
NAT模式用的也不是不少,由於有一個瓶頸(10臺機器之內的網站規模,訪問量不是很大的狀況下,可使用NAT,好在他節省公網IP資源。)。對於小企業來說公網IP仍是要花錢的,因此用的IP少的話仍是佔優點的。bash
可是反過來說用這種DR模式,用了幾十臺服務器或者以上,你每一臺都要配置一個公網IP。這個就是很浪費IP資源的。尤爲是如今公網IP愈來愈珍惜,實際上還有一種方案,就是搭建一個內部的LVS。就是所有都用內網,包括VIP也用內網。而後公網作一個映射就能夠了。公網ip的80端口映射到內網的VIP的80端口。
DR模式搭建 – 準備工做:
~1.三臺機器
~2.分發器,也叫調度器(簡寫爲dir)
208.128
咱們只須要一個網卡,一個IP。把133的網段做爲一個公網IP。(NAT模式裏咱們把它做爲內網,如今把它做爲公網)
~3.rs1
208.130
~4.rs2
208.133
~5.vip
全部的機器都要綁定這個VIP
133.200
DR模式搭建:
~1.
dir上編寫腳本 vim /usr/local/sbin/lvs_dr.sh //內容以下
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward #打開端口轉發
ipv=/usr/sbin/ipvsadm #這是他的變量,如下也是
vip=192.168.208.200
rs1=192.168.208.132
rs2=192.168.208.133
#注意這裏的網卡名字
ifdown ens33 至關於重啓一下。會把以前命令行設置的IP清空掉。是由於若是再一次執行這個腳本,就不會重複的設置這個IP了
ifup ens33
ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up #這是綁定VIP的命令
#ifconfig ens33:2 $vip ifconfig這個命令是能夠給一個網卡設置虛擬網卡的。以上虛擬網卡的額名字叫ens33:2
#broadcast $vip broadcast是設置IP的命令
#route add -host $vip dev ens33:2 #添加網卡
$ipv -C #下面就是LVS ADM的規則。-C清空規則
$ipv -A -t $vip:80 -s rr #下面跟設置NAT模式是同樣的
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1 #-g就是DR模式
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
~2.
兩臺rs上也編寫腳本 vim /usr/local/sbin/lvs_rs.sh//內容以下
#/bin/bash
vip=192.168.133.200 #須要的VIP
#把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
~3.
分別在dir上和兩個rs上執行這些腳本
~4.
測試
實例:
DR模式搭建 – 準備工做:
咱們先把兩臺的rs機器的網關改回來(以前設置成了01的IP)
DR模式搭建:
[root@axinlinux-01 ~]# vim /usr/local/sbin/lvs_dr.sh #同樣要寫一個DR模式的腳本
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/usr/sbin/ipvsadm
vip=192.168.208.200
rs1=192.168.208.130
rs2=192.168.208.133
#注意這裏的網卡名字
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 rr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
[root@axinlinux-01 network-scripts]# sh /usr/local/sbin/lvs_dr.sh #阿鑫執行到這一步的時候,報錯了。是以前電腦重裝系統後設置的IP,仍是在以前的網卡(ens33:1)。刪掉就行了
[root@axinlinux-02 network-scripts]# vi /usr/local/sbin/lvs_rs.sh #02也要設置腳本
#/bin/bash
vip=192.168.133.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@axinlinux-03 ~]# vim /usr/local/sbin/lvs_dr.sh #03也要設置腳本
#/bin/bash
vip=192.168.133.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@axinlinux-02 ~]# route -n #查看是否有208.200的路由。要先sh一下這個腳本才能夠
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.208.2 0.0.0.0 UG 100 0 0 ens33
192.168.208.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.208.200 0.0.0.0 255.255.255.255 UH 0 0 0 lo
[root@axinlinux-02 ~]# ip add #查看是否設定了208.200這個IP
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.208.200/32 brd 192.168.208.200 scope global lo:0
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:0d:d6:92 brd ff:ff:ff:ff:ff:ff
inet 192.168.208.130/24 brd 192.168.208.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe0d:d692/64 scope link
valid_lft forever preferred_lft forever
[root@axinlinux-04 ~]# route -n #由於以前的03有點問題。又從新高了個04來替代
[root@axinlinux-04 ~]# ip add
以上檢查無誤。腳本表明已執行
測試:瀏覽器訪問
仍是有緩存,在瀏覽器上看不出來。在linux上curl也很差使的,由於在dir本機上綁定了VIP,訪問的話不就是訪問他本身嗎,這確定就不對啦。rs上也綁定了VIP,不能訪問這個VIP。最好的方法是在開一個虛擬機,設置成同一個網段
那麼會有一個疑問,平時客戶訪問不都是在瀏覽器上訪問嗎,這樣起不了負載均衡的做用啊。其實不用擔憂,當訪問量達到必定程度時,他更定是能負載均衡的。
還有一點,我們如今這個客戶端IP是同樣的,那就一個IP在訪問,更定會有特殊的緣由,致使一直請求到一臺機器上去。緩存也好最終得不到咱們想要的結果。當訪問量很大的時候,天然就能起到均衡的做用
咱們能夠看看這個:
[root@axinlinux-01 ~]# 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.208.200:80 rr 活動的鏈接 不活動的鏈接
-> 192.168.208.130:80 Route 1 1 0
-> 192.168.208.134:80 Route 1 0 1
正常的話,訪問量很大額時候,互動和不活動的鏈接都是1:1的效果
!!總結:LVS不管是NAT模式、DR模式、IPtunnel模式都是僅僅一個腳本就搞定了。不過須要注意的是,修改內核參數、打開端口轉發這些千萬不要忘。還有,NAT很關鍵的一點,必需要更改rs的網關爲dir的內網IP!!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18.12 keepalived + LVS DR:
再來看keepalived怎麼直線負載均衡的功能。在以前咱們說過,keepalived內置了LVS功能,那他是怎麼內置的呢,怎麼實現的呢,我到底用不用再去安裝ipvsadm呢。
先來分析一下,爲何須要keepalived,把keepalived加入到LVS來。目的是什麼呢。兩個緣由:
1.(分發器作高可用)
LVS有一個很關鍵的角色,就是分發器。那若是分發器宕機,那全部的訪問都會被終止。由於咱們的入口所有在dir上(在這個分發器上)。因此咱們要把這個分發器作一個高可用。以前咱們講了用keepalived能夠作高可用,因此keepalived放在這就很完美。而且他有負載均衡的做用。
2.(rs宕機不分發)
若是咱們在使用LVS,沒有其餘額外的操做的話。其中我把一個rs關機,他是會出問題的(當分發到這個關掉的rs上,就會顯示沒法鏈接)。那就是說LVS並不聰明,即便後端的一個rs宕機,他一樣的也會把請求轉發過去。那咱們keeplived出現就是爲了解決這個問題。當咱們後面的這個rs宕機,他也能保證服務正常提供,當請求分發過來的時候,他能自動檢測到後面的rs已經宕機,那這時候就不會把請求轉發到宕機的rs上去了
~1.完整架構須要兩臺服務器(角色爲dir)分別安裝keepalived軟件,目的是實現高可用。但本次實驗爲節省資源,就用一個keepalived去搭建負載均衡的功能,因此本次實驗能夠只安裝一臺keepalived
~2.keepalived內置了ipvsadm的功能,因此不須要再安裝ipvsadm包,也不用編寫和執行那個lvs_dir的腳本
~3.三臺機器分別爲:
dir(安裝keepalived)133.130
rs1 208.130
rs2 133.134
vip是208.200
~4.編輯keepalived配置文件 vim /etc/keepalived/keepalived.conf//內容請到https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/lvs_keepalived.conf 獲取
須要更改裏面的ip信息
~5.執行ipvsadm -C 把以前的ipvsadm規則清空掉
由於以前咱們設置過這個虛擬IP。-ln能夠看一下
~6.systemctl restart network 能夠把以前的vip清空掉
~7.systemctl keepalived start 啓動keepalived
~7.兩臺rs上,依然要執行/usr/local/sbin/lvs_rs.sh腳本
~8.keepalived有一個比較好的功能,能夠在一臺rs宕機時,再也不把請求轉發過去
測試
實例:
[root@axinlinux-01 ~]# 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 aminglinux
}
virtual_ipaddress {
192.168.208.200 #修改咱們設定的VIP
}
}
virtual_server 192.168.208.200 80 { #這裏的VIP也要修改
#(每隔10秒查詢realserver狀態)
delay_loop 10 # 檢測realserver是否正常。經過這個參數去控制他的頻率
#(lvs 算法)
lb_algo wlc #算法,到權重的最小連接
#(DR模式)
lb_kind DR #選擇模式,若是是NAT就寫NAT
#(同一IP的鏈接60秒內被分配到同一臺realserver)
persistence_timeout 0 #這個咱們能夠不用60,能夠改成0
#(用TCP協議檢查realserver狀態)
protocol TCP
real_server 192.168.208.130 80 { #這個就是rs是誰。端口若是監聽的是8080,就寫8080
#(權重)
weight 100
TCP_CHECK {
#(10秒無響應超時)
connect_timeout 10 #設置他的超時時間
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.208.134 80 { #這個是rs2。端口若是監聽的是8080,就寫8080
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
[root@axinlinux-01 ~]# systemctl start keepalived.service
[root@axinlinux-01 ~]# ps aux |grep keepalived
[root@axinlinux-01 ~]# ip add
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:87:42:24 brd ff:ff:ff:ff:ff:ff
inet 192.168.208.128/24 brd 192.168.208.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.208.200/32 brd 192.168.208.200 scope global ens33:2 再看看有沒有VIP
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe87:4224/64 scope link
valid_lft forever preferred_lft forever
[root@axinlinux-01 ~]# ipvsadm -C 清空之前設定的IP
[root@axinlinux-01 ~]# systemctl restart network
[root@axinlinux-01 ~]# ip add #能夠看到沒有那個VIP了
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:87:42:24 brd ff:ff:ff:ff:ff:ff
inet 192.168.208.128/24 brd 192.168.208.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe87:4224/64 scope link
valid_lft forever preferred_lft forever
[root@axinlinux-01 ~]# ipvsadm -ln #能夠看到就沒有規則了
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
兩臺rs要sh一下/usr/local/sbin/lvs_rs.sh的腳本
[root@axinlinux-01 ~]# systemctl start keepalived
[root@axinlinux-01 ~]# ps aux |grep keepalived
[root@axinlinux-01 ~]# ipvsadm -ln #要等一下才能夠。由於設定了10的檢測間隔
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.208.200:80 wlc
-> 192.168.208.130:80 Route 100 0 0
-> 192.168.208.134:80 Route 100 0 0
[root@axinlinux-04 ~]# systemctl stop nginx #咱們把一臺rs關掉(關掉核心nginx便可)
[root@axinlinux-04 ~]# ps aux |grep nginx
root 1475 0.0 0.0 112676 988 pts/0 S+ 23:40 0:00 grep --color=auto nginx
[root@axinlinux-01 ~]# ipvsadm -ln #而後回到分發器上看一下。結果04沒有了,這說明keeplaved有自動把宕機的rs踢出的功能
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.208.200:80 wlc
-> 192.168.208.130:80 Route 100 0 0 #這隻要看不到了,就說明把它踢掉了
[root@axinlinux-04 ~]# systemctl start nginx #在把它啓動。還能把它加回來
[root@axinlinux-04 ~]# ps aux |grep nginx
[root@axinlinux-01 ~]# 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.208.200:80 wlc
-> 192.168.208.130:80 Route 100 0 0
-> 192.168.208.134:80 Route 100 0 0
仍是沒法測試負載均衡的效果。由於瀏覽器緩存等的關係。訪問量越大越均衡
[root@axinlinux-01 ~]# 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.208.200:80 wlc
-> 192.168.208.130:80 Route 100 1 1
-> 192.168.208.134:80 Route 100 0 2