LVS+Keepalived



LVS
       lvs是一個開源的軟件,可以實現LINUX平臺下的簡單負載均衡。LVS是Linux Virtual Server的縮寫,意思是Linux虛擬服務器。 目前有三種IP負 載均衡技術(VS/NAT、VS/TUN和VS/DR);八種調度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。
Keepalived
       Keepalived 是運行在lvs 之上,它的主要功能是實現真實機的故障隔離及負載均衡器間的失敗 切換,提高系統的可用性

一、環境(一主兩從,兩從做集羣)
Master:CentOS5.8   64位
               MySQL 5.5.17
               192.168.3.28

LVS-VIP:CentOS5.8 64位
                  ipvsadm-1.24.tar.gz, keepalived-1.1.19.tar.gz
                  192.168.3.119

Slave1/node1:CentOS5.8   64位
                         MySQL 5.5.17
                        192.168.3.108

Slave2/node2:CentOS5.8   64位
                          MySQL 5.5.17
                          192.168.3.74
二、部署

1、下載所需軟件
http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
http://www.keepalived.org/software/keepalived-1.1.19.tar.gz

2、安裝LVS
――檢查一下系統內核
安裝之前,首先檢查一下系統內核是否支持LVS的IPVS模塊;自Linux 2.6開始,系統內核完全內置了LVS的各個模塊。
# modprobe -l|grepipvs
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_dh.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_ftp.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_lblc.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_lblcr.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_lc.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_nq.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_rr.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_sed.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_sh.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_wlc.ko
/lib/modules/2.6.18-308.el5/kernel/net/ipv4/ipvs/ip_vs_wrr.ko
看到如上輸出信息,則表明系統內核默認支持IPVS模塊。

――安裝依賴包
由於是源碼包安裝,所以編譯時需要打上如下依賴包。
# rpm -q kernel-headers glibc-headers glibc-devel libgomp gcc libstdc++-devel gcc-c++
檢查所需的依賴包是否安裝,若未安裝,則安裝之。
# rpm -ivh kernel-headers-2.6.18-308.el5.x86_64.rpm
# rpm -ivh glibc-headers-2.5-81.x86_64.rpm
# rpm -ivh glibc-devel-2.5-81.*
# rpm -ivh libgomp-4.4.6-3.el5.1.*
# rpm -ivh gcc-4.1.2-52.el5.x86_64.rpm
# rpm -ivh libstdc++-devel-4.1.2-52.el5.*
# rpm -ivhgcc-c++-4.1.2-52.el5.x86_64.rpm

――編譯安裝
# tar zxvf ipvsadm-1.24.tar.gz
# cd ipvsadm-1.24
# make
# make install

安裝後,執行# ipvsadm --help命令,若能看到幫助信息,則說明IPVS安裝成功。

說明:Make編譯期間,若提示“libipvs.h:14:23: error: net/ip_vs.h: No such file or directory”錯誤,則是由於編譯程序找不到對應的內核造成,做個軟連接即可:
# ln -s /usr/src/kernels/2.6.18-308.el5-x86_64/ /usr/src/linux
若/usr/src/kernels/目錄下沒有對應的內核文件,則是因爲沒有安裝的kernel-devel包的緣故。

3、安裝Keepalived

――安裝依賴包
編譯安裝Keepalived,需要打上如下開發包,首先檢查這些包是否安裝,若未安裝則安裝值。
# rpm -q e2fsprogs-devel keyutils-libs-devellibsepol-devellibselinux-devel krb5-devel zlib-developenssl-devel

# rpm -ivh e2fsprogs-devel-1.39-33.el5.*
# rpm -ivh keyutils-libs-devel-1.2-1.el5.*
# rpm -ivh libsepol-devel-1.15.2-3.el5.*
# rpm -ivh libselinux-devel-1.33.4-5.7.el5.*
# rpm -ivh krb5-devel-1.6.1-70.el5.*
# rpm -ivh zlib-devel-1.2.3-4.el5.*
# rpm -ivh openssl-devel-0.9.8e-22.el5.*

――編譯安裝
# tar zxvf keepalived-1.1.19.tar.gz
# cd keepalived-1.1.19
# ./configure --sysconf=/etc/ --with-kernel-dir=/usr/src/kernels/2.6.18-308.el5-x86_64/

說明:
--sysconf :指定了Keepalived配置文件的安裝路徑,即/etc/Keepalived/Keepalived.conf;
--with-kernel-dri :指定使用內核源碼中的頭文件,即include目錄,該參數很重要,只有使用LVS時才用此參數。

# make
# make install
# ln -s /usr/local/sbin/keepalived /sbin/

安裝後,執行命令# keepalived –help,若看到幫助信息,說明Keepalived安裝成功。
說明:若configure時通過--prefix指定安裝路徑,如/usr/local/keepalived,則需執行如下操作,目的是分別將Keeplalived的工具命令、配置文件、服務啓動腳本拷貝到系統相應目錄下。
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

