[toc]html
在本實驗環境中咱們沒有辦法爲你們提供多臺服務器來模擬集羣環境,由此咱們 docker 工具來建立多個 container 來模擬集羣所須要的多臺服務器。前端
docker 能夠簡單的理解爲很是輕量級的虛擬機工具,而 container 則理解爲建立的虛擬機。nginx
集羣系統中,服務器資源能夠簡單分爲兩種角色:web
整個集羣系統結構:算法
咱們將經過這樣的一些步驟來完成這次的實驗:docker
LVS 成功測試:咱們可以經過 VIP 訪問咱們的 Nginx 站點,通過屢次的刷新咱們可以訪問另外一個站點的內容(以顯示的內容以做區分,由於負載並不高,因此須要不少次刷新,點擊地址欄,按住 F5 不放)ubuntu
首先爲了可以使用 IPVS 內核模塊,咱們將在宿主機中安裝 ipvsadm,並嘗試可否使用:vim
# 更新源 sudo apt-get update # 安裝 ipvsadm 工具 sudo apt-get install ipvsadm # 嘗試使用 ipvsadm sudo ipvsadm -L
使用 docker 建立所需 container,使用如下命令建立:後端
docker run --privileged --name=RealServer1 -tdi ubuntu docker run --privileged --name=RealServer2 -tdi ubuntu
命令講解:瀏覽器
docker run:建立 docker 容器
name 參數:給容器命名,方便區分
tid 參數:分配 tty,可以與之交互
ubuntu:指定容器鏡像,這裏使用 ubuntu 鏡像
建立命令執行完成後,目前有兩個 container:
RealServer1:IP 地址爲 192.168.0.2。下文簡稱 RIP1 RealServer2:IP 地址爲 192.168.0.3。下文簡稱 RIP2
能夠經過 ifconfig 命令查看各自的 IP 地址,此處的地址是由於按順序,且按默認配置建立所致使
RealServer 部署 Nginx 來提供 Web 服務,RealServer1 和 RealServer2 操做步驟相同,此處以 RealServer1 爲示例:
首先登陸 RealServer1:
# 經過 attach 命令登陸 RealServer1 docker attach RealServer1
安裝相關工具
apt-get update apt-get install vim -y apt-get install nginx -y service nginx start
按 i 鍵插入,按 esc 再輸入 :wq 保存退出。
注意若完成了 RealServer1 的配置以後,若是咱們不想打開新的終端,能夠經過 ctrl+p+q 的組合快捷鍵脫離當前機器的登陸,切勿使用 exit 的方式退出 container,這樣的方式關閉服務器的。 脫離以後便會返回到 shiyanlou 的 zsh 交互,能夠經過 docker attach RealServer2 的命令來登陸另外一臺機器,而後作相似的操做(同上的軟件安裝操做以及 nginx 啓動操做) 接下來就修改 nginx 頁面,以下所示:
#在 RealServer2 container 環境 vi /usr/share/nginx/html/index.html
完成兩臺服務器的配置以後,咱們經過 service nginx start 啓動服務器中 nginx 服務。
至此咱們完成兩臺 Web 服務器的配置,咱們能夠打開宿主機 firefox 瀏覽器,地址欄分別輸入兩個 IP 地址,來檢驗咱們的配置成功:
sudo service nginx stop
LoadBalancer 的對外 IP 地址爲 VIP,即 VIP 地址爲 120.26.15.9 (注意,你的 VIP 地址可能和個人不同,根據本身實際狀況來)。對內 IP 稱爲 RIP,此時 RIP 爲 192.168.0.1。
echo '1' | sudo tee /proc/sys/net/ipv4/ip_forward
查看當前機器內核路由轉發開啓狀況:
cat /proc/sys/net/ipv4/ip_forward
獲得的值爲 1,說明此機器已開啓內核路由轉發。進行下一步。
sudo ipvsadm -A -t 120.26.15.9:80 -s rr #定義集羣服務 sudo ipvsadm -a -t 120.26.15.9:80 -r 192.168.0.2 -m #添加 RealServer1 sudo ipvsadm -a -t 120.26.15.9:80 -r 192.168.0.3 -m #添加 RealServer2 sudo ipvsadm -l #查看 ipvs 定義的規則
上面命中 ipvsadm 參數講解:
# 添加集羣服務 -A:添加一個新的集羣服務 -t: 使用 TCP 協議 -s: 指定負載均衡調度算法 rr:輪詢算法(LVS 實現了 8 種調度算法) 120.26.15.9:80 定義集羣服務的 IP 地址(VIP) 和端口 # 添加 Real Server 規則 -a:添加一個新的 RealServer 規則 -t:tcp 協議 -r:指定 RealServer IP 地址 -m:定義爲 NAT 上面命令添加了兩個服務器 RealServer1 和 RealServer2
分別登入兩臺宿主機,講nginx服務分別打開
打開瀏覽器,輸入 VIP 地址:120.26.15.9:
由於訪問壓力比較小,調度算法不會請求切換服務器,能夠按住 F5 快速屢次刷新查看頁面變化效果 以上便實現了 LVS 的 NAT 負載均衡系統。
與 NAT 方式相同,咱們將經過 docker 來模擬咱們的集羣環境。
集羣系統中,服務器資源能夠簡單分爲兩種角色:
整個集羣系統結構:
如果咱們沿用 NAT 的實驗環境,咱們須要作環境的清理:
1.首先清除 ipvsadm 的規則:
sudo ipvsadm -C
2.刪除以前所建立的 container,雖然都是提供 Web 服務,可是在 DR 模式中須要修改內核參數與建立網卡別名,須要超級權限,因此不能沿用以前的 container:
# 關閉全部的 container docker stop `docker ps -aq` # 刪除全部的 container docker rm `docker ps -aq`
3.安裝 ipvsadm 工具
由於在 NAT 實驗中咱們已安裝因此可跳過該步驟,如果新啓動的環境請參考 NAT 中的步驟,此處提示務必在宿主機環境中執行 ipvsadm -L 的驗證步驟,如果不執行該步驟,在 LoadBalancer 的 container 中咱們將沒法加載 IPVS 的內核模塊。
docker run --privileged --name=LoadBalancer -tid ubuntu docker run --privileged --name=RealServer1 -tid ubuntu docker run --privileged --name=RealServer2 -tid ubuntu
首先登陸 RealServer1:
# 經過 attach 命令登陸 RealServer1 docker attach RealServer1
安裝相關工具
apt-get update apt-get install vim -y apt-get install nginx -y vi /usr/share/nginx/html/index.html service nginx start
1.修改內核參數
以 RealServer1 爲例,登陸 container:
執行下列命令:
# 設置只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求 echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore # 爲了保險本身能夠查看一下是否成功修改 cat /proc/sys/net/ipv4/conf/lo/arp_ignore # 設置對查詢目標使用最適當的本地地址.在此模式下將忽略這個IP數據包的源地址並嘗試選擇與能與該地址通訊的本地地址.首要是選擇全部的網絡接口的子網中外出訪問子網中包含該目標IP地址的本地地址. 若是沒有合適的地址被發現,將選擇當前的發送網絡接口或其餘的有可能接受到該ARP迴應的網絡接口來進行發送. echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce # 使得上面的配置當即生效 sysctl -p
ARP 的內核參數: arp_ignore 部分參數:定義了本機響應 ARP 請求的級別
0表示目標 IP 是本機的,則響應 ARP 請求。默認爲 0
1若是接收 ARP 請求的網卡 IP 和目標 IP 相同,則響應 ARP 請求
arp_announce 參數:定義了發送 ARP 請求時,源 IP 應該填什麼。
0 表示使用任一網絡接口上配置的本地 IP 地址,一般就是待發送的 IP 數據包的源 IP 地址 。默認爲 0
1 儘可能避免使用不屬於該網絡接口(即發送數據包的網絡接口)子網的本地地址做爲 ARP 請求的源 IP 地址。大體的意思是若是主機包含多個子網,而 IP 數據包的源 IP 地址屬於其中一個子網,雖然該 IP 地址不屬於本網口的子網,可是也能夠做爲ARP 請求數據包的發送方 IP。
2 表示忽略 IP 數據包的源 IP 地址,老是選擇網絡接口所配置的最合適的 IP 地址做爲 ARP 請求數據包的源 IP 地址(通常適用於一個網口配置了多個 IP 地址)
只有目的 IP 是本機器中的一員時纔會作相應的處理,因此須要添加網卡別名:
# 配置虛擬IP ifconfig lo:0 192.168.0.10 broadcast 192.168.0.10 netmask 255.255.255.255 up # 添加路由,由於本就是相同的網段因此能夠不添加該路由 route add -host 192.168.0.10 dev lo:0 service networking restart
ifconfig eth0:0 192.168.0.10 netmask 255.255.255.0 up
查看網卡信息:ifconfig
在 LoadBalancer 中添加 IPVS 規則:
ipvsadm -A -t 192.168.0.10:80 -s rr # 定義集羣服務 ipvsadm -a -t 192.168.0.10:80 -r 192.168.0.3 -g # 添加 RealServer1 ipvsadm -a -t 192.168.0.10:80 -r 192.168.0.4 -g # 添加 RealServer2 ipvsadm -l # 查看 ipvs 定義的規則
ipvsadm 命令參數講解:
# 添加集羣服務 -A:添加一個新的集羣服務 -t: 使用 TCP 協議 -s: 指定負載均衡調度算法 rr:輪詢算法(LVS 實現了 8 種調度算法) 192.168.0.10:80 定義集羣服務的 IP 地址(VIP) 和端口 # 添加 Real Server 規則 -a:添加一個新的 RealServer 規則 -t:tcp 協議 -r:指定 RealServer IP 地址 -g:定義爲 DR 模式 上面命令添加了兩個集羣服務器 RealServer1 和 RealServer2
LVS 成功測試:咱們可以經過 VIP 訪問咱們的 Nginx 站點,通過屢次的刷新咱們可以訪問另外一個站點的內容(以顯示的內容以做區分,由於負載並不高,因此須要不少次刷新,點擊地址欄,按住 F5 不放)
查看 ipvsadm 中的統計數據。