推薦-LVS專題: LVS+Keepalived并使用DNS輪詢實現Director的高可用和負載均衡

LVS專題: LVS+Keepalived并使用DNS輪詢實現Director的高可用和負載均衡

前言

LVS專題寫到第三篇了, 前兩篇我們對LVS的基礎使用也有了一些了解, 這篇我們將做一個比較復雜的實驗, 話不多說, 開始吧!

什么是KeepAlived

What is Keepalived ? 
Keepalived is a routing software written in C. The main goal of this project is to provide simple and robust facilities for loadbalancing and high-availability to Linux system and Linux based infrastructures. Loadbalancing framework relies on well-known and widely used Linux Virtual Server (IPVS) kernel module providing Layer4 loadbalancing. Keepalived implements a set of checkers to dynamically and adaptively maintain and manage loadbalanced server pool according their health. On the other hand high-availability is achieved by VRRP protocol. VRRP is a fundamental brick for router failover. In addition, Keepalived implements a set of hooks to the VRRP finite state machine providing low-level and high-speed protocol interactions. Keepalived frameworks can be used independently or all together to provide resilient infrastructures. ##轉自官方文檔

大體的意思就是keepalived是一個由C語言編寫的項目, 主要目標是提供負載均衡和高可用的Linux服務. keepalived依賴于Linux Virtual Server(IPVS)內核提供的四層負載均衡, keepalived實現了動態自適應和維護, 能夠檢測負載均衡池中的主機的健康狀態, 而keepalived的高可用是通過VRRP(virtual route redundancy protocol)實現的.

關于VRRP協議參考文檔H3C技術白皮書: VRRP、RFC 3768:Virtual Router Redundancy Protocol (VRRP)

實驗介紹

大家都知道LVS雖然性能很強勁但是功能上有很多不足, 例如: 不能提供后端健康狀態檢查功能, director容易成為單點故障…, 而這些功能我們都可以通過第三方軟件keepalived來提供, 而本次實驗我們就要使用keepalived提供lvs-director的高可用, 并讓兩臺director分別互為主從都能接受客戶端通過dns對A記錄的輪詢請求從而轉發至后端主機. 實現Director的高可用和負載均衡

實驗拓撲

圖畫的不夠形象, 實驗中我們使用DR模型來進行實驗

blob.png

實驗環境

VIP1為172.16.1.8、VIP2為172.16.1.9

主機 IP地址 功用
director1.anyisalin.com VIP1,VIP2, DIP: 172.16.1.2 Director1
director2.anyisalin.com VIP1,VIP2, DIP: 172.16.1.3 Director2
rs1.anyisalin.com VIP, RIP: 172.16.1.4 RealServer 1
rs2.anyisalin.com VIP, RIP: 172.16.1.5 RealServer 2
ns.anyisalin.com IP: 172.16.1.10 DNS

注意: 本文實驗中所有主機SElinux和iptables都是關閉的

實驗步驟

配置KeepAlived(1)

實現Director 的VIP互為主從

下面的操作都在director1上執行

[root@director1 ~]# ntpdate 0.centos.pool.ntp.org  #同步時間
[root@director1 ~]# yum install keepalived &> /dev/null && echo success    #安裝keepalived
success

[root@director1 ~]# vim /etc/keepalived/keepalived.conf    #修改配置文件的部分配置如下
vrrp_instance VI_1 {
   state MASTER
   interface eth0
   virtual_router_id 51
   priority 100
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
   172.16.1.8 dev eth0 label eth0:0
   }
}


vrrp_instance VI_2 {
  state BACKUP
  interface eth0
  virtual_router_id 52
  priority  99
  advert_int 1
  authentication {
   auth_type PASS
   auth_pass 2222
  }

  virtual_ipaddress {
    172.16.1.9 dev eth0 label eth0:1
  }
}

下面的操作都在director1上執行

[root@director2 ~]# ntpdate 0.centos.pool.ntp.org  #同步時間
[root@director2 ~]# yum install keepalived &> /dev/null && echo success    #安裝keepalived
success

[root@director2 ~]# vim /etc/keepalived/keepalived.conf    #修改配置文件的部分配置如下
vrrp_instance VI_1 {
   state BACKUP
   interface eth0
   virtual_router_id 51
   priority 99
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
   172.16.1.8 dev eth0 label eth0:0
   }
}


vrrp_instance VI_2 {
  state MASTER
  interface eth0
  virtual_router_id 52
  priority  100
  advert_int 1
  authentication {
   auth_type PASS
   auth_pass 2222
  }

  virtual_ipaddress {
    172.16.1.9 dev eth0 label eth0:1
  }
}

同時在director1和director2上啟動keepalived

[root@director1 ~]# service keepalived start
[root@director2 ~]# service keepalived start

測試

默認情況director1director2的ip如下 

