Keepalived的相關應用,使用keepalived實現nginx和lvs的高可用負載均衡器

使用keepalived實現HA Cluster集羣,下面以示例來演示keepalived的使用和keepalived的相關知識
php


HA Cluster配置前提:linux

    1、本機的主機名,要與hostname(uname-n)得到的名稱保持一致;nginx

     CentOS6: /etc/sysconfig/networkweb

       CentOS7: hostnamectl set-hostname HOSTNAMEcentos

     各節點要能互相解析主機名;通常建議經過hosts文件進行解析;瀏覽器

     修改主機名爲centos7centos6.1.com,而後修改hosts文件,能讓兩邊能相互解析到bash

   2、各節點時間同步;ntpdate  172.16.249.195把這個主機當成時間服務器,而後進行時間同步服務器

    設置ntp時間同步服務器網絡

    修改/etc/ntp.conf文件架構

    內容以下:

        driftfile /var/lib/ntp/drift

        restrict 127.0.0.1

        restrict ::1

        restrict 172.16.0.0 mask 255.255.0.0nomodify notrap

        server 127.127.1.0

        fudge 127.127.1.0 stratum 8

        includefile /etc/ntp/crypto/pw

        keys /etc/ntp/keys

        disable monitor

 

    3、確保iptablesselinux不會成爲服務阻礙;

        nopreempt:非搶佔模式;默認爲搶佔模式;

 

 在調度器上,首先安裝keepalived程序,而後把時間同步成同樣的

ntpdate 172.16.249.195

spacer.gif

檢查iptablesselinux是否開啓了

而後在CentOS7中進行實驗

yum install  keepalived 

 

用兩臺機器一臺CentOS7,一臺CentOS6看是否有問題

CentOS7

