序言
提到LVS,就從章文嵩博士開始吧,反正也不知道如何下筆來寫這一篇。章大博士,讀博時候建立這個lvs軟體項目,但是他提倡開源精神,在使用者的建議和回報中,這個花了他兩周時間開發的開源軟體不斷得到改建和豐富。到1999年,該款軟體已在負載均衡領域中比較出名,章文嵩仍舊堅持開源,将源代碼分享給所有人。好人自有好歸宿,章博士在2016年5月27日,去滴滴出任進階副總裁、負責CTO線基礎平台部兼工程技術委員會主席。在來滴滴之前,章博士曾在阿裡任職近七年,曆任淘寶網資深技術總監、淘寶技術委員會主席、阿裡副總裁、阿裡開源委員會主席、阿裡雲CTO等。
那扯那麼多LVS是個什麼呢?
他是Linux Virtual Server的縮寫,是一個虛拟的伺服器叢集系統,總之為使用叢集技術來和Linux系統來實作一個高可用,高性能的伺服器。如果進一步的扯淡,建議百度百科一下,裡面清清楚楚,如果你看百科看不懂,那你加左上角的技術群,去跟裡面的大神聊聊吧。這裡我附帶一個直通章博士的LVS中文站點:http://zh.linuxvirtualserver.org/。
LVS 叢集分為三層結構:
- 負載排程器(load balancer):它是整個LVS 叢集對外的前端機器,負責将client請求發送到一組伺服器[多台LB IP]上執行,而client端認為是傳回來一個同一個IP【通常把這個IP 稱為虛拟IP/VIP】
- 伺服器池(server pool):一組真正執行client 請求的伺服器,一般是我們的web伺服器;除了web,還有FTP,MAIL,DNS
- 共享存儲(shared stored):它為 server pool 提供了一個共享的存儲區,很容易讓伺服器池擁有相同的内容,提供相同的服務
LVS NAT模式簡述
章文嵩博士的博文在這裡,瞅瞅吧。http://www.linuxvirtualserver.org/zh/lvs3.html
接下來我們的示例,就采用如下ip配置部署。
具體資料包路由走向,參考我的文章 VMware虛拟網絡連接配接模式詳解(NAT,Bridged,Host-only) 中的nat網絡連接配接方式。
NAT模式的幾個要點
- dip這台伺服器為分發伺服器,他擁有2個ip一個客戶通路的外網ip,一個ip作為vip真實伺服器的網關位址,且真實伺服器必須在一個網段中。
- 分發伺服器上安裝支援負載均衡各種算法的軟體,來實作負載轉發功能。
- 分發伺服器還需要打開路由轉發功能。
- 中RIP真實伺服器可以使用任何的作業系統,但都需使用私有網絡。
- NAT網絡連接配接方式的弊端也是lvs nat模式的性能瓶頸所在,就是分發伺服器轉發所有的請求到真實伺服器與轉發請求響應資料到用戶端,這樣就是一個性能瓶頸。
LVS NAT模式配置操作
1、準備工作,3台伺服器。一台用作Director server。2台用作real server。如上圖。
2、配置Director server為雙ip
[root@localhost ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.222.131 netmask 255.255.255.0 broadcast 192.168.222.255
inet6 fe80::20c:29ff:feaf:ff3a prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:af:ff:3a txqueuelen 1000 (Ethernet)
RX packets 53298 bytes 4735958 (4.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2690 bytes 453988 (443.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.136 netmask 255.255.255.0 broadcast 192.168.2.255
inet6 fe80::20c:29ff:feaf:ff44 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:af:ff:44 txqueuelen 1000 (Ethernet)
RX packets 11269 bytes 882315 (861.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1502 bytes 294418 (287.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- 檢視eth1具體配置,eth0為nat連網方式,不需要修改,eth1為host-only模式,需要修改為靜态ip,且配置ip位址。
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE="Ethernet"
BOOTPROTO="static"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="eth1"
DEVICE="eth1"
ONBOOT="yes"
IPADDR="192.168.2.136"
NETMASK="255.255.255.0"
- 設定Director server,開啟路由轉發功能
[root@localhost network-scripts]# echo "1">"/proc/sys/net/ipv4/ip_forward"
- 在Director server上安裝lvs管理工具:ipvsadmin,ipvsadmin這個工具稍後會深入一下。
[root@localhost ~]# yum install ipva
- 配置負載均衡規則為輪詢
[root@localhost ~]# ipvsadm -C --清空轉發規則
[root@localhost ~]# ipvsadm -A -t 192.168.222.131:80 -s rr --131上一單有80端口的tcp請求,即使用rr表示轉發政策為輪詢的方式轉發給一下的真實伺服器,這裡有好多負載均衡轉發算法,在下面會介紹下。
[root@localhost ~]# ipvsadm -a -t 192.168.222.131:80 -r 192.168.2.130 -m
[root@localhost ~]# ipvsadm -a -t 192.168.222.131:80 -r 192.168.2.129 -m
- 到此Director server已經全部配置完畢。
3、配置Real server。real server為host-only模式,這裡要做的就很簡單啦。
- 配置ip為靜态ip,且網關為Director server的内網ip
[root@localhost network-scripts]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE="Ethernet"
BOOTPROTO="static"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
IPADDR="192.168.2.130"
NETMASK="255.255.255.0"
GATEWAY="192.168.2.136"
- 2台real server的網絡設定一樣,隻是ip不一樣而已。這裡不一一列出,如上配置即可。
- 安裝nginx ,安裝之後修改頁面,打開80端口即可。
4、看下結果,在主機上用浏覽器打開。http://192.168.222.131/ ,不斷重新整理頁面即可看到來到2個real server的不同web站點的網頁。
[root@localhost ~]# curl 192.168.222.131
192.168.222.130:A
[root@localhost ~]# curl 192.168.222.131
192.168.2.129 c
[root@localhost ~]# curl 192.168.222.131
192.168.222.130:A
[root@localhost ~]# curl 192.168.222.131
192.168.2.129 c
5、到此,lvs的nat模式的配置實作也已完成,這個配置其實很簡單的,對吧。哈哈。
ipvsadmin工具指令講解
ipvsadm 參數詳解
- -A (--add-service) 在核心的虛拟伺服器清單中添加一條新的虛拟IP記錄。也就是增加一台新的虛拟伺服器。虛拟IP也就是虛拟伺服器的IP位址。
- -E (--edit-service) 編輯核心虛拟伺服器清單中的一條虛拟伺服器記錄
- -D (--delete-service) 删除核心虛拟伺服器清單中的一條虛拟伺服器記錄
- -C (--clear) 清除核心虛拟伺服器清單中的所有規則
- -R (--restore) 恢複虛拟伺服器規則
- -S (--save) 儲存虛拟伺服器規則,輸出為-R 選項可讀的格式
- -a (--add-server) 在核心虛拟伺服器清單的一條記錄裡添加一條新的Real Server記錄。也就是在一個虛拟伺服器中增加一台新的Real Server
- -e (--edit-server) 編輯一條虛拟伺服器記錄中的某條Real Server記錄
- -d (--delete-server) 删除一條虛拟伺服器記錄中的某條Real Server記錄
- -L|-l –list 顯示核心中虛拟伺服器清單
- -Z (--zero) 虛拟伺服器清單計數器清零(清空目前的連接配接數量等)
- --set tcp tcpfin udp 設定連接配接逾時值
- -t 說明虛拟伺服器提供的是tcp服務,此選項後面跟如下格式:[virtual-service-address:port] or [real-server-ip:port]
- -u 說明虛拟伺服器提供的是udp服務,此選項後面跟如下格式:[virtual-service-address:port] or [real-server-ip:port]
- -f fwmark 說明是經過iptables标記過的服務類型
- -s 此選項後面跟LVS使用的排程算法,有這樣幾個選項: rr|wrr|lc|wlc|lblc|lblcr|dh|sh,預設的排程算法是: wlc
- -p [timeout] 在某個Real Server上持續的服務時間。也就是說來自同一個使用者的多次請求,将被同一個Real Server處理。此參數一般用于有動态請求的操作中,timeout 的預設值為360 分鐘。例如:-p 600,表示持續服務時間為600分鐘。
- -r 指定Real Server的IP位址,此選項後面跟格式: [real-server-ip:port]
- -g (--gatewaying) 指定LVS 的工作模式為直接路由模式(此模式是LVS 預設工作模式)
- -i (-ipip) 指定LVS 的工作模式為隧道模式
- -m (--masquerading) 指定LVS 的工作模式為NAT模式
- -w (--weight) weight 指定Real Server的權值
- -c (--connection) 顯示LVS目前的連接配接資訊 如:ipvsadm -L -c
- -L --timeout 顯示“tcp tcpfin udp”的timeout值,如:ipvsadm -L --timeout
- -L --daemon 顯示同步守護程序狀态,例如:ipvsadm -L –daemon
- -L --stats 顯示統計資訊,例如:ipvsadm -L –stats
- -L --rate 顯示速率資訊,例如:ipvsadm -L --rate
- -L --sort 對虛拟伺服器和真實伺服器排序輸出,例如:ipvsadm -L --sort
儲存添加的虛拟ip記錄和ipvsadm的規則可以使用service ipvsadm save,還可以用-S或--save。清除所有記錄和規則除了使用-C,還以使用--clear。
下面列出幾個常用的查詢。
1、檢視記錄和規則
[root@localhost network-scripts]# 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.222.131:80 rr
-> 192.168.2.129:80 Masq 1 1 0
-> 192.168.2.130:80 Masq 1 0 0
InActConn:
指非活躍連接配接數,我們将處于
TCP ESTABLISH
狀态以外的連接配接都稱為不活躍連接配接。例如處于
SYN_RECV
狀态的連接配接,處于
TIME_WAIT
狀态的連接配接等。
ActiveConn:是活動連接配接數,也就是tcp連接配接狀态的ESTABLISHED;
Weight:輪詢權重
2、選項是統計自該條轉發規則生效以來的包
[root@localhost network-scripts]# ipvsadm -L --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.222.131:http 50 263 134 46273 20519
-> 192.168.2.129:http 32 178 83 31215 13069
-> 192.168.2.130:http 18 85 51 15058 7450
Conns (connections scheduled) : 已經轉發過的連接配接數
InPkts (incoming packets) :入包個數
OutPkts (outgoing packets) : 出包個數
InBytes (incoming bytes) :入流量(位元組)
OutBytes (outgoing bytes) : 出流量(位元組)
3、顯示速率資訊
[root@localhost network-scripts]# ipvsadm -L --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 192.168.222.131:http 0 1 0 216 87
-> 192.168.2.129:http 0 1 0 212 85
-> 192.168.2.130:http 0 0 0 4 2
CPS (current connection rate) :每秒連接配接數
InPPS (current in packet rate) : 每秒的入包個數
OutPPS (current out packet rate): 每秒的出包個數
InBPS (current in byte rate) : 每秒入流量(位元組)
OutBPS (current out byte rate) 每秒入流量(位元組)
lvs中的集中排程模式
1、rr(round robin:輪詢。 --在伺服器池中無窮的循環周遊。
2、wrr(weighted round robin):權重輪詢法。 --根據權重值,來配置設定請求連接配接,處理的請求連接配接數與權重值的比率一緻。
3、lc(least-connection):最少連接配接法。 --當請求到達director時,director檢視活動和非活動的連接配接數量,以确定把請求分發給哪個伺服器,director将叢集節點目前的活動連接配接數量x256再加上不活動的連接配接數量,得到借點的開銷值。最低開銷值的節點勝出,被分發給新的入站請求。(如果開銷一樣,則第一個節點被選中)。
4、wlc(weighted least-connection):帶權重的最少連接配接法。 --先如lc算出叢集節點的開銷值,然後除以配置設定給其的權重值,最小值節點勝出,将入站請求分發給它。
5、lblc(locality-based least-connection):基于本地的最少連接配接法。 --基于局部的最小連接配接,當realserver是緩存伺服器的時候用的比較多。
6、lblcr(locality-based least-connection with replication):帶複制的基于局部的最小連接配接。 --當realserver是緩存伺服器的時候用的比較多。
7、dh(destination hashing):目标散列法
8、sh(source hashing):源散列法。 --同一個ip的用戶端總是分發給同一個realserver。相當于有客戶粘性,與nginx中的iphash一緻。
9、sed(shortest expected delay):最短預期延遲法。 --最短延時預測(ci+1)/ui,ci是連接配接數,ui是權重值。在wlc方法上做啦輕微改進,這些服務使用tcp,而且當群節點在處理每個請求時保持在活動狀态。計算方法:每個叢集節點的的開銷值是通過将活動的連接配接數+1計算的。然後開銷值除以配置設定權重值,得到的就是sed值,值少的叢集節點勝出。
10、nq(never queue):永不排隊法。 --沒有隊列,配置設定請求給空閑的伺服器,沒有空閑的伺服器就找響應最快的。
總結
接下來是大家最喜歡的總結内容啦,内容有三,如下:
1、希望能關注我其他的文章。
2、部落格裡面有沒有很清楚的說明白,或者你有更好的方式,那麼歡迎加入左上方的2個交流群,我們一起學習探讨。
3、你可以忘記點贊加關注,但千萬不要忘記掃碼打賞哦。