4、配置Keepalived
Keepalived成功安裝後,默認的配置文件爲/etc/keepalived/keepalived.conf,一個完整的配置文件應包括:全局定義、vrrp實例定義、虛擬服務器定義三個部分,分別說明如下:

# vi keepalived.conf
! Configuration File for keepalived
#全局定義部分

global_defs {
notification_email {
 [email protected]        #設置報警郵件地址,每行一個,可設置多個。注意,若要開啓郵件報警,需開啓本機sendmail服務
   }
 notification_email_fromkeepalived@localhost  #設置郵件的發送地址
 smtp_server 127.0.0.1      #設置smtp server地址
 smtp_connect_timeout 30      #設置連接smtp server的超時時間
 router_id MySQL_LVS      #表示運行keepalived服務器的一個標識,發郵件時顯示在郵件主題中的信息
}

#vrrp實例定義部分

vrrp_instance VI_1 {
 state MASTER        #指定keepalived的角色,MASTER表示爲主服務器,BACKUP表示爲備服務器
 interface eth0         #指定HA監測網絡的接口
 virtual_router_id 51       #虛擬路由標識,是一個數字,同一個vrrp實例使用唯一的標識,即同一個vrrp_instance下,MASTER和BACKUP必須是一致的
 priority 100        #定義優先級,數字越大,優先級越高。在同一個vrrp_instance下,MASTER的優先級必須大於BACKUP的優先級
 advert_int 1        #設定MASTER和BACKUP負載均衡器之間同步檢查的時間間隔,單位:秒
authentication {         #設定驗證類型和密碼
 auth_type PASS       #設定驗證類型,主要有PASS和AH兩種
 auth_pass 1111        #設置驗證密碼,在一個vrrp_instance下,MASTER和BACKUP須使用相同密碼
    }
virtual_ipaddress {        #設置虛擬IP地址,每行一個,可設置多個
        192.168.3.40
    }
}

#虛擬服務器定義部分

virtual_server 192.168.3.40 3306 {   #設置虛擬服務器,指定虛擬IP和服務端口,IP與端口之間用空格隔開;本例Real Server用於運行MySQL從庫,所以此處指定MySQL的服

                                                          #務端口:3306
 delay_loop 6      #設置運行情況檢查時間,單位:秒
 lb_algo lc       #設置負載調度算法,本例採用wlc,有4種常用算法:rr(輪詢)、wrr(加權輪詢)、lc(最少連接)、wlc(加權最少連接),本例採用lc算法。
 lb_kind DR       #設置LVS的負載均衡機制,有NAT,TUN,DR三種,本例採用DR調度模式,這是性能最好的。
 nat_mask 255.255.255.0
 #persistence_timeout 50    #會話保持時間,單位:秒。該選項對動態網頁非常有用,爲集羣系統中的session共享提供了一個很好的解決方案。有了這個會話保持功能,
                                            #用戶的請求會一直分發到某個服務器節點,直到超過這個會話的保持時間。需要注意的是,這個會話保持時間是最大無響應超時時間,也就是說,
                              #用戶在操作動態頁面時,如果在50秒內沒有執行任何操作,那麼接下來的操作會被分發到另外節點,但如果用戶一直在操作動態頁面,則不受此時間限制。
    protocol TCP                                  #指定轉發協議類型,有TCP和UDP兩種
real_server 192.168.3.108 3306 {               #配置服務節點1,需要指定real server的真實IP地址和端口,IP和端口之間用空格隔開
        weight 100                            #配置服務器節點的權值,權值大小用數字標識,數字越大,權值越高,設置權值的大小可以爲不同性能的服務器分配不同的負載,

                                                     #如:爲性能高的服務器設置較高的權        值,爲性能較低的服務器設置相對較低的權值,以便合理利用和分配系統資源。
        TCP_CHECK {                     #real server的狀態檢測設置部分,單位:秒
 connect_timeout    3                   #表示3秒無響應超時
 nb_get_retry       3                      #表示重試次數
 delay_before_retry 3                  #表示重試的間隔
        }
    }
real_server 192.168.3.74 3306 {             #配置服務器節點2
 weight 100
        TCP_CHECK {
  connect_timeout    3
  nb_get_retry       3
  delay_before_retry 3
        }
    }

說明:在配置keepalived.conf時,需特別注意配置文件的語法格式,因爲keepalived在啓動時並不檢測配置文件的正確性,即使沒有配置文件,也可照樣啓動。缺省情況下,Keepalived啓動時會查找/etc/keepalived/keepalived.conf配置文件。

5、編寫腳本 lvs_real.sh

#!/bin/bash
# description: Config realserver

SNS_VIP=192.168.3.40

/etc/rc.d/init.d/functions
 
 case "$1" in
 start)
        /sbin/ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
        /sbin/route add -host $SNS_VIP dev lo:0
        echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
        echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
        sysctl -p >/dev/null 2>&1
        echo "RealServer Start OK"
        ;;
 stop)
        /sbin/ifconfig lo:0 down
        /sbin/route del $SNS_VIP >/dev/null 2>&1
        echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
        echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
        echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
        echo "RealServer Stoped"
        ;;

