keeplive安装部署
部署keeplive
1、安裝依賴
yum install -y openssl openssl-devel gcc2、安裝軟件包
tar xvf keepalived-2.0.7.tar.gz cd keepalived-2.0.7 ./configure --prefix=/usr/local/keepalived make && make install 完成后會在以下路徑生成: /usr/local/etc/keepalived/keepalived.conf /usr/local/etc/sysconfig/keepalived /usr/local/sbin/keepalived3、 keepalived啟動腳本變量引用文件,默認文件路徑是/etc/sysconfig/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived4、將keepalived主程序加入到環(huán)境變量(安裝目錄下)
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived5、keepalived啟動腳本(源碼目錄下),放到/etc/init.d/目錄下就可以使用service命令便捷調用
cp /usr/local/keepalived-2.0.20/keepalived/etc/init.d/keepalived /etc/init.d/keepalived6、 將配置文件放到默認路徑下
mkdir /etc/keepalived cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf7、基本設置
加為系統(tǒng)服務:chkconfig --add keepalived 開機啟動:chkconfig keepalived on 查看開機啟動的服務:chkconfig --list 啟動、關閉、重啟service keepalived start|stop|restart8、編輯keepalived.conf文件
! Configuration File for keepalivedglobal_defs { notification_email { email地址 } script_user root enable_script_security notification_email_from 發(fā)件人地址 smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MASTER-HA } #檢測mysql服務是否在運行。有很多方式,比如進程,用腳本檢測等等 vrrp_script chk_mysql_port {script "/opt/chk_mysql.sh" #這里通過腳本監(jiān)測interval 2 #腳本執(zhí)行間隔,每2s檢測一次weight -5 #腳本結果導致的優(yōu)先級變更,檢測失敗(腳本返回非0)則優(yōu)先級 -5fall 2 #檢測連續(xù)2次失敗才算確定是真失敗。會用weight減少優(yōu)先級(1-255之間)rise 1 #檢測1次成功就算成功。但不修改優(yōu)先級}vrrp_instance VI_1 {state MASTERinterface ens33 #指定虛擬ip的網卡接口mcast_src_ip 192.168.1.20virtual_router_id 51 #路由器標識,MASTER和BACKUP必須是一致的priority 99 #定義優(yōu)先級,數(shù)字越大,優(yōu)先級越高,在同一個vrrp_instance下,MASTER的優(yōu)先級必須大于BACKUP的優(yōu)先級。這樣MASTER故障恢復后,就>可以將VIP資源再次搶回來,但是我們這里使用的是非搶占模式 所以兩臺機器除去自己IP地址之外其他配置是一致的。advert_int 1authentication {auth_type PASSauth_pass 1111} virtual_ipaddress {192.168.1.25}track_script {chk_mysql_port } }9、添加MySQL檢測文件/opt/chk_mysql.sh
#!/bin/bash counter=$(netstat -na|grep LISTEN|grep 3306|wc -l) if [ ${counter} = 0 ]; then/etc/init.d/keepalived stop fi10、啟動服務
/etc/init.d/keepalived start配置郵件發(fā)送提醒
1、從個人郵箱內獲取授權碼
2、安裝mailx發(fā)送郵件程序
3、編輯郵箱認證文件
vi /etc/mail.rc set from=xxx@qq.com set smtp=smtp.qq.com set smtp-auth-user=xxx@qq.com set smtp-auth-password=授權碼 set smtp-auth=login set ssl-verify=ignore4、編寫郵箱通知腳本
vim /etc/keepalived/notify.sh contact='xxx@qq.com'function notify() {mailsubject="$(hostname) to be $1, vip轉移"mailbody="$(date +'%F %T'): VRRP Transition, $(hostname) changed to be $1"echo "$mailbody" | mail -s "$mailsubject" $contact }case $1 inmaster)notify master;;backup)notify backup;;fault)notify fault;;*)echo "Usage: $(basename$0) {master|backup|fault}"exit 100;; esac5、賦權
chmod +x notify.sh6、配置文件內添加郵件發(fā)送執(zhí)行腳本
virtual_ipaddress {172.30.1.100 dev eth1 label eth1:0172.30.1.200 dev eth1 label eth1:1}#定義通知腳本,當前節(jié)點成為主節(jié)點時觸發(fā)的腳本notify_master "/etc/keepalived/notify.sh master"#定義通知腳本,當前節(jié)點轉為備節(jié)點時觸發(fā)的腳本notify_backup "/etc/keepalived/notify.sh backup"#定義通知腳本,當前節(jié)點轉為“失敗”狀態(tài)時觸發(fā)的腳本notify_fault "/etc/keepalived/notify.sh fault"7、給所有服務都進行配置
keeplive配置說明
一、配置項
global_defs{ notification_email{#指定keepalived在發(fā)生切換時需要發(fā)送email到的對象,一行一個 sysadmin@fire.loc } notification_email_fromAlexandre.Cassen@firewall.loc#指定發(fā)件人 smtp_serverlocalhost#指定smtp服務器地址 smtp_connect_timeout30#指定smtp連接超時時間 router_idLVS_DEVEL#運行keepalived機器的一個標識 } vrrp_sync_groupVG_1{#監(jiān)控多個網段的實例 group{ inside_network#實例名 outside_network } notify_master/path/xx.sh#指定當切換到master時,執(zhí)行的腳本 notify_backup/path/xx.sh#指定當切換到backup時,執(zhí)行的腳本 notify_fault"path/xx.shVG_1"#故障時執(zhí)行的腳本 notify/path/xx.sh smtp_alert#使用global_defs中提供的郵件地址和smtp服務器發(fā)送郵件通知 }#因為Keepalived在轉換狀態(tài)時會依照狀態(tài)來呼叫: #當進入Master狀態(tài)時會呼叫notify_master #當進入Backup狀態(tài)時會呼叫notify_backup #當發(fā)現(xiàn)異常情況時進入Fault狀態(tài)呼叫notify_fault vrrp_instanceinside_network{ stateBACKUP#指定那個為master,那個為backup,如果設置了nopreempt這個值不起作用,主備考priority決 定 interfaceeth0#設置實例綁定的網卡VRRP心跳包從哪塊網卡發(fā)出 dont_track_primary#忽略vrrp的interface錯誤(默認不設置) track_interface{#設置額外的監(jiān)控,里面那個網卡出現(xiàn)問題都會切換 eth0 eth1 } mcast_src_ip#發(fā)送多播包的地址,如果不設置默認使用綁定網卡的primaryip garp_master_delay#在切換到master狀態(tài)后,延遲進行gratuitousARP請求 virtual_router_id50#VPID標記相同VRID的LVS屬于同一組,根據優(yōu)先級選舉出一個主 priority99#優(yōu)先級,高優(yōu)先級競選為master advert_int10#檢查間隔,默認1秒VRRP心跳包的發(fā)送周期,單位為s組播信息發(fā)送間隔,兩個節(jié)點設置必須一樣(實際并不一定完全是10秒,測試結果是小于10秒的隨機值) nopreempt#設置為不搶占注:這個配置只能設置在backup主機上,而且這個主機優(yōu)先級要比另外一臺高首先nopreemt必須在state為BACKUP的節(jié)點上才生效(因為是BACKUP節(jié)點決定是否來成為MASTER的),其次要實現(xiàn)類似于關閉autofailback的功能需要將所有節(jié)點的state都設置為BACKUP,或者將master節(jié)點的priority設置的比BACKUP低。我個人推薦使用將所有節(jié)點的state都設置成BACKUP并且都加上nopreempt選項,這樣就完成了關于autofailback功能,當想手動將某節(jié)點切換為MASTER時只需去掉該節(jié)點的nopreempt選項并且將priority改的比其他節(jié)點大,然后重新加載配置文件即可(等MASTER切過來之后再將配置文件改回去再reload一下)。 preempt_delay#搶占延時,默認5分鐘 debug#debug級別 authentication{#設置認證 auth_typePASS#認證方式 auth_pass111111#認證密碼(密碼只識別前8位) } virtual_ipaddress{#設置vip 192.168.202.200 } } virtual_server192.168.202.20023{ delay_loop6#健康檢查時間間隔(實際并不一定完全是6秒,測試結果是小于6秒的隨機值?) lb_algorr#lvs調度算法rr|wrr|lc|wlc|lblc|sh|dh lb_kindDR#負載均衡轉發(fā)規(guī)則NAT|DR|RUN persistence_timeout5#會話保持時間 protocolTCP#使用的協(xié)議 persistence_granularity<NETMASK>#lvs會話保持粒度 virtualhost<string>#檢查的web服務器的虛擬主機(host:頭) sorry_server<IPADDR><port>#備用機,所有realserver失效后啟用 real_server192.168.200.523{ weight1#默認為1,0為失效 inhibit_on_failure#在服務器健康檢查失效時,將其設為0,而不是直接從ipvs中刪除 notify_up<string>|<quoted-string>#在檢測到serverup后執(zhí)行腳本 notify_down<string>|<quoted-string>#在檢測到serverdown后執(zhí)行腳本TCP_CHECK{ connect_timeout3#連接超時時間 nb_get_retry3#重連次數(shù) delay_before_retry3#重連間隔時間 connect_port23健康檢查的端口的端口 bindto<ip> } HTTP_GET|SSL_GET{ url{#檢查url,可以指定多個 path/ digest<string>#檢查后的摘要信息 status_code200#檢查的返回狀態(tài)碼 } connect_port<port> bindto<IPADD> connect_timeout5 nb_get_retry3 delay_before_retry2 }SMTP_CHECK{ host{ connect_ip<IPADDRESS> connect_port<port>#默認檢查25端口 bindto<IPADDRESS> } connect_timeout5 retry3 delay_before_retry2 helo_name<string>|<quoted-string>#smtphelo請求命令參數(shù),可選 } MISC_CHECK{ misc_path<string>|<quoted-string>#外部腳本路徑 misc_timeout#腳本執(zhí)行超時時間 misc_dynamic#如設置該項,則退出狀態(tài)碼會用來動態(tài)調整服務器的權重,返回0正常,不修改;返回1,檢查失敗,權重改為0;返回2-255,正常,權重設置為:返回狀態(tài)碼-2 } }1、其他配置項說明
keepalived的核心就是將IPVS配置成高可用,生成ipvs規(guī)則來完成負載均衡效果。
virtualserver(虛擬服務)的定義:
virtual_serverIPport#定義虛擬主機IP地址及其端口
virtual_serverfwmarkint#ipvs的防火墻打標,實現(xiàn)基于防火墻的負載均衡集群
virtual_servergroupstring#將多個虛擬服務器定義成組,將組定義成虛擬服務
lb_algo{rr|wrr|lc|wlc|lblc|lblcr}#定義LVS的調度算法
lb_kind{NAT|DR|TUN}#定義LVS的模型
presitence_timeout#定義支持持久連接的時長
protocolTCP#規(guī)則所能支持的協(xié)議
sorry_server#如果所有real_server都出現(xiàn)故障了,利用此返回信息
二、術語
虛擬路由器
由一個Master路由器和多個Backup路由器組成。主機將虛擬路由器當作默認網關;
VRID
虛擬路由器的標識。有相同VRID的一組路由器構成一個虛擬路由器;
Master路由器
虛擬路由器中承擔報文轉發(fā)任務的路由器;
Backup路由器
Master路由器出現(xiàn)故障時,能夠代替Master路由器工作的路由器;
虛擬IP地址
虛擬路由器的IP地址。一個虛擬路由器可以擁有一個或多個IP地址;
IP地址擁有者
接口IP地址與虛擬IP地址相同的路由器被稱為IP地址擁有者;
虛擬MAC地址
一個虛擬路由器擁有一個虛擬MAC地址。通常情況下,虛擬路由器回應ARP請求使用的是虛擬MAC地址,只有虛擬路由器做特殊配置的時候,才回應接口的真實MAC地址;
優(yōu)先級
VRRP根據優(yōu)先級來確定虛擬路由器中每臺路由器的地位;
非搶占方式
如果Backup路由器工作在非搶占方式下,則只要Master路由器沒有出現(xiàn)故障Backup路由器即使隨后被配置了更高的優(yōu)先級也不會成為Master路由器;
搶占方式
如果Backup路由器工作在搶占方式下,當它收到VRRP報文后,會將自己的優(yōu)先級與通告報文中的優(yōu)先級進行比較。如果自己的優(yōu)先級比當前的Master路由器的優(yōu)先級高,就會主動搶占成為Master路由器;否則,將保持Backup狀態(tài).
三、高級使用
1、介紹
Keeaplived主要有兩種應用場景,一個是通過配置keepalived結合ipvs做到負載均衡(LVS+Keepalived)。另一個是通過自身健康檢查、資源接管功能做高可用(雙機熱備),實現(xiàn)故障轉移。
以下內容主要針對Keepalived+MySQL雙主實現(xiàn)雙機熱備為根據,主要講解keepalived的狀態(tài)轉換通知功能,利用此功能可有效加強對MySQL數(shù)據庫監(jiān)控。此文不再講述Keepalived+MySQL雙主部署過程,有需求者可參考以往博文:http://blog.jobbole.com/94643/
2、keepalived主要作用
keepalived采用VRRP(virtualrouterredundancyprotocol),虛擬路由冗余協(xié)議,以軟件的形式實現(xiàn)服務器熱備功能。通常情況下是將兩臺linux服務器組成一個熱備組(master-backup),同一時間熱備組內只有一臺主服務器(master)提供服務,同時master會虛擬出一個共用IP地址(VIP),這個VIP只存在master上并對外提供服務。如果keepalived檢測到master宕機或服務故障,備服務器(backup)會自動接管VIP成為master,keepalived并將master從熱備組移除,當master恢復后,會自動加入到熱備組,默認再搶占成為master,起到故障轉移功能。
3、工作在三層、四層和七層原理
Layer3:工作在三層時,keepalived會定期向熱備組中的服務器發(fā)送一個ICMP數(shù)據包,來判斷某臺服務器是否故障,如果故障則將這臺服務器從熱備組移除。
Layer4:工作在四層時,keepalived以TCP端口的狀態(tài)判斷服務器是否故障,比如檢測mysql3306端口,如果故障則將這臺服務器從熱備組移除。
示例:
!ConfigurationFileforkeepalived global_defs{ notification_email{ xxx@163.com } notification_email_fromexample@example.com smtp_server127.0.0.1 smtp_connect_timeout30 router_idMYSQL_HA }vrrp_instanceVI_1{ stateBACKUP interfaceeth1 virtual_router_id50 nopreempt#當主down時,備接管,主恢復,不自動接管 priority100 advert_int1 authentication{ auth_typePASS ahth_pass123 }virtual_ipaddress{ 192.168.1.200#虛擬IP地址 }}virtual_server192.168.1.2003306{delay_loop6 #lb_algorr #lb_kindNAT persistence_timeout50 protocolTCP real_server192.168.1.2013306{#監(jiān)控本機3306端口 weight1 notify_down/etc/keepalived/kill_keepalived.sh#檢測3306端口為down狀態(tài)就執(zhí)行此腳本(只有keepalived關閉,VIP才漂移) TCP_CHECK{#健康狀態(tài)檢測方式,可針對業(yè)務需求調整(TTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK) connect_timeout3 nb_get_retry3 delay_before_retry3 }}}Layer7:工作在七層時,keepalived根據用戶設定的策略判斷服務器上的程序是否正常運行,如果故障則將這臺服務器從熱備組移除。
示例:
!ConfigurationFileforkeepalived global_defs{ notification_email{ xxx@163.com } notification_email_fromexample@example.com smtp_server127.0.0.1 smtp_connect_timeout30 router_idMYSQL_HA }vrrp_scriptcheck_nginx{ script/etc/keepalived/check_nginx.sh#檢測腳本 interval2#執(zhí)行間隔時間 }vrrp_instanceVI_1{ stateBACKUP interfaceeth1 virtual_router_id50 nopreempt#當主down時,備接管,主恢復,不自動接管 priority100 advert_int1 authentication{ auth_typePASS ahth_pass123 } virtual_ipaddress{ 192.168.1.200#虛擬IP地址 } track_script{#在實例中引用腳本 check_nginx } }腳本內容如下:
#cat/etc/keepalived/check_nginx.sh Count1=`netstat-antp|grep-vgrep|grepnginx|wc-l` if[$Count1-eq0];then /usr/local/nginx/sbin/nginx sleep2 Count2=`netstat-antp|grep-vgrep|grepnginx|wc-l` if[$Count2-eq0];then servicekeepalivedstop else exit0 fi else exit0 fi4、健康狀態(tài)檢測方式
4.1HTTP服務狀態(tài)檢測
4.2TCP端口狀態(tài)檢測(使用TCP端口服務基本上都可以使用)
TCP_CHECK{connect_port80#健康檢測端口,默認為real_server后跟端口connect_timeout5nb_get_retry3delay_before_retry3}4.3郵件服務器SMTP檢測
SMTP_CHECK{#健康檢測郵件服務器smtp
4.4用戶自定義腳本檢測real_server服務狀態(tài)
MISC_CHECK{misc_path/script.sh#指定外部程序或腳本位置misc_timeout3#執(zhí)行腳本超時時間!misc_dynamic#不動態(tài)調整服務器權重(weight),如果啟用將通過退出狀態(tài)碼動態(tài)調整real_server權重值}5、狀態(tài)轉換通知功能
keepalived主配置郵件通知功能,默認當real_server宕機或者恢復時才會發(fā)出郵件。有時我們更想知道keepalived的主服務器故障切換后,VIP是否順利漂移到備服務器,MySQL服務器是否正常?那寫個監(jiān)控腳本吧,可以,但沒必要,因為keepalived具備狀態(tài)檢測功能,所以我們直接使用就行了。
主配置默認郵件通知配置模板如下:
5.1實例狀態(tài)通知
a)notify_master:節(jié)點變?yōu)閙aster時執(zhí)行
b)notify_backup:節(jié)點變?yōu)閎ackup時執(zhí)行
c)notify_fault:節(jié)點變?yōu)楣收蠒r執(zhí)行
5.2虛擬服務器檢測通知
a)notify_up:虛擬服務器up時執(zhí)行
b)notify_down:虛擬服務器down時執(zhí)行
示例:
!ConfigurationFileforkeepalived global_defs{ notification_email{ example@163.com }notification_email_fromexample@example.com smtp_server127.0.0.1 smtp_connect_timeout30 router_idMYSQL_HA } vrrp_instanceVI_1{ stateBACKUP interfaceeth1 virtual_router_id50 nopreempt#當主down時,備接管,主恢復,不自動接管 priority100 advert_int1 authentication{ auth_typePASS ahth_pass123 } virtual_ipaddress{ 192.168.1.200 } notify_master/etc/keepalived/to_master.sh notify_backup/etc/keepalived/to_backup.sh notify_fault/etc/keepalived/to_fault.sh }virtual_server192.168.1.2003306{delay_loop6persistence_timeout50protocolTCPreal_server192.168.1.2013306{weight1notify_up/etc/keepalived/mysql_up.shnotify_down/etc/keepalived/mysql_down.shTCP_CHECK{connect_timeout3nb_get_retry3delay_before_retry3}}}狀態(tài)參數(shù)后可以是bash命令,也可以是shell腳本,內容根據自己需求定義,以上示例中所涉及狀態(tài)腳本如下:
1)當服務器改變?yōu)橹鲿r執(zhí)行此腳本
2)當服務器改變?yōu)閭鋾r執(zhí)行此腳本
#!/bin/bash Date=$(date+%F""%T) IP=$(ifconfigeth0|grep"inetaddr"|cut-d":"-f2|awk'{print$1}') Mail="baojingtongzhi@163.com" echo"$Date$IPchangetobackup."|mail-s"Master-BackupChangeStatus"$Mail3)當服務器改變?yōu)楣收蠒r執(zhí)行此腳本
#!/bin/bash Date=$(date+%F""%T) IP=$(ifconfigeth0|grep"inetaddr"|cut-d":"-f2|awk'{print$1}') Mail="baojingtongzhi@163.com" echo"$Date$IPchangetofault."|mail-s"Master-BackupChangeStatus"$Mail4)當檢測TCP端口3306為不可用時,執(zhí)行此腳本,殺死keepalived,實現(xiàn)切換
#!/bin/bash Date=$(date+%F""%T) IP=$(ifconfigeth0|grep"inetaddr"|cut-d":"-f2|awk'{print$1}') Mail="baojingtongzhi@163.com" pkillkeepalived echo"$Date$IPThemysqlservicefailure,killkeepalived."|mail-s"Master-BackupMySQLMonitor"$Mail5)當檢測TCP端口3306可用時,執(zhí)行此腳本
#!/bin/bash Date=$(date+%F""%T) IP=$(ifconfigeth0|grep"inetaddr"|cut-d":"-f2|awk'{print$1}') Mail="baojingtongzhi@163.com" echo"$Date$IPThemysqlserviceisrecovery."|mail-s"Master-BackupMySQLMonitor"$Mail總結
以上是生活随笔為你收集整理的keeplive安装部署的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [BUGKU][CTF][Reverse
- 下一篇: Facebook开源动画库 POP-PO