Nginx+MySQL雙機(jī)互備、全自動(dòng)切換方案_第1頁(yè)
Nginx+MySQL雙機(jī)互備、全自動(dòng)切換方案_第2頁(yè)
Nginx+MySQL雙機(jī)互備、全自動(dòng)切換方案_第3頁(yè)
Nginx+MySQL雙機(jī)互備、全自動(dòng)切換方案_第4頁(yè)
Nginx+MySQL雙機(jī)互備、全自動(dòng)切換方案_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Nginx+MySQL雙機(jī)互備、全自動(dòng)切換方案在生產(chǎn)應(yīng)用中,某臺(tái)“Nginx+ MySQL”接口數(shù)據(jù)服務(wù)器,扮演的角色十分重要,如果服務(wù)器硬件或Nginx、MySQL發(fā)生故障,而短時(shí)間內(nèi)無(wú)法恢復(fù),后果將非常嚴(yán)重。為了避免單點(diǎn)故障,我設(shè)計(jì)了此套方案,編寫(xiě)了failover.sh腳本,實(shí)現(xiàn)了雙機(jī)互備、全自動(dòng)切換,故障轉(zhuǎn)移時(shí)間只需幾十秒。一、雙機(jī)互備、全自動(dòng)切換方案:1、拓?fù)鋱D:2、解釋?zhuān)?1)、假設(shè)外網(wǎng)域名blog.XXX.cc解析到外網(wǎng)虛擬IP 00上,內(nèi)網(wǎng)hosts設(shè)置db10對(duì)應(yīng)內(nèi)網(wǎng)虛擬IP 00(2)、默認(rèn)情況下,由主機(jī)綁定內(nèi)、外網(wǎng)虛擬IP,備機(jī)作

2、為備份,當(dāng)主機(jī)的MySQL、Nginx或服務(wù)器出現(xiàn)故障無(wú)法訪問(wèn)時(shí),備機(jī)會(huì)自動(dòng)接管內(nèi)、外網(wǎng)虛擬IP。兩臺(tái)服務(wù)器都啟動(dòng)負(fù)責(zé)監(jiān)控、自動(dòng)切換虛擬IP的守護(hù)進(jìn)程/usr/bin/nohup /bin/sh /usr/local/webserver/failover/failover.sh 2>&1 > /dev/null &(3)、主機(jī)和備機(jī)上的MySQL服務(wù)器互為主從,互相同步。在主機(jī)處于活動(dòng)狀態(tài)(即由主機(jī)綁定虛擬IP)時(shí),讀寫(xiě)主機(jī)的MySQL,寫(xiě)到主機(jī)的數(shù)據(jù)會(huì)同步到備機(jī);在備機(jī)處于活動(dòng)狀態(tài)時(shí),讀寫(xiě)備機(jī)的MySQL,寫(xiě)到備機(jī)的數(shù)據(jù)會(huì)同步到主機(jī)(如果主機(jī)上的MySQL死掉暫時(shí)

3、無(wú)法同步,主機(jī)上的MySQL恢復(fù)后,數(shù)據(jù)會(huì)自動(dòng)從備機(jī)上同步過(guò)來(lái),反之亦然)。(4)、主機(jī)處于活動(dòng)狀態(tài)時(shí),每20秒會(huì)把/data0/htdocs/(網(wǎng)頁(yè)、程序、圖片存放目錄)、/usr/local/webserver/php/etc/(php.ini等配置文件目錄)、/usr/local/webserver/nginx/conf/(Nginx配置文件目錄)三個(gè)目錄下的文件通過(guò)rsync推送到備機(jī)服務(wù)器上的對(duì)應(yīng)目錄(增量推送,兩臺(tái)服務(wù)器上一樣的文件不會(huì)重復(fù)推送),反之如果備機(jī)處于活動(dòng)狀態(tài)時(shí),每20秒會(huì)嘗試把文件推送到主機(jī)。rsync的配置文件見(jiàn)兩臺(tái)服務(wù)器的/etc/rsyncd.conf,rsyn

