Nginx+keepalived雙主配置(雙機雙主熱備)

簡介

這種方案,使用兩個VIP地址驯嘱,前端使用2臺機器镶苞,互為主備,同時有兩臺機器工作鞠评,當其中一臺機器出現故障茂蚓,兩臺機器的請求轉移到一臺機器負擔,非常適合于生產架構環(huán)境剃幌。

一聋涨、網絡拓撲

image

四臺虛擬機如下所示:

image

為什么使用keepalived呢?

使用keepalived就用來做高可用的负乡,提供虛擬VIP

二牍白、配置

將兩臺機器上的/etc/keepalived/keepalived.conf配置文件修改成如下:

Nginx-A:

[root@Nginx-A src]# vim /etc/keepalived/keepalived.conf   
! Configuration File for keepalived  
  
############################ 全局配置 #############################  
    
global_defs {  
  
    # 定義管理員郵件地址,表示keepalived在發(fā)生諸如切換操作時需要發(fā)送email通知,以及email發(fā)送給哪些郵件地址,可以有多個,每行一個  
    notification_email {      
        #設置報警郵件地址,可以設置多個抖棘,每行一個茂腥。 需開啟本機的sendmail服務   
        13020176132@163.com  
    }  
    #keepalived在發(fā)生諸如切換操作時需要發(fā)送email通知地址,表示發(fā)送通知的郵件源地址是誰  
    notification_email_from 13020176132@163.com   
      
    #指定發(fā)送email的smtp服務器  
    smtp_server 127.0.0.1        
      
    #設置連接smtp server的超時時間  
    smtp_connect_timeout 30      
      
    #運行keepalived的機器的一個標識切省,通匙罡冢可設為hostname。故障發(fā)生時朝捆,發(fā)郵件時顯示在郵件主題中的信息般渡。  
    router_id swarm01     
}  
  
  
############################ VRRPD配置 #############################  
  
# 定義chk_http_port腳本,腳本執(zhí)行間隔10秒,權重-5芙盘,檢測nginx服務是否在運行诊杆。有很多方式,比如進程何陆,用腳本檢測等等  
vrrp_script chk_http_port {    
  
    #這里通過腳本監(jiān)測      
    script "/opt/chk_nginx.sh"     
      
    #腳本執(zhí)行間隔晨汹,每2s檢測一次  
    interval 2      
      
    #腳本結果導致的優(yōu)先級變更,檢測失敶ぁ(腳本返回非0)則優(yōu)先級 -5     
    weight -5       
      
    #檢測連續(xù)2次失敗才算確定是真失敗淘这。會用weight減少優(yōu)先級(1-255之間)      
    fall 2       
      
    #檢測1次成功就算成功。但不修改優(yōu)先級   
    rise 1                      
}  
  
