keepalived 多个应用_Keepalived与LVS部署多个服务
Keepalived與LVS部署多個(gè)服務(wù)
陳信
20120718
說(shuō)明:
主從機(jī)都需要安裝ipvsadm和keepalived;
后端機(jī)器不用安裝,只需要啟動(dòng)vip腳本;
yum -y install kernel-devel
yum -y update kernel
modprobe ip_vs #內(nèi)核加載ip_vs模塊
lsmod |grep ip_vs #查看是否加載成功。
cp /usr/src/kernels/2.6.18-274.el5(版本不同路徑會(huì)不同)/include/net/ip_vs.h /usr/inclide/net/ #這個(gè)很重要,否則在安裝ipvsadm的時(shí)候會(huì)提示缺少*.h文件
yum -y install openssl openssl-devel #安裝keepalived需要
前期準(zhǔn)備工作完成;
比如gcc gcc-c++(yum install gcc* -y)之類(lèi)的;
現(xiàn)在準(zhǔn)備下載ipvsadm和keepalived了
wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz
tar xzvf ipvsadm-1.24.tar.gz
cd ipvsadm-1.24
make && make install
安裝完成,會(huì)多出以下文件。
/sbin/ipvsadm
/sbin/ipvsadm-save
/sbin/ipvsadm-restore
/usr/man/man8/ipvsadm.8
/usr/man/man8/ipvsadm-save.8
/usr/man/man8/ipvsadm-restore.8
/etc/rc.d/init.d/ipvsadm
tar xzvf keepalived-1.2.2.tar.gz
cd keepalived-1.2.2
./configure --prefix=/usr/local/keepalived
make && make install
正確完成安裝會(huì)顯示如下信息:
Keepalived configuration
Keepalived version : 1.2.2
Compiler : gcc
Compiler flags : -g -O2
Extra Lib : -lpopt -lssl -lcrypto
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
IPVS use libnl : No
Use VRRP Framework : Yes
Use Debug flags : No
然后對(duì)keepalived做以下操作:
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
配置keepalived.conf
vi /etc/keepalived/keepalived.conf
主機(jī)192.168.40.18 備機(jī)192.168.40.4 后端192.168.40.5 192.168.40.6 VIP192.168.40.7
主機(jī).18:
cat keepalived.conf
global_defs { #可以在global_defs下定義郵件通知功能
router_id LVS_login
}
vrrp_instance VI_1 {
state BACKUP
nopreempt #設(shè)置為不搶占;注意該參數(shù)只能在BACKUP的state上設(shè)置,且priority必須比另外一臺(tái)高
interface eth0 #實(shí)例綁定的網(wǎng)卡
track_interface { #設(shè)置額外的監(jiān)控,內(nèi)部的任何一塊網(wǎng)卡出現(xiàn)問(wèn)題,都會(huì)進(jìn)入FAULT狀態(tài).
eth0 #可以設(shè)多塊網(wǎng)卡
}
virtual_router_id 56 # 保持主從服務(wù)器一致,VRID的標(biāo)記(0..255)
priority 150 # 優(yōu)先級(jí) (主服務(wù)器較高,數(shù)值大的競(jìng)選為master)
advert_int 1 # 心跳廣播間隔(秒)
authentication { # 認(rèn)證
auth_type PASS # 支持PASS和AH
auth_pass css74..tfwwapmzi4r
}
virtual_ipaddress { #指定漂移IP地址,即VIP.傳遞給ip addr 命令.
192.168.40.7/32 dev eth0 scope global # 虛擬IP地址,可以多個(gè),掩碼位設(shè)置為32,獨(dú)立IP地址.dev eth0為設(shè)備eth0上添加地址.scope global為全局范圍,此處的配置都是符合linux的ip命令的格式的.
}
}
virtual_server 192.168.40.7 4399 {
delay_loop 6 #檢測(cè)的間隔時(shí)間
lb_algo wrr #lvs調(diào)度算法
lb_kind DR #lvs方式(TUN DR NAT)三種
nat_mask 255.255.0.0
persistence_timeout 50 #持久連接超時(shí)時(shí)間
protocol TCP #通信協(xié)議
sorry_server 192.168.100.100 80 #當(dāng)后端realserver都掛掉時(shí)使用的server
real_server 192.168.40.5 4399 {
weight 1
TCP_CHECK { #健康檢查方式
connect_timeout 10 #連接超時(shí)時(shí)間
nb_get_retry 3 #嘗試連接次數(shù)
delay_before_retry 3 #兩次成功retry之間的時(shí)間
connect_port 4399
}
}
real_server 192.168.40.6 4399 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 4399
}
}
}
之后仍可以定義多個(gè)virtual_server 192.168.40.7 port
配置文件到此結(jié)束
從機(jī).4
cat keepalived.conf
global_defs { #可以在global_defs下定義郵件通知功能
router_id LVS_login
}
vrrp_instance VI_1 {
state BACKUP
nopreempt #設(shè)置為不搶占;注意該參數(shù)只能在BACKUP的state上設(shè)置,且priority必須比另外一臺(tái)高
interface eth1 #實(shí)例綁定的網(wǎng)卡
track_interface { #設(shè)置額外的監(jiān)控,內(nèi)部的任何一塊網(wǎng)卡出現(xiàn)問(wèn)題,都會(huì)進(jìn)入FAULT狀態(tài).
eth1
}
virtual_router_id 56 # 保持主從服務(wù)器一致,VRID的標(biāo)記(0..255)
priority 100 # 優(yōu)先級(jí) (主服務(wù)器較高,數(shù)值大的競(jìng)選為master)
advert_int 1 # 心跳廣播間隔(秒)
authentication { # 認(rèn)證
auth_type PASS # 支持PASS和AH
auth_pass css74..tfwwapmzi4r
}
virtual_ipaddress { #指定漂移IP地址,即VIP.傳遞給ip addr 命令.
192.168.40.7/32 dev eth1 scope global # 虛擬IP地址,可以多個(gè),掩碼位設(shè)置為32,獨(dú)立IP地址.dev eth1為設(shè)備eth1上添加地址.scope global為全局范圍,此處的配置都是符合linux的ip命令的格式的.
}
}
virtual_server 192.168.40.7 4399 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.0.0
persistence_timeout 50
protocol TCP
real_server 192.168.40.5 4399 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 4399
}
}
real_server 192.168.40.6 4399 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 4399
}
}
}
后端機(jī)器配置腳本:
cat VIP.sh
!/bin/bash
LVS houduan
Chenxin 20120718
VIP=192.168.40.7
. /etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $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)
ifconfig lo:0 down
route del $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"
;;
*)
echo "Usage:$0{start|stop}"
exit 1
esac
exit 0
檢查:
ip addr
1: lo: mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:66:76:59 brd ff:ff:ff:ff:ff:ff
inet 192.168.40.18/26 brd 192.168.40.63 scope global eth0
inet 192.168.40.7/32 scope global eth0
inet6 fe80::20c:29ff:fe66:7659/64 scope link
valid_lft forever preferred_lft forever
[root@Sz-test keepalived]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.40.7:4399 wrr persistent 50
-> 192.168.40.6:4399 Route 1 1 0
-> 192.168.40.5:4399 Route 1 0 0
可以嘗試登錄4399端口,并ifconfig看一下在哪臺(tái)機(jī)器上;同一臺(tái)機(jī)器會(huì)一直連同一個(gè)后端,換一臺(tái)機(jī)器就連另一個(gè)后端了。
完
詳解keepalived配置文件
Configuration File for keepalived
global_defs {
notification_email {
admin@domain.com #可以寫(xiě)多個(gè),用于接收郵件
....
}
notification_email_from keepalived@domain.com #發(fā)送通知郵件的地址
smtp_server 192.168.200.20 #郵件服務(wù)器地址
smtp_connect_timeout 30 #連接郵件服務(wù)器超時(shí)的時(shí)間
lvs_id LVS_MAIN #主管lvs的名字
}
vrrp_instance VI_1 {
state MASTER #備份服務(wù)器上改成BACKUP
interface eth0 #VIP所在的網(wǎng)卡接口
virtual_router_id 51
priority 100 #備份服務(wù)器上將100改成99
advert_int 1
#nopreempt #master和slave不搶占
authentication { #身份認(rèn)證
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.15
#如果有多個(gè)VIP繼續(xù)換行寫(xiě)
}
}
virtual_server 192.168.200.15 80 { # VIP的ip和端口
delay_loop 3 #檢測(cè)的間隔時(shí)間
lb_algo wrr #lvs調(diào)度算法
lb_kind NAT #lvs方式(TUN|DR|NAT)三種方式
presistence_timeout 50 #持久連接超時(shí)的時(shí)間
protocol TCP #使用的協(xié)議TCP/UDP
sorry_server 192.168.100.100 80 #當(dāng)后端realserver都down掉時(shí)使用的server
real_server 192.168.100.2 80 { #后端的real_server
weight 2 #權(quán)重
HTTP_GET { #健康檢測(cè)的方式 HTTP_CHECK |SSL_GET|HTTP_GET|
url {
path /testurl/test.php #get的文件名稱(chēng)
digest 640205b7b0fc66clea91c463fac6334c
}
connect_timeout 3 # 連接超時(shí)時(shí)間
nb_get_retry 3 #嘗試連接的次數(shù)
delay_before_retry 2 #兩次成功retry之間的時(shí)間
}
}
real_server 192.168.100.3 80 { #后端的real_server
weight 2 #權(quán)重
HTTP_GET { #健康檢測(cè)的方式 TCP_CHECK |SSL_GET|HTTP_GET|
url {
path /testurl/test.php #get的文件名稱(chēng)
digest 640205b7b0fc66clea91c463fac6334c
}
connect_timeout 3 # 連接超時(shí)時(shí)間
nb_get_retry 3 #嘗試連接的次數(shù)
delay_before_retry 2 #兩次成功retry之間的時(shí)間
}
}
}
virtual_server 192.168.200.15 443 {
delay_loop 20
lb_algo rr
lb_kind NAT
persistence_timeout 360
protocol TCP
real_server 192.168.100.2 443 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
real_server 192.168.100.3 443 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
}
· 全局定義塊
1、 email通知。作用:有故障,發(fā)郵件報(bào)警。這是可選項(xiàng)目,建議不用,用nagios全面監(jiān)控代替之。
2、 Lvs負(fù)載均衡器標(biāo)識(shí)(lvs_id)。在一個(gè)網(wǎng)絡(luò)內(nèi),它應(yīng)該是唯一的。
3、 花括號(hào)“{}”。用來(lái)分隔定義塊,因此必須成對(duì)出現(xiàn)。如果寫(xiě)漏了,keepalived運(yùn)行時(shí),不會(huì)得到預(yù)期的結(jié)果。由于定義塊內(nèi)存在嵌套關(guān)系,因此很容易遺漏結(jié)尾處的花括號(hào),這點(diǎn)要特別注意。
· VRRP定義塊
1、 同步vrrp組vrrp_sync_group。作用:確定失敗切換(FailOver)包含的路由實(shí)例個(gè)數(shù)。即在有2個(gè)負(fù)載均衡器的場(chǎng)景,一旦某個(gè)負(fù)載均衡器失效,需要自動(dòng)切換到另外一個(gè)負(fù)載均衡器的實(shí)例是哪些?
2、 實(shí)例組group.至少包含一個(gè)vrrp實(shí)例。
3、 Vrrp實(shí)例vrrp_instance.實(shí)例名出自實(shí)例組group所包含的那些名字。
(1) 實(shí)例狀態(tài)state.只有MASTER和BACKUP兩種狀態(tài),并且需要大寫(xiě)這些單詞。其中MASTER為工作狀態(tài),BACKUP為備用狀態(tài)。當(dāng)MASTER所在的服務(wù)器失效時(shí),BACKUP所在的系統(tǒng)會(huì)自動(dòng)把它的狀態(tài)有BACKUP變換成MASTER;當(dāng)失效的MASTER所在的系統(tǒng)恢復(fù)時(shí),BACKUP從MASTER恢復(fù)到BACKUP狀態(tài)。
(2) 通信接口interface。對(duì)外提供服務(wù)的網(wǎng)絡(luò)接口,如eth0,eth1.當(dāng)前主流的服務(wù)器都有2個(gè)或2個(gè)以上的接口,在選擇服務(wù)接口時(shí),一定要核實(shí)清楚。
(3) lvs_sync_daemon_inteface。負(fù)載均衡器之間的監(jiān)控接口,類(lèi)似于HA HeartBeat的心跳線。但它的機(jī)制優(yōu)于Heartbeat,因?yàn)樗鼪](méi)有“裂腦”這個(gè)問(wèn)題,它是以?xún)?yōu)先級(jí)這個(gè)機(jī)制來(lái)規(guī)避這個(gè)麻煩的。在DR模式中,lvs_sync_daemon_inteface 與服務(wù)接口interface 使用同一個(gè)網(wǎng)絡(luò)接口。
(4) 虛擬路由標(biāo)識(shí)virtual_router_id.這個(gè)標(biāo)識(shí)是一個(gè)數(shù)字,并且同一個(gè)vrrp實(shí)例使用唯一的標(biāo)識(shí)。即同一個(gè)vrrp_stance,MASTER和BACKUP的virtual_router_id是一致的,同時(shí)在整個(gè)vrrp內(nèi)是唯一的。
(5) 優(yōu)先級(jí)priority.這是一個(gè)數(shù)字,數(shù)值愈大,優(yōu)先級(jí)越高。在同一個(gè)vrrp_instance里,MASTER 的優(yōu)先級(jí)高于BACKUP。若MASTER的priority值為150,那么BACKUP的priority只能是140或更小的數(shù)值。
(6) 同步通知間隔 advert_int .MASTER與BACKUP負(fù)載均衡器之間同步檢查的時(shí)間間隔,單位為秒。
(7) 驗(yàn)證authentication。包含驗(yàn)證類(lèi)型和驗(yàn)證密碼。類(lèi)型主要有PASS、AH兩種,通常使用的類(lèi)型為PASS,據(jù)說(shuō)AH使用時(shí)有問(wèn)題。驗(yàn)證密碼為明文,同一vrrp實(shí)例MASTER與BACKUP 使用相同的密碼才能正常通信。
4、 虛擬ip地址virtual_ipaddress . 可以有多個(gè)地址,每個(gè)地址占一行,不需要指定子網(wǎng)掩碼。注意:這個(gè)ip必須與我們?cè)趌vs客戶(hù)端設(shè)定的vip相一致!
· 虛擬服務(wù)器virtual_server定義塊
虛擬服務(wù)器定義是keepalived框架最重要的項(xiàng)目了,是keepalived.conf必不可少的部分。
1、 虛擬服務(wù)器virtual_server. 這個(gè)ip來(lái)自于vrrp定義塊的第“4”步,后面一個(gè)空格,然后加上端口號(hào)。定義一個(gè)vip,可以實(shí)現(xiàn)多個(gè)tcp端口的負(fù)載均衡功能。
(1) delay_loop。健康檢查時(shí)間間隔,單位是秒。
(2) lb_algo. 負(fù)載均衡調(diào)度算法,互聯(lián)網(wǎng)應(yīng)用常使用wlc或rr。
(3) lb_kind. 負(fù)載均衡轉(zhuǎn)發(fā)規(guī)則。一般包括DR,NAT,TUN3種,在我的方案中,都使用DR的方式。
(4) persistence_timeout.會(huì)話(huà)保持時(shí)間,單位是秒。這個(gè)選項(xiàng)對(duì)動(dòng)態(tài)網(wǎng)站很有用處:當(dāng)用戶(hù)從遠(yuǎn)程用帳號(hào)進(jìn)行登陸網(wǎng)站時(shí),有了這個(gè)會(huì)話(huà)保持功能,就能把用戶(hù)的請(qǐng)求轉(zhuǎn)發(fā)給同一個(gè)應(yīng)用服務(wù)器。在這里,我們來(lái)做一個(gè)假設(shè),假定現(xiàn)在有一個(gè)lvs 環(huán)境,使用DR轉(zhuǎn)發(fā)模式,真實(shí)服務(wù)器有3個(gè),負(fù)載均衡器不啟用會(huì)話(huà)保持功能。當(dāng)用戶(hù)第一次訪問(wèn)的時(shí)候,他的訪問(wèn)請(qǐng)求被負(fù)載均衡器轉(zhuǎn)給某個(gè)真實(shí)服務(wù)器,這樣他看到一個(gè)登陸頁(yè)面,第一次訪問(wèn)完畢;接著他在登陸框填寫(xiě)用戶(hù)名和密碼,然后提交;這時(shí)候,問(wèn)題就可能出現(xiàn)了—登陸不能成功。因?yàn)闆](méi)有會(huì)話(huà)保持,負(fù)載均衡器可能會(huì)把第2次的請(qǐng)求轉(zhuǎn)發(fā)到其他的服務(wù)器。
(5) 轉(zhuǎn)發(fā)協(xié)議protocol.一般有tcp和udp兩種。實(shí)話(huà)說(shuō),我還沒(méi)嘗試過(guò)udp協(xié)議類(lèi)的轉(zhuǎn)發(fā)。
2、 真實(shí)服務(wù)器real_server.也即服務(wù)器池。Real_server的值包括ip地址和端口號(hào)。多個(gè)連續(xù)的真實(shí)ip,轉(zhuǎn)發(fā)的端口相同,是不是可以以范圍表示?需要進(jìn)一步實(shí)驗(yàn)。如寫(xiě)成real_server 61.135.20.1-10 80 .
(1) 權(quán)重weight.權(quán)重值是一個(gè)數(shù)字,數(shù)值越大,權(quán)重越高。使用不同的權(quán)重值的目的在于為不同性能的機(jī)器分配不同的負(fù)載,性能較好的機(jī)器,負(fù)載分擔(dān)大些;反之,性能差的機(jī)器,則分擔(dān)較少的負(fù)載,這樣就可以合理的利用不同性能的機(jī)器資源。
(2) Tcp檢查 tcp_check.
總結(jié)
以上是生活随笔為你收集整理的keepalived 多个应用_Keepalived与LVS部署多个服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python时间序列预测报错_pytho
- 下一篇: go interface 转int_大神