Nginx Keepalived主從模式

一扶认、概念

負載均衡技術對于一個網(wǎng)站尤其是大型網(wǎng)站的web服務器集群來說是至關重要的狭吼!做好負載均衡架構层坠,可以實現(xiàn)故障轉移和高可用環(huán)境刁笙,避免單點故障,保證網(wǎng)站健康持續(xù)運行疲吸。
關于負載均衡介紹,可以參考:linux負載均衡總結性說明(四層負載/七層負載)

由于業(yè)務擴展摘悴,網(wǎng)站的訪問量不斷加大,負載越來越高》匙猓現(xiàn)需要在web前端放置nginx負載均衡,同時結合keepalived對前端nginx實現(xiàn)HA高可用除盏。

  1. nginx進程基于Master+Slave(worker)多進程模型挫以,自身具有非常穩(wěn)定的子進程管理功能。在Master進程分配模式下掐松,Master進程永遠不進行業(yè)務處理,只是進行任務分發(fā)大磺,從而達到Master進程的存活高可靠性,Slave(worker)進程所有的業(yè)務信號都 由主進程發(fā)出杠愧,Slave(worker)進程所有的超時任務都會被Master中止,屬于非阻塞式任務模型流济。
  2. Keepalived是Linux下面實現(xiàn)VRRP備份路由的高可靠性運行件锐锣。基于Keepalived設計的服務模式能夠真正做到主服務器和備份服務器故障時IP瞬間無縫交接绳瘟。二者結合雕憔,可以構架出比較穩(wěn)定的軟件LB方案。

Keepalived介紹:

  • Keepalived是一個基于VRRP協(xié)議來實現(xiàn)的服務高可用方案糖声,可以利用其來避免IP單點故障斤彼,類似的工具還有heartbeat、corosync蘸泻、pacemaker琉苇。但是它一般不會單獨出現(xiàn),而是與其它負載均衡技術(如lvs蟋恬、haproxy翁潘、nginx)一起工作來達到集群的高可用。

VRRP協(xié)議:

  • VRRP全稱 Virtual Router Redundancy Protocol歼争,即 虛擬路由冗余協(xié)議拜马。可以認為它是實現(xiàn)路由器高可用的容錯協(xié)議沐绒,即將N臺提供相同功能的路由器組成一個路由器組(Router Group)俩莽,這個組里面有一個master和多個backup,但在外界看來就像一臺一樣乔遮,構成虛擬路由器扮超,擁有一個虛擬IP(vip,也就是路由器所在局域網(wǎng)內其他機器的默認路由),占有這個IP的master實際負責ARP相應和轉發(fā)IP數(shù)據(jù)包出刷,組中的其它路由器作為備份的角色處于待命狀態(tài)璧疗。master會發(fā)組播消息,當backup在超時時間內收不到vrrp包時就認為master宕掉了馁龟,這時就需要根據(jù)VRRP的優(yōu)先級來選舉一個backup當master崩侠,保證路由器的高可用。
  • 在VRRP協(xié)議實現(xiàn)里坷檩,虛擬路由器使用 00-00-5E-00-01-XX 作為虛擬MAC地址却音,XX就是唯一的 VRID (Virtual Router IDentifier),這個地址同一時間只有一個物理路由器占用矢炼。在虛擬路由器里面的物理路由器組里面通過多播IP地址 224.0.0.18 來定時發(fā)送通告消息系瓢。每個Router都有一個 1-255 之間的優(yōu)先級別,級別最高的(highest priority)將成為主控(master)路由器句灌。通過降低master的優(yōu)先權可以讓處于backup狀態(tài)的路由器搶占(pro-empt)主路由器的狀態(tài),兩個backup優(yōu)先級相同的IP地址較大者為master肌稻,接管虛擬IP。
img

雙機高可用一般是通過虛擬IP(飄移IP)方法來實現(xiàn)的榛搔,基于Linux/Unix的IP別名技術践惑。
雙機高可用方法目前分為兩種:

  1. 雙機主從模式:即前端使用兩臺服務器尔觉,一臺主服務器和一臺熱備服務器芥吟,正常情況下钟鸵,主服務器綁定一個公網(wǎng)虛擬IP,提供負載均衡服務贡未,熱備服務器處于空閑狀態(tài)俊卤;當主服務器發(fā)生故障時消恍,熱備服務器接管主服務器的公網(wǎng)虛擬IP,提供負載均衡服務佩抹;但是熱備服務器在主機器不出現(xiàn)故障的時候棍苹,永遠處于浪費狀態(tài)枢里,對于服務器不多的網(wǎng)站蹂午,該方案不經(jīng)濟實惠豆胸。
  2. 雙機主主模式:即前端使用兩臺負載均衡服務器,互為主備灵奖,且都處于活動狀態(tài)瓷患,同時各自綁定一個公網(wǎng)虛擬IP擅编,提供負載均衡服務箫踩;當其中一臺發(fā)生故障時班套,另一臺接管發(fā)生故障服務器的公網(wǎng)虛擬IP(這時由非故障機器一臺負擔所有的請求)。這種方案吆豹,經(jīng)濟實惠,非常適合于當前架構環(huán)境凑阶。

