LVS:
LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集羣系統。
LVS集羣採用IP負載均衡技術和基於內容請求分發技術。調度器具有很好的吞吐率,將請求均衡地轉
移到不同的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、
高可用的虛擬服務器。整個服務器集羣的結構對客戶是透明的,而且無需修改客戶端和服務器端的程
序。爲此,在設計時需要考慮系統的透明性、可伸縮性、高可用性和易管理性。
其中,LVS有三種工作模式:
1、NAT模式(VS-NAT)
把客戶端發來的數據包的IP頭的目的地址,在負載均衡器上換成其中一臺RS的IP地址,併發至此RS
來處理,RS處理完成後把數據交給經過負載均衡器,負載均衡器再把數據包的原IP地址改爲自己的IP,將
目的地址改爲客戶端IP地址即可期間,無論是進來的流量,還是出去的流量,都必須經過負載均衡器
2、IP隧道模式(VS-TUN)
由於互聯網上的大多Internet服務的請求包很短小,而應答包通常很大,所以,隧道模式就是把客
戶端發來的數據包,封裝一個新的IP頭標記(僅目的IP)發給RS,RS收到後,先把數據包的頭解開,還原數據
包,處理後,直接返回給客戶端,不需要再經過負載均衡器注意,由於RS需要對負載均衡器發過來的數據包
進行還原,所以必須支持IPTUNNEL協議,因此在RS的內核中,必須要編譯IPTUNNEL這個選項。
3、直接路由模式(VS-DR)
負載均衡器和RS都使用同一個IP對外服務但只有DR對ARP請求進行響應,所有RS對本身這個IP的ARP
請求保持靜默也就是說,網關會把對這個服務IP的請求全部定向給DR,而DR收到數據包後根據調度算法,
找出對應的RS,把目的MAC地址改爲RS的MAC(因爲IP一致)並將請求分發給這臺RS這時RS收到這個數據
包,處理完成之後,由於IP一致,可以直接將數據返給客戶,則等於直接從客戶端收到這個數據包無異,
處理後直接返回給客戶端由於負載均衡器要對二層包頭進行改換,所以負載均衡器和RS之間必須在一個
廣播域,也可以簡單的理解爲在同一臺交換機上
keepalive:
簡單一點來說,keepalive就是一個在TCP中可以檢測死連接的機制。
搭建環境(CentOS 7)
拓撲圖如下:
說明:
主機 | ip | 角色 | |
LVS-1 | 10.0.0.11 | LVS-DR+keepalive (LVS主調度器) |
vip:10.0.0.100 |
LVS-2 | 10.0.0.12 | LVS-DR+keepalive (LVS從調度器) | |
web-1 | 10.0.0.13 | web服務器 | |
web-2 | 10.0.0.14 | web服務器 |
配置實驗環境:
1、先分別給各臺主機配好ip,關閉SELinux,在這裏我把防火牆也關閉了,爲防止時間不同步,我們也
可以同步一下時間。
##同步時間:
yum install -y ntpdate crontab -e * * * * * ntpdate -u 0.pool.ntp.org >> /dev/null
接下來就是開始安裝和配置服務了。
2、作爲web服務器的兩臺主機,我用yum的方式裝Apache作爲web服務器,這裏就不寫配置httpd服務的具體過程了(兩臺機的配置都是一樣的)。
##開啓路由轉發。
echo "1">/proc/sys/net/ipv4/ip_forward
##綁定VIP(如果不想每次重啓失效,可以選擇寫進網卡里)
ifconfig ens33:0 10.0.0.100 broadcast 10.0.0.100 netmask 255.255.255.255 up
##添加發送數據包到vip的路由
route add -host 10.0.0.100 dev ens33:0
##抑制ARP請求
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
到此web服務器就已經配置完畢了,接下來就是配置LVS調度器了。
3、LVS調度器的配置
兩臺LVS調度器除了keepalive配置文件和ip地址不一樣之外,其他配置都是一樣的。
##開啓路由轉發。
echo "1">/proc/sys/net/ipv4/ip_forward
##安裝相關軟件包
yum install -y keepalived ipvsadm
##配置keepalive(因爲keepalived是爲了lvs而生的,所以我們可以直接用keepalived直接配置lvs
的DR模型)
##主LVS調度器的keepalive配置文件 [root@lvs-1 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { ##全局設置 notification_email { ##設置報警郵件地址 root@localhost } notification_email_from root@localhost ##設置郵件的發送地址 smtp_server localhost smtp_connect_timeout 30 router_id LVS-1 ##表示該臺服務的ID } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 ##master和backup的id一致 priority 150 ##優先級,master的一定比backup的高 advert_int 1 ##master和backup之間的檢測時間 authentication { auth_type PASS ##認證方式 auth_pass 123456 ##認證密碼 } virtual_ipaddress { 10.0.0.100 ##設置vip } } virtual_server 10.0.0.100 80 { delay_loop 6 ##設置運行情況檢查時間,單位是秒 lb_algo rr ##負載算法,這裏是rr表示輪詢 lb_kind DR ##定義模式,這裏是Direct route persistence_timeout 0 ##會話保存時長(秒),0表示不使用stickyness會話 protocol TCP sorry_server 127.0.0.1 80 ##假如後端服務器都不能使用了,則訪問本機的80端口 real_server 10.0.0.13 80 { weight 1 HTTP_GET { ##以http模式檢查該服務器監控狀態 url { path /index.html ##檢測的網頁路徑 } connect_timeout 3 ##連接超時時間 nb_get_retry 3 ##重試次數 delay_before_retry 3 ##每次重試前等待延遲時間 } } real_server 10.0.0.14 80 { weight 1 HTTP_GET { url { path /index.html } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
##從LVS調度器的keepalive配置文件 [root@lvs-2 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { ##全局設置 notification_email { ##設置報警郵件地址 root@localhost } notification_email_from root@localhost ##設置郵件的發送地址 #smtp_server localhost #smtp_connect_timeout 30 router_id LVS-2 ##表示該臺服務的ID } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 ##master和backup的id一致 priority 100 ##優先級,master的一定比backup的高 advert_int 1 ##master和backup之間的檢測時間 authentication { auth_type PASS ##認證方式 auth_pass 123456 ##認證密碼 } virtual_ipaddress { 10.0.0.100 ##設置vip } } virtual_server 10.0.0.100 80 { delay_loop 6 ##設置運行情況檢查時間,單位是秒 lb_algo rr ##負載算法,這裏是rr表示輪詢 lb_kind DR ##定義模式,這裏是Direct route persistence_timeout 0 ##會話保存時長(秒),0表示不使用stickyness會話 protocol TCP sorry_server 127.0.0.1 80 ##假如後端服務器都不能使用了,則訪問本機的80端口 real_server 10.0.0.13 80 { weight 1 HTTP_GET { ##以http模式檢查該服務器監控狀態 url { path /index.html ##檢測的網頁路徑 } connect_timeout 3 ##連接超時時間 nb_get_retry 3 ##重試次數 delay_before_retry 3 ##每次重試前等待延遲時間 } } real_server 10.0.0.14 80 { weight 1 HTTP_GET { url { path /index.html } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
注:如果要配置非搶佔模式,則兩個都爲BACKUP: state BACKUP nopreempt ##這一句一定要加上去
4、啓動keepalive服務,由於主調度器的優先級比從調度器的要高,所以vip在主機LVS-1上。
主機LVS-1(主LVS調度器)
[root@lvs-1 ~]# systemctl restart keepalived
[root@lvs-1 ~]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2017-10-25 23:09:44 CST; 6s ago
Process: 1173 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 1174 (keepalived)
CGroup: /system.slice/keepalived.service
├─1174 /usr/sbin/keepalived -D
├─1175 /usr/sbin/keepalived -D
└─1176 /usr/sbin/keepalived -D
Oct 25 23:09:46 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100
Oct 25 23:09:46 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100
Oct 25 23:09:46 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100
Oct 25 23:09:46 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100
Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100
Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 10.0.0.100
Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100
Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100
Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100
Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100
[root@lvs-1 ~]# ip addr
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
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:1d:7a:63 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.11/24 brd 10.0.0.255 scope global ens33
valid_lft forever preferred_lft forever
inet 10.0.0.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::f87c:449f:eb4a:ba03/64 scope link
valid_lft forever preferred_lft forever
主機LVS-2(從LVS調度器)
[root@lvs-2 ~]# systemctl restart keepalived
[root@lvs-2 ~]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2017-10-25 23:13:46 CST; 2s ago
Process: 1189 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 1190 (keepalived)
CGroup: /system.slice/keepalived.service
├─1190 /usr/sbin/keepalived -D
├─1191 /usr/sbin/keepalived -D
└─1192 /usr/sbin/keepalived -D
Oct 25 23:13:46 lvs-2 Keepalived_healthcheckers[1191]: Activating healthchecker for service [10.0.0.100]:80
Oct 25 23:13:46 lvs-2 Keepalived_healthcheckers[1191]: Activating healthchecker for service [10.0.0.100]:80
Oct 25 23:13:46 lvs-2 Keepalived_vrrp[1192]: Registering Kernel netlink reflector
Oct 25 23:13:46 lvs-2 Keepalived_vrrp[1192]: Registering Kernel netlink command channel
Oct 25 23:13:46 lvs-2 Keepalived_vrrp[1192]: Registering gratuitous ARP shared channel
Oct 25 23:13:46 lvs-2 Keepalived_vrrp[1192]: Opening file '/etc/keepalived/keepalived.conf'.
Oct 25 23:13:46 lvs-2 Keepalived_vrrp[1192]: VRRP_Instance(VI_1) removing protocol VIPs.
Oct 25 23:13:46 lvs-2 Keepalived_vrrp[1192]: Using LinkWatch kernel netlink reflector...
Oct 25 23:13:46 lvs-2 Keepalived_vrrp[1192]: VRRP_Instance(VI_1) Entering BACKUP STATE
Oct 25 23:13:46 lvs-2 Keepalived_vrrp[1192]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]
[root@lvs-2 ~]# ip addr
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
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:76:bf:48 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.12/24 brd 10.0.0.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::8ec5:50ac:d71:20d7/64 scope link
valid_lft forever preferred_lft forever
inet6 fe80::f87c:449f:eb4a:ba03/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
5、正常訪問web網頁測試
在這裏我另外開了一臺虛擬機用來做訪問web服務的,當兩臺LVS調度器都正常的時候,能夠正常訪
問到web頁面
[root@localhost ~]# curl 10.0.0.100 It is web1 [root@localhost ~]# curl 10.0.0.100 It is web2 [root@localhost ~]# curl 10.0.0.100 It is web1 [root@localhost ~]# curl 10.0.0.100 It is web2 [root@localhost ~]# curl 10.0.0.100 It is web1 [root@localhost ~]# curl 10.0.0.100 It is web2
6、當把主LVS調度器(即主機LVS-1)的keepalive服務停掉了之後,我們可以看到vip飄到了從調度器
(主機LVS-2)上去了。
從LVS調度器(主機LVS-2)
[root@lvs-2 ~]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2017-10-25 23:13:46 CST; 13min ago
Process: 1189 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 1190 (keepalived)
CGroup: /system.slice/keepalived.service
├─1190 /usr/sbin/keepalived -D
├─1191 /usr/sbin/keepalived -D
└─1192 /usr/sbin/keepalived -D
Oct 25 23:27:10 lvs-2 Keepalived_vrrp[1192]: Sending gratuitous ARP on ens33 for 10.0.0.100
Oct 25 23:27:10 lvs-2 Keepalived_vrrp[1192]: Sending gratuitous ARP on ens33 for 10.0.0.100
Oct 25 23:27:10 lvs-2 Keepalived_vrrp[1192]: Sending gratuitous ARP on ens33 for 10.0.0.100
Oct 25 23:27:10 lvs-2 Keepalived_vrrp[1192]: Sending gratuitous ARP on ens33 for 10.0.0.100
Oct 25 23:27:15 lvs-2 Keepalived_vrrp[1192]: Sending gratuitous ARP on ens33 for 10.0.0.100
Oct 25 23:27:15 lvs-2 Keepalived_vrrp[1192]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 10.0.0.100
Oct 25 23:27:15 lvs-2 Keepalived_vrrp[1192]: Sending gratuitous ARP on ens33 for 10.0.0.100
Oct 25 23:27:15 lvs-2 Keepalived_vrrp[1192]: Sending gratuitous ARP on ens33 for 10.0.0.100
Oct 25 23:27:15 lvs-2 Keepalived_vrrp[1192]: Sending gratuitous ARP on ens33 for 10.0.0.100
Oct 25 23:27:15 lvs-2 Keepalived_vrrp[1192]: Sending gratuitous ARP on ens33 for 10.0.0.100
[root@lvs-2 ~]# ip addr
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
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:76:bf:48 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.12/24 brd 10.0.0.255 scope global ens33
valid_lft forever preferred_lft forever
inet 10.0.0.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::8ec5:50ac:d71:20d7/64 scope link
valid_lft forever preferred_lft forever
inet6 fe80::f87c:449f:eb4a:ba03/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
主LVS調度器(主機LVS-1)
[root@lvs-1 ~]# systemctl stop keepalived
[root@lvs-1 ~]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens33 for 10.0.0.100
Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100
Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100
Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100
Oct 25 23:09:51 lvs-1 Keepalived_vrrp[1176]: Sending gratuitous ARP on ens33 for 10.0.0.100
Oct 25 23:27:09 lvs-1 Keepalived[1174]: Stopping
Oct 25 23:27:09 lvs-1 systemd[1]: Stopping LVS and VRRP High Availability Monitor...
Oct 25 23:27:09 lvs-1 Keepalived_vrrp[1176]: VRRP_Instance(VI_1) sent 0 priority
Oct 25 23:27:09 lvs-1 Keepalived_vrrp[1176]: VRRP_Instance(VI_1) removing protocol VIPs.
Oct 25 23:27:10 lvs-1 systemd[1]: Stopped LVS and VRRP High Availability Monitor.
[root@lvs-1 ~]# ip addr
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
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:1d:7a:63 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.11/24 brd 10.0.0.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::f87c:449f:eb4a:ba03/64 scope link
valid_lft forever preferred_lft forever
當vip從主調度器飄到從調度器上時,還能正常訪問web頁面
[root@localhost ~]# curl 10.0.0.100 It is web1 [root@localhost ~]# curl 10.0.0.100 It is web2 [root@localhost ~]# curl 10.0.0.100 It is web1 [root@localhost ~]# curl 10.0.0.100 It is web2 [root@localhost ~]# curl 10.0.0.100 It is web1 [root@localhost ~]# curl 10.0.0.100 It is web2
這次有關LVS-DR+keepalive做高可用,實現負載均衡的實驗就寫到這了,如果有寫得不好的地方請
見諒!!!