keepalived + nginx高可用集群


1、安裝環境與版本:

3個CentOS 7 虛擬機

3個Nginx實例

centos-100 centos-101 centos-102
192.168.200.100 192.168.200.101 192.168.200.102

設置keepalived虛擬ip為192.168.200.99

2、改nginx首頁

$ cd /usr/java/nginx/html/
$ vi index.html
分別在首頁上加上各主機ip,能在網頁上訪問,以便於后面測試ip

 
 

 

3、安裝keepalived

$ mkdir -p /usr/java && cd /usr/java
$ wget http://www.keepalived.org/software/keepalived-2.0.13.tar.gz
$ tar -zxvf keepalived-2.0.13.tar.gz
$ cd keepalived-2.0.13
$ ./configure --prefix=/usr/java/keepalived --sysconf=/etc
$ make && make install

$ cp /usr/java/keepalived-2.0.13/keepalived/etc/init.d/keepalived /etc/init.d
不要執行:$ cp /usr/java/keepalived-2.0.13/keepalived/etc/sysconfig/keepalived /etc/sysconfig/Keepalived 開機啟動問題

$ ln -s /usr/java/keepalived/sbin/keepalived /sbin/keepalived
$ ln -s /etc/keepalived /usr/java/keepalived/conf

$ chkconfig --add keepalived
$ chkconfig --level 2345 keepalived on
$ service keepalived start

4、配置keepalived

防火牆對 keepalived 開放
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eno16777736 --destination 224.0.0.18 --protocol vrrp -j ACCEPT;
firewall-cmd --reload;

$ cd /etc/keepalived/
$ cp keepalived.conf{,.bak}
$ vi keepalived.conf
主機配置:

