什么是集群
一組通過高速網絡互聯的計算組,並以單一系統的模式加以管理
將很多服務器集中在一起,提供一種服務,在客戶端看來就象是只有一個服務器
可以在付出較低成本的情況下獲得在性能,可靠性,靈活性方面的相對較高的收益
任務調度是集群系統的核心技術
集群的目的
提高性能:計算密集應用,如天氣預報,核試驗模擬
降低成本:相對百萬美元的超級計算機,價格便宜
提高可擴展性:只要增加集群節點即可
增強可靠性:多個節點完成相同功能,避免單點失敗
集群分類
高性能計算集群HPC
通過以集群開發的並發應用程序,解決復雜的科學問題
負載均衡(LB)集群
客戶端負載在計算機集群中盡可能平均分攤
高可用(HA)集群
避免單點故障,當一個系統發生故障時,可以快速遷移
LVS項目介紹
Linux虛擬服務器(LVS)由章文嵩讀博期間創建
LVS可以實現高可用,可伸縮的Web,Mail,Cache和Media等網絡服務
最終目的是利用linux操作系統和LVS集群軟件實現一個高可用,高性能,低成本的服務器應用集群
LVS集群組成
前端:負載均衡層
由一台或多台負載調度器構成
中間:服務器群組層
有一組實際運行應用服務的服務器組成
后端:數據共享存儲層
提供共享存儲空間的存儲區域
LVS術語
Director Server:調度服務器
將負載分發到Real Server的服務器
Real Server:真實服務器
真正提供應用服務的服務器
VIP:虛擬IP地址
公布給用戶訪問的虛擬IP地址
RIP:真實IP地址
集群節點上使用的IP地址
DIP:調度器連接節點服務器的IP地址
LVS工作模式
VS/NAT
通過網絡地址轉換實現的虛擬服務器
大並發訪問時,調度器的性能成為瓶頸
VS/DR
直接使用路由技術實現虛擬服務器
節點服務器需要配置VIP,注意MAC地址廣播
VS/TUN
通過隧道方式實現虛擬服務器
負載均衡調度算法
LVS目前實現10種調度算法
常用調度算法有4種
輪詢(Round Robin) 將客戶端請求平均分發到Real Server
加權輪詢(Weighted Round Robin)根據Real Server權重值進行輪詢調度
最少連接(Least Connections)選擇連接數最少的服務器
加權最少連接(Weighted Least Connections)根據Real Server權重,選擇連接數最少的服務器
源地址散列(Source Hashing)根據請求的目標IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器
安裝前准備
LVS的IP負載均衡技術是通過IPVS模塊實現的
IPVS模塊已經成為Linux組成部分
[root@localhost ~]# grep -i 'ipvs' /boot/config-2.6.32-573.el6.i686 # IPVS transport protocol load balancing support # IPVS scheduler # IPVS application helper
[root@localhost ~]# yum -y install ipvsadm
ipvsadm用法
創建虛擬服務器
-A 添加虛擬服務器
-E 修改虛擬服務器
-D 刪除虛擬服務器
-C, --clear:清除所有虛擬服務。
-R, --restore:從標准輸入獲取ipvsadm命令。一般結合下邊的-S使用。
-S, --save:從標准輸出輸出虛擬服務器的規則。可以將虛擬服務器的規則保存,在以后通過-R直接讀入,以實現自動化配置。
-L, -l, --list:列出虛擬服務表中的所有虛擬服務。可以指定地址。添加-c顯示連接表。
-Z, --zero:將所有數據相關的記錄清零。這些記錄一般用於調度策略。
--set tcp tcpfin udp:修改協議的超時時間。
--start-daemon state:設置虛擬服務器的備服務器,用來實現主備服務器冗余。(注:該功能只支持ipv4)
--stop-daemon:停止備服務器。
-h, --help:幫助。
-t 設置集群地址(VIP,Virtual IP)
-s 指定負載調度算法
添加,刪除服務器節點
-a 添加真實服務器
-e 修改真實服務器
-d 刪除真實服務器
-r 指定真實服務器(Real Server)的地址
-m 使用NAT模式
-g 使用DR模式
-i 使用TUN模式
-u, --udp-service service-address:使用udp服務,其他同上。
-w 為節點服務器設置權重,默認為1,權重是0~65535的整數。如果將某個真實服務器的權重設置為0,那么它不會收到新的連接,但是已有連接還會繼續維持(這點和直接把某個真實服務器刪除時不同的)
-f, --fwmark-service integer:用firewall mark取代虛擬地址來指定要被負載均衡的數據包,可以通過這個命令實現把不同地址、端口的虛擬地址整合成一個虛擬服務,可以讓虛擬服務器同時截獲處理去往多個不同地址的數據包。fwmark可以通過iptables命令指定。如果用在ipv6需要加上-6。
-p, --persistent [timeout]:設置持久連接,這個模式可以使來自客戶的多個請求被送到同一個真實服務器,通常用於ftp或者ssl中。
-M, --netmask netmask:指定客戶地址的子網掩碼。用於將同屬一個子網的客戶的請求轉發到相同服務器。
-x, --u-threshold uthreshold:設置一個服務器可以維持的連接上限。0~65535。設置為0表示沒有上限。
-y, --l-threshold lthreshold:設置一個服務器的連接下限。當服務器的連接數低於此值的時候服務器才可以重新接收連接。如果此值未設置,則當服務器的連接數連續三次低於uthreshold時服務器才可以接收到新的連接。(PS:筆者以為此設定可能是為了防止服務器在能否接收連接這兩個狀態上頻繁變換)
--mcast-interface interface:指定使用備服務器時候的廣播接口。
--syncid syncid:指定syncid,同樣用於主備服務器的同步。
查看IPVS
-Ln 查看已經設置了的服務器節點情況
以下選項用於list命令:
-c, --connection:列出當前的IPVS連接。
--timeout:列出超時
--daemon:
--stats:狀態信息
--rate:傳輸速率
--thresholds:列出閾值
--persistent-conn:堅持連接
--sor:把列表排序。
--nosort:不排序
-n, --numeric:不對ip地址進行dns查詢
--exact:單位
1 ipvsadm命令用法
1.1 問題
准備一台Linux服務器,安裝ipvsadm軟件包,練習使用ipvsadm命令,實現如下功能:
- 使用命令添加基於TCP一些的集群服務
- 在集群中添加若干台后端真實服務器
- 實現同一客戶端訪問,調度器分配固定服務器
- 會使用ipvsadm實現規則的增、刪、改
- 保存ipvsadm規則
1.2 步驟
實現此案例需要按照如下步驟進行。
步驟一:使用命令增、刪、改LVS集群規則
1)創建LVS虛擬集群服務器
[root@svr5 ~]# ipvsadm -A -t 192.168.0.254 -s wrr -p 30
2)為集群添加若干real server
[root@svr5 ~]# ipvsadm –a -t 192.168.0.254 -r 192.168.0.1 -m -w 1 [root@svr5 ~]# ipvsadm –a -t 192.168.0.254 -r 192.168.0.2 -m -w 2 [root@svr5 ~]# ipvsadm –a -t 192.168.0.254 -r 192.168.0.3 -m -w 3 [root@svr5 ~]# ipvsadm –a -t 192.168.0.254 -r 192.168.0.4 -m -w 4
3)修改集群服務器設置
[root@svr5 ~]# ipvsadm -E -t 192.168.0.254 -s sh -p 30
4)修改read server
[root@svr5 ~]# ipvsadm –a -t 192.168.0.254 -r 192.168.0.1 -m
5)查看LVS狀態
[root@svr5 ~]# ipvsadm –Ln
6)保存所有規則
[root@svr5 ~]# service ipvsadm save
7)清空所有規則
[root@svr5 ~]# ipvsadm –C
2 部署LVS-NAT集群
2.1 問題
使用LVS實現NAT模式的集群調度服務器,為用戶提供Web服務:
- 集群對外公網IP地址為202.114.106.20
- 調度器內網IP地址為192.168.0.254
- 真實Web服務器地址分別為192.168.0.1、192.168.0.2、192.168.0.3
- 使用加權輪詢調度算法,真實服務器權重與其IP地址末尾數一致
2.2 方案
使用4台虛擬機,1台作為Director調度器、3台作為Real Server、物理機作為客戶端
2.3 步驟
實現此案例需要按照如下步驟進行。
步驟一:配置網絡環境
1)設置Web服務器網絡參數
[root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBOOT=yes BOOTPROTO=static IPADDR=192.168.0.1 NETMASK=255.255.255.0 GATEWAY=192.168.0.254 DNS1=202.106.0.20 [root@web1 ~]# service NetworkManager stop [root@web1 ~]# chkconfig NetworkManager off [root@web1 ~]# service network restart [root@web1 ~]# iptables –F;service iptables save [root@web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBOOT=yes BOOTPROTO=static IPADDR=192.168.0.2 NETMASK=255.255.255.0 GATEWAY=192.168.0.254 DNS1=202.106.0.20 [root@web2 ~]# service NetworkManager stop [root@web2 ~]# chkconfig NetworkManager off [root@web2 ~]# service network restart [root@web2 ~]# iptables –F;service iptables save [root@web3 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBOOT=yes BOOTPROTO=static IPADDR=192.168.0.3 NETMASK=255.255.255.0 GATEWAY=192.168.0.254 DNS1=202.106.0.20 [root@web3 ~]# service NetworkManager stop [root@web3 ~]# chkconfig NetworkManager off [root@web3 ~]# service network restart [root@web3 ~]# iptables –F;service iptables save
2)自定義Web頁面
[root@web1 ~]# echo “192.168.0.1” > /var/www/html/index.html [root@web2 ~]# echo “192.168.0.2” > /var/www/html/index.html [root@web3 ~]# echo “192.168.0.3” > /var/www/html/index.html
3)啟動Web服務器軟件
[root@web1 ~]# service httpd start [root@web2 ~]# service httpd start [root@web3 ~]# service httpd start
4)設置LVS調度器網絡參數
[root@lvs ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBOOT=yes BOOTPROTO=static IPADDR=202.114.106.20 DNS1=202.106.0.20 [root@lvs ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth1 ONBOOT=yes BOOTPROTO=static IPADDR=192.168.0.254 NETMASK=255.255.255.0 DNS1=202.106.0.20 [root@lvs ~]# service NetworkManager stop [root@lvs ~]# chkconfig NetworkManager off [root@lvs ~]# service network restart [root@lvs ~]# iptables –F;service iptables save [root@lvs ~]# sed -i '/ip_forward/s/0/1/' /etc/sysctl.conf //開啟路由轉發 [root@lvs ~]# sysctl -p
步驟二:調度器安裝軟件並啟動服務
1)安裝軟件
[root@lvs Packages]# rpm –ihv ipvsadm-1.25-10.el6.x86_64.rpm
2)啟動服務
[root@lvs Packages]# service ipvsadm start
[root@lvs Packages]# chkconfig ipvsadm on
步驟三:部署LVS-NAT模式調度器
1)創建集群服務器
[root@lvs ~]# ipvsadm -A -t 202.114.106.20:80 -s wrr
2)添加真實服務器
[root@lvs ~]# ipvsadm -a -t 202.114.106.20:80 -r 192.168.0.1 -m -w 1 [root@lvs ~]# ipvsadm -a -t 202.114.106.20:80 -r 192.168.0.2 -m -w 2 [root@lvs ~]# ipvsadm -a -t 202.114.106.20:80 -r 192.168.0.3 -m -w 3
3)查看規則列表,並保存規則
[root@lvs ~]# ipvsadm –Ln
[root@lvs ~]# service ipvsadm save
步驟四:客戶端測試
客戶端使用curl命令反復連接http://202.114.106.20,查看訪問的頁面是否會輪詢到不同的后端真實服務器。
3 部署LVS-DR集群
3.1 問題
使用LVS實現DR模式的集群調度服務器,為用戶提供Web服務:
- 路由器對外公網IP地址為202.114.106.20
- 路由器內網IP地址為192.168.0.254
- 路由是需要設置SNAT及DNAT功能
- LVS調度器真實IP地址為192.168.0.10
- LVS調度器VIP地址設置為192.168.0.253
- 真實Web服務器地址分別為192.168.0.1、192.168.0.2
- 使用加權輪詢調度算法,真實服務器權重與其IP地址末尾數一致
3.2 方案
使用4台虛擬機,1台作為Linux路由器、1台作為Director調度器、2台作為Real Server、物理機作為客戶端,拓撲結構如圖-2所示。
ARP廣播的問題
當客戶端發起訪問VIP對應的域名請求時,根據網絡通信原理會產生ARP廣播
因為負載均衡器和真實的服務器在同一網絡並且VIP設置在集群中的每個節點上
此時集群內的真實服務器會嘗試回答來自客戶端的APR廣播,這就會產生問題,大家都說自己是"VIP"
因此真實的主機需要修改arp內核參數
內核參數說明
arp_ignore(定義回復ARP廣播的方式)
0(默認值)回應所有本地地址ARP廣播,本地地址可以配置在任意網絡接口
1只回應配置在入站網卡接口上的任意IP地址的ARP廣播
arp_announce
0(默認值)使用配置在任意網卡接口上的本地IP地址
2對查詢目標使用最適當的本地地址。在此模式下將忽略這個IP數據包的原地址並嘗試選擇與能與該地址通信的本地地址。首要是選擇所有的網絡接口的子網中外出訪問子網中包含該目標IP地址的本地地址。如果沒有合適的地址被發現,將選擇當前的發送網絡接口或其他的有可能接受到該ARP回應的網絡接口來進行發送
3.3 步驟
實現此案例需要按照如下步驟進行。
步驟一:配置網絡環境
1)設置Web服務器網絡參數[Linux-eth0 eth0:1 ifcfg-lo ifcfg-lo:0 和eth0.1關系]
[root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBOOT=yes BOOTPROTO=static IPADDR=192.168.0.1 NETMASK=255.255.255.0 GATEWAY=192.168.0.254 DNS1=202.106.0.20 #既然要讓RS能夠處理目標地址為vip的IP包,首先必須要讓RS能接收到這個包。在lo上配置vip能夠完成接收包並將結果返回client。 #不可以將VIP設置在出口網卡(eth0)上,否則會響應客戶端的arp request,造成client/gateway arp table紊亂,以至於整個loadbalance都不能正常工作。 [root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0 #本地回環 DEVICE=lo:0 ONBOOT=yes BOOTPROTO=static IPADDR=192.168.0.253 NETMASK=255.255.255.255 [root@web1 ~]# vim /etc/sysctl.conf .. .. net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_announce = 2 [root@web1 ~]# sysctl -p [root@web1 ~]# service NetworkManager stop [root@web1 ~]# chkconfig NetworkManager off [root@web1 ~]# service network restart [root@web1 ~]# iptables -F;service iptables save [root@web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBOOT=yes BOOTPROTO=static IPADDR=192.168.0.2 NETMASK=255.255.255.0 GATEWAY=192.168.0.254 DNS1=202.106.0.20 [root@web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0 DEVICE=lo:0 ONBOOT=yes BOOTPROTO=static IPADDR=192.168.0.253 NETMASK=255.255.255.255 [root@web2 ~]# vim /etc/sysctl.conf .. .. net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_announce = 2 [root@web2 ~]# sysctl -p [root@web2 ~]# service NetworkManager stop [root@web2 ~]# chkconfig NetworkManager off [root@web2 ~]# service network restart [root@web2 ~]# iptables -F;service iptables save
2)自定義Web頁面
[root@web1 ~]# echo “192.168.0.1” > /var/www/html/index.html [root@web2 ~]# echo “192.168.0.2” > /var/www/html/index.html
3)啟動Web服務器軟件
[root@web1 ~]# service httpd start;chkconfig httpd on
[root@web2 ~]# service httpd start;chkconfig httpd on
4)設置LVS調度器網絡參數
[root@lvs ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBOOT=yes BOOTPROTO=static IPADDR=192.168.0.10 NETMASK=255.255.255.0 GATEWAY=192.168.0.254 DNS1=202.106.0.20 [root@lvs ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0:0 DEVICE=eth0:0 ONBOOT=yes BOOTPROTO=static IPADDR=192.168.0.253 NETMASK=255.255.255.0 GATEWAY=192.168.0.254 DNS1=202.106.0.20 [root@lvs ~]# service NetworkManager stop [root@lvs ~]# chkconfig NetworkManager off [root@lvs ~]# service network restart [root@lvs ~]# iptables -F;service iptables save
5)設置Linux路由器網絡參數
[root@router ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBOOT=yes BOOTPROTO=static IPADDR=202.114.106.20 DNS1=202.106.0.20 [root@router ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth0 ONBOOT=yes BOOTPROTO=static IPADDR=192.168.0.254 NETMASK=255.255.255.0 DNS1=202.106.0.20 [root@router ~]# service NetworkManager stop [root@router ~]# chkconfig NetworkManager off [root@router ~]# service network restart [root@router ~]# iptables -F;service iptables save
6)設置Linux路由器的SNAT、DNAT功能
[root@router ~]# sed -i '/ip_forward/s/0/1/' sysctl.conf //開啟路由轉發 [root@router ~]# sysctl -p [root@router ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -p tcp –j SNAT --to-source 202.114.106.20 [root@router ~]# iptables -t nat -A PREROUTING -d 202.114.106.20 -p tcp --dport 80 –j DNAT --to-destination 192.168.0.253:80 [root@router ~]# service iptables save
步驟二:調度器安裝軟件並啟動服務
1)安裝軟件
[root@lvs Packages]# rpm –ihv ipvsadm-1.25-10.el6.x86_64.rpm
2)啟動服務
[root@lvs Packages]# service ipvsadm start
[root@lvs Packages]# chkconfig ipvsadm on
步驟三:部署LVS-DR模式調度器
1)創建集群服務器
[root@lvs ~]# ipvsadm -A -t 192.168.0.253:80 -s wrr
2)添加真實服務器
[root@lvs ~]# ipvsadm -a -t 192.168.0.253:80 -r 192.168.0.1 -g -w 1 [root@lvs ~]# ipvsadm -a -t 192.168.0.253:80 -r 192.168.0.2 -g -w 2
3)查看規則列表,並保存規則
[root@lvs ~]# ipvsadm –Ln
[root@lvs ~]# service ipvsadm save
步驟四:客戶端測試
客戶端使用curl命令反復連接http://202.114.106.20,查看訪問的頁面是否會輪詢到不同的后端真實服務器。