推薦-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技術白皮書: VRRPRFC 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 21:32
下一篇 2016-04-10 12:41

相關推薦

  • RAID概述

    1、引言 RAID全稱Redundant Arrays of Inexpensive Disks / Redundant Arrays of Independent Disks,即獨立冗余磁盤陣列。RAID可以通過相關技術(軟件/硬件),將多個較小的磁盤整合成為一個較大的磁盤整體,而且能從某些方面提高數據的讀寫及數據保護。RAID分為不同…

    Linux干貨 2016-12-24
  • 8月5日文本處理工具作業

    分析文本工具相關練習題 1 、找出ifconfig 命令結果中本機的所有IPv4 地址       ~]# ifconfig|tr -cs '[0-9].' '\n'|sort -ut '.…

    Linux干貨 2016-08-06
  • VIM編輯器用法及練習

    VIM編輯器用法及練習 什么是vim? vim是從vi發展出來的一個文本編輯器。代碼補全、編譯及錯誤跳轉等方便編程的功能特別豐富,在程序員中被廣泛使用,和Emacs并列成為類Unix系統用戶最喜歡的文本編輯器。 Vim的第一個版本由布萊姆·米勒在1991年發布。最初的簡稱是Vi IMitation,隨著功能的不斷增加,正式名稱改成了Vi IMproved。現…

    Linux干貨 2016-10-30
  • 網絡概念簡述和Linux網絡管理命令

    網絡概念簡述和Linux網絡管理命令 1. 網絡分類 我們通常接觸到的網絡通常是廣域網、局域網 局域網(Local Area Network,LAN)是指在某一區域內由多臺計算機互聯成的計算機組。 廣域網(Wide Area Network,WAN):網絡跨越國界、洲界,甚至全球范圍。  因特網(Internet)是世界范圍內最大的廣域網。 2. …

    Linux干貨 2016-04-19
  • CentOS程序安裝的3種方式{ 源碼包安裝 | rpm包安裝 | yum安裝;}

    CentOS程序安裝的3種方式{ 源碼包安裝 | rpm包安裝 | yum安裝;} CentOS軟件安裝主要由3種方式,第一種是源碼包安裝,需要從網站下載并解壓之后通過手動編譯的方式安裝,過程相對比較復雜;第二種是rpm包安裝,通過rmp這個包管理器實現程序的安裝、升級、卸載等操作,rpm包管理器是RPM Package Manager的簡稱,功能非常強大,…

    Linux干貨 2016-08-24
  • N25-第一周 總結

    linux bassic The first week of blogging 概要 計算機與操作系統、linux發行版及他們之間聯系與區別、Linux的哲學思想、linux系統上命令使用格式及基礎命令介紹、linux命令幫助說明、FHS 一、計算機與操作系統 什么是計算機? 電子計算機(computer),亦稱電腦,是一種利用電子學原理,根據一系列指令對數…

    Linux干貨 2016-12-04
欧美性久久久久