1、Keepalived 高可用集羣的解決方案php
2、VRRP的有限狀態機html
3、利用keepalived 實現主從VIP的切換node
4、 實如今狀態轉變的時候自定義進行通知,nginx
5、 實現負載均衡算法
六:實現nginx的高可用vim
1、Keepalived 高可用集羣的解決方案後端
最初的誕生是爲ipvs提供高可用的, 在後端的 realserver接收不到主節點的信息以後, keepalived可以本身調用ipvsadm命令生成規則,可以自動實現,將 主節點的 VIP以及ipvs規則「拿過來」,應用在從節點上,繼續爲用戶服務 。 還能夠實現對後端 realserver的健康情況作檢測。ruby
keepalived在一個節點上啓動以後,會生成一個Master主進程,這個主進程又會生成兩個子進程,分別是VRRP Stack(實現vrrp協議的) Checkers(檢測ipvs後端realserver的健康情況檢測)bash
2、VRRP的有限狀態機服務器
VRRP雙方節點都啓動之後,要實現狀態轉換的,剛開始啓動的時候,初始狀態都是BACKUP,然後向其它節點發送通告,以及本身的優先級信息,誰的優先級高,就轉換爲MASTER,不然就仍是BACKUP,這時候服務就在狀態爲MASTER的節點上啓動,爲用戶提供服務,若是,該節點掛掉了,則轉換爲BACKUP,優先級下降,另外一個節點轉換爲MASTER,優先級上升,服務就在此節點啓動,VIP,VMAC都會被轉移到這個節點上,爲用戶提供服務,
實驗環境:
虛擬主機版本:
CentOS6.4-i686
兩個節點:
node1.limian.com 172.16.6.1
node2.limian.com 172.16.6.10
準備
一、節點一:
同步時間:
[root@node1 ~]# ntpdate 172.16.0.1
安裝keepalived
[root@node1 ~]# yum -y install keepalived
二、節點二作一樣的工做
3、利用keepalived 實現主從VIP的切換
3.1咱們修改下keepalived的配置文件:
[root@node1 ~]# cd /etc/keepalived/ [root@node1 keepalived]# cp keepalived.conf keepalived.conf.back //先給配置文件備份一下 [root@node1 keepalived]# vim keepalived.conf
3.2全局階段
global_defs {
notification_email { //定義郵件服務的
root@localhost //定義收件人,這裏改成本機,只是測試使用 } notification_email_from kaadmin@localhost //定義發件人, smtp_server 127.0.0.1 //定義郵件服務器,必定不能使用外部地址 smtp_connect_timeout 30 //超時時間 router_id LVS_DEVEL }
3.3 定義 vrrp階段
vrrp_instance VI_1 { //定義虛擬路由,VI_1 爲虛擬路由的標示符,本身定義名稱
state MASTER //開啓後,該節點的優先級比另外一節點的優先級高,因此轉化爲MASTER狀態 interface eth0 //全部的通告等信息都從eth0這個接口出去 virtual_router_id 7 //虛擬路由的ID,並且這個ID也是虛擬MAC最後一段的來源,這個ID號通常不能大於255,且這個ID必定不能有衝突 priority 100 //初始優先級 advert_int 1 //通告的個數 authentication { //認證機制 auth_type PASS //認證類型 auth_pass 1111 //密碼,應該爲隨機的字符串 } virtual_ipaddress { //虛擬地址,即VIP 172.16.6.100 } }
這樣咱們主節點的配置文件就修改好了,須要複製到從節點上,再作適當的修改就可使用了
[root@node1 keepalived]# scp keepalived.conf 172.16.6.1:/etc/keepalived/
3.4 登陸到從節點 ;
[root@node2 ~]# cd /etc/keepalived/
[root@node2 keepalived]# vim keepalived.conf vrrp_instance VI_1 { state BACKUP //修改從節點的狀態,主節點爲MASTER,從節點就爲BACKUP interface eth0 virtual_router_id 7 priority 99 //修改優先級,注意從節點的優先級必定要小於主節點 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16.6.100 } }
3.5而後在主節點啓動服務
[root@node1 keepalived]# service keepalived start [root@node1 ~]# ip addr show //查看咱們定義的VIP
3.6在從節點啓動服務
[root@node2 keepalived]# service keepalived start
把主節點上的服務停掉,看VIP會不會到從節點上
[root@node2 ~]# ip addr show
3.7在主節點上啓動服務
[root@node1 ~]# service keepalived start [root@node1 ~]# ip addr show //檢測結果發現VIP轉移到了主節點
注:
默認狀況下ARRP工做在「搶佔模式」下,若是發現一個節點的服務中止了,另外一個節點會當即把VIP和VMAC「搶過來」,若是在「非搶佔模式」下,不管你的優先級太高,一個節點服務中止,另外一個節點也不會「搶」VIP和VMAC,除非這個節點掛了,兩一個節點纔會「搶」。
4、 實如今狀態轉變的時候自定義進行通知,
4.1這須要依賴於腳原本完成
主節點
[root@node1 ~]# cd /etc/keepalived/
[root@node1 keepalived]# vim notify.sh //編寫腳本 #!/bin/bash vip=172.16.6.100 contact='root@localhost' thisip=`ifconfig eth0 | awk '/inet addr:/{print $2}' | awk -F: '{print $2}'` Notify() { mailsubject="$thisip is to bi $vip master" mailbody="vrrp transaction, $vip floated to $thisip" echo $mailbody | mail -s "$mailsubject" $contact } case "$1" in master) notify master exit 0 ;; backup) notify backup exit 0 ;; fault) notify fault exit 0 ;; *) echo 'Usage: `basename $0` {master|backup|fault}' exit 1 ;; esac [root@node1 keepalived]# chmod +x notify.sh [root@node1 keepalived]# ./notify.sh master [root@node1 keepalived]# mail //查看有沒有收到通知 Heirloom Mail version 12.4 7/29/08. Type ? for help. "/var/spool/mail/root": 1 message 1 new >N 1 root Wed Sep 25 14:54 18/668 "172.16.6.10 is to bi 172.16.6.100 mas" &
轉換狀態查看是否會收到通知
[root@node1 keepalived]# ./notify.sh backup
[root@node1 keepalived]# ./notify.sh fault [root@node1 keepalived]# mail Heirloom Mail version 12.4 7/29/08. Type ? for help. "/var/spool/mail/root": 3 messages 2 new 1 root Wed Sep 25 14:54 19/679 "172.16.6.10 is to bi 172.16.6.100 mas" >N 2 root Wed Sep 25 14:57 18/668 "172.16.6.10 is to bi 172.16.6.100 mas" N 3 root Wed Sep 25 14:57 18/668 "172.16.6.10 is to bi 172.16.6.100 mas" &
說明腳本正常工做,那麼去編輯配置文件
[root@node1 keepalived]# vim keepalived.conf
在全局階段添加
vrrp_script chk_mantaince_down{ //定義能夠手動控制狀態的腳本
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 1 //檢查時間間隔 weight -2 //若是檢測失敗,優先級-2 }
在 vrrp階段添加以下幾行
track_script { //引用定義的腳本
chk_mantaince_down
}
notify_master"/etc/keepalived/notify.sh master" notify_backup"/etc/keepalived/notify.sh backup" notify_fault"/etc/keepalived/notify.sh fault"
4.2將該腳本複製到另外一個節點,
[root@node1 keepalived]# scp notify.sh 172.16.6.1:/etc/keepalived/
並在配置文件中相應的位置添加相同內容
兩個節點都重啓服務
4.3讓主節點變成從節點
root@node1 keepalived]# touch down
經過監控,發現主節點當即變成從節點,並收到一封郵件
[root@node1 keepalived]# tail -f /var/log/messages You have new mail in /var/spool/mail/root
5、 實現負載均衡
5.1 編輯配置文件
[root@node1 keepalived]# vim keepalived.conf
#####負載均衡階段################# virtual_server 172.16.6.100 80 { //指定VIP和端口 delay_loop 6 //延遲多少個週期再啓動服務,作服務檢測 lb_algo rr loadbalance 負載均衡調度算法 lb_kind DR 類型 nat_mask 255.255.0.0 掩碼 persistence_timeout 0 持久鏈接時間 protocol TCP //協議 real_server 172.16.6.11 80 { //定義後端realserver的屬性 weight 1 HTTP_GET { //定義檢測的方法 url { //檢測的URL path / status_code 200 //獲取結果的狀態碼 } connect_timeout 3 //鏈接超時時間 nb_get_retry 3 //嘗試次數 delay_before_retry 3 //每次嘗試鏈接的等待時間 } } real_server 172.16.6.12 80 { //定義後端realserver的屬性 weight 1 HTTP_GET { //定義檢測的方法 url { //檢測的URL path / status_code 200 //獲取結果的狀態碼 } connect_timeout 3 //鏈接超時時間 nb_get_retry 3 //嘗試次數 delay_before_retry 3 //每次嘗試鏈接的等待時間 } } }
5.二、在從節點上作一樣的修改
5.3重啓服務並用ipvsadm命令檢測是否會生成規則
[root@node1 keepalived]# service keepalived restart [root@node1 keepalived]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.6.100:80 rr [root@node1 keepalived]#
可是爲何沒有咱們定義的兩個 realserver呢?那是由於沒啓動虛擬機呢,健康情況檢測沒經過,就不會顯示了,咱們去啓動一個虛擬機,並啓動服務便可。
並執行以下命令,作lvs負載均衡的DR模型
#ifconfig lo:0 172.16.6.11 broadcast 172.16.6.11 netmask 255.255.255.255 up #route add -host 172.16.6.11 dev lo:0 #echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore #echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
注:
一、後端的realserver的數量能夠添加多臺,可是須要在主節點的配置文件中給出相應的配置,並在添加的realserver上執行相關命令便可
二、儘管keepalived能夠自行添加ipvs規則,實現負載均衡,可是沒法實現動靜分離,在生產環境中咱們要根據場景選擇最佳的方案。
六:實現nginx的高可用
6.1前提
兩個節點上都裝上nginx服務,並確保httpd沒啓用
# netstat -tunlp //確保80端口沒佔用
# service nginx start
6.2爲每一個節點的 nginx編輯一個頁面,以便於效果更直觀一些
[root@node1 ~]# vim /usr/share/nginx/html/index.html //節點1 172.16.6.10 [root@node2 ~]# vim /usr/share/nginx/html/index.html //節點2 172.16.6.1
6.3確保nginx能夠正常訪問
6.4而後停掉服務,
[root@node1 keepalived]# vim notify.sh //修改腳本,讓它能夠監測nginx服務,並能夠啓動或關閉服務
################## case "$1" in master) notify master /etc/rc.d/init.d/nginx start exit 0 ;; backup) notify backup /etc/rc.d/init.d/nginx stop exit 0 ;; fault) notify fault /etc/rc.d/init.d/nginx stop exit 0 ;; ######################################
6.5同步腳本到節點2
[root@node1 keepalived]# scp notify.sh 172.16.6.1:/etc/keepalived/
6.6在主節點上
[root@node1 keepalived]# touch down [root@node1 keepalived]#ss -tunl //發現80端口未被監聽 [root@node1 keepalived]# rm -f down [root@node1 keepalived]#ss -tunl //發現80端口已經被監聽
引用:http://www.tuicool.com/articles/eu26Vz