lvshtml
ARP全稱:「Address Resolution Protocol」,中文名是地址解析協議,使用ARP協議可實現經過IP地址得到對應主機的物理地k址(MAC地址)。mysql
在TCP/IP的網絡環境下,每一個聯網的主機都會分配一個32位的ip地址,這種互聯網地址是在網際範圍標識主機的一種邏輯地址。爲了讓報文在物理網絡上傳輸,還必須知道對方主機的物理地址(MAC)才行,這樣就存在把IP地址變換爲物理地址的地址裝換問題。linux
咱們以以太網環境爲實例說明,爲了正確的向目的的主機傳送報文,必須把目標的32位ip地址轉化爲目標地址48位以太網mac地址,這就須要在互聯網層上有一個服務或者功能將ip地址轉換爲相應的物理地址(mac地址),這個服務或者功能就是ARP協議。nginx
所謂的地址解析,就是主機在發送幀以前將目標ip地址轉換成爲目標mac地址的過程,ARP協議的基本功能就是經過目標設備的IP地址,查詢目標設備的mac地址,以保證主機之間相互通信。web
ARP與DNS優勢類似之處,不一樣點是:DNS是在域名和IP之間解析,另外ARP協議不須要配置服務,而DNS須要配置服務。算法
注意:sql
1. ARP協議須要通訊的主機必須在一個物理網段(即局域網環境)後端
2.實現局域網內經過ip獲取主機的mac地址緩存
3.ARP是OSI的第二層數據鏈路層協議bash
ARP緩存表:
arp –a #查看全部
arp –d #清楚
arp –s #綁定IP和MAC地址
(1) 主機有了arp緩存表,能夠加快arp的解析速度,減小局域網內廣播風暴。
(2) 正是有了arp緩存表,給惡意黑客帶來了攻擊服務器主機的風險,這個就是arp欺騙攻擊。
(3) 案例:切換路由器,負載均衡等設備,可能會致使短時網絡中斷。
(1)ARP病毒,ARP欺詐
排查
一、 MAC地址登記部門人員對應,IP綁定,全部設備登記MAC地址
二、 局域網出現arp中毒,特別是沒法上網。
三、 員工上網物理拓撲規範清晰,從交換機上
(2)高可用服務器對之間切換時要考慮ARP緩存的問題
(3)路由等設備無縫遷移時要考慮ARP緩存的問題,例如:更換辦公室的路由器
OSI把網絡分爲7層,彼此之間不能打交道,只能經過接口。IP在3層,mac在2層,在發送數據包的時候,先要封裝3層IP地址,而後封裝2層的mac地址,但協議只知道目的節點的ip地址,不知道mac,又不能跨2,3層因此得用ARP協議,幫助獲取mac地址
一、 ARP全稱:「Address Resolution Protocol」
二、 實現局域網內經過IP地址獲取主機的MAC地址
三、 MAC地址:48爲主機的物理地址,局域網內惟一。
四、 ARP協議相似DNS服務,但不須要配置ARP服務
五、 ARP協議是OSI 7層模型第三層網絡層協議
六、 ARP協議要求通信的主機雙方必須在同一物理網段(即局域網環境)
七、 arp欺騙的原理,arp欺騙的解決方法
八、 arp緩存表的案例:路由器、負載均衡切換
負載均衡集羣提供了一種廉價、透明、有效的方法,來擴展網絡設備和服務器的負載、帶寬、增長吞吐量、增強網絡數據處理能力、提升靈活性和可用性。
那麼在什麼狀況下,企業網站須要負載均衡服務呢?
從上圖能夠看出,lvs負載均衡調度技術是在Linux內核中實現的,所以,被稱爲Linux虛擬服務器,咱們使用該軟件配置lvs的時候,不能直接配置內核中的ipvs。而須要使用ipvs的管理工具ipvsadm進行管理,固然也能夠經過keepalive軟件之間管理ipvs,並非經過ipvsadm來管理ipvs。
兩個工具:
一、 管理配置LVS的工具,ipvsadm.
二、實現負載調度的工具ip_vs(不能直接操做的),只能經過ipvsadm管理ip_vs。
ip_vs工做在內核層面的
ipvsadm工做在應用層面
一、真正實踐調度的工具是ipvs,工做在Linux內核層面
二、lvs自帶的ipvs命令行管理工具是ipvsadm
三、keepalive實現管理ipvs(配置文件)及負載均衡器的高可用
四、redhat工具piranhaWEB管理實現調度的工具IPVS
client 客戶端對應的ip地址 cip(client ip address)
負載均衡 dip網卡上的IP地址(用於鏈接內外網絡的ip地址)
虛擬的ip地址 vip提供服務的地址
節點(web) rip(集羣節點(real server)上使用的ip地址,物理ip地址)
LVS的四種工做模式:
NAT(network address translation)
TUN(tunneling)
DR(direct routing)
FULLNAT(full network address translation)
支持高併發。
爲了闡述方便,我根據官方原理圖另外製做了一幅圖,以下圖所示:VS/DR的體系結構:
我將結合這幅原理圖及具體的實例來說解一下LVS-DR的原理,包括數據包、數據幀的走向和轉換過程。
官方的原理說明:Director接收用戶的請求,而後根據負載均衡算法選取一臺realserver,將包轉發過去,最後由realserver直接回復給用戶。
實例場景設備清單:
說明:我這裏爲了方便,client是與vip同一網段的機器。若是是外部的用戶訪問,將client替換成gateway便可,由於IP包頭是不變的,變的只是源mac地址
① client向目標vip發出請求,Director接收。此時IP包頭及數據幀頭信息以下:
②LVS根據負載均衡算法選擇一臺active的realserver(假設是192.168.57.122),將此RIP所在網卡的mac地址做爲目標mac地址,發送到局域網裏。此時IP包頭及數據幀頭信息以下:
③ realserver(192.168.57.122)在局域網中收到這個幀,拆開後發現目標IP(VIP)與本地匹配,因而處理這個報文。隨後從新封裝報文,發送到局域網。此時IP包頭及數據幀頭信息以下:
④ 若是client與VS同一網段,那麼client(192.168.57.135)將收到這個回覆報文。若是跨了網段,那麼報文經過gateway/路由器經由Internet返回給用戶
特色:
一、經過在調度器lb上修改數據包的目的mac地址實現轉發。注意,源ip地址仍然是cip,目的ip地址仍然是vip
二、請求的報文經過調度器,而rs響應處理後的報文無需通過調度器LB所以,併發訪問量大時使用效率很高(和nat模式相比)
三、由於DR模式是經過MAC地址的改寫機制實現的轉發,所以,全部RS節點和調度器LB只能在一個局域網LAN中(小缺點)
四、須要注意RS節點的VIP的綁定(lo:vip/32,lo1:vip/32)和ARP抑制問題
五、強調下:RS節點的默認網關不須要的是調度器LB的DIP,而直接是IDC機房分配的上級路由器的ip(這是RS帶有外網ip地址的狀況),理論講:只要RS能夠出網便可,不是必需要配置外網ip
六、因爲DR模式的調度器僅進行了目的MAC地址的改寫,所以,調度器LB沒法改變請求的報文的目的端口(和NAT要區別)
七、當前,調度器LB支持全部的UNIX,LINUX系統,但目前不支持WINDOWS系統。真實服務器RS節點能夠是WINDOWS系統
八、總的來講DR模式效率很高,可是配置也比較麻煩,所以,訪問量不是特別大的公司能夠用haproxy/nginx取代之,這符合運維的原則:簡單、應用、高效。日1000-2000W PV或併發請求1萬如下均可以考慮用haproxy、nginx(LVS NAT模式)
九、直接對外的訪問業務,例如:web服務作RS節點,RS最好用公網IP地址。若是不直接對外的業務,例如:mysql,存儲系統RS節點,最好只用內部IP地址
特色:
一、就是把數據包進來時CIP:VIP改成VIP:RIP
二、出去時:RIP:VIP改成VIP:CIP
就是在數據包的前面加包頭的形式,什麼都不改的狀況下,添加IP頭,到達節點把頭去掉
也須要綁定VIP,抑制ARP,相似於DR模式
安裝軟件:
一、查看LB和節點有沒有安裝(全部機器)
rpm -qa ipvsadm yum –y install ipvsadm
二、作軟鏈接,啓動,驗證(全部機器)
ln -s /usr/src/kernels/2.6.32-573.el6.x86_64 /usr/src/linux ipvsadm lsmod |grep ip_vs
手動配置負載均衡:
三、在lb機器上添加VIP(LB機器)
ip addr add 10.0.0.3/24 dev eth0 label eth0:0
四、配置規則,清理、添加規則、添加real server、查看驗證(LB機器)
ipvsadm -C ipvsadm -A -t 10.0.0.3:80 -s wrr -p 300 ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.70:80 -g -w 1 ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.80:80 -g -w 1 ipvsadm -Ln
五、RS服務器,配置VIP、添加路由記錄、抑制ARP(RS全部機器)
ip addr add 10.0.0.3/32 dev lo label lo:0 或者ipconfig lo:0 10.0.0.3/32 up <==子網掩碼特殊 route add -host 10.0.0.3 dev lo 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
驗證:
六、訪問,查看
watch -n 1 ipvsadm -nL --stats
-A 在內核的虛擬服務器表中添加一條新的虛擬服務器記錄
-E 編輯內核虛擬服務器表中的一條虛擬服務器記錄。
-D 刪除內核虛擬服務器表中的一條虛擬服務器記錄。
-C 清除內核虛擬服務器表中的全部記錄。
-R 恢復虛擬服務器規則
-S 保存虛擬服務器規則,輸出爲-R選項可讀的格式
-a 在內核虛擬服務器表的一條記錄裏添加一條新的真實服務器記錄。
-e 編輯一條虛擬服務器記錄中的某條真實服務器記錄
-d 刪除一條虛擬服務器記錄中的某條真實服務器記錄
-L|-l--list 顯示內核虛擬服務器表
-Z--zero 虛擬服務表計數器清零(清空當前的鏈接數量等)
--settcptcpfinudp 設置鏈接超時值
--start-daemon 啓動同步守護進程。他後面能夠是master或backup,用來講明LVSRouter是master或是backup。在這個功能上也能夠採用keepalived的VRRP功能。
--stop-daemon 中止同步守護進程
-h--help 顯示幫助信息
其餘的選項:
-t --tcp-serviceservice-address 說明虛擬服務器提供的是tcp的服務
-u --udp-serviceservice-address 說明虛擬服務器提供的是udp的服務
-f --fwmark-servicefwmark 說明是通過iptables標記過的服務類型。
-r --real-serverserver-address 真實的服務器
-s --schedulerscheduler 使用的調度算法,rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默認的調度算法是:wlc.
-p--persistent[timeout] 持久穩固的服務。這個選項的意思是來自同一個客戶的屢次請求,將被同一臺真實的服務器處理。timeout的默認值爲300秒。
-g--gatewaying 指定LVS的工做模式爲直接路由模式(也是LVS默認的模式)
-i --ipip 指定LVS的工做模式爲隧道模式
-m --masquerading 指定LVS的工做模式爲NAT模式
-w--weightweight 真實服務器的權值
--mcast-interfaceinterface 指定組播的同步接口
-c--connection 顯示LVS目前的鏈接如:ipvsadm-L-c
--timeout 顯示tcptcpfinudp的timeout值如:ipvsadm-L--timeout
--daemon 顯示同步守護進程狀態
--stats 顯示統計信息
--rate 顯示速率信息
--sort 對虛擬服務器和真實服務器排序輸出
--numeric-n 輸出IP地址和端口的數字形式
global_defs { router_id LVS_DEVEL } vrrp_instance LVI_40 { state MASTER interface eth0 virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.4/24 dev eth0 label eth0:1 } } virtual_server 10.0.0.4 80 { #vip delay_loop 6 lb_algo wlc #算法 lb_kind DR #模式 nat_mask 255.255.255.0 #子網掩碼 # persistence_timeout 50 #保持會話 protocol TCP #-t TCP協議 real_server 10.0.0.70 80 { #節點IP weight 1 #權重 TCP_CHECK { #TCP的健康檢查 connect_timeout 3 #超時時間 nb_get_retry 3 # delay_before_retry 3 #重複的次數 connect_port 80 #檢查的端口 } } real_server 10.0.0.80 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
lvs啓動腳本
!#/bin/bash VIP=( 10.0.0.3 ) . /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 oldboy " ;; 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 "Close LVS Directorserver" action "Start LVS of RearServer.by oldboy " if [ ${#VIP[*]} -eq 1 ];then 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 fi action "Start LVS of RearServer.by oldboy " ;; *) echo "Usage: $0 {start|stop}" exit 1 esac
lvs健康檢查腳本
#!/bin/sh VIP=10.0.0.29 PORT=80 RIP=( 10.0.0.80 10.0.0.70 ) while true do for ((i=0;i<`echo ${#RIP[*]}`;i++)) do PORT_COUNT=`nmap ${RIP[$i]} -p $PORT|grep open|wc -l` [ $PORT_COUNT -ne 1 ]&&{ ipvsadm -d -t $VIP:$PORT -r ${RIP[$i]}:$PORT echo "${RIP[$i]}" >>/tmp/rx.log } done sleep done
生產中ipvsadm -L -n發現兩臺RS的負載不均衡,一臺多一臺沒有,而且RS測試服務正常,lo:VIP也有。就是沒有請求
問題緣由:
persistent10的緣由,persistent會話保持
IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.0.0.3:80 wrr -> 10.0.0.70:80 Route 1 0 0 -> 10.0.0.80:80 Route 1 0 0
解決辦法:
註釋keepalive的配置文件# persistence_timeout字段,而後reload
其餘致使負載不均衡的緣由:
一、肯定調度器的調度規則和IP的正確性
二、RS節點上的VIP綁定和ARP抑制的檢查
生產思路:把RS綁定的VIP作實時監控,把RS綁定的VIP作成配置文件
例如:/etc/sysconfig/network-scripts/lo:0
三、tcpdump,ping
tcpdump 詳解https://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html