Keepalived + Lvs 實作高可用負載均衡
- 前言
- 一、keepalived概述:
- 二、設計原理:
- 三、案例:keepalived 實作雙機熱備;
- 四、keepalived + lvs;
前言
一、keepalived概述:
概述:keepalived 起初為 Lvs 設計的一款強大的輔助工具,保證 Lvs 負載調度器的故障切換以及 web 節點的健康狀態檢查,后續被應用到很多需要容錯的場景下,keepalived 自身基于 VRRP 協議–虛擬路由冗余協議,思科公有協議;
二、設計原理:
應用場景:

設計模塊:
1.core 模塊:為 keepalived 的核心組件,負責主行程的啟動、維護以及全域組態檔的加載和決議;
2.check 模塊:負責 real server 節點池內的節點的健康檢測;
3.VRRP 模塊:在 master 與 backup 之間執行心跳檢測;
熱備實作程序: 將多個主機以軟體的方式組成一個熱備組,通過共有的虛擬ip(VIP)地址對外提供服務,同一時刻,熱備組中只有一臺主機在作業,別的主機冗余狀態,當當前在線的主機失效時,其他冗余的主機會自動接替虛擬ip地址,繼續提供服務,以保證架構的穩定性;
三、案例:keepalived 實作雙機熱備;
案例拓撲:


