最近希望能夠配置一下負載均衡,在虛擬機上面,但是網上找了很多資料很零散,對於不了解的人,很多不夠詳細,最近終於做好了,把具體的步驟寫下來,方便各位網友查閱學習
這個實驗需要安裝nginx如果沒有安裝過,請參考:
linux安裝nginx:http://www.cnblogs.com/aspirant/p/6714548.html
如果安裝了Centos系統之后,發現無法上網,其實很簡單,只需要做一個小小的配置,
使用root用戶進入 /etc/sysconfig/network-script/ifcfg-ens33 里面有一項是 onboot =no 改成 onboot =yes 然后重啟一下機器,命令:reboot now(你的網卡可能不是ens33只需要 只需要進入目錄network-script/ 然后 執行ifcfg-e 按一下TAB鍵,看一下你網卡是什么名字就可以)
這種配置最重要的還是腳本的編寫,為了各位更方便的查詢問題所在,我將腳本文檔上傳,以便查閱
http://files.cnblogs.com/files/aspirant/loadbalance.rar
里面包含了兩個文件,
(a)一個是keepalived.conf, 用於 director server 和backup server 的keepalived配置;
(b)一個是realServer.sh 用於 Realserver1 和 realserver2 的配置
(1) 我們的系統是CentOS7 目前需要四台機器,分別為 Director機器 兩台:master,slave
真實機器realserver1,realserver2;搭建的系統架構圖如下:
- 所用系統:CentOS7
- 真實web服務器(RS1):192.168.137.5
- 真實web服務器(RS2):192.168.137.6
- Master負載均衡服務器:192.168.137.101
- backup負載均衡服務器:192.168.137.102
- 系統對外虛擬IP:192.168.137.100
從架構可以看出來,從用戶的角度來說,會直接訪問192.168.137.100,也就是說不管系統如何設計要保證此ip的可用性,
從架構師的角度考慮:
用戶訪問192。168.137.100位VIP:Virtual IP,虛擬iP,用戶不關心內部如何協調,我們使用
192.168.137.101 作為主機 Master機器,然后使用keepalived 技術配置 HA(high avilable)配置高可用行,也就是說如果 分發的機器Master宕機了,keepalive會自動轉到 backup機器,
這就是HA配置,保證master即使宕機了,也不影響轉發;
master機器負責把用戶的請求轉發到 真實的機器, RS1和RS2,他們會按照一定的輪訓機制,訪問,如果RS1宕機,master會自動轉發到RS2;
我們在兩台負載均衡的機器上面,配置keepalived保證分發機器的高可用行HA;
系統的 IP配置如下:
服務器名 | IP地址 | 虛擬設備名 | 虛擬IP |
Director Server | 192.168.137.101 | ens33:0 | 192.168.137.100 |
Backup Server | 192.168.137.102 | ens33:0 | 192.168.137.100 |
Real Server1 | 192.168.137.5 | lo:0 | 192.168.137.100 |
Real Server2 | 192.168.137.6 | lo:0 | 192.168.137.100 |
二、Keepalived的安裝配置過程
兩台負載均衡服務器上均需要安裝、配置Keepalived,ipvsadm
(1)keepalived 作用: 保證每個服務器都是正常的,如果有宕機情況會自動切換;
(2) ipvsadm ==>用來管理負載均衡的機器,
2.1 安裝 ipvsadm
(1) 執行yum install -y ipvsadm;
安裝IPVS后,就可以配置LVS集群了,首先在Director Server上綁定一個虛擬IP(也叫VIP),此IP用於對外提供服務,執行如下命令:
[root@localhost ~]#ifconfig ens33:0 192.168.137.100 broadcast 192.168.137.100 netmask 255.255.255.255 up
如果此處出現錯誤:SIOCSIFFLAGS: 無法指定被請求的地址
需要把網卡重啟一下使用命令:
/etc/init.d/network restart
此處在ens33設備上綁定了一個虛擬設備ens:33,同時設置了一個虛擬IP是192.168.137.100,也就是上面我們規划的IP地址,然后指定廣播地址也為192.168.137.100,需要特別注意的是,這里的子網掩碼為255.255.255.255。
然后給設備ens:33指定一條路由,執行如下指令:
[root@localhost ~]#route add -host 192.168.137.100 dev ens33:0
接着啟用系統的包轉發功能,從而使系統充當路由器,執行如下指令:
[root@localhost ~]#echo "1" >/proc/sys/net/ipv4/ip_forward
指令中,參數值為1時啟用ip轉發,為0時禁止ip轉發。其實在DR模式中,開啟系統的包轉發功能不是必須的,而在NAT模式下此操作是必須的。
然后開始配置ipvs,執行如下操作:
[root@localhost ~]#ipvsadm -C
[root@localhost ~]#ipvsadm -A -t 192.168.137.100:80 -s rr -p 600
[root@localhost ~]#ipvsadm -a -t 192.168.137.100:80 -r 192.168.137.5:80 -g
[root@localhost ~]#ipvsadm -a -t 192.168.137.100:80 -r 192.168.137.6:80 -g
上面操作中,第一行是清除內核虛擬服務器列表中的所有記錄,第二行是添加一條新的虛擬IP記錄。這個新的IP是192.168.137.100,同時指定持續服務時間為600秒。第三、四行是在新加虛擬IP記錄中添加兩條新的Real Server記錄,並且指定LVS 的工作模式為直接路由模式。
最后,啟動LVS服務,執行如下操作:
[root@localhost ~]#ipvsadm
在backup server上面也要這么配置ipvsadm;
這樣,LVS在Director Server上的配置就完成了。
2.1 安裝Keepalived
$ yum -y install keepalived
2.2 配置Keepalived
$ vim /etc/keepalived/keepalived.conf
配置信息如下
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc #設置報警郵件地址,可以設置多個,每行一個。 failover@firewall.loc #需開啟本機的sendmail服務 sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc #設置郵件的發送地址 smtp_server 127.0.0.1 #設置smtp server地址 smtp_connect_timeout 30 #設置連接smtp server的超時時間 router_id LVS_DEVEL #表示運行keepalived服務器的一個標識。發郵件時顯示在郵件主題的信息 } vrrp_instance VI_1 { state MASTER #指定keepalived的角色,MASTER表示此主機是主服務器,BACKUP表示此主機是備用服務器 interface ens33 #指定HA監測網絡的接口 virtual_router_id 51 #虛擬路由標識,這個標識是一個數字,同一個vrrp實例使用唯一的標識。即同一vrrp_instance下,MASTER和BACKUP必須是一致的 priority 100 #定義優先級,數字越大,優先級越高,在同一個vrrp_instance下,MASTER的優先級必須大於BACKUP的優先級 advert_int 1 #設定MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒 authentication { #設置驗證類型和密碼 auth_type PASS #設置驗證類型,主要有PASS和AH兩種 auth_pass 1111 #設置驗證密碼,在同一個vrrp_instance下,MASTER與BACKUP必須使用相同的密碼才能正常通信 } virtual_ipaddress { #設置虛擬IP地址,可以設置多個虛擬IP地址,每行一個 192.168.137.100 } } virtual_server 192.168.137.100 80 { #設置虛擬服務器,需要指定虛擬IP地址和服務端口,IP與端口之間用空格隔開 delay_loop 6 #設置運行情況檢查時間,單位是秒 lb_algo rr #設置負載調度算法,這里設置為rr,即輪詢算法 lb_kind DR #設置LVS實現負載均衡的機制,有NAT、TUN、DR三個模式可選 nat_mask 255.255.255.0 persistence_timeout 0 #會話保持時間,單位是秒。這個選項對動態網頁是非常有用的,為集群系統中的session共享提供了一個很好的解決方案。 #有了這個會話保持功能,用戶的請求會被一直分發到某個服務節點,直到超過這個會話的保持時間。 #需要注意的是,這個會話保持時間是最大無響應超時時間,也就是說,用戶在操作動態頁面時,如果50秒內沒有執行任何操作 #那么接下來的操作會被分發到另外的節點,但是如果用戶一直在操作動態頁面,則不受50秒的時間限制 protocol TCP #指定轉發協議類型,有TCP和UDP兩種 real_server 192.168.137.5 80 { #配置服務節點1,需要指定real server的真實IP地址和端口,IP與端口之間用空格隔開 weight 1 #配置服務節點的權值,權值大小用數字表示,數字越大,權值越高,設置權值大小可以為不同性能的服務器 #分配不同的負載,可以為性能高的服務器設置較高的權值,而為性能較低的服務器設置相對較低的權值,這樣才能合理地利用和分配系統資源 TCP_CHECK { #realserver的狀態檢測設置部分,單位是秒 connect_timeout 3 #表示3秒無響應超時 nb_get_retry 3 #表示重試次數 delay_before_retry 3 #表示重試間隔 connect_port 8066 } } real_server 192.168.137.6 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 8066 } } }
要注意的地方:
(1)此處可以直接復制過去,注意兩個問題,里面是中文因此 ,需要設置一下vi的配置進入 /etc/virc ,在底部輸入
set fileencodings=utf-8,gbk,ucs-bom,cp936
即可讓中文正常顯示,
(2)如果使用了XShell 命令中不能正常顯示中文,那么請點擊File ==>Properties==>Terminal ==>Encoding ==>選擇UTF-8 點擊確定;即可正常顯示中文;
(3)可以直接把上面的代碼復制下來放到新建文件放到自己的機器上面,但是別忘了需要轉換一下格式,因為我們使用window機器拷貝的,所以在linux上面我們需要轉化一下轉成linux可以使用的腳本,因為window的回車跟linux的回車是不同的,使用dos2unix轉化,
- 我們使用 (a) yum install dos2unix
- (b) dos2unix keepalived.conf
- 轉換完了,就可以用了;
我們可以輸入ifconfig,一般會出現兩個網卡,一個是ens33還有一個是回環地址lo,對於分發機器master 和backup 我們需要在添加 ens33:0網卡,對於真實機器realserver1,realserver2,我們需要添加lo:0網卡,下一步就能看到這是不同的;
(5)persistence_timeout 0:指的是在一定的時間內來自同一IP的連接將會被轉發到同一realserver中。而不是嚴格意義上的輪詢。默認為50s,因此在測試負載均衡是否可以正常輪詢時,最好先把值設置為0,方便查看
(6)TCP_CHECK { :注意TCK_CHECK和 {之間有一個空格,忘記打這個空格的話,可能會出現后面用ipvsadm查看時,某個RS查看不到
(7) 執行 sh realServer.sh start 后報錯:realServer.sh:行6: /etc/rc.d/init.d/functions: 權限不夠
需要把functions的權限修改一下 使用 chmod 777 /etc/rc.d/init.d/functions ; 即可
(8)另外一個台備用服務器上Keepavlied的配置類似,只是把MASTER改為backup,把priority設置為比MASTER低,設置為90;
keepalived的2個節點執行如下命令,開啟轉發功能:
# echo 1 > /proc/sys/net/ipv4/ip_forward
2.3 兩台RS上為lo:0綁定VIP地址、抑制ARP廣播
兩台 RS機器上面都要安裝 nginx:
linux安裝nginx:http://www.cnblogs.com/aspirant/p/6714548.html
然后我們在nginx的訪問目錄:我的是這個: /home/zkpk/nginx-1.8.0/html/index.html中
RS1的 index.html 修改一下,這樣方便測試,比如輸入 我是 RS1;
RS2的 index.html 修改一下,這樣方便測試,比如輸入 我是 RS2;
在兩台RS上編寫以下腳本文件realserver.sh
#!/bin/bash #description: Config realserver VIP=192.168.137.100 /etc/rc.d/init.d/functions case "$1" in start) /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP /sbin/route add -host $VIP dev lo:0 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce sysctl -p >/dev/null 2>&1 echo "RealServer Start OK" ;; stop) /sbin/ifconfig lo:0 down /sbin/route del $VIP >/dev/null 2>&1 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce echo "RealServer Stoped" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0
在兩台RS上分別執行腳本
$ sh realserver.sh start
執行完了之后,驗證一下 使用ifconfig 你會發現 回環地址的網卡會多出一個lo:0的 網卡;
2.4 啟用Keepavlied
$ service keepalived start
之后通過ipvsadm -L命令可以查看VIP是否已經成功映射到兩台RS,如果發現有問題,可以通過/var/log/message查看錯誤原因,注意此處的192.168.137:100 你的可能不是,而是localhost之類的,也沒有錯;
接下來就可以測試可用性了
2.4.1 測試負載均衡
2.4.2測試keepalived的監控檢測
停掉RS1的nginx,然后在MASTER負載均衡服務器上可以到看VIP映射關系中已經剔除了192.168.137.5
(1)停掉RS1的nginx
使用 pkill -9 nginx 殺死進程
如果需要開啟nginx使用: /usr/local/nginx/sbin/nginx 啟動nginx進程;
然后 ps -ef |grep nginx 可以查看nginx是否啟動成功;
(2)實驗測試1
瀏覽器訪問 http://192.168.137.100 看看是否啟動成功,nginx是否顯示;
實驗2
手動關閉192.168.137.5 節點的nginx,service nginx stop 在客戶端上去測試訪問 http://192.168.137.100 結果正常,不會出現訪問失敗的情況,
實驗3
手動重新開啟 192.168.137.5 節點的nginx, service nginx start 在客戶端上去測試訪問 http://192.168.137.100 結果正常,按照 rr 調度算法訪問5節點和6節點。
實驗4
測試 keepalived 的HA特性,首先在master上執行命令 ip addr ,可以看到100的vip在master節點上的;這時如果在master上執行 service keepalived stop 命令,這時vip已經不再master上,在slave節點上執行 ip addr 命令可以看到 vip 已經正確漂到slave節點,這時客戶端去訪問 http://192.168.137.100 訪問依然正常,驗證了 keepalived的HA特性。
至此實驗結束;
參考資料:
逐條配置:
http://ixdba.blog.51cto.com/2895551/554799
http://blog.csdn.net/u012852986/article/details/52412174
http://www.jb51.net/article/38368.htm
http://www.cnblogs.com/llhua/p/4195330.html
具體部署:
http://www.cnblogs.com/liwei0526vip/p/6370103.html
nginx啟動停止:
http://www.cnblogs.com/codingcloud/p/5095066.html