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ì)了此套方案,編寫了failover.sh 腳本,實(shí)現(xiàn)了雙機(jī)互備、全自動(dòng)切換,故障轉(zhuǎn)移時(shí)間只需幾十秒。一、雙機(jī)互備、全自動(dòng)切換方案:1、拓?fù)鋱D:2、解釋:(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ī)

2、綁定內(nèi)、外網(wǎng)虛擬ip,備機(jī)作為備份,當(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í),讀寫主機(jī)的mysql,寫到主機(jī)的數(shù)據(jù)會(huì)同步到備機(jī);在備機(jī)處于活動(dòng)狀態(tài)時(shí),讀寫備機(jī)的mysql,寫到備機(jī)的數(shù)據(jù)會(huì)同步到主機(jī)(

3、如果主機(jī)上的 mysql 死掉暫時(shí)無(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 的配置

4、文件見(jiàn)兩臺(tái)服務(wù)器的/etc/rsyncd.conf ,rsync 守護(hù)進(jìn)程的啟動(dòng)命令為 rsync -daemon 3、自動(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)

5、網(wǎng)關(guān),通知網(wǎng)關(guān)更新虛擬 ip 的 mac地址為備機(jī)的 mac地址,從而保證了切換后能夠通過(guò)虛擬ip及時(shí)訪問(wèn)到備機(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ù)器上都做修改。

6、(2)、 /data0/htdocs/ 目錄內(nèi)任何用 ln -s 建立的軟連接,rsync 不會(huì)自動(dòng)同步,如果在一臺(tái)服務(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/(ngi

7、nx 配置文件目錄)三個(gè)目錄之外的其他配置修改,需要在兩臺(tái)服務(wù)器上都做修改。二、配置文檔與腳本:1、主機(jī)、備機(jī)兩臺(tái)服務(wù)器的rsync 配置(配置相同)(1)、rsync 配置文件vi /etc/rsyncd.conf 輸入一些內(nèi)容并保存:引用uid = root gid = root use chroot = no max connections = 20 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log data0_htdocs path = /data0

8、/htdocs/ ignore errors read only = no hosts allow = /24 hosts deny = /32 php_etc path = /usr/local/webserver/php/etc/ ignore errors read only = no hosts allow = /24 hosts deny = /32 nginx_conf path = /usr/local/webserver/nginx/conf/ ignore errors read only = n

9、o hosts allow = /24 hosts deny = /32 (2)、啟動(dòng) rsync 守護(hù)進(jìn)程/usr/bin/rsync -daemon 2、兩臺(tái) mysql 互為主從的配置這里就不詳細(xì)寫出互為主從的配置過(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)程(為了開機(jī)能夠自動(dòng)運(yùn)行,請(qǐng)將以下語(yǔ)句添

10、加到/etc/rc.local 文件中):/usr/bin/nohup /bin/sh /usr/local/webserver/failover/failover.sh 2&1 /dev/null & (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.sh root 20123 6878 0 16:16 pts/2 00:00:00 grep failov

11、er.sh然后殺死 failover.sh 的進(jìn)程:kill -9 15428 (3)、failover.sh 代碼內(nèi)容( 請(qǐng)注意其中的 type 設(shè)置,主機(jī)設(shè)為 master ,備機(jī)設(shè)為 slave):#!/bin/sh lang=c date=$(date -d today +%y-%m-%d %h:%m:%s) #-配置信息 (開始)- # 類型:主機(jī)設(shè)為 master ,備機(jī)設(shè)為 slave type=master # 主機(jī)、備機(jī)切換日志路徑logfile=/var/log/failover.log #mysql 可執(zhí)行文件地址, 例如/usr/local/mysql/bin/mysq

12、l;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= # 主機(jī)內(nèi)網(wǎng)真實(shí) ip rip_eth0_master=28 # 備機(jī)內(nèi)網(wǎng)真實(shí) ip rip_eth0_slave=32 # 主機(jī)、備機(jī)內(nèi)網(wǎng)共用的虛擬ip vip_eth0_share=00 # 外網(wǎng)網(wǎng)關(guān)gatew

13、ay_eth1= # 主機(jī)外網(wǎng)真實(shí) ip rip_eth1_master=28 # 備機(jī)外網(wǎng)真實(shí) ip rip_eth1_slave=32 # 主機(jī)、備機(jī)外網(wǎng)共用的虛擬ip vip_eth1_share=00 #-配置信息 (結(jié)束)- # 綁定內(nèi)、外網(wǎng)虛擬ip function_bind_vip() /sbin/ifconfig eth0:vip $vip_eth0_share broadcast $vip_eth0_share netmask 55 up /sbin/route add -host $v

14、ip_eth0_share dev eth0:vip /sbin/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/logs/nginx.pid /sbin/service crond start #

15、 解除內(nèi)、外網(wǎng)虛擬ip function_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 netmask 55 down /sbin/service crond stop # 主機(jī)向備機(jī)推送文件的函數(shù)function_rsync_master_to_slave() /usr

16、/bin/rsync -zrtuog /data0/htdocs/ $rip_eth0_slave:data0_htdocs/ /dev/null 2&1 /usr/bin/rsync -zrtuog /usr/local/webserver/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ù)functi

17、on_rsync_slave_to_master() /usr/bin/rsync -zrtuog /data0/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_conf/ /dev

18、/null 2&1 # 虛擬 ip arping function_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 true do # 用 http 協(xié)議檢查虛擬 ip if (curl -m 30 -g http:/$vip_eth1_share/ /dev/null 2&1) &a

19、mp; ($mysql_bin -u$mysql_username -p$mysql_password -p$mysql_port -h$vip_eth0_share -eshow slave statusg /dev/null 2&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 -eshow slave statusg | grep master_host

20、 | 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 = 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 $eth0_active_server =

21、$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 -h$rip_eth0_master -eshow slave statusg | grep seconds_behind_master: 0 /dev/null 2&1) then # 如果主機(jī)能夠訪問(wèn),數(shù)據(jù)庫(kù)同步無(wú)延遲,且本機(jī)就是主機(jī),那么由本機(jī)綁定虛擬 ip if

22、$type = master then # 如果本機(jī)為主機(jī)function_bind_vip function_vip_arping echo $date 主機(jī)已綁定虛擬ip!(type:1) $logfile else # 如果本機(jī)為備機(jī)function_remove_vip echo $date 備機(jī)已去除虛擬ip!(type:2) $logfile fi else if $type = slave then # 如果本機(jī)為備機(jī)function_rsync_slave_to_master function_vip_arping fi fi fi else # 虛擬 ip 無(wú)法訪問(wèn)時(shí),判斷主機(jī)能否訪問(wèn) 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_e

溫馨提示

  • 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)論