1 2 3 4 5 6 7 8 9 10 11 12 | 思路: 1. 配置雙機互信(非必須) 2. 添加主機名解析 3. 設置時間同步 4. 實現主機的高可用 5. 實現web服務器的高可用 6. 測試 架構: Master1: 172.16.16.16 node2.ja.com 軟件: keepalived+nginx 網卡Vmnet2 Master2: 172.16.16.17 node3.ja.com 軟件: keepalived+nginx 網卡Vmnet2 宿主機:僅作爲測試使用的客戶端 |
一、準備工作
1)編輯/etc/hosts文件,分別爲node3,node4添加主機名稱解析,添加內容如下:
1 2 | 172.16.16.16 node2.ja.com 172.16.16.17 node3.ja.com |
2)配置雙機互信,實現免密鑰、免密碼登錄(方便以後的管理,如軟件安裝,文件分發)
1 2 3 4 5 6 | node2: ssh -keygen -t rsa -P '' ssh -copy- id -i . ssh /id_rsa .pub node4.ja.com node3: ssh -keygen -t rsa -P '' ssh -copy- id -i . ssh /id_rsa .pub node3.ja.com |
3)時間同步
命令行同步,立即生效:
1 | ssh node2.ja.com 'ntpdate 172.16.0.1' ;ntpdate 172.16.0.1 |
設置定時任務,永久有效:
1 | echo '*/5 * * * * /usr/sbin/ntpdate 172.16.0.1 &>/dev/null;/sbin/hwclock -w' >> /var/spool/cron/root |
4)分別爲node2,node3安裝keepalived和nginx
1 | yum -y install keepalived nginx ipvsadm |
二、編寫外部腳本
1)主機維護腳本(這個配置在keepalived.conf中)
1 2 3 4 5 6 7 | vrrp_script chk_mantaince { # chk_mantaince定義腳本的名稱,可隨意取 script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" #命令(其實這裏可以是自己定義好的腳本路徑也可以是判斷命令)#這裏的意思是如果在這個文件下有down這個文件就表示期望這 個節點爲備用狀態。 interval 1 #每隔1秒鐘執行一次 weight -2 #一旦命令執行失敗,權重降低2個 } |
2)keepalived狀態轉換通知腳本(這個放在/etc/keepalived/命目錄下)
這個腳本2個節點都要有
添加可執行權限
|
3)nginx web服務健康檢測腳本及郵件通知腳本(這個放在/etc/keepalived/命目錄下)
這個腳本2個節點都要有
添加可執行權限
|
三、配置keepalived
node2上keepalived的完整配置如下:
|
node3節點上keepalived的配置,與上面大部分相同,僅需作出如下修改即可
1 2 3 4 5 6 7 | vrrp_instance VI_1中 state BACKUP priority 99 vrrp_instance VI_1中 state MASTER priority 100 |
注: 相同實例通信時的密碼要相同;每個實例都要有一個獨立的VIP地址
定義完檢測腳本還需在實例中調用檢測跟蹤機制,這樣檢測腳本纔會生效;
主、備節點的priority大小和 weight的大小一定要合適,不然vip會轉移失敗的;
將nginx web服務的守護進程調入後臺運行
1 2 3 4 | [root@node2 keepalived] # nohup sh monitor_nginx.sh & [1] 32071 [root@node3 keepalived] # nohup sh monitor_nginx.sh & [1] 30106 |
查看正在後臺運行的nginx web服務的守護進程
1 2 3 4 | [root@node2 keepalived] # ps -elf|grep "sh monitor_nginx.sh"|grep -v grep 0 S root 32071 30943 0 80 0 - 26523 wait 13:29 pts /4 00:00:00 sh monitor_nginx.sh [root@node3 keepalived] # ps -elf|grep "sh monitor_nginx.sh"|grep -v grep 0 S root 30106 27606 0 80 0 - 26523 wait 02:13 pts /0 00:00:00 sh monitor_nginx.sh |
查看nginx的80端口是否啓用
1 2 3 4 5 6 7 8 | [root@node2 keepalived] # lsof -i:80 COMMAND PID USER FD TYPE DEVICE SIZE /OFF NODE NAME nginx 31880 root 6u IPv4 160257 0t0 TCP *:http (LISTEN) nginx 31882 nginx 6u IPv4 160257 0t0 TCP *:http (LISTEN) [root@node3 keepalived] # lsof -i:80 COMMAND PID USER FD TYPE DEVICE SIZE /OFF NODE NAME nginx 29815 root 6u IPv4 310255 0t0 TCP *:http (LISTEN) nginx 29817 nginx 6u IPv4 310255 0t0 TCP *:http (LISTEN) |
四、主機和服務高可用測試
測試雙主高可用前的測試:確保2個web服務器均可正常提供服務
分別在瀏覽器輸入2個VIP的地址看是否可以看到各自對應的web頁面
主節點1 VIP:http://172.16.16.10/ 參考截圖:雙主-node2
主節點2 VIP: http://172.16.16.11/ 參考截圖:雙主-node3
測試主機(node2,node3)的高可用
思路:
(1)停止node2的keepalived服務或者直接將node2的虛擬機掛起,模擬keepalived應用程序或服務器故障
驗證node2上的VIP地址是否已經成功轉移到node3
(2)在瀏覽器分別使用http://172.16.16.10/和http://172.16.16.11/訪問web資源,驗證是否可以看到node3上提供的web服務
參考截圖10,11
截圖10:
截圖11:
(3)當node2的keepalived再次啓動後,又會把原有的VIP資源搶奪回來,web頁面也會是自己提供的
停掉node2上的keepalived服務
1 | [root@node2 keepalived] # service keepalived stop |
查看node2上的VIP是否成功轉移
1 2 3 | [root@node2 keepalived] # ip addr show|grep 'eth0' 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 inet 172.16.16.16 /16 brd 172.16.255.255 scope global eth0 |
查看node3是否成功接收了從node2轉移來的VIP
1 2 3 4 5 | [root@node3 keepalived] # ip addr show|grep 'eth0' 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 inet 172.16.16.17 /16 brd 172.16.255.255 scope global eth0 inet 172.16.16.11 /32 scope global eth0 inet 172.16.16.10 /32 scope global eth0 |
如上,可以證明VIP資源已成功轉移.
當node2的keepalived再次啓動後,又會把原有的VIP資源搶奪回來,web頁面也會是自己提供的
1 2 3 4 5 | [root@node2 keepalived] # service keepalived start [root@node2 keepalived] # ip addr show|grep 'eth0' 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 inet 172.16.16.16 /16 brd 172.16.255.255 scope global eth0 inet 172.16.16.10 /32 scope global eth0 |
訪問http://172.16.16.10,看頁面是否是node2自己提供的
參考截圖12
在node3上執行如上的操作,那麼node3上的VIP將會轉移到node2,另外在訪問web時,會看到node2提供的頁面,這個操作就交給你了
至此,模擬keepalived應用程序故障後,實現主機的高可用已成功實現
下面我們將模擬nginx 提供的web的高可用
思路:
由於我在前面寫的是一個守護進程形式的腳本,所以當服務器上nginx web服務,停掉的時候,守護進程腳本就會嘗試去啓動nginx,
這可以應對nginx服務意外終止的情況;除非,監控nginx的守護進程腳本被停止了
1 2 3 4 | [root@node2 ~] # jobs -l [1]+ 32071 Running nohup sh monitor_nginx.sh & [root@node3 ~] # jobs -l [1]+ 30106 Running nohup sh monitor_nginx.sh & |
停掉node2上的nginx服務
1 2 3 4 5 6 7 8 | [root@node2 ~] # service nginx stop Stopping nginx: [ OK ] [root@node2 ~] # service nginx stop [root@node2 ~] # lsof -i:80 [root@node2 ~] # lsof -i:80 COMMAND PID USER FD TYPE DEVICE SIZE /OFF NODE NAME nginx 7598 root 6u IPv4 173882 0t0 TCP *:http (LISTEN) nginx 7600 nginx 6u IPv4 173882 0t0 TCP *:http (LISTEN) |
爲了看到守護進程嘗試啓動nginx web服務的瞬間,我們在停掉nginx後,要立即執行端口反查命令,看nginx的web服務是否在線
至此,nginx web服務的高可用和主機的高可用已成功實現。
###################################################################################################
本文出自 “Enjoy the process” 博客