#定義vrrp實例巩剖,VI_1 為虛擬路由的標示符铝穷,自己定義名稱,keepalived在同一virtual_router_id中priority(0-255)最大的會成為master佳魔,也就是接管VIP曙聂,當priority最大的主機發(fā)生故障后次priority將會接管  
vrrp_instance VI_1 {   
  
    #指定keepalived的角色,MASTER表示此主機是主服務器鞠鲜,BACKUP表示此主機是備用服務器宁脊。注意這里的state指定instance(Initial)的初始狀態(tài)断国,就是說在配置好后,這臺服務器的初始狀態(tài)就是這里指定的榆苞,  
    #但這里指定的不算稳衬,還是得要通過競選通過優(yōu)先級來確定。如果這里設置為MASTER坐漏,但如若他的優(yōu)先級不及另外一臺薄疚,那么這臺在發(fā)送通告時,會發(fā)送自己的優(yōu)先級赊琳,另外一臺發(fā)現優(yōu)先級不如自己的高遇绞,  
    #那么他會就回搶占為MASTER     
    state MASTER   
      
    #指定HA監(jiān)測網絡的接口暴构。與本機 IP 地址所在的網絡接口相同,可通過ip addr 查看  
    interface ens33        
  
    # 發(fā)送多播數據包時的源IP地址,這里注意了俊抵,這里實際上就是在哪個地址上發(fā)送VRRP通告爪膊,這個非常重要谜诫,  
    #一定要選擇穩(wěn)定的網卡端口來發(fā)送牵祟,這里相當于heartbeat的心跳端口,如果沒有設置那么就用默認的綁定的網卡的IP弱卡,也就是interface指定的IP地址      
    mcast_src_ip 192.168.182.110  
      
    #虛擬路由標識乃正,這個標識是一個數字,同一個vrrp實例使用唯一的標識婶博。即同一vrrp_instance下瓮具,MASTER和BACKUP必須是一致的  
    virtual_router_id 51      
  
    #定義優(yōu)先級,數字越大凡人,優(yōu)先級越高名党,在同一個vrrp_instance下,MASTER的優(yōu)先級必須大于BACKUP的優(yōu)先級     
    priority 101   
  
    #設定MASTER與BACKUP負載均衡器之間同步檢查的時間間隔挠轴,單位是秒     
    advert_int 1          
  
    #設置驗證類型和密碼传睹。主從必須一樣  
    authentication {      
      
        #設置vrrp驗證類型,主要有PASS和AH兩種  
        auth_type PASS             
          
        #設置vrrp驗證密碼岸晦,在同一個vrrp_instance下欧啤,MASTER與BACKUP必須使用相同的密碼才能正常通信  
        auth_pass 1111             
    }  
      
    #VRRP HA 虛擬地址 如果有多個VIP,繼續(xù)換行填寫  
    #設置VIP启上,它隨著state變化而增加刪除邢隧,當state為master的時候就添加,當state為backup的時候則刪除冈在,由優(yōu)先級決定  
    virtual_ipaddress {            
        192.168.182.156  
    }  
      
    #執(zhí)行nginx檢測腳本倒慧。注意這個設置不能緊挨著寫在vrrp_script配置塊的后面(實驗中碰過的坑),否則nginx監(jiān)控失效!纫谅!  
    track_script {     
  
       #引用VRRP腳本炫贤,即在 vrrp_script 部分指定的名字。定期運行它們來改變優(yōu)先級系宜,并最終引發(fā)主備切換照激。   
       chk_http_port                      
    }  
}  
 
#定義vrrp實例发魄,VI_2 為虛擬路由的標示符盹牧,自己定義名稱,keepalived在同一virtual_router_id中priority(0-255)最大的會成為master励幼,也就是接管VIP汰寓,當priority最大的主機發(fā)生故障后次priority將會接管  
vrrp_instance VI_2 {   
  
    #指定keepalived的角色,MASTER表示此主機是主服務器苹粟,BACKUP表示此主機是備用服務器有滑。注意這里的state指定instance(Initial)的初始狀態(tài),就是說在配置好后嵌削,這臺服務器的初始狀態(tài)就是這里指定的毛好,  
    #但這里指定的不算,還是得要通過競選通過優(yōu)先級來確定苛秕。如果這里設置為MASTER肌访,但如若他的優(yōu)先級不及另外一臺,那么這臺在發(fā)送通告時艇劫,會發(fā)送自己的優(yōu)先級吼驶,另外一臺發(fā)現優(yōu)先級不如自己的高,  
    #那么他會就回搶占為MASTER     
    state BACKUP   
      
    #指定HA監(jiān)測網絡的接口店煞。與本機 IP 地址所在的網絡接口相同蟹演,可通過ip addr 查看  
    interface ens33        
  
    # 發(fā)送多播數據包時的源IP地址,這里注意了顷蟀,這里實際上就是在哪個地址上發(fā)送VRRP通告酒请,這個非常重要,  
    #一定要選擇穩(wěn)定的網卡端口來發(fā)送鸣个,這里相當于heartbeat的心跳端口蚌父,如果沒有設置那么就用默認的綁定的網卡的IP,也就是interface指定的IP地址      
    mcast_src_ip 192.168.182.110  
      
    #虛擬路由標識毛萌,這個標識是一個數字苟弛,同一個vrrp實例使用唯一的標識。即同一vrrp_instance下阁将,MASTER和BACKUP必須是一致的  
    virtual_router_id 52     
  
    #定義優(yōu)先級膏秫,數字越大,優(yōu)先級越高,在同一個vrrp_instance下缤削,MASTER的優(yōu)先級必須大于BACKUP的優(yōu)先級     
    priority 100   
  
    #設定MASTER與BACKUP負載均衡器之間同步檢查的時間間隔窘哈,單位是秒     
    advert_int 1          
  
    #設置驗證類型和密碼。主從必須一樣  
    authentication {      
      
        #設置vrrp驗證類型亭敢,主要有PASS和AH兩種  
        auth_type PASS             
          
        #設置vrrp驗證密碼滚婉,在同一個vrrp_instance下,MASTER與BACKUP必須使用相同的密碼才能正常通信  
        auth_pass 1111             
    }  
      
    #VRRP HA 虛擬地址 如果有多個VIP帅刀,繼續(xù)換行填寫  
    #設置VIP让腹,它隨著state變化而增加刪除,當state為master的時候就添加扣溺,當state為backup的時候則刪除骇窍,由優(yōu)先級決定  
    virtual_ipaddress {            
        192.168.182.157
    }  
      
    #執(zhí)行nginx檢測腳本。注意這個設置不能緊挨著寫在vrrp_script配置塊的后面(實驗中碰過的坑)锥余,否則nginx監(jiān)控失效8鼓伞!  
    track_script {     
  
       #引用VRRP腳本驱犹,即在 vrrp_script 部分指定的名字嘲恍。定期運行它們來改變優(yōu)先級,并最終引發(fā)主備切換雄驹。   
       chk_http_port                      
    }  
}

