本文主要講述LVS-TUN原理介紹和配置實踐,HA高可用方案基於Keepalived。html
LVS-TUN原理介紹和配置實踐
2019年09月03日 - 拆分LVS-Keepalived中LVS-TUN
2019年08月23日 - 更新LVS/NAT、LVS/DR、LVS/TUN三種模式的原理和配置實踐
2018年12月03日 - 精簡和更新配置步驟
2018年07月31日 - 初稿前端
閱讀原文 - https://wsgzao.github.io/post...node
擴展閱讀linux
LVS - http://www.linuxvirtualserver...
Keepalived - http://www.keepalived.org/nginx
Virtual Server via IP Tunneling - http://www.linuxvirtualserver...
LVS和Keepalived官方中文手冊PDF - https://pan.baidu.com/s/1s0P6...git
如下術語涉及LVS三種工做模式的原理
VS/NAT | VS/TUN | VS/DR | |
---|---|---|---|
server | any | tunneling | non-arp device |
server network | private | LAN/WAN | LAN |
server number | low (10~20) | high | high |
server gateway | load balancer | own router | own router |
模式與特色 | NAT 模式 | IPIP 模式 | DR 模式 |
---|---|---|---|
對服務器的要求 | 服務節點可使任何操做系統 | 必須支持 IP 隧道,目前只有 Linux 系統支持 | 服務器節點支持虛擬網卡設備,可以禁用設備的 ARP 響應 |
網絡要求 | 擁有私有 IP 地址的局域網絡 | 擁有合法 IP 地址的局域,網或廣域網 | 擁有合法 IP 地址的局域,服務器節點與負載均衡器必須在同一個網段 |
一般支持節點數量 | 10 到 20 個,根據負載均衡器的處理能力而定 | 較高,能夠支持 100 個服務節點 | 較高,能夠支持 100 個服務節點 |
網關 | 負載均衡器爲服務器節點網關 | 服務器的節點同本身的網關或者路由器鏈接,不通過負載均衡器 | 服務節點同本身的網關或者路由器鏈接,不通過負載均衡器 |
服務節點安全性 | 較好,採用內部 IP,服務節點隱蔽 | 較差,採用公用 IP 地址,節點安全暴露 | 較差,採用公用 IP 地址,節點安全暴露 |
IP 要求 | 僅須要一個合法的 IP 地址做爲 VIP 地址 | 除了 VIPO 地址外,每一個服務器界定啊須要擁有合法的 IP 地址,能夠直接從路由到客戶端 | 除了 VIP 外,每一個服務節點需擁有合法的 IP 地址,能夠直接從路由到客戶端 |
特色 | 地址轉換 | 封裝 IP | 修改 MAC 地址 |
配置複雜度 | 簡單 | 複雜 | 複雜 |
LVS 由2部分程序組成,包括 ipvs 和 ipvsadm。
在lvs+keepalived環境裏面,lvs主要的工做是提供調度算法,把客戶端請求按照需求調度在real服務器,keepalived主要的工做是提供lvs控制器的一個冗餘,而且對real服務器作健康檢查,發現不健康的real服務器,就把它從lvs集羣中剔除,real服務器只負責提供服務。github
在原有的IP報文外再次封裝多一層IP首部,內部IP首部(源地址爲CIP,目標IIP爲VIP),外層IP首部(源地址爲DIP,目標IP爲RIP)
(1) 當用戶請求到達Director Server,此時請求的數據報文會先到內核空間的PREROUTING鏈。 此時報文的源IP爲CIP,目標IP爲VIP 。
(2) PREROUTING檢查發現數據包的目標IP是本機,將數據包送至INPUT鏈
(3) IPVS比對數據包請求的服務是否爲集羣服務,如果,在請求報文的首部再次封裝一層IP報文,封裝源IP爲DIP,目標IP爲RIP。而後發至POSTROUTING鏈。 此時源IP爲DIP,目標IP爲RIP
(4) POSTROUTING鏈根據最新封裝的IP報文,將數據包發至RS(由於在外層封裝多了一層IP首部,因此能夠理解爲此時經過隧道傳輸)。 此時源IP爲DIP,目標IP爲RIP
(5) RS接收到報文後發現是本身的IP地址,就將報文接收下來,拆除掉最外層的IP後,會發現裏面還有一層IP首部,並且目標是本身的lo接口VIP,那麼此時RS開始處理此請求,處理完成以後,經過lo接口送給eth0網卡,而後向外傳遞。 此時的源IP地址爲VIP,目標IP爲CIP
(6) 響應報文最終送達至客戶端算法
LVS/TUN模型特性
其實企業中最經常使用的是 DR 實現方式,而 NAT 配置上比較簡單和方便,後邊實踐中會總結 DR 和 NAT 具體使用配置過程。
TUN(virtual server via ip tunneling IP 隧道)調度器把請求的報文經過IP隧道轉發到真實的服務器。真實的服務器將響應處理後的數據直接返回給客戶端。這樣調度器就只處理請求入站報文。此轉發方式不修改請求報文的IP首部(源IP爲CIP,目標IP爲VIP),而在原IP報文以外再封裝一個IP首部(源IP是DIP,目標IP是RIP),將報文發往挑選出的目標RS;RS直接響應給客戶端(源IP是VIP,目標IP是CIP),因爲通常網絡服務應答數據比請求報文大不少,採用lvs-tun模式後,集羣系統的最大吞吐量能夠提升10倍vim
注意:
(1) DIP, VIP, RIP都應該是公網地址;
(2) RS的網關不能,也不可能指向DIP;
(3) 請求報文要經由Director,但響應不能經由Director;
(4) 此模式不支持端口映射;
(5) RS的操做系統得支持隧道功能後端
缺點:因爲後端服務器RS處理數據後響應發送給用戶,此時須要租借大量IP(特別是後端服務器使用較多的狀況下)。
優勢:實現lvs-tun模式時,LVS 調度器將TCP/IP請求進行從新封裝並轉發給後端服務器,由目標應用服務器直接回複用戶。應用服務器之間是經過IP 隧道來進行轉發,故二者能夠存在於不一樣的網段中。
# Install keepalived # Ubuntu apt-get install keepalived ipvsadm # CentOS yum install keepalived ipvsadm # update iptables vim /etc/sysconfig/iptables # For keepalived: # allow vrrp -A INPUT -p vrrp -j ACCEPT -A INPUT -p igmp -j ACCEPT # allow multicast -A INPUT -d 224.0.0.18 -j ACCEPT # reload iptables service iptables reload # open ip_forward echo "1" > /proc/sys/net/ipv4/ip_forward # edit sysctl.conf vi /etc/sysctl.conf net.ipv4.ip_forward = 1 sysctl -p # keepalived for lvs-tun vim /etc/keepalived/keepalived.conf vrrp_sync_group GOP { group { VI_PRI_AUTH } } vrrp_instance VI_PRI_AUTH { state BACKUP interface em1 virtual_router_id 11 priority 100 advert_int 1 nopreempt authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.10.36.11/23 dev em1 } } virtual_server 10.10.36.11 80 { delay_loop 6 lb_algo rr lb_kind TUN protocol TCP real_server 10.10.36.4 80 { weight 100 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 10.10.36.7 80 { weight 100 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } } # enable and start keepalived systemctl start keepalived systemctl enable keepalived watch ipvsadm -L -n --stats # 編寫DS腳本,推薦用keepalived配置文件 #!/bin/sh # Startup script handle the initialisation of LVS # chkconfig: - 28 72 # description: Initialise the Linux Virtual Server for TUN # ### BEGIN INIT INFO # Provides: ipvsadm # Required-Start: $local_fs $network $named # Required-Stop: $local_fs $remote_fs $network # Short-Description: Initialise the Linux Virtual Server # Description: The Linux Virtual Server is a highly scalable and highly # available server built on a cluster of real servers, with the load # balancer running on Linux. # description: start LVS of TUN LOCK=/var/lock/lvs-tun.lock VIP=10.10.36.11 RIP1=10.10.36.4 RIP2=10.10.36.7 . /etc/rc.d/init.d/functions start() { PID=`ipvsadm -Ln | grep ${VIP} | wc -l` if [ $PID -gt 0 ]; then echo "The LVS-TUN Server is already running !" else #Load the tun mod /sbin/modprobe tun /sbin/modprobe ipip #Set the tun Virtual IP Address /sbin/ifconfig tunl0 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev tunl0 #Clear IPVS Table /sbin/ipvsadm -C #The icmp recruit setting echo "0" >/proc/sys/net/ipv4/ip_forward echo "0" >/proc/sys/net/ipv4/conf/all/send_redirects echo "0" >/proc/sys/net/ipv4/conf/default/send_redirects #Set Lvs /sbin/ipvsadm -At $VIP:80 -s rr /sbin/ipvsadm -at $VIP:80 -r $RIP1:80 -i -w 1 /sbin/ipvsadm -at $VIP:80 -r $RIP2:80 -i -w 1 /bin/touch $LOCK #Run Lvs echo "starting LVS-TUN-DIR Server is ok !" fi } stop() { #stop Lvs server /sbin/ipvsadm -C /sbin/ifconfig tunl0 down >/dev/null #Remove the tun mod /sbin/modprobe -r tun /sbin/modprobe -r ipip rm -rf $LOCK echo "stopping LVS-TUN-DIR server is ok !" } status() { if [ -e $LOCK ]; then echo "The LVS-TUN Server is already running !" else echo "The LVS-TUN Server is not running !" fi } case "$1" in start) start ;; stop) stop ;; restart) stop sleep 1 start ;; status) status ;; *) echo "Usage: $1 {start|stop|restart|status}" exit 1 esac exit 0
# 在加載好ipip模塊後就會有默認的tunl0隧道 modprobe ipip # 添加VIP # ifconfig tunl0 down ifconfig tunl0 10.10.36.11 broadcast 10.10.36.11 netmask 255.255.255.255 up # 添加路由 route add -host 10.10.36.11 tunl0 # 手動關閉ARP轉發 echo '1' > /proc/sys/net/ipv4/conf/tunl0/arp_ignore echo '2' > /proc/sys/net/ipv4/conf/tunl0/arp_announce echo '1' > /proc/sys/net/ipv4/conf/all/arp_ignore echo '2' > /proc/sys/net/ipv4/conf/all/arp_announce echo '0' > /proc/sys/net/ipv4/conf/tunl0/rp_filter echo '0' > /proc/sys/net/ipv4/conf/all/rp_filter # iptables容許ipip協議 iptables -I INPUT 1 -p 4 -j ACCEPT vim /etc/sysconfig/iptables -A INPUT -p ipv4 -j ACCEPT # 編寫RS啓停腳本,推薦用腳本管理RS vim /etc/init.d/lvs-tun #!/bin/sh # # Startup script handle the initialisation of LVS # chkconfig: - 28 72 # description: Initialise the Linux Virtual Server for TUN # ### BEGIN INIT INFO # Provides: ipvsadm # Required-Start: $local_fs $network $named # Required-Stop: $local_fs $remote_fs $network # Short-Description: Initialise the Linux Virtual Server # Description: The Linux Virtual Server is a highly scalable and highly # available server built on a cluster of real servers, with the load # balancer running on Linux. # description: start LVS of TUN-RIP LOCK=/var/lock/ipvsadm.lock VIP=10.10.36.11 . /etc/rc.d/init.d/functions start() { PID=`ifconfig | grep tunl0 | wc -l` if [ $PID -ne 0 ]; then echo "The LVS-TUN-RIP Server is already running !" else #Load the tun mod /sbin/modprobe tun /sbin/modprobe ipip #Set the tun Virtual IP Address /sbin/ifconfig tunl0 $VIP netmask 255.255.255.255 broadcast $VIP up /sbin/route add -host $VIP dev tunl0 echo "1" >/proc/sys/net/ipv4/conf/tunl0/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/tunl0/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce echo "0" > /proc/sys/net/ipv4/conf/tunl0/rp_filter echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter /bin/touch $LOCK echo "starting LVS-TUN-RIP server is ok !" fi } stop() { /sbin/ifconfig tunl0 down echo "0" >/proc/sys/net/ipv4/conf/tunl0/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/tunl0/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce #Remove the tun mod /sbin/modprobe -r tun /sbin/modprobe -r ipip rm -rf $LOCK echo "stopping LVS-TUN-RIP server is ok !" } status() { if [ -e $LOCK ]; then echo "The LVS-TUN-RIP Server is already running !" else echo "The LVS-TUN-RIP Server is not running !" fi } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) echo "Usage: $1 {start|stop|restart|status}" exit 1 esac exit 0 # start lvs-tun chmod 755 /etc/init.d/lvs-tun service lvs-tun start chkconfig lvs-tun on # Nginx test echo "rs1" > /usr/share/nginx/html/index.html echo "rs2" > /usr/share/nginx/html/index.html for i in {1..100}; do curl 10.10.36.11; sleep 0.5; done
這一步的主要目的是讓 RS 禁言,在相對較新的版本中新增了兩個內核參數 (kernel parameter)
總結: LVS/TUN 是全部模式中最最適用於跨網絡跨地域地理位置的一種模式,須要注意的是:
配置時除了配置 DIR,還須要須要配置後端 RS server,即在 tunl 上口配置 vip 地址(須要系統支持 tunl 才行),廣播爲爲本身,此模式下無需開啓路由轉發功能!
# 關於3中模式的參數 [packet-forwarding-method] -g, --gatewaying Use gatewaying (direct routing). This is the default. -i, --ipip Use ipip encapsulation (tunneling). -m, --masquerading Use masquerading (network access translation, or NAT). Note: Regardless of the packet-forwarding mechanism specified, real servers for addresses for which there are interfaces on the local node will be use the local forwarding method, then packets for the servers will be passed to upper layer on the local node. This cannot be specified by ipvsadm, rather it set by the kernel as real servers are added or modified. # ipvsadm命令行混配 /sbin/ifconfig tunl0 10.10.36.11 broadcast 10.10.36.11 netmask 255.255.255.255 up /sbin/route add -host 10.10.36.11 dev tunl0 /sbin/ipvsadm -At 10.10.36.11:80 -s rr /sbin/ipvsadm -at 10.10.36.11:80 -r 10.10.36.4:80 -g -w 1 /sbin/ipvsadm -at 10.10.36.11:80 -r 10.10.36.7:80 -i -w 1 # keepalived混配 vrrp_sync_group GOP { group { VI_PRI_AUTH } } vrrp_instance VI_PRI_AUTH { state BACKUP interface em1 virtual_router_id 11 priority 100 advert_int 1 nopreempt authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.10.36.11/23 dev em1 } } virtual_server 10.10.36.11 80 { delay_loop 6 lb_algo rr lb_kind DR protocol TCP real_server 10.10.36.4 80 { weight 100 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } } virtual_server 10.10.36.11 80 { delay_loop 6 lb_algo rr lb_kind TUN protocol TCP real_server 10.10.36.7 80 { weight 100 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } } # 檢查結果可用 [root@d126027 wangao]# for i in {1..100}; do curl 10.10.36.11; sleep 0.5; done rs2 rs1 rs2 rs1 rs2 [root@d126009 keepalived]# ipvsadm -Ln --stats IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port TCP 10.10.36.11:80 100 700 0 36700 0 -> 10.10.36.4:80 50 350 0 18350 0 -> 10.10.36.7:80 50 350 0 18350 0
DR和TUN的模式基本不用作改動
LVS和Keepalived的原理介紹和配置實踐
LVS原理介紹和配置實踐
Keepalived原理介紹和配置實踐
LVS-NAT原理介紹和配置實踐
LVS-DR原理介紹和配置實踐
LVS-TUN原理介紹和配置實踐