Linux系統集群部署模塊之Keepalived雙機熱備

目錄

概述

一、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腳本,內容根據自己需求定義,以上示例中所涉及狀態腳本如下:

  1. 當服務器改變為主時執行此腳本

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
  1. 當服務器改變為備時執行此腳本

 # 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
?
  1. 當服務器改變為故障時執行此腳本

 ?# 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
  1. 當檢測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
  1. 當檢測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 執行)
  1. 安裝NFS服務

    dnf install nfs-utils rpcbind -y
  2. 創建共享目錄并設置權限

    mkdir -p /data/nfs_share
    chown nfsnobody:nfsnobody /data/nfs_share
    chmod 777 /data/nfs_share
  3. 配置NFS導出文件 (/etc/exports)

    echo "/data/nfs_share 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)" | tee /etc/exports
  4. 啟動NFS服務

    systemctl enable --now rpcbind
    systemctl enable --now nfs-server
    exportfs -arv  # 重新加載配置
  5. 驗證NFS共享

    showmount -e localhost
    # 應顯示: /data/nfs_share 192.168.1.0/24

第二階段:Keepalived配置(實現VIP漂移)
  1. 安裝Keepalived(雙節點執行)

    dnf install keepalived -y
  2. 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}
    }
  3. 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}
    }
  4. 啟動Keepalived服務

    systemctl enable --now keepalived
    systemctl status keepalived
  5. 驗證VIP分配

    ip addr show eth0
    # Master節點應顯示192.168.1.200

第三階段:客戶端配置
  1. 安裝NFS客戶端

    dnf install nfs-utils -y
  2. 創建掛載點

    mkdir -p /mnt/nfs
  3. 掛載NFS共享

    mount -t nfs 192.168.1.200:/data/nfs_share /mnt/nfs
  4. 驗證掛載

    df -hT | grep nfs
    # 應顯示: 192.168.1.200:/data/nfs_share nfs4 ...touch /mnt/nfs/testfile  # 測試寫入
  5. 配置開機自動掛載

    echo "192.168.1.200:/data/nfs_share /mnt/nfs nfs defaults 0 0" | sudo tee -a /etc/fstab

高可用測試流程

  1. 在Master節點創建文件

    echo "From Master" > /data/nfs_share/master.txt
  2. 客戶端驗證

    cat /mnt/nfs/master.txt  # 應顯示"From Master"
  3. 模擬Master故障

    # 在Master節點執行:
    systemctl stop keepalived
  4. 驗證VIP漂移

    # 在Slave節點執行:
    ip addr show eth0  # 應顯示VIP 192.168.1.200
  5. 客戶端持續訪問

    echo "After failover" >> /mnt/nfs/master.txt
    cat /mnt/nfs/master.txt
    # 應顯示兩行內容,證明切換成功

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914669.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914669.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914669.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TDengine 使用最佳實踐(1)

目錄 數據建模 單列模型 多列模型 分庫分表 邊界限制 資源規劃 CPU 主頻 CPU 核數 內存分類 內存計算 CPU 內存比例 磁盤 網絡 下一篇 TDengine 使用最佳實踐&#xff08;1&#xff09; 關于 TDengine TDengine 是一款專為物聯網、工業互聯網等場景設計并優化的大數據平臺&am…

Java行為型模式---責任鏈模式

責任鏈模式基礎概念責任鏈模式&#xff08;Chain of Responsibility Pattern&#xff09;是一種行為型設計模式&#xff0c;其核心思想是將請求的發送者和接收者解耦&#xff0c;使多個對象都有機會處理請求。這些對象連接成一條鏈&#xff0c;請求沿著鏈傳遞&#xff0c;直到有…

嵌入式學習筆記- 結構體名字被賦值時是整體內容賦值

結構體變量名被賦值時&#xff0c;?不是賦值的地址&#xff0c;而是執行對整個結構體內容的復制&#xff08;值拷貝&#xff09;?直接賦值是成員級復制? 當使用 s2 s1; 形式的賦值時&#xff08;其中 s1 和 s2 是同類型結構體變量&#xff09;&#xff0c;系統會?逐成員復…

基于UDP/IP網絡游戲加速高級擁塞控制算法(示意:一)

/* ███████╗ 基于UDP/IP網絡游戲加速高級擁塞控制算法&#xff08;示意&#xff1a;一&#xff09; ███████╗ */#pragma once#include <iostream> #include <vector> #include <deque> #include <cmath> #include <algorithm> …

【YOLOv11-目標檢測】06-模型部署(C++)

上一節課,我們學習了模型的預測。那么,如何用C++部署呢? 克隆項目 進入cmd,進入自己的項目文件夾,然后git clone項目: git clone https://github.com/Geekgineer/YOLOs-CPP 進入到YOLOs-CPP文件夾: 配置環境 ONNX Runtime 后續構建項目的時候,會自動下載,因此,我…

【第零章編輯器開發與拓展】

前言&#xff1a;對編輯器拓展與開發可以節省很多時間&#xff0c;提高開發效率&#xff0c;比如技能編輯器&#xff0c;關卡編輯器這種。當然這只是編輯器開發的一些典型應用&#xff0c;它能做不止這些。學習完這個之后&#xff0c;我們可以開發項目需要的工具。我本意在編輯…

使用 mongoimport 導入本地 JSON 文件到 MongoDB 及數據查看指南

在項目中&#xff0c;我們經常需要將本地 JSON 文件批量導入 MongoDB 數據庫。本文以 Ubuntu 22.04 環境為例&#xff0c;詳細記錄了如何安裝 mongoimport 工具、正確導入多個 JSON 文件&#xff0c;以及查看導入后的數據。一、環境介紹操作系統&#xff1a;Ubuntu 22.04.5 LTS…

