Linux負載均衡雙機實現文件
安裝環境
虛擬伺服器2臺:
Red Hat Enterprise Linux Server release 5.4 1C 記憶體:512M
應用伺服器:
Red Hat Enterprise Linux Server release 5.4 1C 記憶體:1G
Red Hat Enterprise Linux Server release 5.4 1C 記憶體:1G
VIP:192.168.90.100
GATEWAY:192.168.90.200
Vserver1:192.168.90.220
Vserver2:192.168.90.221
RealServer1:192.168.90.223
RealServer2:192.168.90.224
系統架構
這在整個負載均衡+Ha的高可用架構中主要採用ipvsadm和KeepAlived來實現。
1、 LVS:
是Linux Virtual Server的簡寫,意即Linux虛擬伺服器,是一個虛擬的伺服器叢集系統。本專案在1998年5月由章文嵩博士成立,是中國國內最早出現的自由軟體專案之一。目前有三種IP負載均衡技術(VS/NAT、VS/TUN和VS/DR)八種排程演算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。
2、 ipvsadm
IPVS基本上是一種高效的Layer-4交換機,它提供負載平衡的功能。當一個TCP連線的初始SYN報文到達時,IPVS就選擇一臺伺服器,將報文轉發給它。此後通過查發報文的IP和TCP報文頭地址,保證此連線的後繼報文被轉發到相同的伺服器。這樣,IPVS無法檢查到請求的內容再選擇伺服器,這就要求後端的伺服器組是提供相同的服務,不管請求被送到哪一臺伺服器,返回結果都應該是一樣的。
3、 KeepAlived
keepalived是一個類似於layer3, 4 & 5交換機制的軟體,也就是我們平時說的第3層、第4層和第5層交換。Keepalived的作用是檢測web伺服器的狀態,如果有一臺web伺服器當機,或工作出現故障,Keepalived將檢測到,並將有故障的web伺服器從系統中剔除,當web伺服器工作正常後Keepalived自動將web伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web伺服器。
在上圖的結構中:
主要由ipvsadm負責分發資料實現負載均衡的作用,由keepalived檢測各應用伺服器是否正常工作,實現雙機高可用效能。
通過該方案能夠實現WEB應用伺服器訪問的負載均衡功能,通過Virtual Server 的HA來保證負載均衡伺服器的高可用性。
1、 優點:整個架構完全開源免費,而且有很多相對比較標準活躍的論壇作為技術支撐
2、 缺點:功能簡單,缺少收費產品的服務,出現問題之後必須依靠自己來處理。
安裝ipvsadm
#lsmod|grep ip_vs
如果沒有則進行下面的安裝,ipvsadm軟體一般Linux系統光碟中都會自帶,或者從官方上下載(http://www.linuxvirtualserver.org/software/ipvs.html#kernel-2.6)
#uname –r
2.6.18-164.el5
檢視系統版本然後下載相應版本的ipvsadm
先為linux核心建立一個連線檔案,在配置ipvsadm時需要用到核心中的一些函式庫。
# ln -s /usr/src/kernels/2.6.18-164.el5 / /usr/src/linux
#tar –zxvf ipvsadm-1.24.tar.gz
#cd ipvsadm-1.24
#configure
#make(這一步顯示成功之後再進行make install)
#make install
然後在命令列中敲入ipvsadm確認是否已經安裝成功
[root@wpg u01]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
如上則表明正確安裝了ipvsadm
安裝keepalived
官網下載地址:http://www.keepalived.org/download.html
#tar zxvf keepalived-1.1.15.tar.gz
#cd keepalived-1.1.15
#./configure
Keepalived configuration
------------------------
Keepalived version : 1.1.15
Compiler : gcc
Compiler flags : -g -O2
Extra Lib : -lpopt -lssl -lcrypto
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
Use VRRP Framework : Yes
Use LinkWatch : Yes
Use Debug flags : No
執行完configure之後會出現上面的顯示結果,紅色標出部分為LVS所需服務狀態必須為YES。
#make(這一步成功之後進行安裝)
#make install
安裝完成之後檢視一下是否安裝成功。
#find / -name keepalived # 檢視keepalived位置以便於後面複製檔案
#cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
#cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
#mkdir /etc/keepalived
#cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
#cp /usr/local/sbin/keepalived /usr/sbin/
#chkconfig --add keepalived #設定為開啟啟動
#chkconfig keepalived on
到此keepalived也已經安裝完畢,後面我需要對其進行配置來實現,負載均衡+雙機的功能。
配置LVS
這一步需要在做負載均衡的兩臺vserver上都要執行
vi /usr/local/sbin/lvs-dr.sh
#!/bin/bash
# description: start LVS of DirectorServer
GW=192.168.90.254
# website director vip.
WEB_VIP=192.168.90.200
WEB_RIP1=192.168.90.220
WEB_RIP2=192.168.90.221
. /etc/rc.d/init.d/functions
logger $0 called with $1
case "$1" in
start)
# Clear all iptables rules.
/sbin/iptables -F
# Reset iptables counters.
/sbin/iptables -Z
# Clear all ipvsadm rules/services.
/sbin/ipvsadm -C
#set lvs vip for dr
/sbin/ipvsadm --set 30 5 60
/sbin/ifconfig eth0:0 $WEB_VIP broadcast $WEB_VIP netmask 255.255.255.255 up
/sbin/route add -host $WEB_VIP dev eth0:0
/sbin/ipvsadm -A -t $WEB_VIP:80 -s wrr -p 3
/sbin/ipvsadm -a -t $WEB_VIP:80 -r $WEB_RIP1:80 -g -w 1
/sbin/ipvsadm -a -t $WEB_VIP:80 -r $WEB_RIP2:80 -g -w 1
touch /var/lock/subsys/ipvsadm >/dev/null 2>&1
# set Arp
/sbin/arping -I eth0 -c 5 -s $WEB_VIP $GW >/dev/null 2>&1
/sbin/ipvsadm -ln
;;
stop)
/sbin/ipvsadm -C
/sbin/ipvsadm -Z
ifconfig eth0:0 down
route del $WEB_VIP >/dev/null 2>&1
rm -rf /var/lock/subsys/ipvsadm >/dev/null 2>&1
/sbin/arping -I eth0 -c 5 -s $WEB_VIP $GW
echo "ipvsadm stoped"
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ];then
echo "ipvsadm is stoped"
exit 1
else
ipvsadm -ln
echo "..........ipvsadm is OK."
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
exit 0
#------------------------The end of the Scripts-------------------------------------------
指令碼編寫完成之後分別在分別在兩個節點上跑一次如果跑成功之後應該顯示如下結果:
[root@wpg u01]# ./lvsdr.sh status
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.90.100:80 wrr persistent 3
-> 192.168.90.221:80 Route 1 0 0
-> 192.168.90.220:80 Local 1 0 0
..........ipvsadm is OK.
192.168.90.100為我們設定的虛擬IP下面的兩個為Real Server的IP。
這時候檢視系統IP會發現多了一個浮動IP地址。
eth0 Link encap:Ethernet HWaddr 00:0C:29:18:CB:8D
inet addr:192.168.90.220 Bcast:192.168.90.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe18:cb8d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2973 errors:0 dropped:0 overruns:0 frame:0
TX packets:10151 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:297588 (290.6 KiB) TX bytes:533370 (520.8 KiB)
Interrupt:67 Base address:0x2024
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:18:CB:8D
inet addr:192.168.90.100 Bcast:192.168.90.100 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:67 Base address:0x2024
到此我們就完成了負載均衡的配置。
配置KeepaLived
編輯keepalived的配置檔案,在/etc/keepalived/目錄下
#vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_sync_group lvs_1 {
group {
VI_1
VI_GATEWAY
}
}
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 {
192.168.90.100
}
}
vrrp_instance VI_GATEWAY {
state MASTER
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.90.200
}
}
virtual_server 192.168.100 80 {
delay_loop 6
lb_algo wlc
lb_kind NAT
nat_mask 255.255.255.0
persistence_timeout 1200
protocol TCP
real_server 192.168.90.223 80 {
weight 1
inhibit_on_failure
TCP_CHECK {
connect_port 80
connect_timeout 4
}
}
real_server 192.168.90.224 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 4
}
}
}
#-----------------------The End-------------------
#vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_sync_group lvs_1 {
group {
VI_1
VI_GATEWAY
}
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.90.100
}
}
vrrp_instance VI_GATEWAY {
state BACKUP
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.90.200
}
}
virtual_server 192.168.100 80 {
delay_loop 6
lb_algo wlc
lb_kind NAT
nat_mask 255.255.255.0
persistence_timeout 1200
protocol TCP
real_server 192.168.90. 223 80 {
weight 1
inhibit_on_failure
TCP_CHECK {
connect_port 80
connect_timeout 4
}
}
real_server 192.168.90.224 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 4
}
}
}
分別在兩臺vserver伺服器的/etc/sysctl.conf檔案中新增如下配置:
net.ipv4.ip_forward=1
配置RealServer
每個web伺服器節點都需要進行配置
#vim /etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
#vim /etc/sysconfig/network-scripts/ifcfg-eth0新增
GATEWAY=172.168.90.200
#service network restart
設定開啟啟動
將編寫的lvsdr.sh配置指令碼拷貝到/usr/local/sbin/目錄下,然後將下面兩個命令新增到/etc/rc.local檔案中這樣,就能在開機之後自動啟動LVS服務了。
# /usr/local/sbin/lvsdr.sh start (把這條語句寫到/etc/rc.local中,開機啟動)
#/etc/init.d/keepalived start 啟動keepalived 服務,keepalived就能利用keepalived.conf 配置檔案,實現負載均衡和高可用.
功能測試
LVS基本管理
1、 ipvsadm 的啟動和關閉
使用編寫的lvsdr.sh指令碼即可
#lvsdr.sh start 啟動
#lvsdr.sh stop 關閉
2、 keepalived的啟動和關閉
#/etc/init.d/keepalived start 啟動
#/etc/init.d/keepalived stop 關閉
1、 ipvsadm的服務狀態
#ipvsadm -ln
2、 keepalived的服務狀態
#/etc/init.d/keepalived status
#/sbin/ipvsadm -a -t $WEB_VIP:port -r $WEB_RIP2:port -g -w 1
通過該命令來新增節點 $WEB_VIP:port代表 虛擬伺服器的IP和埠,$WEB_RIP2:port
代表真實應用伺服器的IP和埠。
通過監控日誌來檢測服務資訊:
#tail –f /var/log/messages
LVS之IP負載均衡
在下面我們主要介紹三種IP負載均衡技術的原理
通過 NAT 實現虛 擬伺服器( VS/NAT )。
NAT 的工作原理是報文頭(目標地址、源地址和埠等) 被正確改寫後,客戶相信它們連線一個 IP 地址,而不同 IP 地址的伺服器組也認為它們是與客戶直接相連的。由此,可以用 NAT 方法將不同 IP 地址的並行網路服務變成在一個 IP 地址上的一個虛擬服務。
客戶通過 Virtual IP Address (虛擬服務的 IP 地址)訪問網路服務時,請求報文到達排程器,排程器根據連線排程演算法從一組真實伺服器中選出一臺伺服器,將報文的目標地址 Virtual IP Addres s改寫成選定伺服器的地址,報文的目標埠改寫成選定伺服器的相應埠,最後將修改後的報文傳送給選出的伺服器。同時,排程器在連線 Hash 表中記錄這個連線,當這個連線的下一個報文到達時,從連線 Hash 表中可以得到原選定伺服器的地址和埠,進行同樣的改寫操作,並將報文傳給原選定的伺服器。當來自真實伺服器的響應 報文經過排程器時,排程器將報文的源地址和源埠改為 Virtual IP Address 和相應的埠,再把報文發給使用者。我們在連線上引入一個 狀態機,不同的報文會使得連線處於不同的狀態,不同的狀態有不同的超時值。在 TCP 連線中,根據標準的 TCP 有限狀態機進行狀態遷移;在 UDP 中,我們只設定一個 UDP 狀態。不同狀態的超時值是可以設定的,在預設情況下, SYN 狀態的超時為 1 分鐘, ESTABLISHED 狀態的超時為15 分鐘, FIN 狀態的超時為 1 分鐘; UDP 狀態的超時為 5 分鐘。當連線終止或超時,排程器將這 個連線從連線 H ash 表中刪除。
這樣,客戶所看到的只是在 Virtual IP Address 上提供的服務,而伺服器叢集的結構對使用者是透明的。
如下是我的測試環境:
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.130.200:80 wrr persistent 3
-> 192.168.130.184:80 Route 1 0 0
-> 192.168.130.183:80 Route 1 0 0
現在有一個web請求從客戶端:202.100.1.123:80埠發出,這時排程器會把該請求均衡的分配到每個真實的伺服器,假設選擇了192.168.130.183這臺應用伺服器。這樣排程器(Vserver)收到的請求報文中源地址和目標地址為:
SOURCE 202.100.1.123:80 DES 192.168.130.200:80
這時排程器會選擇一臺這時伺服器來處理這個請求,該報文就會被改寫為:
SOURCE 202.100.1.123:80 DES 192.168.130.183:80
然後應用伺服器處理完請求之後,返回到排程器的報文為:
SOURCE 192.168.130.183:80 DES 202.100.1.123:80
排程器會將響應的報文中的源地址改為虛擬VIP然後發給客戶端:
SOURCE 192.168.130.200:80 DES 202.100.1.123:80
這樣就完成了一個請求和相應的過程。對client端來看這些都是不可見的,client會認為是VIP的伺服器處理並相應的請求。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26723566/viewspace-1081942/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux雙網路卡負載均衡Linux負載
- Linux雙網路卡繫結實現負載均衡和失效保護Linux負載
- 在Linux中,如何實現負載均衡?Linux負載
- nginx實現負載均衡Nginx負載
- 磁碟陣列,雙機熱備,負載均衡陣列負載
- 分離mysql和儲存實現雙web負載均衡MySqlWeb負載
- GRPC 負載均衡實現RPC負載
- HaProxy 實現 MySQL 負載均衡MySql負載
- Ribbon實現負載均衡負載
- Oracle負載均衡實現方式Oracle負載
- Nginx + IIS 實現負載均衡Nginx負載
- dubbo(三):負載均衡實現解析負載
- Linux配置雙網路卡繫結實現負載均衡和高可用性配置Linux負載
- Linux 系統雙網路卡繫結配置實現負載均衡和故障轉移Linux負載
- Mycat 雙主雙從-負載均衡-高可用負載
- Linux下雙網路卡繫結技術實現負載均衡和失效保護(轉)Linux負載
- orleans叢集及負載均衡實現負載
- Nginx如何實現四層負載均衡?Nginx負載
- Haproxy搭建 Web 群集實現負載均衡Web負載
- nginx+tomcat實現負載均衡NginxTomcat負載
- Nginx實現簡單的負載均衡Nginx負載
- Python實現簡單負載均衡Python負載
- 雙機熱備和負載均衡有什麼區別負載
- 雙活資料中心負載均衡理解負載
- Linux下玩轉nginx系列(五)---nginx實現負載均衡LinuxNginx負載
- 在 Linux 上用 DNS 實現簡單的負載均衡LinuxDNS負載
- SpringCloud微服務中使用RestTemplate+Ribbon實現負載均衡(實現方法+實現原理+替換負載均衡策略)SpringGCCloud微服務REST負載
- Keepalived實現Nginx負載均衡高可用Nginx負載
- 伺服器負載均衡原理及實現伺服器負載
- nginx實現兩臺服務負載均衡Nginx負載
- jmeter壓力測試實現負載均衡JMeter負載
- RHEL 7配置HAProxy實現Web負載均衡Web負載
- Docker Compose+nginx實現負載均衡DockerNginx負載
- HAproxy&keepalived 實現tcp負載均衡TCP負載
- SQL Server資料庫實現負載均衡SQLServer資料庫負載
- 用Nginx實現Session共享的均衡負載NginxSession負載
- Nginx如何實現負載均衡釋出策略?Nginx負載
- 服務發現與負載均衡機制-Service負載