1.含義
keepalived是一個類似於layer3, 4 & 5交換機制的軟件,也就是我們平時說的第3層、第4層和第5層交換。Keepalived是自動完成,不需人工干涉。
Keepalived的作用是檢測服務器的狀態,如果有一臺web服務器宕機,或工作出現故障,Keepalived將檢測到,並將有故障的服務器從系統中剔除,同時使用其他服務器代替該服務器的工作,當服務器工作正常後Keepalived自動將服務器加入到服務器羣中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的服務器。
2.工作原理
Layer3,4,5工作在IP/TCP協議棧的IP層,TCP層,及應用層,原理分別如下:
Layer3:Keepalived使用Layer3的方式工作式時,Keepalived會定期向服務器羣中的服務器發送一個ICMP的數據包(既我們平時用的Ping程序),如果發現某臺服務的IP地址沒有激活,Keepalived便報告這臺服務器失效,並將它從服務器羣中剔除,這種情況的典型例子是某臺服務器被非法關機。Layer3的方式是以服務器的IP地址是否有效作爲服務器工作正常與否的標準。
Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的狀態來決定服務器工作正常與否。如web server的服務端口一般是80,如果Keepalived檢測到80端口沒有啓動,則Keepalived將把這臺服務器從服務器羣中剔除。
Layer5:Layer5對指定的URL執行HTTP GET。然後使用MD5算法對HTTP GET結果進行求和。如果這個總數與預期值不符,那麼測試是錯誤的,服務器將從服務器池中移除。該模塊對同一服務實施多URL獲取檢查。如果您使用承載多個應用程序服務器的服務器,則此功能很有用。此功能使您能夠檢查應用程序服務器是否正常工作。MD5摘要是使用genhash實用程序(包含在keepalived軟件包中)生成的。
SSL_GET與HTTP_GET相同,但使用SSL連接到遠程Web服務器。
MISC_CHECK:此檢查允許用戶定義的腳本作爲運行狀況檢查程序運行。結果必須是0或1.該腳本在導演盒上運行,這是測試內部應用程序的理想方式。可以使用完整路徑(即/path_to_script/script.sh)調用可以不帶參數運行的腳本。那些需要參數的需要用雙引號括起來(即“/path_to_script/script.sh arg 1 … arg n”)
3.環境準備
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
服務器詳情
IP | 作用 |
---|---|
192.168.180.131 | keepalived+nginx(主) |
192.168.180.132 | keepalived+nginx(從) |
192.168.180.133 | web站點(tomcat) |
192.168.180.134 | web站點(tomcat) |
4.配置過程
在LB01和LB02上安裝keepalived(yum安裝)
yum install keepalived -y
修改配置文件
vim /etc/keepalived/keepalived.conf
配置如下
LB01:
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LB01
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.110.200/24 dev ens33 label ens33:1
}
}
LB02
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LB02
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.110.200/24 dev ens33 label ens33:1
}
}
主要配置註釋
- router_id 是路由標識,在一個局域網裏面應該是唯一的;
- vrrp_instance VI_1{…}這是一個VRRP實例,裏面定義了keepalived的主備狀態、接口、優先級、 認證和IP信息;
- state 定義了VRRP的角色;
- interface定義使用的接口,這裏我的服務器用的網卡都是eth1,根據實際來填寫
- virtual_router_id是虛擬路由ID標識,一組的keepalived配置中主備都是設置一致
- priority是優先級,數字越大,優先級越大
- auth_type是認證方式
- auth_pass是認證的密碼
- virtual_ipaddress{…}定義虛擬IP地址,可以配置多個IP地址,這裏我定義爲192.168.101.200,綁定了ens33的網絡接口,虛擬接口ens33:1
啓動keepalived
systemctl start keepalived.service
寫入開機自啓動
echo "systemctl start keepalived.service" >> /etc/rc.local
查看進程(3個進程)
ps -ef|grep keepalived
過幾分鐘,可以看到LB01(MASTER)上生成了一個虛擬IP,我們稱之爲VIP
ifconfig ens33:1
VIP即爲虛擬IP
正常情況下只會在主節點上生產VIP,當主節點發生故障時,自動漂移到備節點,當兩個節點同時出現VIP時,此時服務不可用,我們稱之爲"腦裂".
5.高可用切換試驗
停掉LB01主節點服務,查看備節點狀態
systemctl stop keepalived.service
可以看到VIP已經漂移到了備節點,現在我們將主節點起來,此時主節點會再將VIP奪回來
而備節點VIP消失
此時基本可以斷定keepalived配置正確
nginx安裝
LB01與LB02上,獲取nginx源地址
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
執行yum安裝
yum install -y nginx
啓動Nginx
systemctl start nginx
在/root下新建nginx狀態監測腳本
#vim /root/check_ng.sh
nginx_num=` ps -ef|grep nginx|grep -v grep|wc -l`
if [ $nginx_num -eq 0 ]
then
systemctl stop keepalived
fi
在keepalived配置監測腳本路徑(此腳本需要先啓動nginx在啓動keepalived)
vim /etc/keepalived/keepalived.conf
新加入以下一段
vrrp_script check_nginx {
script "/root/check_ng.sh"
interval 2
weight -20
}
#當檢查心跳的時候,發現當前的nginx或keepalived停止了,權重值就減少20,這樣的話就會比另一臺服務器的權重小
重啓keepalived
systemctl restart keepalived.service
此時正常
測試nginx頁面,瀏覽器訪問http://192.168.110.131/http://192.168.110.132,可以看到歡迎界面
6.配置WEB站點
在WEB01與WEB02上安裝jdk與tomcat
安裝jdk1.7
#yum安裝
yum install java-1.7.0-openjdk -y
#配置環境變量
vim /etc/profile
#在末位加上以下參數
JAVA_HOME=/usr/lib/jvm/jre-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64 #該位置對應你的實際路徑
JRE_HOME=$JAVA_HOME
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
#:wq保存後
source /etc/profile
驗證是否成功
[root@192 ~]# java -version
java version "1.7.0_261"
OpenJDK Runtime Environment (rhel-2.6.22.2.el7_8-x86_64 u261-b02)
OpenJDK 64-Bit Server VM (build 24.261-b02, mixed mode)
[root@192 ~]# vim /etc/profile
tomcat站點安裝就不一一描述了,我這裏使用的apache-tomcat-7.0.103,官網下載後直接傳上去即可
修改默認歡迎頁面
將apache-tomcat-7.0.103/webapps/ROOT
下的index.jsp換成我們的測試文件,我的效果是這樣的
接下來配置NGINX反向代理,轉發到後端的兩臺tomcat上
LB01與LB02
vim /etc/nginx/conf.d/tomcat.conf
upstream tomcat {
server 192.168.110.133:8080;
server 192.168.110.134:8080;
}
server{
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcat;
}
}
配置完後校驗一下語法
[root@192 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新加載nginx
nginx -s reload
完成
7測試集羣情況
瀏覽器訪問http://192.168.110.200/
瀏覽器無法加載,且ping不通VIP,出現此問題的原因是keepalived.conf配置中默認vrrp_strict打開了,需要把它註釋掉。
vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LB01
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#重啓keepalived
systemctl restart keepalived.service
此時在ping
再次訪問
停掉主節點的keepalived試驗,此時VIP在備機上
再次訪問
*
碼字不易,希望多多點贊,謝謝!`