這是悟空的第 158 篇原創文章
原文連結:首發悟空聊架構
官網:www.passjava.cn
你好,我是悟空。
上篇我們講了Keepalived 底層原理上篇,中篇還是得繼續呀,但是發現中篇內容還是很多,一篇講不完,所以先講 Keepalived 的路由原理。
在寫的過程中,發現路由原理其實挺枯燥的,我想把這個主題用通俗易懂、且有趣的方式講解出來,但是一直找不到合適的切入點,一次偶然的對話讓我的靈感迸發。
話說之前大學放暑假的時候,我到一個餐廳打工兩個月,Title 是初級傳菜員
。正是這次打工經驗,為我帶來了一波潛藏已久的素材,請聽聽我的故事吧~
本文主要內容如下:
在餐廳主要有這幾種角色:
為什麼需要傳菜員這個角色?有了傳菜員這個角色後,發生了什麼呢?
流程圖如下:
① 客戶點菜下單。
② 服務員記錄菜名、上菜時間。這裡的上菜時間是指客戶要求的上菜時間,因為有些客戶可能想等朋友一起來了再吃。
③ 服務員將一份訂單交給傳菜員,另外一份訂單留在包間。
④ 傳菜員大聲通知多位廚師有哪些菜要做,什麼時候開始上菜。
⑤ 廚師準備食材和烹飪。如果缺少食材,廚師還會告訴傳菜員,由傳菜員轉告服務員說這道菜不能做。
⑥ 廚師做好後將菜裝在盤子裡,然後遞給傳菜員。
⑦ 傳菜員將訂單上對應的菜劃掉,表示已經做了。
⑧ 傳菜員將菜端給服務員。
⑨ 服務員將菜從訂單上劃掉。
⑩ 服務員將菜端上餐桌。
這個流程簡單來說就是客戶下單->服務員傳單->傳菜員通知->廚師烹飪->傳菜員傳菜->服務員上菜。
上面的流程不正是服務員請求資料,將請求都發給了傳菜員,傳菜員將請求轉發給了廚師,廚師處理完後返回結果。妙啊!!
上篇我們講到 Keepalived 的負載均衡排程演演算法,通過這個演演算法選出某臺真實服務來處理本次使用者端請求。
就好比傳菜員要將要做的菜,告訴其中一個廚師(一般是告訴大廚)。
而如何告訴廚師呢?是用
喇叭
喊,還是傳呼機
,還是走到他旁邊告訴他?
服務員與廚師對話的方式
對於 Keepalived 來說,選擇了一個真實伺服器後,後續還有兩個流程需要梳理下:
上面兩個流程就是 Keepalived 的路由方案要做的事。
Keepalived 有三種路由方案:NAT、TUN、DR。
具體的設定哪種路由方案在 keepalived.conf 組態檔中,其中有一個 lb_kind 設定,可以設定成 NAT、DR、TUN 三種。目前設定的是 DR 模式。
還有一個設定 lb_algo,這個是設定排程演演算法的,比如這裡設定的 wrr 加權輪詢排程演演算法。
上篇我們說到 Keepalived 是利用了 LVS 模組的功能來實現負載均衡的。那麼 LVS 的結構是怎麼樣的呢?
分為兩個模組:前端的負載均衡器(Load Balance,簡稱 LB),後端的多臺真實伺服器(Real Server, 簡稱 RS)組成。LB 負責流量轉發,RS 負責處理請求,然後將請求返回。
NAT 的全稱是 Network Address Translation,網路地址轉換。它有兩個功能:
對於 Keepalived 來說,這種模式就好比餐廳的標準下單上菜模式:多個服務員將訂單資料轉給傳菜員,傳菜員通知廚師進行烹飪,廚師把菜做好後轉給傳菜員,傳菜員負責把菜傳遞給服務員。
如下圖所示,LVS 負載排程器有兩塊網路卡,設定了不同的 IP 地址,網路卡 eth0 設定為公網 VIP 與外部網路連通,網路卡 eth1 設定為私有 VIP 與內部網路通過交換裝置相互連線,
範例如下:
eth0 網路卡 -> 公網 VIP -> 外部網路
eth1 網路卡 -> 私有 VIP -> 交換裝置 > 內網網路
原理圖如下所示:
① 比如現在 eth0 網路卡設定了一個公有 VIP 如 10.1.2.88,使用者端傳送的請求都是到這個 Public VIP(目標地址)。
② 主 LVS Router 負責接收請求,將請求的目的地址(Public VIP)替換成 NAT VIP(192.168.56.88)。
③ 這個 NAT VIP 和後端伺服器同屬一個區域網,可以相互存取,請求經過負載均衡排程選擇一個真實伺服器。
④ LVS 修改封包中的目標地址和目標埠為真實伺服器的。
⑤ 真實伺服器處理完請求後,將應答資料返回給 LVS Router。
⑥ LVS Router 將應答資料的源 IP 地址 NAT VIP 和埠轉換成 Public VIP 和 LVS 的埠,然後轉發給外部網路的使用者端。
對於使用者端而言,它只和 Public VIP 打交道,並不知道 NAT VIP,更不知道真實伺服器的 IP 地址,這個過程也稱為 IP 偽裝。
對於服務員