4、c守護(hù)進(jìn)程的啟動(dòng)命令為rsync -daemon3、自動(dòng)切換流程(1)、主機(jī)默認(rèn)綁定內(nèi)、外網(wǎng)虛擬IP,當(dāng)主機(jī)的MySQL、Nginx無(wú)法訪問(wèn)或服務(wù)器宕機(jī),主機(jī)上的failover.sh守護(hù)進(jìn)程會(huì)自動(dòng)摘除自己綁定的內(nèi)、外網(wǎng)虛擬IP(如果主機(jī)上的failover.sh死掉,無(wú)法摘除自己綁定的虛擬IP也沒(méi)關(guān)系),備機(jī)上的failover.sh守護(hù)進(jìn)程會(huì)自動(dòng)接管備機(jī)原來(lái)綁定的內(nèi)、外網(wǎng)虛擬IP,并發(fā)送ARPing包給內(nèi)、外網(wǎng)網(wǎng)關(guān)更新MAC,強(qiáng)行接管。(2)、備機(jī)綁定虛擬IP后,會(huì)發(fā)送ARPing包給內(nèi)、外網(wǎng)網(wǎng)關(guān),通知網(wǎng)關(guān)更新虛擬IP的MAC地址為備機(jī)的MAC地址,從而保證了切換后能夠通過(guò)虛擬IP及時(shí)訪問(wèn)

5、到備機(jī)。(3)、如果主機(jī)的MySQL、Nginx啟動(dòng)起來(lái),全部恢復(fù)正常訪問(wèn),主機(jī)上的failover.sh守護(hù)進(jìn)程會(huì)檢測(cè)主機(jī)上的MySQL數(shù)據(jù)是否已經(jīng)完全從備機(jī)上同步過(guò)來(lái)。如果同步延遲時(shí)間為0,主機(jī)會(huì)自動(dòng)接管內(nèi)、外網(wǎng)虛擬IP,并發(fā)送ARPing包給內(nèi)、外網(wǎng)網(wǎng)關(guān),而備機(jī)也會(huì)自動(dòng)摘除內(nèi)、外網(wǎng)虛擬IP。(4)、整個(gè)切換流程均由failover.sh自動(dòng)完成,無(wú)需人工處理。 4、注意事項(xiàng)(很重要):(1)、crontab里的文件沒(méi)有做自動(dòng)同步,如果修改,需要手工在兩臺(tái)服務(wù)器上都做修改。(2)、/data0/htdocs/目錄內(nèi)任何用ln -s建立的軟連接,rsync不會(huì)自動(dòng)同步,如果在一臺(tái)服

6、務(wù)器上建了軟連接,需要手工在另外一臺(tái)服務(wù)器上也建相同的軟連接。(3)、如果要?jiǎng)h除/data0/htdocs/目錄內(nèi)的某些文件或目錄,需要先刪除處于活動(dòng)狀態(tài)(即綁定了虛擬IP)服務(wù)器上的文件或目錄,再刪除處于備用狀態(tài)服務(wù)器上的文件或目錄。(4)、除了/data0/htdocs/(網(wǎng)頁(yè)、程序、圖片存放目錄)、/usr/local/webserver/php/etc/(php.ini等配置文件目錄)、/usr/local/webserver/nginx/conf/(Nginx配置文件目錄)三個(gè)目錄之外的其他配置修改,需要在兩臺(tái)服務(wù)器上都做修改。二、配置文檔與腳本:1、主機(jī)、備機(jī)兩臺(tái)服務(wù)器的rsync

7、配置(配置相同)(1)、rsync配置文件vi /etc/rsyncd.conf輸入一些內(nèi)容并保存:引用uid = rootgid = rootuse chroot = nomax connections = 20pid file = /var/run/rsyncd.pidlock file = /var/run/rsync.locklog file = /var/log/rsyncd.logdata0_htdocspath = /data0/htdocs/ignore errorsread only = nohosts allow = /24hosts deny =

8、 /32php_etcpath = /usr/local/webserver/php/etc/ignore errorsread only = nohosts allow = /24hosts deny = /32nginx_confpath = /usr/local/webserver/nginx/conf/ignore errorsread only = nohosts allow = /24hosts deny = /32(2)、啟動(dòng)rsync守護(hù)進(jìn)程/usr/bin/rsync -daemon

9、2、兩臺(tái)MySQL互為主從的配置這里就不詳細(xì)寫(xiě)出互為主從的配置過(guò)程了,如果不懂的朋友可以在Google上搜一下。有一點(diǎn)需要指出,f配置文件中請(qǐng)加上skip-name-resolve參數(shù),使用IP來(lái)進(jìn)行MySQL帳號(hào)驗(yàn)證。3、主機(jī)、備機(jī)兩臺(tái)服務(wù)器負(fù)載監(jiān)控、虛擬IP自動(dòng)切換的failover.sh守護(hù)進(jìn)程(1)、啟動(dòng)failover.sh守護(hù)進(jìn)程(為了開(kāi)機(jī)能夠自動(dòng)運(yùn)行,請(qǐng)將以下語(yǔ)句添加到/etc/rc.local文件中):/usr/bin/nohup /bin/sh /usr/local/webserver/failover/failover.sh 2>&1 > /dev/nu

