07 July 2014
前一篇有講過了,
Keepalived是一個routing software,
它可以做到load balancing和high-availability,
前一篇也教怎麼set up HA,
這篇會講怎麼set up load balancing,
理論上架構應該要和下圖中一樣,才會比較合理,
有N檯load-balancer,專門做load balancing,
有N檯web!
而這些load balancer,都會裝keepalived,然後去binding Virtual IP!


但基於測試方便加上懶得安裝這麼多檯機器來說明,
先簡化成下圖,
每一檯server身兼load balancer和web server,






前一篇一樣,假設我們有兩檯server,
IP分別為
  1. 10.1.190.142
  2. 10.1.190.143

virtual ip:10.1.190.150

在開始之前,請先去完成前一篇的所有操作,

1. Generate hash

首先,先gen hash,
這hash是給load balancer用的,
原因是load balancer會去確認每一檯的web server是活著的,
確認時會帶著這個hash值!
因為有兩檯機器,所以要gen 2組,
root@host1:~$ genhash -s 10.1.190.142 -p 80 -u /index.html
MD5SUM = 043e8a8eeaf59e7ef9c6b4cd6f71a7de

root@host1:~$ genhash -s 10.1.190.143 -p 80 -u /index.html
MD5SUM = 66d84fe2b7e20944dd5d077e768b2cfb


2. Write a script for handling iptables

在這步驟,要寫一隻script,
負責add和delete rule的,
為什麼要add?
因為當如果沒有add virtual ip進去rule,
當load balancer把packet轉進來時,是送不進來的!
#!/bin/bash                                                                                                                                                                 

VIP=$2

count=$(iptables -t nat -L| grep $VIP | wc -l)

case "$1" in
--add)
if [[ $count == 0 ]]; then
iptables -A PREROUTING -t nat -d $VIP -p tcp -j REDIRECT
fi
;;
--del)
if [[ $count > 0 ]]; then
iptables -D PREROUTING -t nat -d $VIP -p tcp -j REDIRECT
fi
;;
esac

exit 0

3. Configuration settings

基本上設置跟第一篇沒有什麼太大差別,
首先只有第26,27行,多了兩個指令,
分別是當這檯機器進入master模式時,要把rule刪除
以及進入backup時,要把rule加進去!

以及增加了31~60行的setting,
記得第一檯和第二檯都要進行設定,但一樣要把state,priority, router_id改成符合該host的設定!
global_defs {
notification_email {
kenyang@xxx.com
}
notification_email_from xxxx@example.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id host1 # 用來識別是哪檯機器,如果postfix有安裝,在寄信的時候,title就會跟你說是哪檯機器有問題
}

vrrp_instance VI_1 { # VI_1 可以改成自己想要的string

state MASTER # MASTER意思是這檯為主要的機器

interface eth0 # 把virtual ip binding在eht0上

virtual_router_id 1 # 0~255之間,用來識別是哪一個instance
priority 100

virtual_ipaddress {
10.1.190.150/24
}

smtp_alert # 當有問題時要發信通知

notify_master "/etc/keepalived/handle_iptable.sh --del 10.1.190.150" # 當這檯機器進入master模式時,要把rule刪除
notify_backup "/etc/keepalived/handle_iptable.sh --add 10.1.190.150" # 當這檯機器進入backup模式時,要把rule加入
}

# virtual web server
virtual_server 10.1.190.150 80 {
delay_loop 10 # n秒確認底下的web一次
lb_algo rr # 使用Round Robin的演算法做load balancing (rr, wrr, al, wlc, ......etc)
lb_kind DR # Forwarding的方法 (dr, nat, tun)
persistence_timeout 5 # timeout for persistent connection
protocol TCP

real_server 10.1.190.142 80 {
HTTP_GET { # 使用HTTP_GET的方式進行確認web活著
url {
path /index.html
digest 043e8a8eeaf59e7ef9c6b4cd6f71a7de # 剛剛第一步驟gen的hash
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 2
}
}
real_server 10.1.190.143 80 {
HTTP_GET { # 使用HTTP_GET的方式進行確認web活著
url {
path /index.html
digest 66d84fe2b7e20944dd5d077e768b2cfb # 剛剛第一步驟gen的hash
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 2
}
}
}



4. Verify

完成上述設定以後,
先把keepalived reload,
service keepalived reload

reload完成以後,
先在第一檯打下面的指令,
為什麼是在第一檯打?因為現在第一檯是master,它搶到virtual ip,
所以load balancing的工作是交由第一檯來做的!
ipvsadm -ln

打完應該會看到下面的內容,
10.1.190.150這檯底下有兩檯主機,
分別是142, 143,
load balancer就是透過上述的HTTP_GET去確認web server是活著的,
比較特別的有兩個參數,
  1. ActiveConn: 簡言之這檯機器目前有幾個人連上來
  2. InActConn: 有幾檯機器的tcp status不是established
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.190.150:80 rr persistent 5
-> 10.1.190.142:80 Route 1 0 0
-> 10.1.190.143:80 Route 1 0 0

這時候在電腦上的browser瀏覽10.1.190.150,
然後在手機(或者其他檯電腦上)也瀏覽10.1.190.150
然後再馬上在第一檯機器打下面的指令
ipvsadm -ln
應該會發現ActiveConn都變成1了!
如果你有第三檯機器,你可以試試看再連線10.1.190.150!
這時某一檯的ActiveConn會變成2!

















blog comments powered by Disqus