新手向:Python數據處理Excel報表自動化生成與分析

Python實現Excel報表自動化系統全流程指南本文將詳細介紹如何使用Python實現一個完整的Excel報表自動化系統&#xff0c;涵蓋從數據清洗、分析到可視化報表生成的全流程。本教程面向Python初學者&#xff0c;通過實際案例講解pandas和openpyxl庫的核心用法。系統概述Excel報表自…

【第六節】docker可視化工具portainer安裝

該文章參考了這篇文章https://zhuanlan.zhihu.com/p/27740131259portainer是一個基于網頁的docker可視化管理工具&#xff0c;試想一下我們怎么登錄路由器管理界面的&#xff0c;異曲同工。那么就需要在服務器的docker內安裝portainer&#xff0c;然后在我們的開發機或者說工作…

使用 Certbot 申請和自動續簽 Let’s Encrypt 的免費 SSL 證書

一. Let’s Encrypt 介紹 Let’s Encrypt 是當前最常用的免費 HTTPS 證書生成工具之一。該服務由非營利組織提供&#xff0c;致力于為全球范圍內的網站提供便捷的自動化證書頒發服務。雖然 Let’s Encrypt 證書的有效期只有90天&#xff0c;但是可以自動續期&#xff0c;這使得…

【kubernetes】--controller(DaemonSet)

Kubernetes DaemonSet 控制器詳解 它確保集群中所有(或部分)節點上都運行一個 Pod 的副本。當有新節點加入集群時&#xff0c;DaemonSet 會自動在新節點上創建 Pod&#xff1b;當節點從集群中移除時&#xff0c;這些 Pod 也會被垃圾回收。 DaemonSet 的核心特性 每個節點一個 P…

內測分發平臺應用的異地容災和負載均衡處理和實現思路

內測分發平臺應用的異地容災和負載均衡處理和實現思路如下&#xff1a;一、異地容災1.風險評估和需求分析&#xff1a;對現有的IT基礎設施進行全面的風險評估和需求分析&#xff0c;評估潛在風險和災害的可能性&#xff0c;以及確定業務和數據的關鍵性。2.設計備份架構&#xf…

【Vue】瀏覽器緩存 sessionStorage、localStorage、Cookie

嘿&#xff0c;各位 Vue 開發者們&#xff01;今天咱們來好好聊聊瀏覽器里的三種緩存方式&#xff1a;sessionStorage、localStorage 和 Cookie。在實際開發中&#xff0c;合理運用這些緩存能讓我們的應用性能大幅提升&#xff0c;同時避免一些不必要的問題。下面就跟著我的筆記…

c#如何將不同類型的數據存儲到一起

在 C# 中&#xff0c;存儲不同類型的數據有多種方式&#xff0c;具體選擇取決于你的需求&#xff08;類型安全、性能、靈活性等&#xff09;。以下是常見的解決方案及其適用場景&#xff1a;1. 使用 object 類型&#xff08;裝箱 / 拆箱&#xff09;將所有數據轉換為基類 objec…

超唯美治愈風卡通插畫PPT模版

海洋卡通風治愈系PPT模版&#xff0c;兒童可愛治愈可愛PPT模版&#xff0c;治愈風商務通用PPT模版&#xff0c;治愈系課件PPT模版&#xff0c;治愈風插畫PPT模版&#xff0c;超唯美治愈風PPT模版&#xff0c;可愛插畫治愈系女孩PPT模版 超唯美治愈風卡通插畫PPT模版&#xff1a…

el-tooltip 快速滾動的時候出現殘影如何解決 vue3

<el-tooltip:disabled"isScrolling" <!-- 新增滾動狀態綁定 -->:popper-options"{ modifiers: [{ name: computeStyles, options: { adaptive: false }] }"effect"dark":content"label.name"placement"right-start"…

【經典面經】C++新特性 TCP完整收發數據 TLS1.2 TLS1.3

文章目錄cpp新特性C11C14C17C20tcp如何保證完整收發數據結論1. **面向連接的三次握手**2. **字節序號與確認機制**3. **校驗和&#xff08;Checksum&#xff09;**4. **超時重傳與快速重傳**5. **滑動窗口&#xff08;流量控制&#xff09;**6. **數據重組與排序**7. **四次揮手…

Spring AI 系列之十一 - RAG-進階RetrievalAugmentationAdvisor

之前做個幾個大模型的應用&#xff0c;都是使用Python語言&#xff0c;后來有一個項目使用了Java&#xff0c;并使用了Spring AI框架。隨著Spring AI不斷地完善&#xff0c;最近它發布了1.0正式版&#xff0c;意味著它已經能很好的作為企業級生產環境的使用。對于Java開發者來說…

[TOOL] ubuntu 使用 ffmpeg 操作 gif、mp4

文章目錄一、工具安裝二、gif 轉mp4三、mp4 兩倍速一、工具安裝 安裝 ffmpeg 工具&#xff1a; sudo apt install ffmpeg二、gif 轉mp4 1. 配置環境 核心指令: ffmpeg -i input.mp4 -filter_complex "[0:v]setpts0.5*PTS[v];[0:a]atempo2.0[a]" -map "[v]&q…

linux中INIT_MM_CONTEXT宏對pgd的重復賦值

在GNU C中&#xff0c;支持通過標號元素對指定結構體成員名進行初始化&#xff0c;這允許初始化值以任意順序出現。在linux內核中對init_mm初始化時有如下代碼。#define INIT_MM_CONTEXT(name) \.pgd init_pg_dir,struct mm_struct init_mm {.mm_rb RB_ROOT,.pgd swapper…