blob.png


我們將director1keepalived服務停止, 效果如下, IP自動轉移到director2 

推薦-LVS專題: LVS+Keepalived并使用DNS輪詢實現Director的高可用和負載均衡


我們將director1keepalived服務再次啟動, 效果如下, IP地址轉回director1 

推薦-LVS專題: LVS+Keepalived并使用DNS輪詢實現Director的高可用和負載均衡

配置LVS

配置KeepAlived(2)

這里我們使用DR模型進行實驗, 因為keepalived可以通過調用ipvs的接口來自動生成規則, 所以我們這里無需ipvsadm, 但是我們要通過ipvsadm命令來查看一下ipvs規則

下面的操作在director1和director2都要執行, 由于篇幅過長, 遂不演示director2的操作

[root@director1 ~]# yum install ipvsadm httpd &> /dev/null && echo success
success
[root@director1 ~]# echo "<h1>Sorry, Service is Unavailable </h1>" > /var/www/html/index.html #配置sorry頁面

[root@director1 ~]# vim /etc/keepalived/keepalived.conf    #修改keepalived配置文件, 添加以下段落
virtual_server 172.16.1.8 80 {
   delay_loop 6
   lb_algo rr
   lb_kind DR
   nat_mask 255.255.255.0
  # persistence_timeout 50
   protocol TCP
   sorry_server 127.0.0.1 80

   real_server 172.16.1.4 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.1.5 80 {
       weight 1
       HTTP_GET {
           url {
             path /
       status_code 200
           }
           connect_timeout 3
           nb_get_retry 3
           delay_before_retry 3
       }
   }
}


virtual_server 172.16.1.9 80 {
   delay_loop 6
   lb_algo rr
   lb_kind DR
   nat_mask 255.255.255.0
  # persistence_timeout 50
   protocol TCP
   sorry_server 127.0.0.1 80

   real_server 172.16.1.4 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.1.5 80 {
       weight 1
       HTTP_GET {
           url {
             path /
       status_code 200
           }
           connect_timeout 3
           nb_get_retry 3
           delay_before_retry 3
       }
   }
}

同時在director1和director2上重啟keepalived

[root@director2 ~]# service keepalived restart
[root@director2 ~]# service keepalived restart

查看ipvs規則

[root@director1 ~]# 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.1.8:80 rr
 -> 172.16.1.4:80                Route   1      0          0        
 -> 172.16.1.5:80                Route   1      0          0        
TCP  172.16.1.9:80 rr
 -> 172.16.1.4:80                Route   1      0          0        
 -> 172.16.1.5:80                Route   1      0          0

配置RS的IP和web服務

下面的操作都在rs1上執行

[root@rs1 ~]# yum install httpd -y &> /dev/null && echo success    #安裝httpd
success
[root@rs1 ~]# echo "<h1>This is 172.16.1.4</h1>" > /var/www/html/index.html    #創建網頁文件

[root@director1 ~]# service httpd start    #啟動httpd服務
Starting httpd: httpd: apr_sockaddr_info_get() failed for director1.anyisalin.com

httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                          [  OK  ]
[root@rs1 ~]# vim setup.sh #編寫腳本配置相關內核參數和IP, 對這里不了解的看我上篇文章
#!/bin/bash
case $1 in
start)
       echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
       echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
       echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
       echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
       ifconfig lo:0 172.16.1.8/32 broadcast 172.16.1.8 up
       ifconfig lo:1 172.16.1.9/32 broadcast 172.16.1.9 up
       ;;
stop)
       echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
       echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
       echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
       echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
       ifconfig lo:0 down
       ifconfig lo:1 down
esac

[root@rs1 ~]# bash setup.sh start  #運行腳本
[root@rs1 ~]# scp setup.sh 172.16.1.5:/root        #將腳本傳給rs2

下面的操作都在rs1上執行

[root@rs1 ~]# yum install httpd -y &> /dev/null && echo success    #安裝httpd
success
[root@rs1 ~]# echo "<h1>This is 172.16.1.4</h1>" > /var/www/html/index.html    #創建網頁文件
[root@rs2 ~]# bash setup.sh start  #運行腳本

測試LVS

測試director1director2 

推薦-LVS專題: LVS+Keepalived并使用DNS輪詢實現Director的高可用和負載均衡

當我們關閉rs1的web服務, 會自動檢查健康狀態并刪除 

推薦-LVS專題: LVS+Keepalived并使用DNS輪詢實現Director的高可用和負載均衡

當我們同時關閉rs1rs2的web服務, 會自動啟用sorry server 

推薦-LVS專題: LVS+Keepalived并使用DNS輪詢實現Director的高可用和負載均衡

配置DNS

配置dns的過程沒什么好說的, 有興趣可以看我的博客DNS and BIND 配置指南

