Linux 熱備切換:簡單的命令行搞定
來源:程序員人生 發布時間:2014-05-31 08:41:33 閱讀次數:3664次
在網絡系統中,除了用負載均衡來提高性能和可用性外,還有大量的主從備份模式應用,比如當前版本的 redis 和 mongodb。我們有無數的理由希望備份服務器能在合適的時間自動接替 "受傷倒地" 的主服務器繼續完成后續工作,也就是所謂的 "熱切換"。在 Linux 上要實現這個非常簡單,幾行命令就搞定了。
其原理就是動態綁定虛擬IP(或漂移IP)。假設主服務器 192.168.1.20,備份服務器 192.168.1.30,虛擬 IP 為 192.168.1.5。我們首先在主服務器上運行如下腳本。
$ cat master.sh
#!/bin/bash
ifconfig eth0:1 192.168.1.5 broadcast 192.168.1.255 netmask 255.255.255.0 up
route add -host 192.168.1.5 dev eth0:1
arping -I eth0 -c 3 -s 192.168.1.5 192.168.1.1
$ sudo ./master.sh
ARPING 192.168.1.1 from 192.168.1.5 eth0
Unicast reply from 192.168.1.1 [00:1F:A3:2C:E2:38] 1.627ms
Unicast reply from 192.168.1.1 [00:1F:A3:2C:E2:38] 0.989ms
Unicast reply from 192.168.1.1 [00:1F:A3:2C:E2:38] 0.968ms
Sent 3 probes (1 broadcast(s))
Received 3 response(s)
很顯然上級路由(192.168.1.1)已經接受了我們的設置,用 ifconfig 可以查看虛擬 IP 的綁定信息。
$ cat a.txt
eth0 Link encap:Ethernet HWaddr 00:0c:29:04:a0:db
inet addr:192.168.1.20 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe04:a0db/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:238 errors:0 dropped:0 overruns:0 frame:0
TX packets:188 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:25793 (25.7 KB) TX bytes:25405 (25.4 KB)
eth0:1 Link encap:Ethernet HWaddr 00:0c:29:04:a0:db
inet addr:192.168.1.5 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
如此就將 192.168.1.5 綁定到主服務器上,相關用戶就可以通過該虛擬IP訪問主服務器服務了。
$ ssh 192.168.1.5
接著,我們在備份服務器(192.168.1.30)上運行監控腳本 (實際部署時可以作為后臺進程運行,并將輸出重定向到 /dev/null)。
$ cat slave.sh
#!/bin/bash
while true
do
ping -c 3 192.168.1.20
if [ $? -eq 0 ]; then
echo "Master Server running ..."
sleep 5
else
echo "Backup Server running ..."
ifconfig eth0:1 192.168.1.5 broadcast 192.168.1.255 netmask 255.255.255.0 up
route add -host 192.168.1.5 dev eth0:1
arping -I eth0 -c 3 -s 192.168.1.5 192.168.1.1
break
fi
done
該腳本通過循環 ping 主服務器(192.168.1.20)的返回值來判斷主服務器是否完蛋,當然也可以用諸如 wget + grep 的方式監控 WebServer 等。一旦發現主服務器異常將發送虛擬 IP 綁定設置,如此來實現將 192.168.1.5 的請求路由到備份服務器 192.168.1.30 上來。
開始運行監控腳本。
$ sudo ./slave.sh
PING 192.168.1.20 (192.168.1.20) 56(84) bytes of data.
64 bytes from 192.168.1.20: icmp_seq=1 ttl=64 time=1.01 ms
64 bytes from 192.168.1.20: icmp_seq=2 ttl=64 time=0.855 ms
64 bytes from 192.168.1.20: icmp_seq=3 ttl=64 time=0.813 ms
--- 192.168.1.20 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.813/0.893/1.011/0.085 ms
Master Server running ...
PING 192.168.1.20 (192.168.1.20) 56(84) bytes of data.
64 bytes from 192.168.1.20: icmp_seq=1 ttl=64 time=0.989 ms
64 bytes from 192.168.1.20: icmp_seq=2 ttl=64 time=0.887 ms
64 bytes from 192.168.1.20: icmp_seq=3 ttl=64 time=0.813 ms
--- 192.168.1.20 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 0.813/0.896/0.989/0.076 ms
Master Server running ...
現在我們關掉主服務器(拔網線比關電源要好些),備份服務器將開始接管。
--- 192.168.1.20 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.518/0.724/0.829/0.145 ms
Master Server running ...
PING 192.168.1.20 (192.168.1.20) 56(84) bytes of data.
--- 192.168.1.20 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2004ms
Backup Server running ...
ARPING 192.168.1.1 from 192.168.1.5 eth0
Unicast reply from 192.168.1.1 [00:1F:A3:2C:E2:38] 1.812ms
Unicast reply from 192.168.1.1 [00:1F:A3:2C:E2:38] 1.110ms
Unicast reply from 192.168.1.1 [00:1F:A3:2C:E2:38] 1.116ms
Sent 3 probes (1 broadcast(s))
Received 3 response(s)
這個時候,我們再次訪問 192.168.1.5 的服務時就會自動導向備份服務器 192.168.1.30 上。
等主服務器 "修好" 以后,再次運行 "sudo ./master.sh" 即可恢復。
附: 使用 down 參數可以解除虛擬IP的綁定。
$ sudo ifconfig eth0:1 192.168.1.5 broadcast 192.168.1.255 netmask 255.255.255.0 down
--------- 分隔線 ---------------
此種做法當然遠不如專業級的 heartbeat、keepalived,但勝在簡單易用。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