修改位置文件(/etc/keepalived/keepalived.conf

首先把「virtual_server 192.168.200.100 443 {」這一行如下的所有註釋掉

而後修改內容以下

spacer.gif

爲了完整,把這後面的信息補全

spacer.gif

而後複製這個文件到另外一個主機

scp keepalived.conf 172.16.249.147:/etc/keepalived/

而後稍微修改下

spacer.gif

這樣就能夠了,這樣就能夠啓動測試了

systemctl start keepalived.service;ssh172.16.249.147 'service  keepalivedstart'  由於我使用的是一個centos7和一個centos6,因此先後的啓動命令不同,若是使用的是一樣的就不需這樣了

spacer.gif

使用  ps   aux  查看keepalived是否啓動

wKioL1Y4G0egzOfxAADpxwAchlY677.jpg

而後在centos7上使用ifconfig進行查看,能夠看到地址加上來了

spacer.gif

而後咱們把centos7下的keepalived關閉,而後查看地址

spacer.gif

地址沒有了,去centos6上查看會發現地址在6上看,這就是高可用了,就是當一臺負載均衡器下線時,另外一臺能當即啓用,實現高可用

spacer.gif

 

沒有日誌信息,咱們本身定義一個

首先修改/etc/sysconfig/keepalived這個文件,

wKiom1Y4G5XBTx90AAAcfvEZUgo658.jpg

而後修改/etc/rsyslog.conf這個文件

wKioL1Y4G9KRfvJYAABqGs-7iOU027.jpg

而後使用systemctl restart rsyslog.service重啓日誌服務

另外一個主機一樣修改重啓日誌服務使用(service rsyslog restart

而後重啓keepalived服務查看日誌就有了

 

而後作兩個虛擬路由,即雙主模式

修改keepalived的配置文件,增長下面一段

spacer.gif

而後另外一臺主機修改keepalived的配置文件爲下面一段

wKiom1Y4G-_wseoYAAC6wJ3iFfU746.jpg

而後重啓服務就能夠查看了(若是由於網絡環境比較複雜的話,等的時間可能要長一點)

 

spacer.gif

spacer.gif

若是停掉一臺的keepalived服務,另外一臺會包括全部的地址

spacer.gif

 

這樣停服務在生產中,是不行的,下面來添加腳本實現動態切換

修改配置文件,添加下面配置

這一段要加在vrrp_instance 字段外面

 

spacer.gif

wKioL1Y4HJjSsixZAABddcm2SoA300.jpg

 

另外一個主機也作這樣的配置

wKiom1Y4HFzxXHcIAAE-zcDxJ-c405.jpg

這就能夠啓用了

spacer.gif

wKioL1Y4HS-Az_UzAAHc_ATHw2Q943.jpg


而後在172.16.249.195的/etc/keepalived目錄下建立一個down文件,而後查看地址

spacer.gif

另外一臺主機上就有兩個地址了

spacer.gif


定義郵件的發送,須要自行定義,須要本身寫一個腳本

腳本內容:

#!/bin/bash

    #Author: MageEdu <linuxedu@foxmail.com>

    #description: An example of notify script

    #

    vip=172.16.100.88

    contact='root@localhost'

    notify(){

        mailsubject="`hostname` to be $1: $vipfloating"

        mailbody="`date '+%F %H:%M:%S'`: vrrptransition, `hostname` changed to be $1"

        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

/etc/keepalived/目錄下建立一個名爲notify.sh的腳本

spacer.gif

給這個腳本一個執行權限chmod +x notify.sh

 

配置文件中vrrp_instance VI_1這一段裏寫入下面三行

notify_master"/etc/keepalived/notify.sh master"

notify_backup"/etc/keepalived/notify.sh backup"

notify_fault"/etc/keepalived/notify.shfault"

spacer.gif 

驗證下,

wKioL1Y4HlyC-VlwAAH1BI2QwyY270.jpg

而後把這個腳本複製到另外一個負載均衡器上,而後修改配置文件

scp -rp notify.sh172.16.249.147:/etc/keepalived/

這樣郵件的發送就弄好了

另外一個虛擬路由就再也不演示了,跟這個步驟同樣

 


咱們加入lvsnginx來實現高可用的負載均衡器的實現(作的是雙主模型)


下面先以lvs作負載均衡器,進行高可用負載均衡,以lvsDR模式爲例,規劃以下


spacer.gif

首先兩個RS打開web服務,配好測試頁,訪問測試如下,沒問題了,

spacer.gif spacer.gif

 

而後配置第一個Director(負載均衡器),安裝ipvsadm,配置lvs規則(若是不會配置能夠上網搜索,或者查看本人的lvs的博客),首先測試是能正常工做的

首先加入VIP

spacer.gif

用其餘主機ping測試一下,這個地址通不通,通了就沒問題了,就差lvs規則了,

 

而後配置兩個RS,首先配置arp_ignorearp_annoce,而後配置VIP和路由

寫一個腳本實現一些功能,而後直接在兩臺RS上運行一下,就能夠了

spacer.gif

而後 bash  set.sh  start  而後cat看一下是否成功了;把這個腳本複製給另外一臺RS執行一次

而後添加地址和路由

ifconfig lo:0 172.16.249.18 netmask255.255.255.255 broadcast 172.16.249.18

route add -host 172.16.249.18 dev lo:0

ifconfig lo:1 172.16.249.19 netmask255.255.255.255 broadcast 172.16.249.19

route add -host 172.16.249.19 dev lo:1

 

另外一臺RS也添加地址和路由

ifconfig lo:0 172.16.249.18 netmask255.255.255.255 broadcast 172.16.249.18

route add -host 172.16.249.18 dev lo:0

ifconfig lo:1 172.16.249.19 netmask255.255.255.255 broadcast 172.16.249.19

route add -host 172.16.249.19 dev lo:1

由於作的是兩個虛擬路由器的即雙主的,就是經過DNS在前面分流,一部分走172.16.249.18這個地址一部分走172.16.249.19,因此RS要配置兩個VIP

             

而後RS的配置就作完了,而後回到Director上寫入ipvs規則

ipvsadm -A -t 172.16.249.18:80 -s rr

ipvsadm -a -t 172.16.249.18:80 -r172.16.249.116 -g

ipvsadm -a -t 172.16.249.18:80 -r172.16.249.123 -g

spacer.gif

而後測試是否能正常輪調

若是用物理機的瀏覽器訪問不輪調,是網絡的影響,開一個虛擬機進行測試,若是沒有問題,就證實lvsdr模式的負載均衡作好了

spacer.gif

另外一臺lvs服務器也作一下這個規則,而後測試一下,證實lvs的負載均衡沒有問題了

而後咱們把lvs服務器上的規則清掉,地址刪除

而後在兩臺lvs上作sorry  server 啓動httpd服務,而後寫一個頁面,而後訪問


spacer.gif


spacer.gif

測試沒問題,就能夠了

 

下面作keepalived高可用的負載均衡器(安裝keepalived

直接作成兩臺虛擬路由器的,

修改第一臺lvs主機的keepalived的配置文件以下

global_defs {

  notification_email {

         root@localhost

   }

  notification_email_from kaadmin@localhost

  smtp_server 127.0.0.1

  smtp_connect_timeout 30

  router_id centos7

}

vrrp_script chk_schedown {

   script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"

   interval 1

   weight -2

    }

 

vrrp_instance VI_1 {

   state MASTER

   interface eth0

   virtual_router_id 51

   priority 100

   advert_int 1

   authentication {

       auth_type PASS

       auth_pass 5b03429a7cf5

    }

   virtual_ipaddress {

         172.16.249.18/16dev eth0 label eth0:0

    }

   track_script {

       chk_schedown

    }

   notify_master "/etc/keepalived/notify.sh master"

   notify_backup "/etc/keepalived/notify.sh backup"

   notify_fault "/etc/keepalived/notify.sh fault

}

 

vrrp_instance VI_2 {

   state BACKUP

   interface eth0

   virtual_router_id 61

   priority 99

   advert_int 1

   authentication {

       auth_type PASS

       auth_pass 20b662c6c06d

    }

   virtual_ipaddress {

         172.16.249.19/16dev eth0 label eth0:1

    }

}

 

virtual_server 172.16.249.18 80 {

   delay_loop 6

   lb_algo wrr

   lb_kind DR

   nat_mask 255.255.0.0

   protocol TCP

 

   real_server 172.16.249.116 80 {

       weight 1

       HTTP_GET {

           url {

              path /

               status_code 200

           }

           connect_timeout 3

           nb_get_retry 3

           delay_before_retry 3

       }

    }

   real_server 172.16.249.123 80 {

       weight 2

       HTTP_GET {

           url {

              path /

               status_code 200

           }

           connect_timeout 3

           nb_get_retry 3

           delay_before_retry 3

       }

    }

}

 

virtual_server 172.16.249.19 80 {

   delay_loop 6

   lb_algo wrr

   lb_kind DR

   nat_mask 255.255.0.0

   protocol TCP

 

   real_server 172.16.249.116 80 {

       weight 1

       HTTP_GET {

           url {

              path /

               status_code 200

           }

           connect_timeout 3

           nb_get_retry 3

           delay_before_retry 3

       }

    }

   real_server 172.16.249.123 80 {

       weight 2

       HTTP_GET {

           url {

              path /

               status_code 200

           }

           connect_timeout 3

           nb_get_retry 3

           delay_before_retry 3

       }

    }

}

而後配置另外一臺lvs主機中的keepalived以下:

global_defs {

  notification_email {

         root@localhost

   }

  notification_email_from kaadmin@localhost

  smtp_server 127.0.0.1

  smtp_connect_timeout 30

  router_id centos6.1.com

}

 

vrrp_script chk_schedown {

   script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"

   interval 1

   weight -2

    }

 

vrrp_instance VI_1 {

   state BACKUP

   interface eth0

   virtual_router_id 51

   priority 99

   advert_int 1

   authentication {

       auth_type PASS

       auth_pass 5b03429a7cf5

    }

   virtual_ipaddress {

         172.16.249.18/16dev eth0 label eth0:0

    }

  track_script {

       chk_schedown

    }

   notify_master "/etc/keepalived/notify.sh master"

   notify_backup "/etc/keepalived/notify.sh backup"

   notify_fault "/etc/keepalived/notify.sh fault"

 

}

 

vrrp_instance VI_2 {

   state MASTER

   interface eth0

   virtual_router_id 61

   priority 100

   advert_int 1

   authentication {

       auth_type PASS

       auth_pass 20b662c6c06d

    }

   virtual_ipaddress {

       172.16.249.19/16 dev eth0 label eth0:1

    }

}

 

virtual_server 172.16.249.18 80 {

   delay_loop 6

   lb_algo wrr

   lb_kind DR

   nat_mask 255.255.0.0

   protocol TCP

 

   real_server 172.16.249.116 80 {

       weight 1

       HTTP_GET {

           url {

              path /

               status_code 200

           }

           connect_timeout 3

           nb_get_retry 3

           delay_before_retry 3

       }

    }

   real_server 172.16.249.123 80 {

       weight 2

       HTTP_GET {

           url {

              path /

               status_code 200

           }

            connect_timeout 3

           nb_get_retry 3

           delay_before_retry 3

       }

    }

}

 

virtual_server 172.16.249.19 80 {

   delay_loop 6

   lb_algo wrr

   lb_kind DR

   nat_mask 255.255.0.0

   protocol TCP

 

   real_server 172.16.249.116 80 {

       weight 1

       HTTP_GET {

           url {

              path /

               status_code 200

           }

           connect_timeout 3

           nb_get_retry 3

           delay_before_retry 3

       }

    }

    real_server 172.16.249.123 80 {

       weight 2

       HTTP_GET {

           url {

              path /

               status_code 200

           }

           connect_timeout 3

           nb_get_retry 3

           delay_before_retry 3

       }

    }

}

這隻在第一個虛擬路由器中作腳本,第二個沒有作,要想作了,跟第一個的同樣

而後就能夠啓動keepalived服務了

spacer.gif

spacer.gif

而後訪問測試一下

spacer.gif

wKiom1Y4IWvByU3EAAED5zLsCNk205.jpg

能夠看到兩個地址都能負載均衡


下面讓一臺lvskeepalived下線

wKioL1Y4IajzhGVnAAJ-Sb7p3vM227.jpg

wKiom1Y4IbaD9bS3AANzP7esvfI737.jpg

這樣兩個地址都在一臺lvs上了,訪問測試下

spacer.gif

能夠看到也沒有問題,

若是把一臺RS下線,全部請求就都在一個RS上了;若是RS都下線,sorry  server就能夠發揮做用了。(這裏再也不演示了)

這樣高可用的lvs的負載均衡就作好了

 

 

下面作下nginx的高可用的負載均衡,就是用nginx作負載均衡器

使用nginx作負載均衡器,架構以下:

spacer.gif

安裝nginx,而後啓動起來,配置成負載均衡服務器

修改/etc/nginx/nginx.conf

spacer.gif

另外一臺負載均衡器一樣這樣配置

 

而後修改這一臺nginx的keepalived的配置文件

global_defs {

  notification_email {

         root@localhost

   }

  notification_email_from kaadmin@localhost

  smtp_server 127.0.0.1

  smtp_connect_timeout 30

  router_id centos7

}

vrrp_script chk_nginx {

   script "killall -0 nginx &> /dev/null"

   interval 1

   weight -10

    }

 

vrrp_instance VI_1 {

   state MASTER

   interface eth0

   virtual_router_id 51

   priority 100

    advert_int 1

   authentication {

       auth_type PASS

       auth_pass 5b03429a7cf5

    }

   virtual_ipaddress {

         172.16.249.18/16dev eth0 label eth0:0

    }

   track_script {

          chk_nginx

    }

   notify_master "/etc/keepalived/notify.sh master"

   notify_backup "/etc/keepalived/notify.sh backup"

   notify_fault "/etc/keepalived/notify.sh fault

}

 

另外一臺nginxkeepalived配置文件爲

global_defs {

  notification_email {

         root@localhost

   }

  notification_email_from kaadmin@localhost

  smtp_server 127.0.0.1

  smtp_connect_timeout 30

  router_id centos6.1.com

}

 

vrrp_script chk_nginx {

   script "killall -0 nginx &> /dev/null"

   interval 1

   weight -10

    }

 

vrrp_instance VI_1 {

   state BACKUP

   interface eth0

   virtual_router_id 51

   priority 99

   advert_int 1

   authentication {

       auth_type PASS

       auth_pass 5b03429a7cf5

    }

   virtual_ipaddress {

         172.16.249.18/16dev eth0 label eth0:0

    }

  track_script {

         chk_nginx

    }

   notify_master "/etc/keepalived/notify.sh master"

   notify_backup "/etc/keepalived/notify.sh backup"

   notify_fault "/etc/keepalived/notify.sh fault"

 

}

而後啓動keepalived

spacer.gif

能夠看到地址配好了,測試下

spacer.gifwKiom1Y4IsmTmaZmAABnw6J0Z74905.jpg


能夠看到作好了,而後把一臺nginxnginx服務停掉,看另外一臺可否上線

spacer.gifwKioL1Y4I0HjGZWVAALm0ip3OJQ642.jpg

訪問也沒有問題,這樣nginx的高可用就作好了,

 

作雙主模式的,只須要在keepalived配置文件里加入下面這些內容就好了

第一臺(172.16.249.195

spacer.gif

第二臺(172.16.249.147

wKioL1Y4I-ex_60BAAE1cPGa6oM321.jpg

而後重啓keepalived服務

查看ip

spacer.gifwKioL1Y4JBOTg3BeAAL3t2WQimI535.jpg


訪問測試,

spacer.gif

讓一臺的nginx服務停掉

wKioL1Y4JFOiDUsJAANk7xAYh58891.jpg

能夠看到能正常切換,這樣nginx高可用的雙主模式就作好了

相關文章
相關標籤/搜索