工作原理此處不作講解,自己去官方網站學習(http://www.linuxvirtualserver.org),這里重點講如何配置!
注:最好從官方網站對其進行了解,不至於會對某些問題產生誤解,盡管是英文的!
環境:
192.168.1.1 GateWay
192.168.1.10 LVS_VIP(VIP:Virtual IP)
192.168.1.14 LVS_Master
192.168.1.15 LVS_Backup
192.168.1.16 WEB1_RealServer
192.168.1.17 WEB2_RealServer
LINUX(CentOS 5.6)配置
1. 安裝CentOS(此處我使用的版本為:CentOS-5.6-x86_64)
2. 安裝IPVSADM
知識點:IPVSADM理解為IPVS管理工具;LVS(Linux Virtual Server)的核心為IPVS(IP Virtual Server),從Linux內核版本2.6起,IPVS模塊已經編譯進了Linux內核。
> 使用yum命令進行安裝,系統會選擇最適合內核版本的ipvsadm
yum -y install ipvsadm
3. 配置(使用KeepAlived時,此步可省略,因為KeepAlived提供了更簡單的配置方式來實現負載均衡。不過仍然建議使用此種方式配置一遍。)
> ifconfig eth0:0 192.168.1.10 broadcast 192.168.1.10 netmask 255.255.255.255 up
> route add -host 192.168.1.10 dev eth0:0
> ipvsadm -A -t 192.168.1.10:80 -s wrr
> ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.16:80 -g
> ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.17:80 -g
4. 防火牆設置
> service iptables stop
或 在防火牆規則表中加入一條記錄
> vi /etc/sysconfig/iptables
> -A RH-Firewall-1-INPUT -m state --state NEW -m -tcp -p tcp --dport 80 -j ACCEPT
> service iptables restart
WINDOWS 2008 SERVER R2 配置
1. 創建windows環回網卡(如何創建,請自己Google)
2. 設置環回網卡IP地址
> IP地址: 192.168.1.10
> 子網掩碼: 255.255.255.255
其它不用設置了
3. 修改客戶端網卡接口、環回接口連接模式(至關重要)
> netsh interface ipv4 set interface "網卡名稱" weakhostreceive=enabled
> netsh interface ipv4 set interface "網卡名稱" weakhostsend=enabled
> netsh interface ipv4 set interface "環回網卡名稱" weakhostreceive=enabled
> netsh interface ipv4 set interface "環回網卡名稱" weakhostsend=enabled
接下來,我們在瀏覽器地址欄中輸入 http://192.168.1.10,你會發現你的訪問請求被轉移到了192.168.1.16或192.168.1.17,這時我們嘗試停掉其中任何一台服務器,你再來訪問 http://192.168.1.10,你會發現有時正常,有時不正常。原因很簡單,因為其中一台機器被你停掉了,但是IPVS無法發現這種錯誤,所以還是會把請求均衡負載到當初配置的真實服務器列表中;針對這種問題,我們該如何來解決呢?此時該是KEEPALIVED登場的時候了!
KEEPALIVED 配置
知識點:KeepAlived是一個路由軟件,它主要的目的是讓我們通過簡單的配置,實現高可用負載均衡,當然負載均衡依賴於Linux虛擬服務器(IPVS)的內核模塊,其高可用性
使用VRRP協議來實現,KeepAlived不僅會檢測負載均衡服務器池中每台機器的健康狀況並通知IPVS將非健康的機器從池中移除掉;同時它還能對負載均衡調度器本身
實現健康狀態檢查,當主負載均衡調度器出現問題時,備用負載均衡調度器頂替主進行工作。
1. 安裝KeepAlived(KeepAlived依賴openssl,所以在安裝KeepAlived之前需要先安裝openssl)
> yum -y install openssl-devel
> wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz(KeepAlived版本大家自己去 http://www.keepalived.org 上查看,下載最新版本即可)
> tar zxvf keepalived-1.2.7.tar.gz
> cd keepalived-1.2.7
> ./configure -prefix=/usr/local/keepalived
> make && make install
2. 配置KeepAlived
The First:打開IP Forward 功能(LVS現有三種負載均衡規則都需要打開此功能,如果不打開此功能,下面的配置配得再好都無濟於事。)
> vi /etc/sysctl.conf
> net.ipv4.ip_forward = 1
> sysctl -p(使設置立即生效)
KeepAlived配置分三部分
> 全局定義塊--global_defs
. 不建議使用email通知,改用nagios來進行監控
. router_id:負載均衡器標識。在一個網絡內,它應該是唯一的。
> VRRP定義塊--vrrp_instance
. state
均衡器狀態。只有MASTER和BACKUP兩種狀態,並且需要大寫這些單詞;其中MASTER為工作狀態,BACKUP為備用狀態;當MASTER所在服務器
失效時,BACKUP所在系統會自動把它的狀態由BACKUP變為MASTER;當失效的MASTER所在系統恢復時,BACKUP從MASTER恢復到BACKUP狀態。
. interface
對外提供服務的網絡接口,如eth0,eth1;當前的主流服務器一般都有2個或2個以上的接口,在選擇服務接口時,一定要核實清楚。
. virtual_router_id
這個標識是個數字,並且同一個VRRP實例使用唯一的標識。即同一個vrrp_instance,MASTER和BACKUP的virtual_router_id是一致的。
. priority
優先級。這個標識也是個數字,數值越大,優先級越高;在同一個vrrp_instance里,MASTER的優先級高於BACKUP。
. advert_int
同步通知間隔。MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位為秒。
. authentication
驗證。包含驗證類型和驗證密碼。類型主要有PASS、AH兩種,通常使用PASS類型,據說AH使用時有問題;驗證密碼為明文,同一個vrrp_instance
實例MASTER與BACKUP使用相同的密碼才能正常通信。
. virtual_ipaddress
虛擬IP地址。可以有多個地址,每個地址占一行。
> 虛擬服務器定義塊--virtual_server
. delay_loop
健康檢查時間間隔,單位為秒。
. lb_algo
負載均衡調度算法(rr、wrr、dh、sh、lc、wlc、sed、nq、lblc、lblcr)。
算法分兩大類:靜態算法、動態算法
靜態算法:只是根據算法進行調度並不考慮后端REALSERVER的實際連接情況
---- rr(輪叫調度 - Round-Robin Scheduling)
調度器通過"輪叫"調度算法將外部請求按順序輪流分配到集群中的真實服務器上,它均等地對待每一台服務器,而不管服務器上實際的連接數
和系統負載。
---- wrr(加權輪叫調度 - Weighted Round-Robin Scheduling)
調度器通過"加權輪叫"調度算法根據真實服務器的不同處理能力來調度訪問請求。這樣可以保證處理能力強的服務器處理更多的訪問流量。調
度器可以自動問詢真實服務器的負載情況,並動態地調整其權值
---- dh(目標地址散列調度 - Destination Hashing Scheduling)
"目標地址散列"調度算法根據請求的目標IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且
未超載,將請求發送到該服務器,否則返回空。
---- sh(源地址散列調度 - Source Hashing Scheduling)
"源地址散列"調度算法根據請求的源IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超
載,將請求發送到該服務器,否則返回空。
動態算法:前端的調度器會根據后端REALSERVER的實際連接情況來分配請求
---- lc(最小連接調度 - Least-Connection Scheduling)
當一個用戶請求過來的時候,就計算下哪台RS的鏈接誰最小,那么這台RS就獲得了下次響應客戶端請求的機會,計算的方法
Overhead=active*256+inactive,如果兩者的結果是相同的則從LVS中的規則依次往下選擇RS。這種算法也是不考慮服務器的性能的。
---- wlc(加權最小連接調度 - Weighted Least-Connection Scheduling)
這個就是加了權重的LC,考慮了RS的性能,即是性能好的就給的權重值大一些,不好的給的權重值小一些。缺點就是如果Overhead相同,
則會按規則表中的順序,由上而下選擇RS,Overhead=(active*256+inactive)/weight
---- sed(最短預期延時調度 - Shortest Expected Delay Scheduling)
就是對WLC的情況的補充,Overhead=(active+1)*256/weight,加一,就是為了讓其能夠比較出大小。
---- nq(不排隊調度 - Never Queue Scheduling)
never queue 基本和SED相同,避免了SED當中的性能差的服務器長時間被空閑的弊端,它是第一個請求給性能好的服務器,第二個請求
一定是給的空閑服務器不論它的性能的好與壞。以后還是會把請求給性能好的服務器
---- lblc(基於局部性的最少鏈接 - Locality-Based Least Connections Scheduling)
它就是動態DH和LC的組合,適用於cache群,對於從來沒有來過的那些新的請求會分給當前連接數較少的那台服務器。
---- lblcr(帶復制的基於局部性最少鏈接 - Locality-Based Least Connections with Replication Scheduling)
帶有復制功能的LBLC,它的適用場景這里舉例說明一下,比如說現在有RS1和RS2,第一次訪問RS1的5個請求第二次又來了,理所應到
Director將會將其交給RS1,而此時在RS2是非常閑的,所以此時最好的處理方法就是可以將后來的這5個請求分別交給RS1和RS2,所以
此時就需要把客戶端第一次請求的資源復制下來。(特殊情況)
小解:活動鏈接active和非活動鏈接inactive
這里以http為例,http本身是一種無狀態的鏈接,當客戶端請求訪問的時候,有個等待響應過程,這個時段可以稱其為活動鏈接active狀態。
當服務器端給與響應后,請求因為keepalive而並未斷開,則此段時間的狀態就是非活動鏈接狀態。
. lb_kind
負載均衡轉發規則(DR、NET、TUN),常用DR。
. persistence_timeout
會話保持時間,單位是秒。這個選項對動態網站很有用處,當用戶用賬號登錄網站時,有了這個會話保持功能,就能把用戶的請求轉發給同一個應用服務
器。在這里,我們來做一個假設,假定現在有一個LVS環境,使用DR轉發模式,真實服務器有3台,如果負載均衡器不啟用會話保持功能,當用戶第一次
訪問的時候,他的訪問請求分發給某個真實服務器,這樣他看到一個登錄頁面,第一次訪問完畢;接着他在登錄框填寫用戶名和密碼,然后提交,這個時
候,問題就可能出現了:登錄不成功,因為沒有會話保持,負載均衡器可能把第2次的請求轉發到其它服務器。
. protocol
轉發協議。一般有TCP和UDP兩種,UDP沒嘗試過。
. real_server
真實服務器,也即服務器詞。real_server的值包括IP和端口。
* weight
權重值,它是一個數字,數值越大,權重越高。使用不同的權重值的目的在於為不同性能的機器分配不同的負載。
* tcp_check
TCP方式檢查機器健康狀態
我這里把我配好的截圖給大家看看(包含負載均衡器的高可用)
MASTER:
BACKUP:
MASTER與BACKUP配置僅三處不同:global_defs中的router_id、vrrp_instance中的state、priority
3. 啟動KeepAlived
/usr/local/keepalived/sbin/keepalived -D
此處需要注意:KeepAlived默認會去/etc/keepalived下面找它的配置文件,要么你將keepalived.conf文件copy到該目錄下,要么在啟動時帶上 -f 參數來指
定keepalived.conf文件位置。
4. 到這里,KeepAlived就安裝成功了!接下來我們可以使用一些命令來檢查一下。
> 查看進程:ps aux | grep keepalived
Keepalived正常運行時,共啟動3個進程,其中一個進程是父進程,負責監控其子進程;一個是vrrp子進程;另外一個是checkers子進程。
我們也可以通過命令(pstree | grep keepalived)查看進程相關性來驗證上面的說法
> 查看日志:tail -f /var/log/messages
> 查看請求轉發情況:ipvsadm -lcn | grep 虛擬IP
5. 優化。
最后,我們需要做一下優化,那就是將KeepAlived做成服務,隨機啟動,這樣我們就免去了每次手動去啟動的麻煩
將KeepAlived加入系統服務
> ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
> ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
> mkdir /etc/keepalived
> ln -s /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
> ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
設置KeepAlived系統服務隨機啟動
> chkconfig --add keepalived
> chkconfig keepalived on
> 查看:chkconfig --list keepalived
到這里,整個配置就完成了,最后我們嘗試關閉Master機器或Master上的keepalived服務,看看Backup機器是否會代替Master來工作。