10、ll &(2)、停止failover.sh守護(hù)進(jìn)程:ps -ef | grep failover.sh會(huì)顯示以下信息:root     15428     1  0 Nov17 ?        00:00:03 /bin/sh /usr/local/webserver/failover/failover.shroot     20123  6878

11、  0 16:16 pts/2    00:00:00 grep failover.sh然后殺死failover.sh的進(jìn)程:kill -9 15428(3)、failover.sh代碼內(nèi)容(請(qǐng)注意其中的type設(shè)置,主機(jī)設(shè)為master,備機(jī)設(shè)為slave):#!/bin/shLANG=Cdate=$(date -d "today" +"%Y-%m-%d %H:%M:%S")#-配置信息(開(kāi)始)-#類(lèi)型:主機(jī)設(shè)為master,備機(jī)設(shè)為slavetype="master"#主

12、機(jī)、備機(jī)切換日志路徑logfile="/var/log/failover.log"#MySQL可執(zhí)行文件地址,例如/usr/local/mysql/bin/mysql;MySQL用戶名;密碼;端口mysql_bin="/usr/local/webserver/mysql/bin/mysql"mysql_username="root"mysql_password="123456"mysql_port="3306"#內(nèi)網(wǎng)網(wǎng)關(guān)gateway_eth0=""

13、#主機(jī)內(nèi)網(wǎng)真實(shí)IPrip_eth0_master="28"#備機(jī)內(nèi)網(wǎng)真實(shí)IPrip_eth0_slave="32"#主機(jī)、備機(jī)內(nèi)網(wǎng)共用的虛擬IPvip_eth0_share="00"#外網(wǎng)網(wǎng)關(guān)gateway_eth1=""#主機(jī)外網(wǎng)真實(shí)IPrip_eth1_master="28"#備機(jī)外網(wǎng)真實(shí)IPrip_eth1_slave="32"#主機(jī)、備機(jī)外網(wǎng)共

14、用的虛擬IPvip_eth1_share="00"#-配置信息(結(jié)束)-#綁定內(nèi)、外網(wǎng)虛擬IPfunction_bind_vip()    /sbin/ifconfig eth0:vip $vip_eth0_share broadcast $vip_eth0_share netmask 55 up    /sbin/route add -host $vip_eth0_share dev eth0:vip    /s

15、bin/ifconfig eth1:vip $vip_eth1_share broadcast $vip_eth1_share netmask 55 up    /sbin/route add -host $vip_eth1_share dev eth1:vip    /usr/local/webserver/php/sbin/php-fpm reload    kill -USR1 cat /usr/local/webserver/nginx/lo

16、gs/nginx.pid    /sbin/service crond start#解除內(nèi)、外網(wǎng)虛擬IPfunction_remove_vip()    /sbin/ifconfig eth0:vip $vip_eth0_share broadcast $vip_eth0_share netmask 55 down    /sbin/ifconfig eth1:vip $vip_eth1_share broadcast $vip_eth1_share

17、 netmask 55 down    /sbin/service crond stop#主機(jī)向備機(jī)推送文件的函數(shù)function_rsync_master_to_slave()    /usr/bin/rsync -zrtuog /data0/htdocs/ $rip_eth0_slave:data0_htdocs/ > /dev/null 2>&1    /usr/bin/rsync -zrtuog /usr/local/we

18、bserver/php/etc/ $rip_eth0_slave:php_etc/ > /dev/null 2>&1    /usr/bin/rsync -zrtuog /usr/local/webserver/nginx/conf/ $rip_eth0_slave:nginx_conf/ > /dev/null 2>&1#備機(jī)向主機(jī)推送文件的函數(shù)function_rsync_slave_to_master()    /usr/bin/rsync -zrtuog /data0

19、/htdocs/ $rip_eth0_master:data0_htdocs/ > /dev/null 2>&1    /usr/bin/rsync -zrtuog /usr/local/webserver/php/etc/ $rip_eth0_master:php_etc/ > /dev/null 2>&1    /usr/bin/rsync -zrtuog /usr/local/webserver/nginx/conf/ $rip_eth0_master:nginx_co