今天在此分享下Nginx+keepalived實現(xiàn)高可用負載均衡的主從模式的操作記錄:

二宙橱、環(huán)境說明

操作系統(tǒng):centos7 64位

master: 192.168.202.144(nginx/keepalived)
slave:192.168.202.145(nginx/keepalived)
web應用1:192.168.202.146
web應用2:192.168.202.147 //注意nginx和tomcat應用不要放在同一機器师郑!
vip:192.168.202.22 //負載均衡器上配置的域名都解析到這個VIP上

三调窍、安裝

兩臺接入服務器分別安裝NginX和keepalived:

  • 準備依賴包:

      yum install -y make wget
      yum -y install gcc pcre-devel zlib-devel openssl-devel 
    
  • 下載

    wget http://nginx.org/download/nginx-1.9.5.tar.gz 
    
    wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz
    
  • 安裝NginX

    tar zxvf nginx-1.9.5.tar.gz
    cd nginx-1.9.5
    ./configure --with-http_stub_status_module
    make && make install
    
  • 啟動nginx服務

    cd /usr/local/nginx/sbin/
    ./nginx
    
  • 修改nginx的html文件地梨,(NGINX_HOME/html/index.html),來標識它屬于哪臺虛擬機缔恳。如下所示:

mark
mark
  • 安裝keepalived

    tar zxvf keepalived-1.2.7.tar.gz
    cd keepalived-1.2.7
    ./configure
    make && make install
    
    cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
    cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
    mkdir /etc/keepalived
    cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
    cp /usr/local/sbin/keepalived /usr/sbin/
    
  • 加入啟動服務

    echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local
    
    echo "/etc/init.d/keepalived start" >> /etc/rc.local
    
  • 啟動keepalived服務

    service keepalived start|stop|restart

  • 修改配置文件

    vim /etc/keepalived/keepalived.conf

    # 主 192.168.202.144
    
    global_defs {
        ## 設置lvs的id万细,在一個網(wǎng)絡內唯一
        router_id LVS_DEVEL
    }
    vrrp_instance VI_1 {
        ## 主機配置雅镊,從機為BACKUP
        state MASTER
        ## 網(wǎng)卡名稱
        interface eno16777736
        virtual_router_id 51
        ## 權重值,值越大,優(yōu)先級越高咧虎,backup設置比master小,這樣就能在master宕機后講backup變?yōu)閙aster,而master回復后就可以恢復.
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            ## 同一網(wǎng)段虛擬IP
            192.168.202.22
        }
    }
    
    virtual_server 192.168.202.22 80 {
        delay_loop 6
        lb_algo rr
        lb_kind NAT
        persistence_timeout 50
        protocol TCP
    
        real_server 192.168.202.144 80 {
            weight 1
            TCP_CHECK{
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
            }
        }
    }
    
    # 從 192.168.202.145
    global_defs {
       router_id LVS_DEVEL
    }
    vrrp_instance VI_1 {
        state BACKUP
        interface eno16777736
        virtual_router_id 51
        priority 50
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
             192.168.202.22
        }
    }
    
    virtual_server 192.168.202.22 80 {
        delay_loop 6
        lb_algo rr
        lb_kind NAT
        persistence_timeout 50
        protocol TCP
    
        real_server 192.168.202.145 80 {
            weight 1
            TCP_CHECK{
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
            }
        }
    }
    

    ?

    重啟keepalived

    分別重啟兩臺虛擬機的keepalived砰诵,當我們訪問上面配置同一網(wǎng)段的虛擬IP地址: 192.168.202.22訪問的就是主服務器:192.168.202.144

    service keepalived restart
    
    mark

    并且當我們關閉掉主機也就是192.168.202.144的keepalived時茁彭,就會訪問從機的nginx服務

    mark

四理肺、配置keepalived的日志

  • 修改/etc/sysconfig/keepalived

    “-D” 就是輸出日志的選項
    這里的“-S 0”表示local0.* 具體的還需要看一下/etc/syslog.conf文件

    vim /etc/sysconfig/keepalived
    修改為:
    KEEPALIVED_OPTIONS="-D -d -S 0"
    
  • **修改/etc/rsyslog.conf

    vim /etc/rsyslog.conf
    添加:
    local0.*  /var/log/keepalived.log
    
  • 重新啟動keepalived和rsyslog服務

    service rsyslog restart
    service keepalived restart
    
  • 然后就可以查看keepalived的日志了

    tail -f /var/log/keepalived.log
    

