1 Keepalived介紹
Keepalived軟件主要是通過VRRP協議實現高可用功能的。
三個重要功能:
1、管理LVS負載均衡軟件
2、實現對LVS集羣節點健康檢查功能(healthcheck)
3、作爲系統網絡服務的高可用功能
1)VRRP(Virtual Router Redundancy Protocol),爲了解決靜態路由的單點故障問題而出現
2)VRRP是通過一種競選機制來將路由的任務交給某臺VRRP路由器的
3)VRRP是用IP組播的方式(224.0.0.18)實現高可用對之間的通信
4)工作時主節點發包,備節點接包,當備節點收不到主節點的數據包時,就啓動接管程序接管主節點的資源。備節點可以有多個,通過優先級來競選
5)VRRP使用了加密協議加密數據,但Keepalived推薦用明文的方式配置認證類型和密碼
2 Keepalived高可用服務搭建準備
安裝環境說明
1、4臺服務器:lb01、lb02、web01、web02
2、系統環境:
[root@lb01 ~]# cat /etc/redhat-release CentOS release 6.5 (Final) [root@lb01 ~]# uname -r 2.6.32-431.el6.x86_64 [root@lb01 ~]# ls -l /application/nginx/ 總用量 36 drwx------ 2 nginx root 4096 6月 28 2017 client_body_temp drwxr-xr-x 3 root root 4096 3月 28 00:24 conf drwx------ 2 nginx root 4096 6月 28 2017 fastcgi_temp drwxr-xr-x 2 root root 4096 6月 28 2017 html drwxr-xr-x 2 root root 4096 5月 1 18:07 logs drwx------ 2 nginx root 4096 6月 28 2017 proxy_temp drwxr-xr-x 2 root root 4096 6月 28 2017 sbin drwx------ 2 nginx root 4096 6月 28 2017 scgi_temp drwx------ 2 nginx root 4096 6月 28 2017 uwsgi_temp
開始安裝keepalived軟件
yum install keepalived –y [root@lb01 ~]# rpm -qa keepalived keepalived-1.2.13-5.el6_6.x86_64 [root@lb02 ~]# rpm -qa keepalived keepalived-1.2.13-5.el6_6.x86_64 啓動keepalived /etc/init.d/keepalived start [root@lb01 ~]# ps -ef|grep keep|grep -v grep root 1855 1 0 20:53 ? 00:00:00 /usr/sbin/keepalived -D root 1857 1855 0 20:53 ? 00:00:00 /usr/sbin/keepalived -D root 1858 1855 0 20:53 ? 00:00:00 /usr/sbin/keepalived -D [root@lb02 ~]# ps -ef|grep keep|grep -v grep root 2118 1 0 20:53 ? 00:00:00 /usr/sbin/keepalived -D root 2120 2118 0 20:53 ? 00:00:00 /usr/sbin/keepalived -D root 2121 2118 0 20:53 ? 00:00:00 /usr/sbin/keepalived –D 默認情況下會啓動三個VIP地址 [root@lb01 ~]# ip addr|grep 192.168 inet 192.168.4.125/24 brd 192.168.4.255 scope global eth0 inet 192.168.200.16/32 scope global eth0 inet 192.168.200.17/32 scope global eth0 inet 192.168.200.18/32 scope global eth0 測試完成後,關閉服務 [root@lb01 ~]# /etc/init.d/keepalived stop
Keepalived配置文件說明
1)全局定義部分
[root@lb01 ~]# ll /etc/keepalived/keepalived.conf -rw-r--r-- 1 root root 3562 3月 19 2015 /etc/keepalived/keepalived.conf [root@lb01 ~]# head -13 /etc/keepalived/keepalived.conf |cat -n 1 ! Configuration File for keepalived 2 3 global_defs { 4 notification_email { 5 [email protected] 6 [email protected] 7 [email protected] 8 } 9 notification_email_from [email protected] 10 smtp_server 192.168.200.1 11 smtp_connect_timeout 30 12 router_id LVS_DEVEL 13 }
參數說明:
1行,註釋
2行 空行
3~8行是定義服務故障報警的Email地址
9行,指定發送郵件的發送人
10行smtp_server指定發送郵件的smtp服務器
11行 連接smtp的超時時間
12行 是keepalived服務器的路由標識。在一個局域網內,這個標識應該是唯一
2)VRRP實例定義區塊部分
[root@lb01 ~]# head -30 /etc/keepalived/keepalived.conf |cat -n|tail -16 15 vrrp_instance VI_1 { 16 state MASTER 17 interface eth0 18 virtual_router_id 51 19 priority 100 20 advert_int 1 21 authentication { 22 auth_type PASS 23 auth_pass 1111 24 } 25 virtual_ipaddress { 26 192.168.200.16 27 192.168.200.17 28 192.168.200.18 29 } 30 }
15行定義一個實例名字
16行 當前實例VI_1的角色狀態,爲MASTER
17行 網絡接口
18行virtual_router_id爲虛擬路由ID標識,MASTER和BACKUP必須一致
19行 優先級,數字越大越高
20行 同步通知間隔 目前爲1秒
21~24權限認證配置
25~29 爲虛擬IP地址
keepalived高可用服務單實例實戰
主服務器
[root@lb01 keepalived]# vim keepalived.conf ! Configuration File for keepalived global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lb01 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 55 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.4.130/24 dev eth0 label eth0:1 } } 配置完畢,啓動服務,查看是否有虛擬IP [root@lb01 keepalived]# /etc/init.d/keepalived start 正在啓動 keepalived: [確定] [root@lb01 keepalived]# ip add |grep 192.168.4.130 inet 192.168.4.130/24 scope global secondary eth0:1
備服務器
[root@lb02 keepalived]# cat keepalived.conf ! Configuration File for keepalived global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lb02 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 55 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.4.130/24 dev eth0 label eth0:1 } } 啓動服務,檢查是否有虛擬IP [root@lb02 keepalived]# /etc/init.d/keepalived start 正在啓動 keepalived: [確定] [root@lb02 keepalived]# ip add|grep 192.168.4.130 [root@lb02 keepalived]#
備節點沒有虛擬IP,表示配置正確
如果主備都出現了虛擬IP,說明高可用裂腦了,檢查:
1、主備之間是否通信正常,若不正常是否有防火牆阻擋
2、主備對應的keepalived.conf配置是否有誤,virtual_router_id配置不一致
3、硬件故障:心跳線壞了、網卡壞了、IP配置衝突等
進行高可用主備之間的切換實驗
[root@lb01 keepalived]# /etc/init.d/keepalived stop 停止 keepalived: [確定] [root@lb02 keepalived]# ip add|grep 192.168.4.130 inet 192.168.4.130/24 scope global secondary eth0:1 [root@lb01 keepalived]# /etc/init.d/keepalived start 正在啓動 keepalived: [確定] [root@lb01 keepalived]# ip add|grep 192.168.4.130 inet 192.168.4.130/24 scope global secondary eth0:1 [root@lb02 keepalived]# ip add|grep 192.168.4.130
nginx負載均衡配合keepalived服務
主備的負載均衡配置一致
[root@lb01 ~]# cat /application/nginx/conf/extra/lb_bbs.conf server { listen 192.168.4.130:80; server_name bbs.etiantian123.org; location / { proxy_pass http://bbs_server_pools; proxy_set_header Host $host; } } [root@lb01 ~]# cat /application/nginx/conf/nginx.conf worker_processes 1; error_log logs/error.log; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; upstream bbs_server_pools{ server 192.168.4.121:80 weight=1; server 192.168.4.122:80 weight=1; } #include extra/lb_www.conf; include extra/lb_bbs.conf; include extra/lb_blog.conf; }
解決監聽的網卡上不存在IP地址的問題
nginx配置監聽的時候,如果本地的網卡沒有這個監聽的地址,可能會報錯
解決:
在/etc/sysctl.conf加入內核參數配置:
net.ipv4.ip_nonlocal_bind = 1
解決高可用只針對物理服務器的問題
如果nginx服務出現問題停止而keepalived服務還在工作,這就會導致用戶訪問的VIP無法找到對應的服務。
解決辦法:
1、寫腳本檢查
[root@lb01 scripts]# cat check_nginx.sh #!/bin/sh while true do if [`netstat -lntup|grep nginx|wc -l` -ne 1 ];then /etc/init.d/keepalived stop fi sleep 5 done
2、可以使用keepalived的配置文件參數觸發寫好的監測服務腳本
[root@lb01 scripts]# cat chk_nginx_proxy.sh #!/bin/sh if [`netstat -lntup|grep nginx|wc -l` -ne 1 ];then /etc/init.d/keepalived stop fi [root@lb01 scripts]# chmod +x chk_nginx_proxy.sh
此時keepalived的完整配置爲:
[root@lb01 keepalived]# vim keepalived.conf ! Configuration File for keepalived global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lb01 } vrrp_script chk_nginx_proxy { 《===定義vrrp腳本,檢測http端口 script “/server/scripts/chk_nginx_proxy.sh” 《===執行腳本,當nginx服務有問題,停掉keepalived服務 interval 2 《====間隔2秒 weight 2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 55 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.4.130/24 dev eth0 label eth0:1 } track_script { chk_nginx_proxy 《====觸發檢查 } }
解決多組keepalived服務器在一個局域網的衝突問題
global_defs { router_id lb01 vrrp_mcast_group4 224.0.0.19 <===這個就是指定組播地址的配置 }
配置指定文件接受keepalived服務日誌
默認情況下keepalived會輸出到系統日誌/var/log/messages
1)/etc/sysconfig/keepalived第14行KEEPALIVED_OPTIONS="-D"修改爲 KEEPALIVED_OPTIONS="-D –d –S 0" 2)修改rsyslog的配置文件 vi /etc/rsyslog.conf #keepalived local0.* /var/log/keepalived.log 3)完成後,重啓rsyslog服務 /etc/init.d/rsyslog restart
監測keepalived裂腦的腳本
[root@lb02 ~]# cat /server/scripts/check_split_brain.sh #!/bin/sh lb01_vip=192.168.4.130 lb01_ip=192.168.4.125 while true do ping -c -W 3 $lb01_ip &>/dev/null if [ $? -eq 0 -a `ip add|grep "$lb01_vip"|wc -l` -eq 1 ] then echo "ha is split brain.warning." else echo "ha is ok" fi sleep 5 done
3 LVS
LVS負載均衡集羣介紹
負載均衡LB提供了一種廉價、有效、透明的方法,來擴展網絡設備和服務器帶寬、增加吞吐量、加強網絡數據能力、提高網絡的靈活性和可用性。
搭建負載均衡服務的需求
1)把單點計算機無法承受的大規模併發訪問或數據流量分擔到多臺節點設備上分別處理,減少用戶等待響應時間,提升用戶體驗。
2)單個重負載的運算分擔到多臺節點設備上做並行處理,每個節點設備處理結束後,將結果彙總,返回給用戶,系統處理能力得到大幅提高。
3)7*24的服務保證,任意一個或多個有限後面節點宕機,不會影響業務。
在負載均衡集羣中,所有計算機節點都會提供相同的服務。集羣負載均衡器截獲所有對該服務器的入站請求。然後將這些請求儘可能地平均的在
所有集羣節點上。
LVS(linux virtual server)
LVS是Linux Virtual Server的縮寫,意即Linux虛擬服務器,是一個虛擬的服務器集羣系統,可以在UNIX/LINUX平臺下實現負載均衡集羣功能。
IPVS軟件工作層次
LVS負載均衡調度技術是在內核層面完成的。
體系結構與工作原理簡單描述
LVS集羣負載均衡器接受服務的所有入站客戶端的計算機請求,並根據調度算法決定那個集羣節點應該處理回覆請求。
負載均衡器(LB)有時也被稱爲LVS Direcotr。
LVS虛擬服務器的體系結構,一組服務器通過高速的局域網或者地理分佈的廣域網相互連接,在它們的前端有一個負載調度器(load Balancer)。
負載調度器能無縫地將網絡請求調度到真實的服務器上,從而使得服務器集羣的結構對於客戶是透明的,客戶訪問集羣系統提供的網絡服務就像
訪問一臺高性能、高可用的服務器一樣。客戶程序不受服務器集羣的影響不需作任何修改。
LVS相關術語命名約定
名稱 縮寫 說明
虛擬IP地址(Virtual Ip Address) VIP Director用於向客戶端計算機提高服務的IP地址。比如www.etiantian.org域名就要解析到VIP上。
真實IP地址(Real Server Ip Address) RIP 在集羣下面節點上使用的IP地址。
Director的IP地址(Director Ip Address) DIP Director用於連接內外網絡的IP地址,物理網卡上的IP地址。
客戶端主機IP地址(Client Ip Address) CIP 客戶端用於計算機請求集羣服務的IP地址,該地址用作發送給集羣的請求的源IP地址。
LVS負載均衡集羣的3種工作模式介紹
1)NAT模式-網絡地址轉換
(Virtual Server via Network Address Translation(VS/NAT)
通過網絡地址轉換,調度器重寫請求報文的目標地址,根據預設的調度算法,將請求分派給後端的真實服務器;真實服務器的響應報文通過調度器時
報文的源地址被重寫,在返回給客戶端,完成整個負載調度過程。
提示:VS/NAT模式,很類似公路收費站,來去都要進過LB負載均衡器,通過修改目的地址,端口或源地址或源端口。(10-20臺)
2)TUN模式-隧道模式
Virtual Server via IP Tunneling (VS/TUN)
採用NAT技術時,由於請求和響應報文都必須經過調度器地址重寫,當客戶請求越來越多時,調度器的處理能力將成爲瓶頸。
爲了解決這個問題,調度器把請求報文通過IP隧道(相當於ipip或ipsec)轉發至真實服務器,而真實服務器將響應直接返
回給客戶,這樣調度器只處理請求報文。由於一般網絡應答數據比請求報文大很多,採用VS/TUN技術後,集羣系統的最大
吞吐量可以調高10倍。
3)DR模式-直接路由模式
Virtual Sever via Direct Routing (VS/DR)
VS/DR通過改寫請求報文的MAC地址,將請求發送到真實的服務器,而請求發送到真實的服務器,而真實服務器將響應直接返回給客戶。
同VS/TUN技術一樣,VS/DR技術可極大的提高集羣系統的伸縮性。這種方法沒有IP隧道的開銷,對於集羣中真實服務器也沒有必須支持
IP隧道協議的要求,但是要求調度器與真實服務器都有一塊網卡連接在統一服務網段上。
LVS的調度算法
LVS調度算法決定了如何在這些集羣節點之間分佈工作負荷。
當Director收到來自客戶端的訪問它VIP上的集羣服務入站請求時,Director必須決定哪個集羣節點應該獲得請求。
Director可用於做出該決定的調度方法分爲兩個基本類別:
固定調度算法:rr,wrr,dh,sh
動態調度算法:wlc,lc,lblc,lblcr,SE,NQ
10種調度算法如下:
rr : 輪詢調度(Round-Robin),它將請求一次分配不同的RS,也就是在RS中均攤請求。這種算法簡單,但是隻適合與RS處理
性能相差不大的情況。
wrr: 加權輪詢調度(Weighted Round-Robin),它將依據不同RS的權值分配任務。權值較高的RS將優先獲得任務,並且分配到
的連接數將比權值較低的RS更多。相同權值的RS得到相同的連接數。
dh: 目的地址哈希調度(Destination Hashing)以目的地址爲關鍵字查找一個靜態的hash表來獲得需要的RS。
sh: 源地址哈希調度(Source Hashing)以源地址爲關鍵字查找一個靜態hash表來獲得需要的RS。
lc: 最小連接數調度(Least-Connection),IPVS表存儲了所有的活動連接。把新的連接請求發送到當前連接數最小的RS。
wlc: 加權最小連接數調度(Weighted Least-Connection)假設各臺RS的權值一次爲Wi(l=1..n),當前的TCP連接數依次爲
Ti(l=1..n),依次選取Ti/Wi爲最小的RS作爲下一個分的的RS。
lblcr:基於地址的最小連接數調度(Locality-Based Least-Connect)將來自同一目的地址的請求分配給同一臺RS,如果這臺服務器
尚未滿負荷,否則分配給連接數最小的RS,並以它爲下一次分配的首選考慮。
lblcr: 基於地址帶重複最小連接數調度(Locality-Based Least-Connection with Replication)對於某一目的地址,對應有一個
RS子集。對此地址請求,爲它分配子集中連接數最小RS;如果子集中所有服務器均已滿負荷,則從集羣選擇一個連接數較小服
務器。將它加入到此子集並分配連接;若一定時間內,未被做任何修改,則將子集中負載最大的節點從子集刪除。
LVS的調度算法和生產環境選型
一般的網絡服務,如HTTP、Mail、MySQL等,常用的調度算法爲:
1)基本輪詢調度rr算法 2)加權最小連接調度wlc 3)加權輪詢調度wrr算法。
基於局部性的最小連接LBLC和帶複製的基於局部性最少連接LBLCR主要適用web和Cache集羣。
源地址散列調度和目標地址散列可以結合適用在防火牆集羣中,他們可以保證整個系統的唯一出入口。最短預期延遲調度SED和不排列調度
NQ主要是對處理時間相對比較長的網絡服務。
LVS DR模式具體的調度原理過程:
安裝LVS
1、下載相關軟件包
[root@lb01 tools]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
2、安裝LVS命令
查看是否存在LVS
[root@lb01 tools]# lsmod |grep ip_vs
檢查系統內核版本
[
root@lb01 tools]# cat /etc/redhat-release CentOS release 6.5 (Final) [root@lb01 tools]# uname -r 2.6.32-431.el6.x86_64
做個軟鏈接
[root@lb01 tools]# ls -ld /usr/src/kernels/2.6.32-431.el6.x86_64 drwxr-xr-x. 22 root root 4096 5月 20 2017 /usr/src/kernels/2.6.32-431.el6.x86_64 [root@lb01 tools]# ls -ld /usr/src/kernels/2.6.32-431.el6.x86_64 /usr/src/linux drwxr-xr-x. 22 root root 4096 5月 20 2017 /usr/src/kernels/2.6.32-431.el6.x86_64 lrwxrwxrwx 1 root root 39 5月 1 17:34 /usr/src/linux -> /usr/src/kernels/2.6.32-431.el6.x86_64
編譯安裝
[root@lb01 tools]# tar zxf ipvsadm-1.26.tar.gz [root@lb01 tools]# cd ipvsadm-1.26 [root@lb01 ipvsadm-1.26]# make [root@lb01 ipvsadm-1.26]# make install
如果出現報錯,可能是由於缺少3個組件popt-devel,popt-static,libnl-devel,yum安裝即可
[root@lb01 ipvsadm-1.26]# lsmod |grep ip_vs
安裝完成後並沒有加載到內核
啓動LVS
[root@lb01 ipvsadm-1.26]# /sbin/ipvsadm IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn [root@lb01 ipvsadm-1.26]# lsmod |grep ip_vs ip_vs 125220 0 libcrc32c 1246 1 ip_vs ipv6 317340 275 ip_vs
配置LVS虛擬IP
[root@lb01 ~]# ifconfig eth0:127 192.168.4.127 netmask 255.255.255.0 [root@lb01 ~]# ifconfig eth0:127 eth0:127 Link encap:Ethernet HWaddr 00:0C:29:06:6E:89 inet addr:192.168.4.127 Bcast:192.168.4.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 手工執行配置添加LVS服務 [root@lb01 ~]# ipvsadm -C [root@lb01 ~]# ipvsadm --set 30 5 60 [root@lb01 ~]# ipvsadm -A -t 192.168.4.127:80 -s wrr -p 20 [root@lb01 ~]# ipvsadm -a -t 192.168.4.127:80 -r 192.168.4.122:80 -g -w 1 [root@lb01 ~]# ipvsadm -a -t 192.168.4.127:80 -r 192.168.4.121:80 -g -w 1
查看配置及狀態信息
[root@lb01 ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.4.127:80 wrr persistent 20 -> 192.168.4.121:80 Route 1 0 0 -> 192.168.4.122:80 Route 1 0 0 [root@lb01 ~]# ipvsadm -L -n --stats IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port TCP 192.168.4.127:80 14 37 0 1892 0 -> 192.168.4.121:80 8 22 0 1128 0 -> 192.168.4.122:80 6 15 0 764 0
刪除配置
[root@lb01 ~]# ipvsadm -D -t 192.168.4.127:80 [root@lb01 ~]# ipvsadm -d -t 192.168.4.127:80 -r 192.168.4.121:80
命令相關參數說明
--clear -C clear the whole table --add-service -A add virtual service with options --tcp-service -t service-address service-address is host[:port] --scheduler -s scheduler one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq --add-server -a add real server with options --real-server -r server-address server-addres s is host(and port) --masquerading -m masquerading (NAT) --gatewaying -g gatewaying(direct routing)(default) --delete-server -d delete real server --persistent -p [timeout] persistent server(會話保持功能) --set tcp tcpfin udp set connection timeout values --weight -w weight capacity of real server [root@lb01 ~]# ipvsadm –help 《===更多命令幫助
手工在RS端綁定VIP
[root@lamp01 ~]# ifconfig lo:127 192.168.4.127 netmask 255.255.255.255 up [root@lamp01 ~]# route add -host 192.168.4.127 dev lo [root@lnmp02 ~]# ifconfig lo:127 192.168.4.127 netmask 255.255.255.255 up [root@lnmp02 ~]# route add -host 192.168.4.127 dev lo
手工在RS端抑制ARP響應
cat /proc/sys/net/ipv4/conf/lo/arp_ignore cat /proc/sys/net/ipv4/conf/all/arp_ignore cat /proc/sys/net/ipv4/conf/all/arp_announce cat /proc/sys/net/ipv4/conf/lo/arp_announce 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
最後瀏覽器訪問VIP進行測試
LVS自動化腳本
ipvs_server
#!/bin/bash # function: # version:1.1 . /etc/init.d/functions VIP=192.168.4.127 SUBNET=eth0:`echo $VIP|cut -d. -f4` PORT=80 GW=192.168.4.1 #w=3 RIP1=( 192.168.4.121 ) #w=1 RIP2=( 192.168.4.122 ) IFCONFIG=/sbin/ifconfig ROUTE=/sbin/route IPVSADM=/sbin/ipvsadm ARPING=/sbin/arping #functions function usage (){ local script_name script_name=$1 echo "Usgae : $script_name [ start | stop | restart ]" echo "" return 1 } function checkCmd (){ if [ ! -f $1 ]; then echo "Can't find "$1 return 1 fi } function checkSubnet (){ $IFCONFIG |grep "$1"|wc -l } function ipvsStart (){ #judge if $SUBNET is exist. if [ $(checkSubnet $SUBNET) -ne 0 ]; then $IFCONFIG $SUBNET down fi local rs #$IFCONFIG $SUBNET $VIP broadcast $VIP netmask 255.255.255.255 up $IFCONFIG $SUBNET $VIP broadcast $VIP netmask 255.255.255.0 up #$ROUTE add -host $VIP dev $SUBNET $IPVSADM -C $IPVSADM -A -t $VIP:$PORT -s wrr -p 60 for ((i=0; i<`echo ${#RIP1[*]}`; i++)) do $IPVSADM -a -t $VIP:$PORT -r ${RIP1[$i]}:$PORT -g -w 1 done for ((i=0; i<`echo ${#RIP2[*]}`; i++)) do $IPVSADM -a -t $VIP:$PORT -r ${RIP2[$i]}:$PORT -g -w 1 done rs=$? $IPVSADM >/tmp/wangxin.log # update MAC NetIf=$(echo ${SUBNET}|awk -F ":" '{print $1}') $ARPING -c 1 -I ${NetIf} -s $VIP $GW >>/tmp/wangxin.log [ $rs -eq 0 ] && action "Ipvsadm start." /bin/true return $rs } function ipvsStop (){ local rs rs=1 #clean ipvs $IFCONFIG $SUBNET down $IPVSADM -C $IPVSADM -Z rs=$? #$ROUTE del $VIP $ARPING -c 1 -I ${NetIf} -s $VIP $GW >/dev/null 2>&1 [ $rs -eq 0 ] && action "Ipvsadm stoped." /bin/true return $rs } main () { #judge argv num by wangxin if [ $# -ne 1 ]; then usage $0 fi case "$1" in start) ipvsStart ;; stop) ipvsStop ;; restart) ipvsStop ipvsStart ;; *) usage $0 ;; esac } #start operating main $*
ipvs_client
#!/bin/bash # description: Config realserver lo and apply noarp VIP=( 192.168.4.127 ) . /etc/rc.d/init.d/functions case "$1" in start) for ((i=0; i<`echo ${#VIP[*]}`; i++)) do interface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`" /sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 up done 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 action "Start LVS of RearServer.by wang1xin" ;; stop) for ((i=0; i<`echo ${#VIP[*]}`; i++)) do interface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`" /sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 down done 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 action "Close LVS of RearServer.by wang2xin" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac
一個腳本同時實現自動剔除和加入RS
#!/bin/bash PORT="80" VIP=192.168.4.127 RIP=( 192.168.4.121 192.168.4.122 ) function check_url() { for ((i=0; i<`echo ${#RIP[*]}`; i++)) do judge=($(curl -I -s http://${RIP[$i]}|head -1|tr "\r" "\n")) if [[ "${judge[1]}" == ‘200‘ && "${judge[2]}"==‘OK‘ ]] then if [ `ipvsadm -L -n|grep "${RIP[$i]}"|wc -l` -ne 1 ] then ipvsadm -a -t $VIP:$PORT -r ${RIP[$i]}:$PORT fi else if [ `ipvsadm -L -n|grep "${RIP[$i]}"|wc -l` -eq 1 ] then ipvsadm -d -t $VIP:$PORT -r ${RIP[$i]}:$PORT fi fi done } while true do check_url sleep 5 done
4 LVS+keepalived高性能集羣應用實戰
LVS配置(略)
Keepalived配置
主節點
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lb01 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 55 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.4.130/24 dev eth0 label eth0:1 } } virtual_server 192.168.4.130 80 { delay_loop 6 lb_algo wrr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.4.121 80 { weight 1 TCP_CHECK { connect_timeout 8 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.4.122 80 { weight 1 TCP_CHECK { connect_timeout 8 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
備節點
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lb02 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 55 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.4.130/24 dev eth0 label eth0:1 } } virtual_server 192.168.4.130 80 { delay_loop 6 lb_algo wrr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.4.121 80 { weight 1 TCP_CHECK { connect_timeout 8 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.4.122 80 { weight 1 TCP_CHECK { connect_timeout 8 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
5 其他
keepalived+LVS部署問題排錯思路
1、iptables防火牆問題
2、linux負載均衡器轉發問題
對於nat模式,linux內核轉發及iptables轉發功能需要開放,對於DR模式,可以不打開
3、RS端抑制ARP問題
4、RS端lo上綁定業務VIP,每個RS都要綁定
5、RS端lo上綁定的業務VIP,有時lo接口VIP會丟失
解決辦法:
a)ipvs_client完整腳本啓動命令放入rc.local
b)通過nagios監控RS端上綁定的業務VIP做監控報警
c)把RS端lo上綁定的業務VIP做成網卡配置文件提供服務
如:/etc/sysconfig/network-scripts/ifcfg-lo:123
6、確保client用戶、director和RS 三者之間任意兩者業務服務可訪問
可用wget telnet等命令來監測
7、ipvsadm -L -n來檢查LVS真是服務器情況及VIP連接及配置
8、檢查keepalived配置文件是否配置正確
9、查看系統日誌/var/log/messages
10、通過tcpdump命令跟蹤數據包流向
11、注意LVS配置的語法,尤其是大括號問題
keepalived+LVS生產環境負載均衡維護思路
1、業務高峯期儘量不修改負載均衡配置,以免發生故障
2、修改keepalived.conf時,備份
3、將keepalived.conf的配置下載下來,保留原始文件再進行修改,對比,然後傳到服務器
4、替換正式配置文件後,主負載均衡器可以先執行/etc/init.d/keepalived stop,把業務切換到備份負載均衡器上
LVS負載均衡器的多臺RS上線方案
1)通過ipvsadm命令下線機器
2)通過url做健康檢查,然後,移走健康檢查文件。這樣director會把此RS從轉發池中移除
LVS性能調優
1、關閉iptables,換硬件防火牆
大流量時,iptables是一個性能瓶頸
2、調整連接超時時間
3、內核優化
4、網卡優化
5、TCP/IP優化
6、硬件優化
7、增大哈希表,ip_vs_conn_tab_bits調到20
通過重啓,向內核傳遞參數來調整