20、nf/ > /dev/null 2>&1#虛擬IP ARPingfunction_vip_arping()  /sbin/arping -I eth0 -c 3 -s $vip_eth0_share $gateway_eth0 > /dev/null 2>&1  /sbin/arping -I eth1 -c 3 -s $vip_eth1_share $gateway_eth1 > /dev/null 2>&1  while truedo   &

21、#160;#用HTTP協(xié)議檢查虛擬IP    if (curl -m 30 -G http:/$vip_eth1_share/ > /dev/null 2>&1) && ($mysql_bin -u"$mysql_username" -p"$mysql_password" -P"$mysql_port" -h"$vip_eth0_share" -e"show slave statusG" > /dev/null 2

22、>&1)    then    #取得與內(nèi)網(wǎng)VIP綁定的服務(wù)器內(nèi)網(wǎng)IP    eth0_active_server=$($mysql_bin -u"$mysql_username" -p"$mysql_password" -P"$mysql_port" -h"$vip_eth0_share" -e"show slave statusG" | gr

23、ep "Master_Host" | awk -F ': ' 'printf $2')        #如果內(nèi)網(wǎng)VIP=主機(jī)內(nèi)網(wǎng)IP(主機(jī)MySQL中的Master_Host顯示的是備機(jī)的域名或IP),且本機(jī)為主機(jī)    if "$eth0_active_server" = "$rip_eth0_slave" && "$type"

24、= "master"     then      function_rsync_master_to_slave      function_vip_arping        #如果內(nèi)網(wǎng)VIP=備機(jī)內(nèi)網(wǎng)IP(備機(jī)MySQL中的Master_Host顯示的是主機(jī)的域名或IP)    elif &quo

25、t;$eth0_active_server" = "$rip_eth0_master"     then      if (curl -m 30 -G http:/$rip_eth1_master/ > /dev/null 2>&1) && ($mysql_bin -u"$mysql_username" -p"$mysql_password" -P"$mysql_port"

26、; -h"$rip_eth0_master" -e"show slave statusG" | grep "Seconds_Behind_Master: 0" > /dev/null 2>&1)      then        #如果主機(jī)能夠訪問(wèn),數(shù)據(jù)庫(kù)同步無(wú)延遲,且本機(jī)就是主機(jī),那么由本機(jī)綁定虛擬IP    

27、0;   if "$type" = "master"         then          #如果本機(jī)為主機(jī)       function_bind_vip          func

28、tion_vip_arping          echo "$date 主機(jī)已綁定虛擬IP!(Type:1)" >> $logfile        else          #如果本機(jī)為備機(jī)       function_

29、remove_vip          echo "$date 備機(jī)已去除虛擬IP!(Type:2)" >> $logfile        fi      else        if "$type" = "slav

30、e"         then          #如果本機(jī)為備機(jī)       function_rsync_slave_to_master                 

31、60;function_vip_arping        fi            fi    fi    else        #虛擬IP無(wú)法訪問(wèn)時(shí),判斷主機(jī)能否訪問(wèn)     

32、60;  if (curl -m 30 -G http:/$rip_eth1_master/ > /dev/null 2>&1) && ($mysql_bin -u"$mysql_username" -p"$mysql_password" -P"$mysql_port" -h"$rip_eth0_master" -e"show slave statusG" > /dev/null 2>&1)  

33、60;     then            #如果主機(jī)能夠訪問(wèn),且本機(jī)就是主機(jī),那么由本機(jī)綁定虛擬IP            if "$type" = "master"         

34、    then                function_bind_vip                function_vip_arping       &#

35、160;        echo "$date 主機(jī)已綁定虛擬IP!(Type:3)" >> $logfile            else                function_remove_v

36、ip                echo "$date 備機(jī)已去除虛擬IP!(Type:4)" >> $logfile            fi    elif (curl -m 30 -G http:/$rip_eth1_slave/ &g

37、t; /dev/null 2>&1) && ($mysql_bin -u"$mysql_username" -p"$mysql_password" -P"$mysql_port" -h"$rip_eth0_slave" -e"show slave statusG" > /dev/null 2>&1)        then            #如果主機(jī)不能訪問(wèn)而備機(jī)能夠訪問(wèn),且本機(jī)就是備機(jī),那么由備機(jī)綁定虛擬IP            if "$t

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論