Nginx-B:

[root@Nginx-B src]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived    
  
global_defs {
    notification_email {                
        13020176132@163.com
    }
      
    notification_email_from 13020176132@163.com  
    smtp_server 127.0.0.1                    
    smtp_connect_timeout 30                 
    router_id swaram02                 
}
  
vrrp_script chk_http_port {         
    script "/opt/chk_nginx.sh"   
    interval 2                      
    weight -5                       
    fall 2                   
    rise 1                  
}
  
vrrp_instance VI_1 {            
    state BACKUP           
    interface ens33            
    mcast_src_ip 192.168.182.111
    virtual_router_id 51        
    priority 90               
    advert_int 1               
    authentication {            
        auth_type PASS         
        auth_pass 1111          
    }
    virtual_ipaddress {        
        192.168.182.156
    }
 
    track_script {                     
       chk_http_port                 
    }
 
}
 
vrrp_instance VI_2 {            
    state MASTER           
    interface ens33            
    mcast_src_ip 192.168.182.111
    virtual_router_id 52        
    priority 100               
    advert_int 1               
    authentication {            
        auth_type PASS         
        auth_pass 1111          
    }
    virtual_ipaddress {        
        192.168.182.157
    }
 
    track_script {                     
       chk_http_port                 
    }
 
}

然后修改兩臺機器上的nginx首頁

[root@Nginx-A html]# vim  /usr/local/nginx/html/index.html 
<!DOCTYPE html>
<html>
 <head> 
  <title>Welcome to Nginx-Master!</title> 
  <style>
        body {
                width: 35em;
                margin: 0 auto;
                font-family: Tahoma, Verdana, Arial, sans-serif;
         }
 </style> 
 </head>
 <body>
  <h1>Welcome to Nginx-A!</h1>     
  <h1><b>Nginx-A:192.168.182.110</b></h1>     
  <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p>
  <p>For online documentation and support please refer to <a >nginx.org</a>.<br /> Commercial support is available at <a >nginx.com</a>.</p>
  <p><em>Thank you for using nginx.</em></p>
 </body>
</html>
 
[root@Nginx-B html]# vim  /usr/local/nginx/html/index.html 
<!DOCTYPE html>
<html>
 <head> 
  <title>Welcome to Nginx-Master!</title> 
  <style>
        body {
                width: 35em;
                margin: 0 auto;
                font-family: Tahoma, Verdana, Arial, sans-serif;
         }
 </style> 
 </head>
 <body>
  <h1>Welcome to Nginx-B!</h1>     
  <h1><b>Nginx-B:192.168.182.111</b></h1>     
  <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p>
  <p>For online documentation and support please refer to <a >nginx.org</a>.<br /> Commercial support is available at <a >nginx.com</a>.</p>
  <p><em>Thank you for using nginx.</em></p>
 </body>
</html>

chk_nginx.sh腳本也不用改佃牛,然后重啟keepalived

[root@Nginx-A keepalived]# systemctl start keepalived.service
[root@Nginx-A keepalived]# systemctl status keepalived.service
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since 二 2018-05-29 14:46:25 CST; 4s ago
  Process: 10590 ExecStart=/usr/local/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 7396 (keepalived)
    Tasks: 6
   Memory: 3.0M
   CGroup: /system.slice/keepalived.service
           ├─  7396 /usr/local/keepalived/sbin/keepalived -D
           ├─  7397 /usr/local/keepalived/sbin/keepalived -D
           ├─  7398 /usr/local/keepalived/sbin/keepalived -D
           ├─ 99999 nginx: master process /usr/local/nginx/sbin/nginx
           ├─100001 nginx: worker process
           └─100002 nginx: worker process
 
