目錄
概述
一、keepalived安裝
二、配置文件
三、 其他配置項說明
四、名詞解釋
五、高階使用
1、介紹
2、keepalived主要作用
3、工作在三層、四層和七層原理
4、健康狀態檢測方式
4.1 HTTP服務狀態檢測
4.2 TCP端口狀態檢測(使用TCP端口服務基本上都可以使用)
4.3 郵件服務器SMTP檢測
4.4 用戶自定義腳本檢測real_server服務狀態
5、狀態轉換通知功能
5.1 實例狀態通知
5.2 虛擬服務器檢測通知
六、項目實際中配置
概述
Keepalived是一個基于VRRP協議(虛擬冗余路由協議)來實現的LVS服務高可用方案,可以利用其來避免單點故障。一個LVS服務會有2臺服務器運行Keepalived,一臺為主服務器(MASTER),一臺為備份服務器(BACKUP),但是對外表現為一個虛擬IP,主服務器會發送特定的消息(心跳檢測,heartbeat)給備份服務器,當備份服務器收不到這個消息的時候,即主服務器宕機的時候, 備份服務器就會接管虛擬IP,繼續提供服務,從而保證了高可用性。
Keepalived的作用是檢測服務器的狀態,如果有一臺web服務器死機,或工作出現故障,Keepalived將檢測到,并將有故障的服務器從系統中剔除,同時使用其他服務器代替該服務器的工作,當服務器工作正常后Keepalived自動將服務器加入到服務器群中。
一、keepalived安裝
[root@web1 ~]# yum install -y epel-release
[root@web1 ~]# yum install keepalived nginx
配置并啟動
[root@web2 keepalived]# echo web2 > /usr/share/nginx/html/index.html
[root@web2 keepalived]# systemctl enable --now keepalived.service nginx.service
驗證
[root@web1 keepalived]# ip a
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:c8:dc:33 brd ff:ff:ff:ff:ff:ffinet 192.168.115.111/24 brd 192.168.115.255 scope global ens33valid_lft forever preferred_lft foreverinet 192.168.115.250/32 scope global ens33
##停掉master查看backup
[root@web1 keepalived]# systemctl stop keepalived.service
[root@web2 keepalived]# ip a
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:8a:4a:79 brd ff:ff:ff:ff:ff:ffinet 192.168.115.112/24 brd 192.168.115.255 scope global ens33valid_lft forever preferred_lft foreverinet 192.168.115.250/32 scope global ens33
二、配置文件
global_defs {notification_email { ?#指定keepalived在發生切換時需要發送email到的對象,一行一個sysadmin@fire.loc}
notification_email_from Alexandre.Cassen@firewall.loc #指定發件人smtp_server localhost #指定smtp服務器地址smtp_connect_timeout 30 #指定smtp連接超時時間router_id LVS_DEVEL #運行keepalived機器的一個標識
}
vrrp_sync_group VG_1{ #監控多個網段的實例
group {
inside_network #實例名
outside_network
}
notify_master /path/xx.sh #指定當切換到master時,執行的腳本
notify_backup /path/xx.sh #指定當切換到backup時,執行的腳本
notify_fault "path/xx.sh VG_1" #故障時執行的腳本
notify /path/xx.sh
smtp_alert #使用global_defs中提供的郵件地址和smtp服務器發送郵件通知
}
Keepalived在轉換狀態時會依照狀態來呼叫:
-
當進入Master狀態時會呼叫notify_master
-
當進入Backup狀態時會呼叫notify_backup
-
當發現異常情況時進入Fault狀態呼叫notify_fault
vrrp_instance inside_network {state BACKUP #指定那個為master,那個為backup,如果設置了nopreempt這個值不起作用,主備靠priority決定interface eth0 #設置實例綁定的網卡 VRRP心跳包從哪塊網卡發出dont_track_primary #忽略vrrp的interface錯誤(默認不設置)track_interface{ #設置額外的監控,里面那個網卡出現問題都會切換eth1eth2}mcast_src_ip #發送多播包的地址,如果不設置默認使用綁定網卡的primary ipgarp_master_delay #在切換到master狀態后,延遲進行gratuitous ARP請求virtual_router_id 50 #VPID標記 相同VRID的LVS屬于同一組,根據優先級選舉出一個主priority 99 #優先級,高優先級競選為masteradvert_int 10 #檢查間隔,默認1秒 VRRP心跳包(報文)的發送周期,單位為s 組播信息發送間隔,兩個節點設置必須一樣(實際并不一定完全是10秒,測試結果是小于10秒的隨機值)nopreempt #設置為不搶占 注:這個配置只能設置在backup主機上,而且這個主機優先級要比另外一臺高
首先nopreemt必須在state為BACKUP的節點上才生效(因為是BACKUP節點決定是否來成為MASTER的),其次要實現類似于關閉auto failback的功能需要將所有節點的state都設置為BACKUP,或者將master節點的priority設置的比BACKUP低。我個人推薦使用將所有節點的state都設置成BACKUP并且都加上nopreempt選項,這樣就完成了關于autofailback功能,當想手動將某節點切換為MASTER時只需去掉該節點的nopreempt選項并且將priority改的比其他節點大,然后重新加載配置文件即可(等MASTER切過來之后再將配置文件改回去再reload一下)。
preempt_delay #搶占延時,默認5分鐘debug #debug級別authentication { #設置認證auth_type PASS #認證方式auth_pass 111111 #認證密碼(密碼只識別前8位)}virtual_ipaddress { #設置vip192.168.202.200}
}
virtual_server 192.168.202.200 23 {delay_loop 6 #健康檢查時間間隔(實際并不一定完全是6秒,測試結果是小于6秒的隨機值?)lb_algo rr ?#lvs調度算法rr|wrr|lc|wlc|lblc|sh|dhlb_kind DR ?#負載均衡轉發規則NAT|DR|TUNpersistence_timeout 5 #會話保持時間protocol TCP #使用的協議persistence_granularity <NETMASK> #lvs會話保持粒度virtualhost <string> #檢查的web服務器的虛擬主機(host:頭) ? sorry_server<IPADDR> <port> #備用機,所有realserver失效后啟用real_server 192.168.200.5 23 {weight 1 #默認為1,0為失效inhibit_on_failure #在服務器健康檢查失效時,將其設為0,而不是直接從ipvs中刪除notify_up <string> | <quoted-string> #在檢測到server up后執行腳本notify_down <string> | <quoted-string> #在檢測到server down后執行腳本TCP_CHECK {connect_timeout 3 #連接超時時間nb_get_retry 3 #重連次數delay_before_retry 3 #重連間隔時間connect_port 23 ?#健康檢查的端口的端口bindto <ip> ?#檢查的IP地址}HTTP_GET | SSL_GET{url{ #檢查url,可以指定多個path /digest <string> #檢查后的摘要信息status_code 200 #檢查的返回狀態碼,301 302 }connect_port <port>bindto <IPADD>connect_timeout 5nb_get_retry 3delay_before_retry 2}
?SMTP_CHECK{host{connect_ip <IP ADDRESS>connect_port <port> #默認檢查25端口bindto <IP ADDRESS>}connect_timeout 5retry 3delay_before_retry 2helo_name <string> | <quoted-string> #smtp helo請求命令參數,可選}MISC_CHECK{misc_path <string> | <quoted-string> #外部腳本路徑misc_timeout #腳本執行超時時間misc_dynamic #如設置該項,則退出狀態碼會用來動態調整服務器的權重,返回0 正常,不修改;返回1,檢查失敗,權重改為0;返回2-255,正常,權重設置為:返回狀態碼-2}}
三、 其他配置項說明
keepalived 的核心就是將IPVS配置成高可用,生成ipvs規則來完成負載均衡效果。
-
virtual server (虛擬服務)的定義:
-
virtual_server IP port #定義虛擬主機IP地址及其端口
-
virtual_server fwmark int #ipvs的防火墻打標,實現基于防火墻的負載均衡集群
-
virtual_server group string #將多個虛擬服務器定義成組,將組定義成虛擬服務
-
lb_algo{rr|wrr|lc|wlc|lblc|lblcr} #定義LVS的調度算法
-
lb_kind {NAT|DR|TUN} #定義LVS的模型
-
presitence_timeout #定義支持持久連接的時長
-
protocol TCP #規則所能支持的協議
-
sorry_server #如果所有real_server都出現故障了,利用此返回信息
四、名詞解釋
虛擬路由器: 由一個Master路由器和多個Backup路由器組成。主機將虛擬路由器當作默認網關;
VRID:虛擬路由器的標識。有相同VRID的一組路由器構成一個虛擬路由器;
Master路由器:虛擬路由器中承擔報文轉發任務的路由器;
Backup路由器 :Master路由器出現故障時,能夠代替Master路由器工作的路由器;
虛擬IP 地址:虛擬路由器的IP 地址。一個虛擬路由器可以擁有一個或多個IP地址;
IP地址擁有者: 接口IP地址與虛擬IP地址相同的路由器被稱為IP地址擁有者;
虛擬MAC地址: 一個虛擬路由器擁有一個虛擬MAC地址。通常情況下,虛擬路由器回應ARP請求使用的是虛擬MAC地址,只有虛擬路由器做特殊配置的時候,才回應接口的真實MAC地址;
優先級:VRRP根據優先級來確定虛擬路由器中每臺路由器的地位;
非搶占方式:如果Backup路由器工作在非搶占方式下,則只要Master路由器沒有出現故障,Backup路由器即使隨后被配置了更高的優先級也不會成為Master路由器;
搶占方式:如果Backup路由器工作在搶占方式下,當它收到VRRP報文后,會將自己的優先級與通告報文中的優先級進行比較。如果自己的優先級比當前的Master路由器的優先級高,就會主動搶占成為Master路由器;否則,將保持Backup狀態
五、高階使用
1、介紹
Keeaplived 主要有兩種應用場景,一個是通過配置keepalived結合ipvs做到負載均衡(LVS+Keepalived)。另一個是通過自身健康檢查、資源接管功能做高可用(雙機熱備),實現故障轉移。
以下內容主要針對Keepalived+MySQL雙主實現雙機熱備為根據,主要講解keepalived的狀態轉換通知功能,利用此功能可有效加強對MySQL數據庫監控。
2、keepalived主要作用
keepalived采用VRRP(virtual router redundancy protocol),虛擬路由冗余協議,以軟件的形式實現服務器熱備功能。通常情況下是將兩臺linux服務器組成一個熱備組(master-backup),同一時間熱備組內只有一臺主服務器(master)提供服務,同時master會虛擬出一個共用IP地址(VIP),這個VIP只存在master上并對外提供服務。如果keepalived檢測到master宕機或服務故障,備服務器(backup)會自動接管VIP成為master,keepalived并將master從熱備組移除,當master恢復后,會自動加入到熱備組,默認再搶占成為master,起到故障轉移功能。
3、工作在三層、四層和七層原理
Layer3: 工作在三層時,keepalived會定期向熱備組中的服務器發送一個ICMP數據包,來判斷某臺服務器是否故障,如果故障則將這臺服務器從熱備組移除。
Layer4: 工作在四層時,keepalived以TCP端口的狀態判斷服務器是否故障,比如檢測mysql 3306端口,如果故障則將這臺服務器從熱備組移除。
! Configuration File for keepalivedglobal_defs {notification_email { ? ? example@163.com ?} ? ?notification_email_from ?example@example.comsmtp_server 127.0.0.1smtp_connect_timeout 30router_id MYSQL_HA}vrrp_instance VI_1 { ?state BACKUPinterface eth1virtual_router_id 50 ? ? ?nopreempt ? ? ? ? ? ? ? ? ? #當主down時,備接管,主恢復,不自動接管 ? ? ?priority 100 ? ? ?advert_int 1authentication { ? ? ? ? auth_type PASS ? ahth_pass 123 ? ? ? } ? ? ?virtual_ipaddress { ? ? 192.168.1.200 ? ? ? ? ?#虛擬IP地址}virtual_server 192.168.1.200 3306 { ? ? ? ? ? ?delay_loop 6# ? lb_algo rr # ? lb_kind NATpersistence_timeout 50 ? ?protocol TCP ?real_server 192.168.1.201 3306 { ? ? ? #監控本機3306端口 ? ? ? ?weight 1 ? notify_down /etc/keepalived/kill_keepalived.sh ? #檢測3306端口為down狀態就執行此腳本(只有keepalived關閉,VIP才漂移 ) ? TCP_CHECK { ? ? ? ? #健康狀態檢測方式,可針對業務需求調整(TTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK)connect_timeout 3 ? ? ? ? ? nb_get_retry 3 ? ? ? ? ? ? delay_before_retry 3 ? ? } ?#MISC_CHECK { ? ? ? ? ? ? ? ? ? ? ? ## 使用 MISC_CHECK 方式自定義腳本做健康檢查# ? misc_path "/etc/keepalived/check.sh" ? ## 檢測腳本# ? misc_timeout ? 10 ? ? ? ? ? ? ## 執行腳本的超時時間# ? misc_dynamic ? ? ? ? ? ? ? ? ? ## 根據退出狀態碼動態調整服務器的權重# ? }
?}}
Layer7:工作在七層時,keepalived根據用戶設定的策略判斷服務器上的程序是否正常運行,如果故障則將這臺服務器從熱備組移除。
! Configuration File for keepalivedglobal_defs {notification_email {example@163.com}notification_email_from ?example@example.com ? ? ?smtp_server 127.0.0.1smtp_connect_timeout 30router_id MYSQL_HA}vrrp_script check_nginx { ? script /etc/keepalived/check_nginx.sh ? ?#檢測腳本interval 2 ? #執行間隔時間}vrrp_instance VI_1 {state BACKUPinterface eth1virtual_router_id 50nopreempt ? ? ? ? ? ? ? ? ? #當主down時,備接管,主恢復,不自動接管priority 100 advert_int 1authentication { ? auth_type PASS ? ? ? ?ahth_pass 123 ? ? } ? ? virtual_ipaddress {192.168.1.200 ? ? ? ? ?#虛擬IP地址 ? } ? ? track_script { ? ? ? ? ?#在實例中引用腳本 ? ?check_nginx ? ? ?} ?}
腳本內容如下:
? ? ? ?# cat /etc/keepalived/check_nginx.shCount1=`netstat -antp |grep -v grep |grep nginx |wc -l`if [ $Count1 -eq 0 ]; then/usr/local/nginx/sbin/nginxsleep 2 ?Count2=`netstat -antp |grep -v grep |grep nginx |wc -l`if [ $Count2 -eq 0 ]; then service keepalived stop ? ? ?elseexit 0fi else ? exit 0fi
?#也可以簡單如下:#!/bin/bash[[ `ps -C nginx --no-header |wc -l` -eq 0 ]] && exit 1 || exit 0# 如果沒有nginx進程 返回錯誤狀態1 ?#if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then# ? ? ? echo "$(date) nginx pid not found">>/etc/keepalived/keepalived.log# ? ? ? #killall keepalived#fi
#在keepalived主機中,運行如下腳本,用來檢測本機的nginx進行狀態
vim start_keepalived.sh
#!/bin/bash
while true
doif pgrep nginx &> /dev/null;thensystemctl start keepalivedfisleep 3
?
done
?
?
?
#mysql 檢測腳本如下:#!/bin/bash[[ `ps -C mysqld --no-header |wc -l` -eq 0 ]] && exit 1 || exit 0# 如果沒有nginx進程 返回錯誤狀態1 ?if [ `ps -C nginx --no-header |wc -l` -eq 0 ];thenecho "$(date) nginx pid not found">>/etc/keepalived/keepalived.logkillall keepalivedfi
4、健康狀態檢測方式
4.1 HTTP服務狀態檢測
HTTP_GET或SSL_GET { ? ? ? ? ? url { ? ? ?path /index.html ? ? ? ?#檢測url,可寫多個 ? ? ? ? digest ?24326582a86bee478bac72d5af25089e ? ?#檢測效驗碼 ? ? ? ?#digest效驗碼獲取方法:genhash -s IP -p 80 -u http://IP/index.html ? ? ? ? status_code 200 ? ? ? ? #檢測返回http狀態碼 ? ?} ? ? ? connect_port 80 #連接端口 ?connect_timeout 3 ?#連接超時時間 nb_get_retry 3 ?#重試次數delay_before_retry 2 #連接間隔時間}
4.2 TCP端口狀態檢測(使用TCP端口服務基本上都可以使用)
? ?TCP_CHECK { ? ? ? ? ? ? connect_port 80 ? ? #健康檢測端口,默認為real_server后跟端口 ? ?connect_timeout 5 ? ? ?nb_get_retry 3 ? ? ?delay_before_retry 3}
4.3 郵件服務器SMTP檢測
SMTP_CHECK { ? ? ? ? ? ?#健康檢測郵件服務器smtp ? ? ? host { ? ? ? ?connect_ip ? ? ? ? ?connect_port ? ?} ? ? ? ? ? connect_timeout 5 ? ? ? retry 2 ? ?delay_before_retry 3 ? hello_name "mail.domain.com" ? }
4.4 用戶自定義腳本檢測real_server服務狀態
MISC_CHECK { ? ? ? ? misc_path /script.sh ? ?#指定外部程序或腳本位置 ? ? ?misc_timeout 3 ? ? ?#執行腳本超時時間 ?!misc_dynamic ? ? ? #不動態調整服務器權重(weight),如果啟用將通過退出狀態碼動態調整real_server權重值# misc_dynamic ? ? ? ## 根據退出狀態碼動態調整服務器的權重}
5、狀態轉換通知功能
keepalived主配置郵件通知功能,默認當real_server宕機或者恢復時才會發出郵件。有時我們更想知道keepalived的主服務器故障切換后,VIP是否順利漂移到備服務器,MySQL服務器是否正常?那寫個監控腳本吧,可以,但沒必要,因為keepalived具備狀態檢測功能,所以我們直接使用就行了。
主配置默認郵件通知配置模板如下:global_defs ? ? ? ? ? # Block id{ ? notification_email ? ?# To: ? { ? ? ?admin@example1.com ... ? ? ? ?}
?# From: from address that will be in header ? ?notification_email_from admin@example.comsmtp_server 127.0.0.1 ? # IP ?smtp_connect_timeout 30 # integer, secondsrouter_id my_hostname ? # string identifying the machine, ? ? ? ? ? ? ? ? ? ? ? ?# (doesn't have to be hostname).
5.1 實例狀態通知
a) notify_master :節點變為master時執行
b) notify_backup : 節點變為backup時執行
c) notify_fault : 節點變為故障時執行
5.2 虛擬服務器檢測通知
a) notify_up : 虛擬服務器up時執行
b) notify_down : 虛擬服務器down時執行
示例:! Configuration File for keepalivedglobal_defs { notification_email {example@163.com ? ? } ? notification_email_from example@example.com ? ?smtp_server 127.0.0.1 smtp_connect_timeout 30 ?router_id MYSQL_HA} ? ?vrrp_instance VI_1 { ? ? ? state BACKUP ? ? interface eth1virtual_router_id 50 ?nopreempt ? ? ? ? ? #當主down時,備接管,主恢復,不自動接管 ? priority 100advert_int 1 ?authentication { ? ? ? ? ?auth_type PASS ? ? ? ? ?ahth_pass 123 ? ? } ? ?virtual_ipaddress { ? ? ?192.168.1.200 ? ? } ? ? ? ? ?notify_master /etc/keepalived/to_master.sh ? ? ? ? ?notify_backup /etc/keepalived/to_backup.shnotify_fault /etc/keepalived/to_fault.sh ? ?} virtual_server 192.168.1.200 3306 { ? ? delay_loop 6 ? ? persistence_timeout 50 ? ?protocol TCP ? ? ? real_server 192.168.1.201 3306 { ? ? ? ? ? ?weight 1 ? ? ? ? notify_up /etc/keepalived/mysql_up.sh ? ? ? ? notify_down /etc/keepalived/mysql_down.sh ? ? ? ? ? TCP_CHECK {connect_timeout 3 ? ? ? ? ? ?nb_get_retry 3 ? ? ? ? ? ?delay_before_retry 3 ? ? ? ? ? } ? ? ? ?} ? ? }
狀態參數后可以是bash命令,也可以是shell腳本,內容根據自己需求定義,以上示例中所涉及狀態腳本如下:
-
當服務器改變為主時執行此腳本
yum install -y sendmail mailx
systemctl enabled --now sendmail
# cat to_master.sh #!/bin/bashDate=$(date +%F" "%T)IP=$(ifconfig eth0 |grep "inet addr" |cut -d":" -f2 |awk '{print $1}')Mail="z13516052620@163.com"echo "$Date $IP change to master." |mail -s "Master-Backup Change Status" $Mail
-
當服務器改變為備時執行此腳本
# cat to_backup.sh#!/bin/bashDate=$(date +%F" "%T)IP=$(ifconfig eth0 |grep "inet addr" |cut -d":" -f2 |awk '{print $1}')Mail="baojingtongzhi@163.com"echo "$Date $IP change to backup." |mail -s "Master-Backup Change Status" $Mail
?
-
當服務器改變為故障時執行此腳本
?# cat to_fault.sh#!/bin/bashDate=$(date +%F" "%T)IP=$(ifconfig eth0 |grep "inet addr" |cut -d":" -f2 |awk '{print $1}')Mail="baojingtongzhi@163.com"echo "$Date $IP change to fault." |mail -s "Master-Backup Change Status" $Mail
-
當檢測TCP端口3306為不可用時,執行此腳本,殺死keepalived,實現切換
# cat mysql_down.sh#!/bin/bashDate=$(date +%F" "%T)IP=$(ifconfig eth0 |grep "inet addr" |cut -d":" -f2 |awk '{print $1}')Mail="baojingtongzhi@163.com"pkill keepalivedecho "$Date $IP The mysql service failure,kill keepalived." |mail -s "Master-Backup MySQL Monitor" $Mail
-
當檢測TCP端口3306可用時,執行此腳本
# cat mysql_up.sh#!/bin/bashDate=$(date +%F" "%T)IP=$(ifconfig eth0 |grep "inet addr" |cut -d":" -f2 |awk '{print $1}')Mail="baojingtongzhi@163.com"echo "$Date $IP The mysql service is recovery." |mail -s "Master-Backup MySQL Monitor" $Mail
六、項目實際中配置
檢測nginx配置
global_defs {router_id ? masterenable_script_security
}
vrrp_script check_nginx {script /etc/keepalived/check_nginx.shinterval 1weight -20
}
?
vrrp_instance VI_1 {state MASTERinterface eth2virtual_router_id 201priority ? 100advert_int 3authentication {auth_type PASSauth_pass 1114}
track_script {check_nginx}virtual_ipaddress {10.239.167.8}
}
?
vrrp_instance VI_2 {state BACKUPinterface eth0virtual_router_id 202priority ? 100advert_int 3authentication {auth_type PASSauth_pass 1114}
track_script {check_nginx}virtual_ipaddress {10.1.19.105}
}
?
2
! Configuration File for keepalived
?
global_defs {router_id LVS_HTTPscript_user root
}
#vrrp_script check_keepalived {
# ? ? ? script "/etc/keepalived/check_keepalived.sh"
# ? ? ? interval 2
# ? ? ? weight 3
#}
vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 21nopreemptpriority 130advert_int 3authentication {auth_type PASSauth_pass 1111}#track_script {# ? check_keepalived#}virtual_ipaddress {10.1.13.27/24}#notify_master "/etc/keepalived/master.sh ethxx" ? #切換主執行#notify_backup "/etc/keepalived/slave.sh eth0" ##切換備執行#notify_stop "/etc/keepalived/stop.sh eth0" ##
}
?
virtual_server 10.1.13.27 26000 { ? ? ? ?#設置虛擬服務器的 IP 和端口,用空格隔開delay_loop 6 ? ? ? ? ? ? ? ? ? ? ? ? ? ? #設置運行情況檢查時間,單位是秒
# lb_algo rr ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #負載調度算法(輪詢)
# lb_kind DR ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #負載均衡機制(NAT、TUN、DR)persistence_timeout 50 ? ? ? ? ? ? ? ? ? #會話保持時間(秒)protocol TCP ? ? ? ? ? ? ? ? ? ? ? ? ? ? #轉發協議類型real_server 10.1.13.136 26000 { ? ? ? #配置服務節點weight 90 ? ? ? ? ? ? ? ? ? ? ? ?#配置服務節點的權重notify_down /etc/keepalived/failoverdb.sh ?#虛擬服務故障響應腳本TCP_CHECK { ? ? ? ? ? ? ? ? ? ? ?#使用TCP_CHECK方式進行健康檢查connect_timeout 10 ? ? ? ? ? #10秒無響應即超時delay_before_retry 3 ? ? ? ? #重試間隔時間}#MISC_CHECK { ? ? ? ? ? ? ? ? ? ? ? ## 使用 MISC_CHECK 方式自定義腳本做健康檢查# ? misc_path "/etc/keepalived/check.sh" ? ## 檢測腳本# ? misc_timeout ? 10 ? ? ? ? ? ? ## 執行腳本的超時時間# ? misc_dynamic ? ? ? ? ? ? ? ? ? ## 根據退出狀態碼動態調整服務器的權重# ? }}
}
?在Openeluer系統中,以上環境將存儲系統更改為NFS,構建一個雙機熱備環境,該如何操作?
構建高可用NFS共享存儲方案(基于Keepalived + NFS on OpenEuler)
實驗環境規劃
操作系統:OpenEuler 22.03 LTS
1. VIP主機 (Keepalived Master):IP: 192.168.1.100
2. 備份主機 (Keepalived Slave):IP: 192.168.1.101
3. 客戶端主機:IP: 192.168.1.102
4. 虛擬IP (VIP):192.168.1.200
5. 共享目錄:/data/nfs_share
配置步驟詳解(OpenEuler系統)
第一階段:NFS服務器配置(Master & Slave 執行)
-
安裝NFS服務
dnf install nfs-utils rpcbind -y
-
創建共享目錄并設置權限
mkdir -p /data/nfs_share chown nfsnobody:nfsnobody /data/nfs_share chmod 777 /data/nfs_share
-
配置NFS導出文件 (
/etc/exports
)echo "/data/nfs_share 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)" | tee /etc/exports
-
啟動NFS服務
systemctl enable --now rpcbind systemctl enable --now nfs-server exportfs -arv # 重新加載配置
-
驗證NFS共享
showmount -e localhost # 應顯示: /data/nfs_share 192.168.1.0/24
第二階段:Keepalived配置(實現VIP漂移)
-
安裝Keepalived(雙節點執行)
dnf install keepalived -y
-
Master節點配置 (
/etc/keepalived/keepalived.conf
)confvrrp_script chk_nfs {script "/usr/bin/pgrep nfsd || exit 1"interval 2weight 50 }vrrp_instance VI_1 {state MASTERinterface eth0 # 使用ip a查看實際網卡名virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.1.200/24}track_script {chk_nfs} }
-
Slave節點配置 (
/etc/keepalived/keepalived.conf
)confvrrp_script chk_nfs {script "/usr/bin/pgrep nfsd || exit 1"interval 2weight 50 }vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 51priority 90advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.1.200/24}track_script {chk_nfs} }
-
啟動Keepalived服務
systemctl enable --now keepalived systemctl status keepalived
-
驗證VIP分配
ip addr show eth0 # Master節點應顯示192.168.1.200
第三階段:客戶端配置
-
安裝NFS客戶端
dnf install nfs-utils -y
-
創建掛載點
mkdir -p /mnt/nfs
-
掛載NFS共享
mount -t nfs 192.168.1.200:/data/nfs_share /mnt/nfs
-
驗證掛載
df -hT | grep nfs # 應顯示: 192.168.1.200:/data/nfs_share nfs4 ...touch /mnt/nfs/testfile # 測試寫入
-
配置開機自動掛載
echo "192.168.1.200:/data/nfs_share /mnt/nfs nfs defaults 0 0" | sudo tee -a /etc/fstab
高可用測試流程
-
在Master節點創建文件
echo "From Master" > /data/nfs_share/master.txt
-
客戶端驗證
cat /mnt/nfs/master.txt # 應顯示"From Master"
-
模擬Master故障
# 在Master節點執行: systemctl stop keepalived
-
驗證VIP漂移
# 在Slave節點執行: ip addr show eth0 # 應顯示VIP 192.168.1.200
-
客戶端持續訪問
echo "After failover" >> /mnt/nfs/master.txt cat /mnt/nfs/master.txt # 應顯示兩行內容,證明切換成功