基於keepalived 實現VIP轉移,lvs,nginx的高可用

1、Keepalived 高可用集羣的解決方案php

2、VRRP的有限狀態機html

3、利用keepalived 實現主從VIP的切換node

4、 實如今狀態轉變的時候自定義進行通知,nginx

5、 實現負載均衡算法

六:實現nginx的高可用vim

1、Keepalived 高可用集羣的解決方案後端

183501583.png

最初的誕生是爲ipvs提供高可用的, 在後端的 realserver接收不到主節點的信息以後, keepalived可以本身調用ipvsadm命令生成規則,可以自動實現,將 主節點的 VIP以及ipvs規則「拿過來」,應用在從節點上,繼續爲用戶服務 。 還能夠實現對後端 realserver的健康情況作檢測。ruby

keepalived在一個節點上啓動以後,會生成一個Master主進程,這個主進程又會生成兩個子進程,分別是VRRP Stack(實現vrrp協議的) Checkers(檢測ipvs後端realserver的健康情況檢測)bash

2、VRRP的有限狀態機服務器

183601870.png

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

184053712.png

3.6在從節點啓動服務

[root@node2 keepalived]# service keepalived start

把主節點上的服務停掉,看VIP會不會到從節點上

[root@node2 ~]# ip addr show

184225729.png

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能夠正常訪問

 

184735882.png

 

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
相關文章
相關標籤/搜索