LVS叢集簡介及使用
什麼是叢集
一組通過高速網路互聯的計算組,並以單一系統的模式加以管理
將很多伺服器集中在一起,提供一種服務,在客戶端看來就象是隻有一個伺服器
可以在付出較低成本的情況下獲得在效能,可靠性,靈活性方面的相對較高的收益
任務排程是集群系統的核心技術
叢集的目的
提高效能:計算密集應用,如天氣預報,核試驗模擬
降低成本:相對百萬美元的超級計算機,價格便宜
提高可擴充套件性:只要增加叢集節點即可
增強可靠性:多個節點完成相同功能,避免單點失敗
叢集分類
高效能運算叢集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組成部分
[[email protected] ~]# grep -i 'ipvs' /boot/config-2.6.32-573.el6.i686 # IPVS transport protocol load balancing support # IPVS scheduler # IPVS application helper
[[email protected] ~]# 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虛擬叢集伺服器
[[email protected] ~]# ipvsadm -A -t 192.168.0.254 -s wrr -p 30
2)為叢集新增若干real server
[[email protected] ~]# ipvsadm –a -t 192.168.0.254 -r 192.168.0.1 -m -w 1 [[email protected] ~]# ipvsadm –a -t 192.168.0.254 -r 192.168.0.2 -m -w 2 [[email protected] ~]# ipvsadm –a -t 192.168.0.254 -r 192.168.0.3 -m -w 3 [[email protected] ~]# ipvsadm –a -t 192.168.0.254 -r 192.168.0.4 -m -w 4
3)修改叢集伺服器設定
[[email protected] ~]# ipvsadm -E -t 192.168.0.254 -s sh -p 30
4)修改read server
[[email protected] ~]# ipvsadm –a -t 192.168.0.254 -r 192.168.0.1 -m
5)檢視LVS狀態
[[email protected] ~]# ipvsadm –Ln
6)儲存所有規則
[[email protected] ~]# service ipvsadm save
7)清空所有規則
[[email protected] ~]# 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伺服器網路引數
[[email protected] ~]# 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 [[email protected] ~]# service NetworkManager stop [[email protected] ~]# chkconfig NetworkManager off [[email protected] ~]# service network restart [[email protected] ~]# iptables –F;service iptables save [[email protected] ~]# 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 [[email protected] ~]# service NetworkManager stop [[email protected] ~]# chkconfig NetworkManager off [[email protected] ~]# service network restart [[email protected] ~]# iptables –F;service iptables save [[email protected] ~]# 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 [[email protected] ~]# service NetworkManager stop [[email protected] ~]# chkconfig NetworkManager off [[email protected] ~]# service network restart [[email protected] ~]# iptables –F;service iptables save
2)自定義Web頁面
[[email protected] ~]# echo “192.168.0.1” > /var/www/html/index.html [[email protected] ~]# echo “192.168.0.2” > /var/www/html/index.html [[email protected] ~]# echo “192.168.0.3” > /var/www/html/index.html
3)啟動Web伺服器軟體
[[email protected] ~]# service httpd start [[email protected] ~]# service httpd start [[email protected] ~]# service httpd start
4)設定LVS排程器網路引數
[[email protected] ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBOOT=yes BOOTPROTO=static IPADDR=202.114.106.20 DNS1=202.106.0.20 [[email protected] ~]# 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 [[email protected] ~]# service NetworkManager stop [[email protected] ~]# chkconfig NetworkManager off [[email protected] ~]# service network restart [[email protected] ~]# iptables –F;service iptables save [[email protected] ~]# sed -i '/ip_forward/s/0/1/' /etc/sysctl.conf //開啟路由轉發 [[email protected] ~]# sysctl -p
步驟二:排程器安裝軟體並啟動服務
1)安裝軟體
[[email protected] Packages]# rpm –ihv ipvsadm-1.25-10.el6.x86_64.rpm
2)啟動服務
[[email protected] Packages]# service ipvsadm start
[[email protected] Packages]# chkconfig ipvsadm on
步驟三:部署LVS-NAT模式排程器
1)建立叢集伺服器
[[email protected] ~]# ipvsadm -A -t 202.114.106.20:80 -s wrr
2)新增真實伺服器
[[email protected] ~]# ipvsadm -a -t 202.114.106.20:80 -r 192.168.0.1 -m -w 1 [[email protected] ~]# ipvsadm -a -t 202.114.106.20:80 -r 192.168.0.2 -m -w 2 [[email protected] ~]# ipvsadm -a -t 202.114.106.20:80 -r 192.168.0.3 -m -w 3
3)檢視規則列表,並儲存規則
[[email protected] ~]# ipvsadm –Ln [[email protected] ~]# 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關係]
[[email protected] ~]# 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都不能正常工作。 [[email protected] ~]# 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 [[email protected] ~]# 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 [[email protected] ~]# sysctl -p [[email protected] ~]# service NetworkManager stop [[email protected] ~]# chkconfig NetworkManager off [[email protected] ~]# service network restart [[email protected] ~]# iptables -F;service iptables save [[email protected] ~]# 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 [[email protected] ~]# 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 [[email protected] ~]# 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 [[email protected] ~]# sysctl -p [[email protected] ~]# service NetworkManager stop [[email protected] ~]# chkconfig NetworkManager off [[email protected] ~]# service network restart [[email protected] ~]# iptables -F;service iptables save
2)自定義Web頁面
[[email protected] ~]# echo “192.168.0.1” > /var/www/html/index.html [[email protected] ~]# echo “192.168.0.2” > /var/www/html/index.html
3)啟動Web伺服器軟體
[[email protected] ~]# service httpd start;chkconfig httpd on [[email protected] ~]# service httpd start;chkconfig httpd on
4)設定LVS排程器網路引數
[[email protected] ~]# 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 [[email protected] ~]# 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 [[email protected] ~]# service NetworkManager stop [[email protected] ~]# chkconfig NetworkManager off [[email protected] ~]# service network restart [[email protected] ~]# iptables -F;service iptables save
5)設定Linux路由器網路引數
[[email protected] ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBOOT=yes BOOTPROTO=static IPADDR=202.114.106.20 DNS1=202.106.0.20 [[email protected] ~]# 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 [[email protected] ~]# service NetworkManager stop [[email protected] ~]# chkconfig NetworkManager off [[email protected] ~]# service network restart [[email protected] ~]# iptables -F;service iptables save
6)設定Linux路由器的SNAT、DNAT功能
[[email protected] ~]# sed -i '/ip_forward/s/0/1/' sysctl.conf //開啟路由轉發 [[email protected] ~]# sysctl -p [[email protected] ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -p tcp –j SNAT --to-source 202.114.106.20 [[email protected] ~]# iptables -t nat -A PREROUTING -d 202.114.106.20 -p tcp --dport 80 –j DNAT --to-destination 192.168.0.253:80 [[email protected] ~]# service iptables save
步驟二:排程器安裝軟體並啟動服務
1)安裝軟體
[[email protected] Packages]# rpm –ihv ipvsadm-1.25-10.el6.x86_64.rpm
2)啟動服務
[[email protected] Packages]# service ipvsadm start
[[email protected] Packages]# chkconfig ipvsadm on
步驟三:部署LVS-DR模式排程器
1)建立叢集伺服器
[[email protected] ~]# ipvsadm -A -t 192.168.0.253:80 -s wrr
2)新增真實伺服器
[[email protected] ~]# ipvsadm -a -t 192.168.0.253:80 -r 192.168.0.1 -g -w 1 [[email protected] ~]# ipvsadm -a -t 192.168.0.253:80 -r 192.168.0.2 -g -w 2
3)檢視規則列表,並儲存規則
[[email protected] ~]# ipvsadm –Ln [[email protected] ~]# service ipvsadm save
步驟四:客戶端測試
客戶端使用curl命令反覆連線http://202.114.106.20,檢視訪問的頁面是否會輪詢到不同的後端真實伺服器。