下面的操作都在ns上執行

[root@ns /]# yum install bind bind-utils -y --nogpgcheck &> /dev/null && echo success #安裝bind
success

[root@ns /]# vim /etc/named.conf    #修改主配置文件如下
options {
       directory       "/var/named";

};
zone "." IN {
       type hint;
       file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

[root@ns /]# vim /etc/named.rfc1912.zones   #在文件尾部加上下列字段
zone "anyisalin.com" IN {
       type master;
       file "anyisalin.com.zone";
};

[root@ns /]# vim /var/named/anyisalin.com.zone  #創建區域配置文件

$TTL 600
$ORIGIN anyisalin.com.
@  IN   SOA  ns.anyisalin.com.  admin.anyisalin.com. (
       20160409
       1D
       5M
       1W
       1D
)

       IN   NS  ns
ns      IN   A   172.16.1.10
www     IN   A   172.16.1.8
www     IN   A   172.16.1.9

[root@ns /]# service named start    #啟動named
Generating /etc/rndc.key:                                  [  OK  ]
Starting named:                                            [  OK  ]

測試DNS輪詢效果

已經實現DNS輪詢效果 

blob.png

最終測試

做了那么實驗, 結合前面實驗的效果, 來一次最終測試, 我將本機的DNS server指向了172.16.1.10以便測試

默認情況如下 

推薦-LVS專題: LVS+Keepalived并使用DNS輪詢實現Director的高可用和負載均衡

我們將director2keepalived強制關閉,依然不會影響訪問 

推薦-LVS專題: LVS+Keepalived并使用DNS輪詢實現Director的高可用和負載均衡

此時我們的director1的IP地址如下, 接管了director2的IP 

blob.png

總結

我們通過DNS輪詢實現LVS-Director的負載均衡, KeepAlived實現Director的高可用, 而Director本身就可以為后端的RS進行負載均衡, 這一套架構還是很完整的. 其實本文還有很多不完善的地方, 但是由于我時間較緊, 遂不對其進行敘述, 希望大家多多諒解, LVS專題到這里可能結束了, 也可能會不定期的更新, 希望大家多多關注我的博客! 
作者: AnyISalIn QQ:1449472454 
感謝:MageEdu

原創文章,作者:Net18-AnyISalIn,如若轉載,請注明出處:http://www.www58058.com/14485

(3)
Net18-AnyISalInNet18-AnyISalIn
上一篇 2016-04-07
下一篇 2016-04-10

相關推薦

  • 馬哥教育網絡班N22期+第8周課程練習

    1、請描述網橋、集線器、二層交換機、三層交換機、路由器的功能、使用場景與區別。 網橋:是連接兩個局域網的基于MAC地址數據存儲轉發設備,工作于數據鏈路層集線器:所有端口處于同一個廣播域和沖突域中,帶寬共享,工作于物理層二層交換機:多端口網橋,一個端口一個沖突域,默認所有端口位于同一個廣播域中,可以劃分vlan,隔離廣播域,帶寬獨享三層交換機:具有路由功能的二…

    Linux干貨 2016-10-19
  • man命令的用法

    man 命令的用法    在linux運維工作中,經常會有一些命令我們不是很清楚它們的準確用法,這時候我們就需要去查詢這些命令的用法,linux中就有很多文檔幫助我們去了解這些命令的用法,其中就有一條命令man,下面我就總結一下它的用法。     man 是 manual 的簡寫,提供命令的幫助文件。   &…

    Linux干貨 2017-02-17
  • zabbix快速創建篩選(sql操作)

        公司由于大量業務調整,尤其是服務器功能和性能的轉變,監控也跟隨這變化,其中操作最為繁瑣的當數zabbix篩選(相信各位從頁面添加的都深感痛苦)于是有了本文。     本文采用的方法是sql操作(由于本人不會php等,無法寫程序直接調用官方api,所以,嘿嘿,不解釋,同時也希望各路大…

    Linux干貨 2015-12-17
  • N26-第二周

    1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。(盜圖了,哈哈哈) 文件查看類命令:cat, tac, head, tail, more, less,touch    cat 查看文件內容   tac命令   反向查看文件內容  注:可對照上圖 分屏查看命令:more  …

    Linux干貨 2017-01-07
  • 第九周-Shell腳本編程

      1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現; #!/bin/bash nologin=0 login=0 for i in `cut -d : -f 7 /etc/passwd`;do if [ $i = /sbin/n…

    Linux干貨 2017-08-23
  • 高可用集群基本概念與heartbeat文本配置接口

    一、高可用集群基本概念:     什么是高可用集群:          所謂高可用集群,就是在出現故障時,可以把業務自動轉移到其他主機上并讓服務正常運行的集群構架     高可用集群的構架層…

    Linux干貨 2016-01-13
欧美性久久久久