5月 29 14:46:25 Nginx-A systemd[1]: Starting LVS and VRRP High Availability Monitor...
5月 29 14:46:25 Nginx-A Keepalived[10590]: Starting Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
5月 29 14:46:25 Nginx-A Keepalived[10590]: Unable to resolve default script username
 
[root@Nginx-B conf]# /etc/init.d/keepalived status
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since 二 2018-05-29 14:45:34 CST; 4min 17s ago
  Process: 5770 ExecStart=/usr/local/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 2771 (keepalived)
    Tasks: 3
   Memory: 960.0K
   CGroup: /system.slice/keepalived.service
           ├─2771 /usr/local/sbin/keepalived -D
           ├─2772 /usr/local/sbin/keepalived -D
           └─2773 /usr/local/sbin/keepalived -D
 
5月 29 14:45:34 Nginx-B systemd[1]: Starting LVS and VRRP High Availability Monitor...
5月 29 14:45:34 Nginx-B Keepalived[5770]: Starting Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
5月 29 14:45:34 Nginx-B systemd[1]: Started LVS and VRRP High Availability Monitor.

三、keepalived+nginx的高可用測試

3.1 查看服務器上的IP地址

查看Nginx-A的地址:

[root@Nginx-A keepalived]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:e0:69:a0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.182.110/24 brd 192.168.182.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.182.156/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.182.157/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::3064:9b6a:9819:180a/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

查看Nginx-B的地址:

[root@Nginx-B keepalived]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:25:44:71 brd ff:ff:ff:ff:ff:ff
    inet 192.168.182.111/24 brd 192.168.182.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::2818:83f9:1989:3130/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::3064:9b6a:9819:180a/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever

會多出兩個虛擬IP

    inet 192.168.182.156/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.182.157/32 scope global ens33

首先通過兩個VIP地址訪問如下:

image
image

3.2荠医、關閉Nginx-A上的nginx吁脱,keepalived將在2s內將它重新啟動

[root@Nginx-A keepalived]# /usr/local/nginx/sbin/nginx -s stop

3.3、關閉Nginx-A上的keepalived彬向,VIP會切換到Nginx-B上

[root@Nginx-A keepalived]# service keepalived stop

不管訪問的是:http://192.168.182.157/ 還是http://192.168.182.156/ 都將導到Nginx-B上去兼贡。

image
image

同時會發(fā)現Nginx-A上的虛擬IP會消失

[root@Nginx-A keepalived]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:e0:69:a0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.182.110/24 brd 192.168.182.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::3064:9b6a:9819:180a/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市娃胆,隨后出現的幾起案子遍希,更是在濱河造成了極大的恐慌,老刑警劉巖里烦,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凿蒜,死亡現場離奇詭異,居然都是意外死亡胁黑,警方通過查閱死者的電腦和手機废封,發(fā)現死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丧蘸,“玉大人漂洋,你說我怎么就攤上這事。” “怎么了刽漂?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵演训,是天一觀的道長。 經常有香客問我贝咙,道長样悟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任庭猩,我火速辦了婚禮窟她,結果婚禮上,老公的妹妹穿的比我還像新娘眯娱。我一直安慰自己礁苗,他們只是感情好爬凑,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布徙缴。 她就那樣靜靜地躺著,像睡著了一般嘁信。 火紅的嫁衣襯著肌膚如雪于样。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天潘靖,我揣著相機與錄音穿剖,去河邊找鬼。 笑死卦溢,一個胖子當著我的面吹牛糊余,可吹牛的內容都是我干的。 我是一名探鬼主播单寂,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼贬芥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宣决?” 一聲冷哼從身側響起蘸劈,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尊沸,沒想到半個月后威沫,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡洼专,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年棒掠,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屁商。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡烟很,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情溯职,我是刑警寧澤精盅,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站谜酒,受9級特大地震影響叹俏,放射性物質發(fā)生泄漏。R本人自食惡果不足惜僻族,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一粘驰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧述么,春花似錦蝌数、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至剑梳,卻和暖如春唆貌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背垢乙。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工锨咙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人追逮。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓酪刀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钮孵。 傳聞我的和親對象是個殘疾皇子骂倘,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內容