該服務涉及到的技術較多,相關技術文檔的具體解釋可以參考以下鏈接:
LVS 實現負載均衡原理及安裝配置詳解
keepalived雙機熱備理論+配置文件詳解
一、環境分析:
1、2個調度器和2個web節點使用同一個網段地址,可以直接和外網通信。爲了共享存儲的
安全性,一般將web節點和存儲服務器規劃到內網環境,所以web節點必須有兩個及以上
網卡的接口。
2、我這裏資源有限,也爲了配置方便,所以調度器和web節點分別只有兩個,在web訪問請
求量不大的情況下,足夠了,但是若訪問請求比較大,那麼最少要分別配置三個調度器和
web節點,如果只有兩個web節點的話,訪問量又比較大,那麼一旦有一個宕機了,那剩下
一個獨苗必定會因爲扛不住激增的訪問請求,而被打死。
3、準備系統映像,以便安裝相關服務。
4、自行配置防火牆策略和除了VIP之外的IP地址(我這裏直接關閉了防火牆)。
5、keepalived會自動調用IP_vs模塊,所以無需手動加載。
二、最終效果:
1、 客戶端多次訪問羣集的VIP,得到的是同一個網頁。
2、主調度器宕機後,羣集的VIP地址將會自動漂移到從(備份)調度器,此時,所有
的調度任務由從調度器進行分配。當主調度器恢復運行後,羣集的VIP地址會自動轉移回
主調度器,主調度器繼續工作,從調度器轉回備份狀態。
3、web節點宕機後,會被keepalived健康檢查功能檢測到,從而自動在web節點池中去除
宕機的節點,待web節點恢復運行後,會被自動添加到web節點池中。
三、開始搭建:
主調度器ip:200.0.0.1
從調度器ip: 200.0.0.2
web1ip:200.0.0.3
web2ip:200.0.0.4
1、配置主調度器
[root@LVS1 ~]# yum -y install keepalived ipvsadm #安裝所需工具
[root@LVS1 ~]# vim /etc/sysctl.conf #調整內核參數,寫入下面三行
.....................
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@LVS1 ~]# sysctl -p #刷新一下
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@LVS1 ~]# cd /etc/keepalived/
[root@LVS1 keepalived]# cp keepalived.conf keepalived.conf.bak #備份配置文件
[root@LVS1 keepalived]# vim keepalived.conf #編輯keepalived配置文件
#以下標註的行是需要進行更改的,沒有標註的行,保持默認即可
! Configuration File for keepalived
global_defs {
notification_email {
[email protected] #收件人地址(沒需要的話可以不做修改)
[email protected]
[email protected]
}
notification_email_from [email protected] #發件人姓名、地址(可不做修改)
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL1 #本服務器的名稱改一下,在羣集中所有調度器名稱裏必須唯一。
}
vrrp_instance VI_1 {
state MASTER #設置爲主調度器
interface ens33 #承載VIP地址的物理網卡接口根據實際情況改一下
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
200.0.0.100 #指定漂移IP地址(VIP),可以有多個。
}
}
virtual_server 200.0.0.100 80 { #改爲VIP地址及所需端口
delay_loop 6
lb_algo rr #根據需要改一下負載調度算法,rr表示輪詢。
lb_kind DR #設置工作模式爲DR(直接路由)模式。
! persistence_timeout 50 #爲了一會測試看到效果,將連接保持這行前加“ !”將該行註釋掉。
protocol TCP
real_server 200.0.0.4 80 { #一個web節點的配置,real_server 200.0.0.4 80 { ..... }是複製下面的。複製過來後,更改一下節點IP地址即可。
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 200.0.0.3 80 { #一個web節點的配置,改動完成後,有幾個節點就複製幾份real_serve 200.0.0.3 80 { ..... }到該行的上方,最好別往下面粘貼,以防大括號丟失。
weight 1
TCP_CHECK {
connect_port 80 #添加該行,以配置連接端口
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
#以下還有很多配置項,我這裏有98行,全部刪除即可,若不刪除時重啓服務可能報錯。
[root@LVS1 ~]# systemctl restart keepalived #重啓服務
[root@LVS1 ~]# systemctl enable keepalived #設置開機自啓動
2、配置從調度器
[root@LVS2 ~]# yum -y install ipvsadm keepalived #安裝所需工具
[root@LVS2 ~]# scp [email protected]:/etc/sysctl.conf /etc/
#將主調度器的/proc參數文件複製過來
[email protected] s password: #輸入主調度器的用戶密碼
sysctl.conf 100% 566 205.8KB/s 00:00
[root@LVS2 ~]# sysctl -p #刷新
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@LVS2 ~]# scp [email protected]:/etc/keepalived/keepalived.conf /etc/keepalived/
#將主調度器的keepalived配置文件複製過來,稍微改動即可。
[email protected] s password: #輸入主調度器的用戶密碼
keepalived.conf 100% 1053 2.5MB/s 00:00
[root@LVS2 ~]# vim /etc/keepalived/keepalived.conf #編輯複製過來的配置文件
#若兩臺服務器都是ens33網卡的話,那麼所需該的只有以下三項(其他項保持默認):
router_id LVS_DEVEL2 #將route_id改爲不一樣的。route_id必須是唯一的。
state BACKUP #狀態改爲BACKUP,注意大小寫。
priority 90 #優先級要比主調度器小,並且不可與其他備份調度器優先級衝突。
[root@LVS2 ~]# systemctl restart keepalived #啓動服務
[root@LVS2 ~]# systemctl enable keepalived #設置開機自啓動
#######需要部署多個從調度器,按照以上這個從(備份)調度器配置即可。
爲了測試,所以纔在每個web節點準備不同的網頁文件,以便測試是否有負載均衡的效果
3、配置web1節點:
[root@Web1 ~]# cd /etc/sysconfig/network-scripts/
[root@Web1 network-scripts]# cp ifcfg-lo ifcfg-lo:0 #複製一份迴環地址的配置文件
[root@Web1 network-scripts]# vim ifcfg-lo:0 #編輯迴環地址,以承載羣集的VIP。
DEVICE=lo:0 #更改網卡名稱
IPADDR=200.0.0.100 #配置羣集的VIP
NETMASK=255.255.255.255 #子網掩碼必須爲4個255。
ONBOOT=yes
#保留上面四行配置項即可,多餘的刪除。
[root@Web1 network-scripts]# ifup lo:0 #啓動迴環接口
[root@Web1 ~]# ifconfig lo:0 #查看VIP配置是否正確
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 200.0.0.100 netmask 255.255.255.255
loop txqueuelen 1 (Local Loopback)
[root@web1 ~]# route add -host 200.0.0.100 dev lo:0 #添加VIP本地訪問路由記錄
[root@web1 ~]# vim /etc/rc.local #設置開機自動,添加這條路由記錄
................................
/sbin/route add -host 200.0.0.100 dev lo:0
[root@web1 ~]# vim /etc/sysctl.conf #調整/proc響應參數,寫入下面六行
...................
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@web1 ~]# sysctl -p #刷新一下
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@web1 ~]# yum -y install httpd #安裝http服務
[root@Web1 ~]# echo 111111111111 > /var/www/html/index.html #準備測試網頁文件
[root@Web1 ~]# systemctl start httpd #啓動http服務
[root@Web1 ~]# systemctl enable httpd #設置開機自啓動
4、配置web2節點:
[root@web2 ~]## scp [email protected]:/etc/sysconfig/network-scrts/ifcfg-lo:0 /etc/sysconfig/network-scripts/
#複製web1節點的lo:0配置文件
The authenticity of host '200.0.0.3 (200.0.0.3)' can't be established.
ECDSA key fingerprint is b8:ca:d6:89:a2:42:90:97:02:0a:54:c1:4c:1e:c2:77.
Are you sure you want to continue connecting (yes/no)? yes #輸入yes
Warning: Permanently added '200.0.0.3' (ECDSA) to the list of known hosts.
[email protected]'s password: #輸入web1節點用戶的密碼
ifcfg-lo:0 100% 66 0.1KB/s 00:00
[root@Web2 ~]# ifup lo:0 #啓用lo:0
[root@Web2 ~]# ifconfig lo:0 #確認VIP無誤
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 200.0.0.100 netmask 255.255.255.255
loop txqueuelen 1 (Local Loopback)
[root@Web2 ~]# scp [email protected]:/etc/sysctl.conf /etc/ #複製內核文件
[email protected]'s password: #輸入web1節點用戶的密碼
sysctl.conf 100% 659 0.6KB/s 00:00
[root@Web2 ~]# sysctl -p #刷新一下
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@Web2 ~]# route add -host 200.0.0.100 dev lo:0 #添加VIP本地訪問路由記錄
[root@Web2 ~]# vim /etc/rc.local #設置開機自動,添加這條路由記錄
................................
/sbin/route add -host 200.0.0.100 dev lo:0
[root@web2 ~]# yum -y install httpd #安裝http服務
[root@Web2 ~]# echo 22222222222 > /var/www/html/index.html #準備測試網頁文件
[root@Web2 ~]# systemctl start httpd #啓動http服務
[root@Web2 ~]# systemctl enable httpd #設置開機自啓動
5、客戶端訪問測試:
#################若訪問到的是同一頁面,在排除配置上錯誤的情況下,可以打開多個網頁,或者稍等一會再刷新,因爲它可能有一個保持連接的時間,所以會存在延遲。
附上一些查看命令:
1)VIP在哪個調度器上,查詢該調度器承載VIP地址的物理接口,即可看到VIP地址(VIP地址在備份調度器上查不到的):
[root@LVS1 ~]# ip a show dev ens33 #查詢承載VIP地址的物理網卡ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> ate UP groupn 1000
link/ether 00:0c:29:77:2c:03 brd ff:ff:ff:ff:ff:ff
inet 200.0.0.1/24 brd 200.0.0.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 200.0.0.100/32 scope global ens33 #VIP地址。
valid_lft forever preferred_lft forever
inet6 fe80::95f8:eeb7:2ed2:d13c/64 scope link noprefixroute
valid_lft forever preferred_lft forever
2)查詢有哪些web節點:
[root@LVS1 ~]# ipvsadm -ln #查詢web節點池及VIP
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 200.0.0.100:80 rr
200.0.0.3:80 Route 1 0 0
200.0.0.4:80 Route 1 0 0
3)模擬Web2節點和主調度器宕機,並在備份調度器上再次查詢VIP以及web節點:
[root@LVS2 ~]# ip a show dev ens33 #可以看到VIP地址已經轉移到了備份調度器上
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP>
link/ether 00:0c:29:9a:09:98 brd ff:ff:ff:ff:ff:ff
inet 200.0.0.2/24 brd 200.0.0.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 200.0.0.100/32 scope global ens33 #VIP地址。
valid_lft forever preferred_lft forever
inet6 fe80::3050:1a9b:5956:5297/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@LVS2 ~]# ipvsadm -ln #Web2節點宕機後,就查不到了。
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 200.0.0.100:80 rr
-> 200.0.0.3:80 Route 1 0 0
#當主調度器或Web2節點恢復正常後,將會自動添加到羣集中,並且正常運行。
4)查看調度器故障切換時的日誌消息:
[root@LVS2 ~]# tail -30 /var/log/messages