status)
  islothere='/sbin/ifconfig lo:0 |grep $SNS_VIP'
   if test -z "$islothere" ; then
      echo "LVS_VIP is not Start for Real Server"
   else
      echo "LVS_VIP is Running on Real Server"
   fi
  ;;

*)
        echo "Usage: $0 {start|status|stop}"
        exit 1
esac

配置完成後,爲服務lvsrs添加可執行權限,然後就可啓動或關閉lvsrs了。啓動後,可通過ifconfig命令查看VIP是否成功添加;注意此時VIP即使成功添加,也是ping不通的。

6、開啓服務

sh lvs_real.sh start
service keepalived start

這是就可以ping 通VIP了


7、拷貝lvs_real.sh 到每個節點
scp lvs_real.sh [email protected]:/etc/init.d
scp lvs_real.sh [email protected]:/etc/init.d

8、配置各項服務開啓自動啓動
lvs
 cp /root/lvs_real.sh /etc/init.d/lvs_real.sh
 vi /etc/init.d/lvs_real.sh
 加入 # chkconfig: 2345 64 36
 chkconfig --add lvs_real.sh
 chkconfig lvs_real.sh on
 chkconfig keepalived on


節點配置:
 vi /etc/init.d/lvs_real.sh
 加入 # chkconfig: 2345 64 36
 chkconfig --add lvs_real.sh
 chkconfig lvs_real.sh on

 service iptables stop
 chkconfig iptables off

三、測試

       本方案是由一臺負載調度器(Director Server)和兩臺Real Server組成的負載均衡集羣,由LVS軟件實現。正常情況下,用戶請求通過VIP到達Director Server,然後由其根據負載均衡算法選擇一臺Real Server響應用戶;當監測到某一臺Real Server故障時,則將其剔除集羣,不再提供服務,待恢復正常後,自動加入繼續提供服務。

――負載均衡功能
在一臺客戶端機器上併發創建客戶端連接,以模擬用戶請求:
# mysqlslap -uroot -proot123 -h192.168.3.40 -P3306 --concurrency=100 --iterations=5 --create-schema='information_schema' --query='select count(*) from processlist;' --number-of-queries=10000 --debug-info

在此期間,查看兩臺Slave從庫上的連接數:
# ipvsadm --list
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  localhost:mysql lc persistent 50
  -> localhost:mysql              Route   100    48         154      
  -> localhost:mysql              Route   100    1          0        
[root@localhost ~]# ipvsadm --list
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  localhost:mysql lc persistent 50
  -> localhost:mysql              Route   100    49         253      
  -> localhost:mysql              Route   100    1          0        
[root@localhost ~]# ipvsadm --list
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  localhost:mysql lc persistent 50
  -> localhost:mysql              Route   100    61         341      
  -> localhost:mysql              Route   100    1          0        
[root@localhost ~]# ipvsadm --list
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  localhost:mysql lc persistent 50
  -> localhost:mysql              Route   100    32         370      
  -> localhost:mysql              Route   100    1          0 

從兩臺Slave從庫上查詢,每臺從庫均創建了多個連接,連接是動態變化的,所以連接數並不是絕對平均。

――故障轉移功能
將node1上的MySQL實例關閉,模擬此節點故障,然後查看主Director Server上日誌
[root@localhost ~]# service mysql stop
Shutting down MySQL...                                     [  OK  ]

[root@node1 ~]# tail /var/log/messages
Apr  4 00:01:22 localhost Keepalived_healthcheckers: TCP connection to [192.168.3.108:3306] failed !!!
Apr  4 00:01:22 localhost Keepalived_healthcheckers: Removing service [192.168.3.108:3306] from VS [192.168.3.40:3306]


日誌顯示,Keepalived檢測到192.168.3.108:3306端口連接失敗,則將其從VS [192.168.3.40:3306]中剔除了;此時若再次連接MySQL,會發現所有連接均在192.168.3.74上。
將node1上的MySQL實例重新啓動,模擬節點恢復,然後查看主Director Server上日誌
[root@localhost ~]# service mysql start
Starting MySQL..                                           [  OK  ]

[root@node1 ~]# tail /var/log/messages
Apr  4 00:06:52 localhost Keepalived_healthcheckers: TCP connection to [192.168.3.108:3306] success.
Apr  4 00:06:52 localhost Keepalived_healthcheckers: Adding service [192.168.3.108:3306] to VS [192.168.3.40:3306]

可見,Real Server恢復後,Keepalived可立即監測到,此時自動將其添加到LVS集羣中。


發佈了46 篇原創文章 · 獲贊 30 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章