五年枕、Nginx心跳檢測

當我們配置了keepalived熏兄,當主keepalived的宕機了树姨。會自動更改路由到backup的keepalived,但是如果nginx掛掉的話帽揪,keepalived就會找不到nginx服務這樣還是會造成nginx服務不可用。那么我們就可以在keepalived中添加心跳script耍缴,用來檢測nginx心跳防嗡,如果檢測不到nginx服務侠坎,就關閉掉keepalived的進程。這樣從機的keepalive服務就可以被調用他嫡。

  • 下面是檢測nginx心跳的腳本

    /usr/local/ngin/sbin/check_nginx_alive.sh
    
    #!/bin/sh
    
    PATH=/bin:/sbin:/usr/bin:/usr/sbin
    
    A=`ps -C nginx --no-header |wc -l`
    
    if [ $A -eq 0 ]
       then
         echo 'nginx server is died'
         /etc/init.d/keepalived stop
    fi
    
  • 然后再在修改/etc/keepalived/keepalived.conf文件

    ! Configuration File for keepalived
    
    vrrp_script check_nginx_alive {
        script "/usr/local/nginx/sbin/check_nginx_alive.sh"
        interval 3
        weight -10
    }
    global_defs {
       notification_email {
         acassen@firewall.loc
         failover@firewall.loc
         sysadmin@firewall.loc
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 192.168.200.1
       smtp_connect_timeout 30
       router_id LVS_DEVEL
    }
    
    vrrp_instance VI_1 {
        state MASTER
        interface ens33
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.202.22
        }
        track_script {
            check_nginx_alive
        }
    }
    
    virtual_server 192.168.202.22 {
        delay_loop 6
        lb_algo rr
        lb_kind NAT
        nat_mask 255.255.255.0
        persistence_timeout 50
        protocol TCP
    
        real_server 192.168.202.144 80 {
            weight 1
            TCP_CHECK{
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
            }
        }
    }
    

上面是主機192.168.64.128的配置,可以看到一共新添加了兩個地方,主要是添加了一個shell腳本用于檢測nginx是否存活门躯,然后再在keepalived的配置文件中,添加這個這個檢測心跳的文件染乌。這個是主機的配置荷憋,那么從機也需要做相應的修改褐望。那么不管是keepalived宕機還是nginx宕機都會切換到可以熱備的機器中去,這樣就達到了nginx的可高用锅铅。

六、防坑指南

  1. 首先關于VIP生成的問題玩荠,這個VIP需要2臺服務器之間能相互ping通阶冈。具體生成見文檔http://blog.chinaunix.net/uid-186064-id-2823297.html塑径,本人只做了前三步,etho為網(wǎng)卡ID匆骗,通過ifconfig對應修改 碉就。
  2. keepalived配置文件修改一定要細心闷串,多查看日志分析原因烹吵。默認日志是在/var/log/message中
  3. 我測試的時候不同網(wǎng)段锈津,但是網(wǎng)絡互通凉蜂,也無法進行動態(tài)切換;另外從服務不能單獨運行跃惫。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末爆存,一起剝皮案震驚了整個濱河市先较,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌曾棕,老刑警劉巖菜循,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癌幕,死亡現(xiàn)場離奇詭異,居然都是意外死亡橙喘,警方通過查閱死者的電腦和手機厅瞎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門和簸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來某筐,“玉大人,你說我怎么就攤上這事身诺∶股模” “怎么了幔托?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵重挑,是天一觀的道長。 經(jīng)常有香客問我刺覆,道長谦屑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任酝枢,我火速辦了婚禮悍手,結果婚禮上谓苟,老公的妹妹穿的比我還像新娘。我一直安慰自己卑笨,他們只是感情好仑撞,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布隧哮。 她就那樣靜靜地躺著,像睡著了一般陨帆。 火紅的嫁衣襯著肌膚如雪疲牵。 梳的紋絲不亂的頭發(fā)上榆鼠,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天妆够,我揣著相機與錄音,去河邊找鬼颓哮。 笑死鸵荠,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播熄赡,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼彼硫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了词渤?” 一聲冷哼從身側響起串绩,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤礁凡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后剪芍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罪裹,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡状共,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年口芍,在試婚紗的時候發(fā)現(xiàn)自己被綠了雇卷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡小染,死狀恐怖裤翩,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情呵扛,我是刑警寧澤筐带,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布伦籍,位于F島的核電站,受9級特大地震影響芝薇,放射性物質發(fā)生泄漏作儿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一灭红、第九天 我趴在偏房一處隱蔽的房頂上張望口注。 院中可真熱鬧,春花似錦娇斑、人聲如沸材部。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽物臂。三九已至,卻和暖如春蛾狗,著一層夾襖步出監(jiān)牢的瞬間仪媒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工留凭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冰抢,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像巢音,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子梧躺,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內容