案例環境:
| 系統型別 | IP地址 | 主機名 | 所需軟體 |
|---|---|---|---|
| Centos 7.4 1708 64bit | 192.168.100.101 | node1.linuxyu.cn | keepalived+httpd |
| Centos 7.4 1708 64bit | 192.168.100.102 | node2.linuxyu.cn | keepalived+httpd |
案例步驟:
- 安裝 node1 節點上的 httpd 的服務;
- 安裝 node2 節點上的 httpd 的服務;
- 在兩臺 node 節點上安裝 keepalived 軟體程式(兩臺安裝步驟一致,在此只列出一臺);
- 配置 node1 上 master 主節點;
- 配置 node2 上 backup 從節點;
- 客戶端訪問測驗雙機熱備的效果;
- 擴展內容:上述步驟實作了 keepalived 在 real server
節點池中進行了四層健康檢測(傳輸層,基于協議或者埠),下邊展示 keepalived 如何對節點池中進行七層健康檢測(應用層);
1. 安裝 node1 節點上的 httpd 的服務;
安裝并啟動 httpd 服務
[root@node1 ~]# yum -y install httpd
[root@node1 ~]# echo "<h1>192.168.100.101</h1>" > /var/www/html/index.html
[root@node1 ~]# systemctl start httpd
[root@node1 ~]# systemctl enable httpd
[root@node1 ~]# netstat -anput |grep 80
tcp6 0 0 :::80 :::* LISTEN 2125/httpd
2. 安裝 node2 節點上的 httpd 的服務;
安裝并啟動 httpd 服務
[root@node2 ~]# yum -y install httpd
[root@node2 ~]# echo "<h1>192.168.100.102</h1>" > /var/www/html/index.html
[root@node2 ~]# systemctl start httpd
[root@node2 ~]# systemctl enable httpd
[root@node2 ~]# netstat -anput |grep 80
tcp6 0 0 :::80 :::* LISTEN 1119/httpd
3. 在兩臺 node 節點上安裝 keepalived 軟體程式(兩臺安裝步驟一致,在此只列出一臺);
安裝 keepalived 并備份 keepalived 主組態檔
[root@node1 ~]# yum -y install keepalived
[root@node1 ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
4. 配置 node1 上 master 主節點;
編輯 keepalived 主組態檔
[root@node1 ~]# echo '
global_defs {
router_id HA_TEST_R1
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 1
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.100.200
}
}
' > /etc/keepalived/keepalived.conf
router_id HA_TEST_R1 ##本服務器的名稱
vrrp_instance VI_1 { ##定義VRRP熱備實體
state MASTER ##MASTER表示主服務器
interface eth0 ##承載VIP地址的物理介面
virtual_router_id 1 ##虛擬路由器的ID號
priority 100 ##優先級,數值越大優先級越高
advert_int 1 ##通告間隔秒數(心跳頻率)
authentication { ##認證資訊
auth_type PASS ##認證型別
auth_pass 123456 ##密碼字串
}
virtual_ipaddress {
192.168.100.200 ##指定漂移地址(VIP)
啟動 keepalived 服務并查看 VIP 是否在此服務器
[root@node1 ~]# systemctl start keepalived
[root@node1 ~]# systemctl enable keepalived
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
[root@node1 ~]# ip a |grep 192.168.100.200
inet 192.168.100.200/32 scope global ens32
5. 配置 node2 上 backup 從節點;
編輯 keepalived 主組態檔
[root@node2 ~]# echo '
global_defs {
router_id HA_TEST_R2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 1
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.100.200
}
}
' > /etc/keepalived/keepalived.conf
router_id HA_TEST_R1 ##本服務器的名稱
state BACKUP ##表示從服務器
priority 90 ##優先級,低于主服務器
啟動 keepalived 服務并設定開機自啟
[root@node2 ~]# systemctl start keepalived
[root@node2 ~]# systemctl enable keepalived
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
6. 客戶端訪問測驗雙機熱備的效果;
此期間反復斷開、連接主服務器網卡進行查看,
6.1 客戶機ping 漂移ip進行測驗
ping 192.168.100.200 -t
如果有中斷很短時間即恢復,說明雙機熱備生效
6.2 客戶機 訪問http進行驗證
http://192.168.100.200
如果斷開主服務器重繪立刻顯示192.168.100.102的內容,恢復主服務器重繪頁面則顯示內容為192.168.100.101,說明雙機熱備生效
6.3 主、副服務器查看日志記錄
tail -f /var/log/messages
7. 擴展內容:上述步驟實作了 keepalived 在 real server
節點池中進行了四層健康檢測(傳輸層,基于協議或者埠),下邊展示 keepalived 如何對節點池中進行七層健康檢測(應用層);
示例:僅供參考(未經測驗,謹慎使用)
[root@node1 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id HA_TEST_R1
}
vrrp_script check_nginx{
script /etc/check_nginx.sh
interval 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 1
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.100.200
}
track_script{
check_nginx
}
}
virtual_server 192.168.100.200 80 {
protocol TCP
real_server 192.168.100.101 80 {
weight 3
}
}
script /etc/check_nginx.sh ##檢測腳本
interval 2 ##執行間隔時間
track_script{ ##在實體中參考腳本
check_nginx
}
virtual_server 192.168.100.200 80 { ##VIP 配置
protocol TCP ##選擇協議
real_server 192.168.100.101 80 { ##本機地址
weight 3 ##服務器權重
}
}
[root@node1 ~]# vim /etc/keepalived/check_nginx.sh
#!/bin/bash
Count1=`netstat -anput |grep -v grep |grep nginx |wc -l`
if [ $Count1 -eq 0 ]; then
/usr/local/nginx/sbin/nginx
sleep 2
Count2=`netstat -anput |grep -v grep |grep nginx |wc -l`
if [ $Count2 -eq 0 ]; then
/etc//init.d/keepalived start
else
exit 0
fi
四、keepalived + lvs;
實驗環境:
| 系統型別 | IP地址 | 主機名 | 所需軟體 |
|---|---|---|---|
| Centos 7.4 1708 64bit | 192.168.100.101 | kp1.linuxyu.cn | keepalived+ipvsadm |
| Centos 7.4 1708 64bit | 192.168.100.102 | kp2.linuxyu.cn | keepalived+ipvsadm |
| Centos 7.4 1708 64bit | 192.168.100.103 | web1.linuxyu.cn | httpd |
| Centos 7.4 1708 64bit | 192.168.100.104 | web2.linuxyu.cn | httpd |
實驗拓撲:

實驗程序:
在上面 keepalived 雙機熱備實驗基礎上進行更改
1、kp1 主調度器
[root@kp1 ~]# systemctl stop httpd
[root@kp1 ~]# systemctl disable httpd
[root@kp1 ~]# yum -y remove httpd
[root@kp1 ~]# netstat -anput | grep httpd
[root@kp1 ~]# yum -y install ipvsadm
[root@kp1 ~]# echo '
global_defs {
router_id HA_TEST_R1
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 1
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.100.200
}
}
virtual_server 192.168.100.200 80 {
delay_loop 15
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.100.103 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
}
}
real_server 192.168.100.104 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
}
}
}
' >/etc/keepalived/keepalived.conf
組態檔解釋
vrrp_instance VI_1 {
state MASTER 【主服務器】
interface eth3 【配置外網卡】
virtual_router_id 1【主從ID號要一致】
priority 100【優先級高優先】
advert_int 1【心跳數(秒)】
authentication { 【認證方式】
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { 【漂移ip即虛擬ip】
202.1.1.254
}
}
【vip、埠】
virtual_server 202.1.1.254 80 {
delay_loop 15【健康檢查間隔時間秒】
lb_algo rr【調度演算法】
lb_kind DR【群集作業模式】
! persistence_timeout 50【連接保持時間】
protocol TCP【應用服務采用的協議】
【web節點1】
real_server 202.1.1.101 80 {
weight 1【權重】
TCP_CHECK { 【健康檢查方式】
connect_port 80【目標埠】
connect_timeout 3【連接超時】
nb_get_retry 3【重試次數】
delay_before_retry 3【重試間隔】
}
}【一定要注意{}完整性】
[root@kp1 ~]# cat /etc/keepalived/keepalived.conf
加載系統內核的服務模塊
[root@kp1 ~]# modprobe ip_vs
查看系統模塊運行狀態并重啟 keepalived 服務
[root@kp1 ~]# lsmod |grep ip_vs
[root@kp1 ~]# systemctl restart keepalived
2、kp2 副調度器
[root@kp2 ~]# service httpd stop
[root@kp2 ~]# yum -y remove httpd
[root@kp2 ~]# netstat -anput |grep httpd
[root@kp2 ~]# yum -y install ipvsadm
[root@kp2 ~]# echo '
global_defs {
router_id HA_TEST_R2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 1
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.100.200
}
}
virtual_server 192.168.100.200 80 {
delay_loop 15
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.100.103 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
}
}
real_server 192.168.100.104 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
}
}
}
' >/etc/keepalived/keepalived.conf
[root@kp2 ~]# cat /etc/keepalived/keepalived.conf
[root@kp2 ~]# modprobe ip_vs
[root@kp2 ~]# lsmod |grep ip_vs
[root@kp2 ~]# echo "modprobe ip_vs" >>/etc/rc.local
[root@kp2 ~]# systemctl restart keepalived
3、web服務器池配置
3.1 web1 服務器,web2 服務器同樣配置
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
[root@web1 ~]# cp ifcfg-lo ifcfg-lo:0
[root@web1 ~]# echo '
DEVICE=lo:0
IPADDR=192.168.100.200
NETMASK=255.255.255.255
ONBOOT=yes
'>/etc/sysconfig/network-scripts/ifcfg-lo:0
[root@web1 network-scripts]# systemctl restart network
[root@web1 network-scripts]# ip a
[root@web1 ~]# echo "route add -host 192.168.100.200 dev lo:0" >>/etc/rc.local
[root@web1 ~]# route add -host 192.168.100.200 dev lo:0
[root@web1 ~]# route -n
[root@web1 ~]# echo '
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
' >> /etc/sysctl.conf
[root@web1 ~]# sysctl -p
3.2 web1 服務器
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# echo "<h1>web1</h1>" >/var/www/html/index.html
[root@web ~]# systemctl start httpd
[root@web ~]# netstat -anput | grep httpd
3.3 web2 服務器
[root@web2 ~]# yum -y install httpd
[root@web2 ~]# echo "<h1>web2</h1>" >/var/www/html/index.html
[root@web2 ~]# systemctl start httpd
[root@web2 ~]# netstat -anput | grep httpd
4.測驗lvs+Keepalived高可用集群
驗證1:lvs負載均衡是否正常
在客戶機瀏覽器訪問192.168.100.200,查看是否能夠切換網頁,
驗證2:節點及服務健康檢查
1.開啟lvs主調度器的日志監控
tail -f /var/log/messages
2.關閉web1的apache服務,查看是否觸發主調度器的apache服務健康檢查
3. 關閉web1的網路連接,查看是否觸發節點健康檢查
驗證3:雙機熱備檢查
1.關閉lvs主調度器
2.客戶機是否能夠正常訪問網頁
驗證4:服務器恢復正常后是否能夠切換
鏈接: CSDN個人資源永久下載地址
提取碼:964v
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/206546.html
標籤:其他
下一篇:(小白)系統重裝
