高可用叢集之keepalived+lvs實戰-技術流ken
1.keepalived簡介
lvs在我之前的部落格《 ofollow,noindex" target="_blank">高負載叢集實戰之lvs負載均衡-技術流ken 》中已經進行了詳細的介紹和應用,在這裡就不再贅述。這篇博文將把lvs與keepalived相結合使用,在實際工作中搭建高可用,高負載,高效能的伺服器叢集。
“Keepalived的作用是檢測伺服器的狀態,如果有一臺web伺服器宕機,或工作出現故障,Keepalived將檢測到,並將有故障的伺服器從系統中剔除,同時使用其他伺服器代替該伺服器的工作,當伺服器工作正常後Keepalived自動將伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的伺服器。”
2.keepalived的主要功能
1. healthcheck
檢查後端節點是否正常工作
如果發現後端節點異常,就將該異常節點從排程規則中刪除;
如果發現後端的異常節點恢復正常了,就將該節點重新加入到排程規則中;
2. failover
是對排程器的主節點做健康檢測。
將備用節點升級為主節點
接管主節點上的資源( vip 、 lvs 規則)
3.keepalived 實現故障切換的原理
1.keepalived 是基於 vrrp 寫於實現的故障切換
2. 正常情況下,主節點會每隔一段時間向備節點發送一個心跳資訊,這個就是告訴備節點自己正常
當主節點發生故障,那麼備節點無法接收都心跳資訊,就認定主節點故障,那麼就會接收主節點的業務和資源(包括 vip )
當主節點又恢復的時候,那麼備節點釋放所接收到資源和業務
4. 簡單說說 vrrp 協議
1. VRRP ( (Virtual Router Redundancy Protocol ),虛擬路由冗餘協議,為了解決靜態路由的單點故障問題
2. VRRP 的工作機制是基於競選機制選擇一個路由來完成任務處理
3. VRRP 協議是通過傳送多播資料包實現競選的( Multicat )
4. 競選出來主節點會一直髮送廣播包, backup 節點一直監聽這些廣播包(處於監聽狀態)
5. 當備用節點無法接收到廣播包的是時候,就會重新進行競選,選出一個新的節點作為主節點
5. keepalived 可以完成如下工作
1. 自動生成 vip ( vip 給使用者提供服務)
2. 自動配置 lvs 規則
3. 可以實現各種服務的高可用
4. failover 的時候,做 vip 的 漂移
6. keepalived 的配置檔案
第一段:global_defs,全域性配置段 global_defs { notification_email { [email protected] } notification_email_from [email protected] smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id id1<<< 當前主機的ID值,這個值必須是唯一的 } 第二段:vrrp_instance,例項配置段(虛擬服務段) 【該段是定義虛擬服務的vip等資訊】 vrrp_instance VI_1 {<<< 指定例項的名稱 state MASTER<<< 指定節點的狀態,MASTER表示主,BACKUP表示備用節點 interface eth0<<< 指定將VIP繫結在哪個網絡卡上 virtual_router_id 51<<< 虛擬路由ID,用於標識哪些個節點是一組,同一組的主機的虛擬id需要相同 priority 100<<< 指定該節點的優先順序(主這節點的優先順序大於備節點) advert_int 1<<< 指定備節點在幾秒之內沒有接收到主節點的心跳資訊,就接管其業務和資源 authentication {<<< 指定keepalived叢集中各個主備節點做認證的方式 auth_type PASS auth_pass 1111 } virtual_ipaddress {<<< 指定用於提供服務的ip地址(也就是VIP) 10.220.5.233 } } 第三段:virtual_server,虛擬主機配置段 【該段主要是給lvs來用,用來定義後端RS節點】 virtual_server 10.220.5.222 80 {#指定例項對應的VIP delay_loop 6# 對後端節點做健康檢查的時間間隔 lb_algo rr# 指定負載均衡排程演算法 lb_kind DR# 指定所使用的lvs模型 nat_mask 255.255.255.0 persistence_timeout 50# 同一IP的請求50秒內被分配到同一臺真實主機 protocol TCP# 用TCP協議對真實節點做健康檢查 real_server 10.220.5.190 80 {# 指定一臺真實伺服器的IP和埠 weight 1# 設定權重 TCP_CHECK {# 用建立tcp連線的方式做健康檢測 connect_timeout 10# 設定建立tcp連線的超時時間 delay_before_retry 3# 超時後多久重試 nb_get_retry 3# 重試次數 connect_port 80# 健康檢查使用的埠號 } } real_server 10.220.5.191 80 { weight 1 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
7.修改配置檔案需要注意的問題
1. 例項可以有一個,也可以有多個
2. 單例項中必須相同的配置
vrrp_instance VI_1
virtual_router_id 51
auth_type PASS
auth_pass 1111
virtual_ipaddress
3. 單例項中必須不相同的配置
router_id id1
state MASTER
priority 100
8.指定日誌儲存方式和位置
1. 修改keepalived的配置 [root@ken ~]# cat /etc/sysconfig/keepalived # Options for keepalived. See `keepalived --help' output and keepalived(8) and # keepalived.conf(5) man pages for a list of all options. Here are the most # common ones : # # --vrrp-POnly run with VRRP subsystem. # --check-COnly run with Health-checker subsystem. # --dont-release-vrrp-VDont remove VRRP VIPs & VROUTEs on daemon stop. # --dont-release-ipvs-IDont remove IPVS topology on daemon stop. # --dump-conf-dDump the configuration data. # --log-detail-DDetailed log messages. # --log-facility-S0-7 Set local syslog facility (default=LOG_DAEMON) # KEEPALIVED_OPTIONS="-D -d -S 0" #KEEPALIVED_OPTIONS="-D" 2. 修改系統日誌配置檔案 [root@ken ~]# echo "local0.*/var/log/ka.log" >>/etc/rsyslog.conf 3. 重啟服務 [root@ken ~]# systemctl restart rsyslog [root@ken ~]# systemctl restart keepalived 日誌 級別:指定觸發日誌的事件的重要等級 日誌設施:指定將日誌記錄在什麼位置
9. keepalived 對 RS 做健康檢查的方式
1. HTTP_GET:向後端的RS傳送http請求,如果請求成功,說明後端節點正常(RS是web服務的時候比較常用) 2. TCP:嘗試與後端RS建立TCP連線,如果成功,說明後端節點正常 【僅僅是檢查RS系統是否正常工作,不能檢查具體的業務】 3. SMTP:對郵件伺服器做健康檢測 4. MISC:通過指令碼的方式實現健康檢測 TCP健康檢測方式舉例 TCP_CHECK {# 通過TcpCheck判斷RealServer的健康狀態 connect_timeout 10# 連線超時時間 nb_get_retry 3# 重連次數 delay_before_retry 3# 重連時間間隔 connect_port 80# 檢測埠 } HTTP_GET健康檢測方式舉例 HTTP_GET { url { path check/t.html# 檢查的uri地址 digest 1362a91278f0# 用keepalived自帶的genhash生成 connect_timeout 3# 連結超時時間 nb_get_retry 3# 重連次數 delay_before_retry 3# 重連時間間隔 connect_port 6500# 檢測埠 } MISC健康檢測方式舉例 MISC_CHECK { misc_path "/tmp/check.sh http://1.2.3.4:80/c/200.jsp" # 呼叫外部程式或者指令碼的路徑和引數 misc_timeout 10 # 指令碼執行的超時時間 misc_dynamic # 動態權重標誌。 # 指令碼返回0 則檢測成功,權重不變 # 返回1表示失敗,權重設定為0 }
10.keepalived+lvs伺服器叢集實戰
1.環境準備
centos7.5
VIP:172.20.10.11/28
客戶端IP:172.20.10.3/28
KEEPALIVED+LVS1伺服器端IP:172.20.10.2/28
KEEPALIVED+LVS2伺服器端IP:172.20.10.5/28
WEB1伺服器端IP:172.20.10.8/28
WEB2伺服器端IP:172.20.10.9/28
2.關閉安全服務
[root@ken ~]# setenforce 0 [root@ken ~]# systemctl stop firewalld [root@ken ~]# iptables -F
3.配置KEEPALIVED+LVS1伺服器端
相當的伺服器配置需要保持相同。接下來的配置你需要配置兩遍,即在每個服務端都需要配置一遍。
安裝ipvsadm
[root@ken ~]# yum install popt* libnl* kernel-devel ipvsadm -y
安裝keepalived
[root@ken ~]# yum install keepalived -y
配置主伺服器端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 id1 vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.20.10.11/28 } } virtual_server 172.20.10.11 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 50 protocol TCP real_server 172.20.10.8 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.20.10.9 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
配置好之後可以把這個檔案使用scp傳輸到另外一臺伺服器上面
[root@ken ~]# scp /etc/keepalived/keepalived.conf 172.20.10.5:/etc/keepalived/keepalived.conf [email protected]'s password: keepalived.conf100% 1116669.7KB/s00:00
配置從伺服器端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 id2 vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 { state BACKUP interface eth0 interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.20.10.11/28 } } virtual_server 172.20.10.11 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 50 protocol TCP real_server 172.20.10.8 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 172.20.10.9 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
4.重啟keepalived
[root@ken ~]# systemctl restart keepalied
5.檢查ipvsadm
[root@ken ~]# ipvsadm -L -n --stats IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:PortConnsInPktsOutPktsInBytes OutBytes -> RemoteAddress:Port TCP172.20.10.11:807840221310 -> 172.20.10.8:804690210090 -> 172.20.10.9:80315011220
6.檢查VIP
檢查主伺服器端
[root@ken ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000 link/ether 00:0c:29:2d:5b:b8 brd ff:ff:ff:ff:ff:ff inet 172.20.10.2/28 brd 172.20.10.15 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet 172.20.10.11/28 scope global secondary eth0#VIP現在在主伺服器端 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe2d:5bb8/64 scope link valid_lft forever preferred_lft forever
檢查從伺服器端
[root@ken ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000 link/ether 00:0c:29:a5:e9:a4 brd ff:ff:ff:ff:ff:ff inet 172.20.10.5/28 brd 172.20.10.15 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fea5:e9a4/64 scope link valid_lft forever preferred_lft forever
6.配置web伺服器端
1.下載apache
[root@ken ~]# yum install httpd -y
2.準備測試頁面
[root@ken ~]# echo "this is 172.20.10.8 for test" >/var/www/html/index.html
3.啟動apache
[root@ken ~]# systemctl restart httpd [root@ken ~]# ss -tnl |grep 80 LISTEN0128:::80:::*
4.繫結VIP
[root@ken ~]# ip a a 172.20.10.11/32 dev lo:0
5.arp抑制
[root@ken ~]# echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore [root@ken ~]# echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore [root@ken ~]# echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce [root@ken ~]# echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
11.瀏覽器測試
確認每臺伺服器每項服務重啟之後,再次關閉每臺伺服器
防火牆
[root@ken ~]# iptables -F
輸入VIP地址
測試成功!
進行重新整理測試
測試成功!
關閉一臺172.20.10.8web伺服器進行測試
[root@ken ~]# systemctl stop httpd
檢視ipvsadm規則
[root@ken ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:PortForward Weight ActiveConn InActConn TCP172.20.10.11:80 rr -> 172.20.10.9:80Route100
已自動移除172.20.10.8伺服器
測試成功!
關閉172.20.10.2 keepalived主伺服器進行測試
[root@ken ~]# systemctl stop keepalived
檢視keepalived主伺服器端ipvsadm規則
[root@ken ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:PortForward Weight ActiveConn InActConn
檢視keepalived主伺服器端VIP
[root@ken ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000 link/ether 00:0c:29:2d:5b:b8 brd ff:ff:ff:ff:ff:ff inet 172.20.10.2/28 brd 172.20.10.15 scope global noprefixroute eth0 valid_lft forever preferred_lft forever#已經沒有VIP inet6 fe80::20c:29ff:fe2d:5bb8/64 scope link valid_lft forever preferred_lft forever
檢視從伺服器ipvsadm規則
[root@ken ~]# ipvsadm -L -n --stats IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:PortConnsInPktsOutPktsInBytes OutBytes -> RemoteAddress:Port TCP172.20.10.11:8000000 -> 172.20.10.9:8000000
從伺服器端已經自動繼承主伺服器端ipvsadm規則
檢視從伺服器端是否有VIP
[root@ken ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000 link/ether 00:0c:29:a5:e9:a4 brd ff:ff:ff:ff:ff:ff inet 172.20.10.5/28 brd 172.20.10.15 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet 172.20.10.11/28 scope global secondary eth0 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fea5:e9a4/64 scope link valid_lft forever preferred_lft forever
VIP已經自動繼承到從伺服器端
測試完成!