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集羣中。