標簽:keepalived
系統運維, 經驗雜筆keepalived+lvs+nginx+tomcat輪詢模式刷新很久才切換realserver
先森剛接觸運維,當然要學習部署各種集群環境,從最開始的LVS+nginx搭建,到現在Keepalived+lvs+nginx+tomcat搭建,集群的搭建也開始慢慢的得心應手了。不過,前進的道路上總是荊棘遍布。先森的LVS用的是DR模式下的RR輪詢算法,這個算法會實現的效果是每個訪問會輪流分布到后端服務器1、2、3..上面去,后端服務器相當于在和訪問打車輪戰。keepalived+lvs+nginx+tomcat拓撲圖然而,先森環境部署好之后,要刷新很久之后,才換切換到另一個后端服務器,雖然這也是一定意義上的達到了目標,但心中總還是有個疙瘩。那么為什么會出現這樣的問題呢?影響因素經過先森的測試,影響刷新輪詢的配置keepalived、Nginx、Tomcat分別有一個,也就是一共有三個配置會影響到。keepalived配置首先,在keepalived的配置文件中,存在一個會話保持時間的配置。vim /etc/keepalived/keepalived.confpersistence_timeout 50 #50秒為默認值會話保持時間這里有個默認為50秒的會話保持時間。如果設置了這一項,那么久會等待50秒后才會切換realserver。如果上面的這樣配置已經刪除或注釋,但問題依舊存在,那么一定就是Nginx和Tomcat的配置問題了。Nginx配置編輯打開到nginx的配置文件:vim /usr/local/nginx/conf/nginx.conf在http模塊下面就存在影響刷新輪詢的配置:Nginx的配置在nginx.conf中,有一項配置:keepalive_timeout 65;這是nginx默認的連接超時時間,默認為65秒。將數字改為0即可。或者把上圖中65那行注釋,0那行取消注釋就好。Tomcat配置同樣的,在Tomcat中也有相關配置。同樣編輯打開Tomcat的配置文件:vim /web/soft/tomcat/conf/server.xml找到設置Http訪問端口那一段:Tomcat的配置在server.xml中,設置外部訪問端口那一段,有個connectionTimeout的設置,即連接超時時間:connectionTimeout="20000"這個值默認是2000毫秒,將其改為10毫秒左右即可。不可以改為0,設置為0表示永不超時。警告總體來說,上面的三個配置都是修改的會話保持時間。但是會話保持時間是不能隨意修改的。什么是會話保持呢?會話保持是指在負載均衡器上有一種機制,在作負載均衡的同時,還保證同一用戶相關連的訪問請求會被分配到同一臺服務器上。會話保持有什么作用呢?舉例說明一下如果有一個用戶訪問請求被分配到服務器A,并且在服務器A登錄了,并且在很短的時間,這個用戶又發出了一個請求,如果沒有會話保持功能的話,這個用戶的請求很有可能會被分配到服務器B去,這個時候在服務器B上是沒有登錄的,所以你要重新登錄,但是用戶并不知道自己的請求被分配到了哪里,用戶的感覺就是登錄了,怎么又要登錄,用戶體驗很不好。所以,切記的是,修改上面的三項會話保持時長的配置僅僅只是用于環境測試,如果在生產環境,一定要按照需求設置。
系統運維, 經驗雜筆LVS+Keepalived時主備負載均衡器都有VIP的問題
先森在模擬搭建LVS+Keepalived的環境,LVS是做負載均衡的,Keepalived是做高可用的。在搭建好之后,先森遇到了一個奇怪的問題,兩個負載均衡器MASTER和BACKUP都搶占到了VIP。不過還好的是,實際上同一時間內只有一個VIP在起作用。下面就來談談先森的解決過程。解決過程通過不停的查找問題,我發現,只需要關閉備用負載均衡器的防火墻,那么主備服務器都有VIP的情況就會得以解決。由此可以肯定,問題就是出現在了防火墻這里。首先用tcpdump查看一下vrrp的組播情況,這個隨便在同網絡的任意一臺服務器抓包即可:tcpdump vrrp -n # -n:不把主機的網絡地址轉換成名字查看下抓包的結果:tcpdump抓包由上圖可以看到,192.168.2.79和192.168.2.53兩個IP在輪流發送組播信號。而正常的應該是由MASTER服務器發送組播,如果BACKUP收不到MASTER的組播信號了,那么判定MASTER宕機了,BACKUP就會接手VIP。2016年12月01日更新SElinux首先,先確定服務器的SElinux是否設置為關閉。一般都是將其關閉的,在CentOS先森嘗試了啟用,但是也沒有firewall-cmd這個命令,無法添加端口,所以還是將其關閉吧。查看SElinux的狀態:getenforce可能的結果有三個:Enforcing #強制開啟Permissive #寬容模式Disabled #關閉如果是Enforcing強制模式,就需要關閉:setenforce 0 #設置為寬容模式但這樣只在本次生效,重啟服務器后將失效。如果要永久關閉,還需要修改配置文件:sed -i 's/=enforcing/=disabled/g' /etc/sysconfig/selinuxiptables防火墻如果將SElinux關閉問題依舊存在,則可能是防火墻將MASTER的VRRP組播給擋住了。首先將防火墻關閉,確定防火墻是否為罪魁禍首。service iptables stop如果關閉防火墻,keepalived問題解決了,那么問題就簡單了,我們只需要讓VRRP組播其通過防火墻即可。我們只需要在防火墻中增加一條規則即可:-A INPUT -p vrrp -j ACCEPT但是這里有個坑,默認的防火墻中基本是如下配置:# Firewall configuration written by system-config-firewall# Manual customization of this file is not recommended.*filter:INPUT ACCEPT [0:0]:FORWARD ACCEPT [0:0]:OUTPUT ACCEPT [0:0]-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT-A INPUT -p icmp -j ACCEPT-A INPUT -i lo -j ACCEPT-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT-A INPUT -j REJECT --reject-with icmp-host-prohibited-A FORWARD -j REJECT --reject-with icmp-host-prohibitedCOMMIT添加規則一定不要在-A INPUT -j REJECT --reject-with icmp-host-prohibited之后,一定要加在其前面。防火墻配置這時候重啟防火墻后查看BACKUP的ip,就會發現VIP已經不在了。再關閉一下MASTER的keepalived,并打開BACKUP的日志,就可以看到正確的內容:tail -f /var/log/messagesKeepalived切換VIP總結如果不是防火墻的原因,那么久應該仔細查看配置文件中的vrrp_sync_group中設置的VRRP組等設置是否相同,當然還有其他的可能性,但大多都是VRRP組播信號的問題。在解決問題的過程中,排除法無疑是最簡單粗暴定位問題的方法,要靈活運用。Keepalived是個很好玩也很好用的軟件,建議朋友們多研究研究。

川公網安備 51011202000104號