! Configuration File for keepalived vrrp_script check_nginx_alive { script "/etc/keepalived/check_nginx_alive.sh" #檢測nginx心跳,當nginx掛掉,kill掉keepalived,這樣從機的keepalived服務就可以被調用 interval 2 #2秒一次,主備一致 weight -10 #權重-10,減的是keepalived的權重,當master的權重-20后,master權重小於slave,從而vip漂移到slave,(腳本里把master的keepalived kill了 } global_defs { #全局部分設置 notification_email { #可以添加郵件提醒 #acassen@firewall.loc #主從切換時發送郵件通知,這里是收件人地址 #failover@firewall.loc #sysadmin@firewall.loc } #notification_email_from Alexandre.Cassen@firewall.loc #發件人地址 #smtp_server 192.168.200.1 #郵件服務器地址 #smtp_connect_timeout 30 #發送郵件超時時間 router_id LVS_DEVEL_100 #必須全局唯一,主備不同 #vrrp_skip_check_adv_addr #vrrp_strict #vrrp_garp_interval 0 #vrrp_gna_interval 0 } vrrp_instance VI_1 {#實例名稱隨便取 state MASTER #指定keepalived的角色,MASTER為主,BACKUP為備 interface eno16777736 #綁定VIP的網卡,需要和公網正常通信 virtual_router_id 51 #master和slave必須一樣 priority 102 #權重級別,大的為master advert_int 1 #主備機之間通信間隔,單位秒 authentication { auth_type PASS #主從keepalived進行安全認證的方式,PASS或者AH方式,推薦PASS auth_pass 1111 #主從密碼要一樣 } virtual_ipaddress { 192.168.200.99 #vip地址,使用這個地址替換了主從的地址,用這個訪問。VIP地址最多可以寫20個,keepalive啟動后會自動配置該處VIP } track_script { check_nginx_alive #調用腳本,vrrp_script后面的名稱,不是腳本的名稱 } } virtual_server 192.168.200.99 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 #persistence_timeout 50 protocol TCP real_server 192.168.200.100 80 { #實際服務器,這個nginx宕掉,馬上切換成備機的nginx weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 retry 3 delay_before_retry 3 connect_port 80 } } } 

備機配置:

! Configuration File for keepalived vrrp_script check_nginx_alive { script "/etc/keepalived/check_nginx_alive.sh" #檢測nginx心跳,當nginx掛掉,kill掉keepalived,這樣從機的keepalived服務就可以被調用 interval 2 #2秒一次,主備一致 weight -10 #權重-10,減的是keepalived的權重,當master的權重-20后,master權重小於slave,從而vip漂移到slave,(腳本里把master的keepalived kill了 } global_defs { #全局部分設置 notification_email { #可以添加郵件提醒 #acassen@firewall.loc #主從切換時發送郵件通知,這里是收件人地址 #failover@firewall.loc #sysadmin@firewall.loc } #notification_email_from Alexandre.Cassen@firewall.loc #發件人地址 #smtp_server 192.168.200.1 #郵件服務器地址 #smtp_connect_timeout 30 #發送郵件超時時間 router_id LVS_DEVEL_101 #必須全局唯一,主備不同 #vrrp_skip_check_adv_addr #vrrp_strict #vrrp_garp_interval 0 #vrrp_gna_interval 0 } vrrp_instance VI_1 {#實例名稱隨便取 state BACKUP #指定keepalived的角色,MASTER為主,BACKUP為備 interface eno16777736 #綁定VIP的網卡,需要和公網正常通信 virtual_router_id 51 #master和slave必須一樣 priority 101 #權重級別,大的為master advert_int 1 #主備機之間通信間隔,單位秒 authentication { auth_type PASS #主從keepalived進行安全認證的方式,PASS或者AH方式,推薦PASS auth_pass 1111 #主從密碼要一樣 } virtual_ipaddress { 192.168.200.99 #vip地址,使用這個地址替換了主從的地址,用這個訪問。VIP地址最多可以寫20個,keepalive啟動后會自動配置該處VIP } track_script { check_nginx_alive #調用腳本,vrrp_script后面的名稱,不是腳本的名稱 } } virtual_server 192.168.200.99 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 #persistence_timeout 50 protocol TCP real_server 192.168.200.101 80 { #實際服務器,這個nginx宕掉,馬上切換成備機的nginx weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 retry 3 delay_before_retry 3 connect_port 80 } } } 

以上主節點的配置, 從節點backup配置和主節點一樣,只是state要改成backup, priority 值要比master小點即可,router_id,real_server 。

創建檢測腳本:$ vi /etc/keepalived/check_nginx_alive.sh

#!/bin/bash
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
        then
                service keepalived stop
                service nginx start
                sleep 5
                if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" != "" ]
                        then
                                service keepalived start
                fi
fi

$ chmod +x /etc/keepalived/check_nginx_alive.sh

$ service nginx restart && service keepalived restart

5、測試

$ ip addr
網卡eno16777736 已經綁定 192.168.200.99

 
 

 

這時就能用192.168.200.99這個虛擬ip訪問了,這時訪問的是主機centos-100

 
 

kill掉主機的nginx$ service nginx stop
再訪問192.168.200.99,已經跳到centos-101主機了

 
101.PNG

 

如果發現有錯誤的話可以查看系統日志,$ tail -f /var/log/messages

6、搶占模式和非搶占模式

keepalived的HA分為搶占模式和非搶占模式,搶占模式即MASTER從故障中恢復后,會將VIP從BACKUP節點中搶占過來。非搶占模式即MASTER恢復后不搶占BACKUP升級為MASTER后的VIP。

非搶占模式配置:

  1. 在vrrp_instance塊下兩個節點各增加了nopreempt指令,表示不爭搶vip
  2. 節點的state都為BACKUP
    兩個keepalived節點都啟動后,默認都是BACKUP狀態,雙方在發送組播信息后,會根據優先級來選舉一個MASTER出來。由於兩者都配置了nopreempt,所以MASTER從故障中恢復后,不會搶占vip。這樣會避免VIP切換可能造成的服務延遲。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM