Linux集群
根據功能劃分為兩大類:高可用和負載均衡
高可用集群(HA集群或者叫雙機熱備)通常為兩臺服務器,一臺工作,另外一臺作為冗余,當提供服務的機器宕機,冗余將接替繼續提供服務;實現高可用的開源軟件有:heartbeat、keepalived
負載均衡集群,需要有一臺服務器作為分發器,它負責把用戶的請求分發給後端的服務器處理,在這個集群裏,除了分發器外,就是給用戶提供服務的服務器了,這些服務器數量至少為2;實現負載均衡的開源軟件有LVS、keepalived、haproxy、nginx,商業的有F5、Netscaler
下面來介紹Keepalived實現高可用集群:
keepalived通過VRRP(Virtual Router Redundancy Protocl)協議來實現高可用。
在這個協議裏會將多臺功能相同的路由器組成一個小組,這個小組裏會有1個master角色和N(N>=1)個backup角色。
master會通過組播的形式向各個backup發送VRRP協議的數據包,當backup收不到master發來的VRRP數據包時,就會認為master宕機了。此時就需要根據各個backup的優先級來決定誰成為新的mater。
Keepalived要有三個模塊,分別是core、check和vrrp。其中core模塊為keepalived的核心,負責主進程的啟動、維護以及全局配置文件的加載和解析,check模塊負責健康檢查,vrrp模塊是來實現VRRP協議的。
使用keepalived+nginx實現web高可用:
準備工作:master:192.168.139.129 需要安裝keepalived + nginx; backup:192.168.139.128 需要安裝keepalived + nginx; 還要設置VIP:192.168.139.100(這個是虛擬IP,服務器是靠這個VIP對外提供服務的。)
keepalived安裝可以yum install -y keepalived; nginx安裝同樣是yum安裝的
下面是具體的實現:
1. master(129)操作:
編輯vim /etc/keepalived/keepalived.conf文件,清空文件內容,加入一下的配置:
global_defs { notification_email { [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_nginx { script "/usr/local/sbin/check_ngx.sh" interval 3 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.139.100 } track_script { chk_nginx } }
由於上面的代碼定義了一個監控的腳本check_ngx.sh,編輯完記得授於執行的權限755
#!/bin/bash #時間變量,用於記錄日誌 d=`date --date today +%Y%m%d_%H%M%S` #計算nginx進程數量 n=`ps -C nginx --no-heading|wc -l` #如果進程為0,則啟動nginx,並且再次檢測nginx進程數量, #如果還為0,說明nginx無法啟動,此時需要關閉keepalived if [ $n -eq "0" ];then /etc/init.d/nginx start n2=`ps -C nginx --no-heading|wc -l` if [ $n2 -eq "0" ];then echo "$d nginx down,keepalived will stop" >> /var/log/check_ngx.log systemctl stop keepalived fi fi
完成以上的步驟,就可以啟動master的keepalived服務了。systemctl start keepalived.service;如下圖:
使用ip add命令可以看到master上的VIP:192.168.139.100(註意ifconfig命令是看不到這個虛擬VIP的) 到這裏master的工作就完成了!!!
2. backup(128)上操作:
編輯vim /etc/keepalived/keepalived.conf文件,清空文件內容,加入一下的配置:
global_defs { notification_email { [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_nginx { script "/usr/local/sbin/check_ngx.sh" interval 3 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.139.100 } track_script { chk_nginx } }
代碼定義了一個監控的腳本check_ngx.sh,編輯完記得授於執行的權限755
#!/bin/bash #時間變量,用於記錄日誌 d=`date --date today +%Y%m%d_%H:%M:%S` #計算nginx進程數量 n=`ps -C nginx --no-heading|wc -l` #如果進程為0,則啟動nginx,並且再次檢測nginx進程數量, #如果還為0,說明nginx無法啟動,此時需要關閉keepalived if [ $n -eq "0" ]; then systemctl start nginx n2=`ps -C nginx --no-heading|wc -l` if [ $n2 -eq "0" ]; then echo "$d nginx down,keepalived will stop" >> /var/log/check_ngx.log systemctl stop keepalived fi fi
完成以上的步驟,就可以啟動master的keepalived服務了。systemctl start keepalived.service
3. 接下來就是驗證是否實現了keepalived高可用了。
我們去master(129)的機器把keepalived 停掉,看看backup的機器會不會自動切換到VIP
master操作:systemctl stop keepalived.service
master機器上已經沒有了VIP了
backup操作:
VIP自動切換到backup機器上面來了!
4. 當我們重新啟動master的服務時,master機器上會重新接管VIP的資源了
systemctl start keepalived.service
到這裏keepalived+nginx實現高可用 就完成了。當然你也可以把nginx服務換成其他的服務,如MySQL等,大致的思路都是一樣的!
下面接著搭建負載均衡集群:
介紹:主流開源軟件LVS、keepalived、haproxy、nginx等;其中LVS屬於4層(網絡OSI 7層模型),nginx屬於7層,haproxy既可以認為是4層,也可以當做7層使用。
keepalived的負載均衡功能其實就是lvs;lvs這種4層的負載均衡是可以分發除80外的其他端口通信的,比如MySQL的,而nginx僅僅支持http,https,mail,haproxy也支持MySQL這種
相比較來說,LVS這種4層的更穩定,能承受更多的請求,而nginx這種7層的更加靈活,能實現更多的個性化需求
這裏我們使用LVS+keepalived實現負載均衡:
關於LVS是什麽,請自行查詢資料!
LVS常見有三種模式:NAT模式、IP Tunnel模式(也稱IP隧道)、DR模式
LVS的調度算法:(常用前面四種)
輪詢 Round-Robin rr
加權輪詢 Weight Round-Robin wrr
最小連接 Least-Connection lc
加權最小連接 Weight Least-Connection wlc
基於局部性的最小連接 Locality-Based Least Connections lblc
帶復制的基於局部性最小連接 Locality-Based Least Connections with Replication lblcr
目標地址散列調度 Destination Hashing dh
源地址散列調度 Source Hashing sh
準備工作:主keepalived(調度器)192.1468.139.129 ; 服務器rs1 192.168.139.128(nginx); 服務器rs2 192.168.139.130(nginx) ; VIP 192.168.139.110
主keepalived(129)上操作:
編輯文件:vim /etc/keepalived/keepalived.conf,清空原來的內容,加入一下配置:
vrrp_instance VI_1 { #備用服務器上為 BACKUP state MASTER #綁定vip的網卡為ens33,你的網卡和阿銘的可能不一樣,這裏需要你改一下 interface ens33 virtual_router_id 51 #備用服務器上為90 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.139.110 } } virtual_server 192.168.139.110 80 { #(每隔10秒查詢realserver狀態) delay_loop 10 #(lvs 算法) lb_algo wlc #(DR模式) lb_kind DR #(同一IP的連接60秒內被分配到同一臺realserver) persistence_timeout 60 #(用TCP協議檢查realserver狀態) protocol TCP real_server 192.168.139.128 80 { #(權重) weight 100 TCP_CHECK { #(10秒無響應超時) connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.139.130 80 { weight 100 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
安裝ipvsadm:yum install -y ipvsadm
在rs服務器(128+130)操作:
編輯腳本:vim /usr/local/sbin/lvs_rs.sh
#/bin/bash vip=192.168.139.110 #把vip綁定在lo上,是為了實現rs直接把結果返回給客戶端 ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up route add -host $vip lo:0 #以下操作為更改arp內核參數,目的是為了讓rs順利發送mac地址給客戶端 #參考文檔www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html 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
然後執行!
配置完成了,我們去主keepalived開啟服務!
驗證:
Linux集群