Keepalived實現服務器的高可用

## 拓撲圖
在這裏插入圖片描述

下載安裝軟件

下載

官網 下載軟件

我這裏使用的是 keepalived-2.1.3.tar.gz

安裝

1.解壓

tar -zxvf keepalived-2.1.3.tar.gz

2.配置

cd keepalived-2.1.3

./configure --prefix=/opt/keepalived

3.編譯和安裝

make && make install

服務及配置文件

移動配置文件位置

將安裝包下的服務文件移動到/etc/init.d目錄下

cp /opt/keepalived-2.1.3/keepalived/etc/init.d/keepalived /etc/init.d

mkdir /etc/keepalived

在安裝目錄下,將配置文件移動到上面創建的配置文件

cp /opt/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

cp /opt/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

修改配置文件

vi /etc/keepalived/keepalived.conf

global_defs {
        router_id 41   #服務器的路由標識,每臺機器不同不要重複
}

vrrp_instance VI_1 {
        state  BACKUP	#路由狀態,主服務器爲MASTER,備份服務器爲BACKUP
        interface enp0s3	#服務器綁定的網卡,查看本機的網卡 ip a
        mcast_src_ip 10.150.132.100		#廣播源ip,就是服務器的實際ip地址
        virtual_router_id  43			#虛擬路由標識,兩臺服務器必須一樣,而且得是0~255之間的數字
        priority        90				#優先級,數字越大優先級越高,根據這個在N個備份服務器裏選舉誰來臨時當主服務器
        advert_int      5				#集羣監控時間,單位爲秒,默認1秒. 當超過這個時間如果收不到MASTER還活着的消息,那麼就要選舉一個新的MSATER
        authentication  {
                auth_type PASS			#集羣間通信用來驗證身份的,配置成一樣即可
                auth_pass 1111
        }
        virtual_ipaddress {
                10.150.132.102			#統一對外提供的虛擬地址,即外部通過這個虛擬ip來訪問實際ip的服務器
                10.150.132.101
        }
}

啓動服務

systemctl start keepalived.service

查看服務

ps -ef| grep keep*

測試

在這裏插入圖片描述
使用虛擬IP就可以訪問到實際服務器的服務

其他配置

端口

keepalived使用 112 端口

日誌配置

centos6

修改/etc/sysconfig/keepalived 文件

#KEEPALIVED_OPTIONS="-D"
KEEPALIVED_OPTIONS="-D -d -S 0" 

修改/etc/rsyslog.conf 文件

local0.* /opt/keepalived/log/keepalived.log

這裏要注意,在keepalived目錄下創建log目錄

centos7

除了以上修改,還需要在/lib/systemd/system/keepalived.service 修改配置信息

將裏面的:
EnvironmentFile=-/usr/local/keepalived/etc/sysconfig/keepalived
ExecStart=/usr/local/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS
修改成:
EnvironmentFile=/etc/sysconfig/keepalived
ExecStart=/sbin/keepalived $KEEPALIVED_OPTIONS
 
然後重新加載service:
systemctl daemon-reload

如果沒有配置日誌,可以使用 tail -f /var/log/message 查看日誌

郵件配置

1.安裝

yum install mailx -y

2.配置郵件

vim /etc/mail.rc

set [email protected]    #發件人郵箱地址(sina設置在sina郵箱中開啓允許代理)
set smtp=smtp.sina.com    #smtp地址
set [email protected]  #郵箱用戶名,不用加域名
set smtp-auth-password=******   #郵箱密碼(郵件密碼是smtp代理授權碼)
set smtp-auth=login   #郵箱驗證方式

3.測試發送郵件

echo "hello world" | mail -s "hello" [email protected]

4.編寫腳本

vim /etc/keepalived/mail_notify.sh

#!/bin/bash
echo "192.168.1.203 $1 狀態被激活,請確認keepalived服務運行狀態"|mail -s "keepalived狀態切換警告" [email protected]

5.授權

chmod 777 /etc/keepalived/mail_notify.sh

6.修改keepalived配置

vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state MASTER
    interface enp0s3
    virtual_router_id 51
    priority 100
    advert_int 1
    #Keepalived進入MASTER狀態執行腳本
    notify_master "/etc/keepalived/mail_notify.sh master"
    #Keepalived進入BACKUP狀態執行腳本
    notify_backup "/etc/keepalived/mail_notify.sh backup"
    #Keepalived進入FAULT狀態執行腳本
    notify_fault "/etc/keepalived/mail_notify.sh fault"
    authentication {
        auth_type PASS
        auth_pass 1111
    }
   track_script {
        chk_http_port
   }
    virtual_ipaddress {
        192.168.200.203
    }
}

7.重啓服務

systemctl restart keepalived.service

服務高可用

編寫服務檢測腳本,交給keepalived定時執行即可。詳情見最後的配置。

多組keepalived在同一個局域網內

此時的解決辦法是,在同組的Keepalived服務器所有的配置文件裏指定獨一無二的多播地址

global_defs {                   #全局配置
router_id LVS_19                #服務標識
vrrp_mcast_group4 224.0.0.19    #這個就是指定多播地址的配置
}
#提示:
1)不同實例的通信認證密碼也最好不同,以確保接管正常。
2)另一款高可用軟件Heartbeat,如果採用多播方式實現主備通信,同樣會有多播地址衝突問題。

檢測腦裂

在備節點上執行腳本,如果可以ping通主節點並且備節點有VIP就報警,讓人員介入檢查是否裂腦

#!/bin/bash
lb01_vip=192.168.0.240
lb01_ip=192.168.0.221
while true
do
    ping -c 2 -W 3 $lb01_ip &>/dev/null
    if [ $? -eq 0 -a `ip a | grep "$lb01_vip" | wc -l` -eq 1 ];then
        echo "ha is split brain.warning."
    else
        echo "ha is OK"
    fi
    sleep 5
done

宕機服務重啓

在主VIP漂移到備份服務器後,處理完問題之後,重啓主服務器,漂移到備份服務器的連接重新轉移到主服務器上。這裏要注意,最後啓動keepalived,先啓動相關服務。

服務器切換時,執行腳本沒有執行

chcon -t keepalived_unconfined_script_exec_t /opt/keepalived/shell/mail_notify.sh

給文件添加selinux權限

備註

! Configuration File for keepalived              

global_defs {                        #全局定義部分
   notification_email {              #設置警報郵箱
     [email protected]            #郵箱
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]      #設置發件人地址
   smtp_server 192.168.50.1        #設置smtp server地址
   smtp_connect_timeout 30          #設置smtp超時連接時間    以上參數可以不配置
   router_id LVS_DEVEL               #是Keepalived服務器的路由標識在一個局域網內,這個標識(router_id)是唯一的
}

## keepalived 會定時執行腳本並對腳本執行的結果進行分析,動態調整 vrrp_instance 的優先級。如果腳本執行結果爲 0,並且 weight 配置的值大於 0,則優先級相應的增加。如果腳本執行結果非 0,並且 weight配置的值小於 0,則優先級相應的減少。其他情況,維持原本配置的優先級,即配置文件中 priority 對應的值。
vrrp_script chk_nginx {
	script "/etc/keepalived/nginx_check.sh" ## 檢測 nginx 狀態的腳本路徑
	interval 2 ## 檢測時間間隔
	weight -20 ## 如果條件成立,權重-20
}

vrrp_script check_redis {
    script "</dev/tcp/127.0.0.1/6379" #修改最後的redis端口6379爲自己需要監聽的端口,理論上可以監聽遠程端口
    interval 2 #檢查腳本的頻率,單位(秒)
    weight -30 #端口檢查失敗,優先級減少30,默認減少2[注意:兩臺主機配置的weight相同時候必須保證weight的值大於priority差值]
}

vrrp_instance VI_1 {      #VRRP實例定義區塊名字是VI_1
    state MASTER          #表示當前實例VI_1的角色狀態這個狀態只能有MASTER和BACKUP兩種狀態,並且需要大寫這些字符ASTER爲正式工作的狀態,BACKUP爲備用的狀態
    interface eth0       
    virtual_router_id 51 #虛擬路由ID標識,這個標識最好是一個數字,在一個keepalived.conf配置中是唯一的, MASTER和BACKUP配置中相同實例的virtual_router_id必須是一致的.
    priority 100                #priority爲優先級 越大越優先
    advert_int 1               #爲同步通知間隔。MASTER與BACKUP之間通信檢查的時間間隔,單位爲秒,默認爲1.
    authentication {           #authentication爲權限認證配置不要改動,同一vrrp實例的MASTER與BACKUP使用相同的密碼才能正常通信。
        auth_type PASS
        auth_pass 1111
    }
    
    ## 將 track_script 塊加入 instance 配置塊
	track_script {
		chk_nginx ## 執行 Nginx 監控的服務
	} #
    
    virtual_ipaddress {         #設置虛擬IP地址
        192.168.50.16         #此格式ip a顯示 ifconfig不顯示
        192.168.50.17/24 dev eth0 label eth0:1    #綁定接口爲eth0,別名爲eth0:1
   }
#至此爲止以上爲實現高可用配置,如只需使用高可用功能下邊配置可刪除
#以下爲虛擬服務器定義部分
virtual_server 192.168.50.16 80 {      #設置虛擬服務器,指定虛擬IP和端口
    delay_loop 6                           #健康檢查時間爲6秒
    lb_algo rr                               #設置負載調度算法 rr算法
    lb_kind NAT                            #設置負載均衡機制 #有NAT,TUN和DR三種模式可選
    nat_mask 255.255.255.0         #非NAT模式註釋掉此行  註釋用!號
    persistence_timeout 50           #連接保留時間,50秒無響應則重新分配節點
    protocol TCP                           #指定轉發協議爲TCP 
    real_server 192.168.5.150 80 {      #RS節點1
        weight 1                #權重
        TCP_CHECK {             #節點健康檢查
        connect_timeout 8       #延遲超時時間
        nb_get_retry 3          #重試次數
        delay_before_retry 3    #延遲重試次數
        connect_port 80         #利用80端口檢查
    }
    }
    real_server 192.168.50.149 80 {      #RS節點2
        weight 1
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80 
    }
    }
}

vi /etc/keepalived/nginx_check.sh

# vi /etc/keepalived/nginx_check.sh
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
	killall keepalived
fi
fi

#或者
#!/bin/bash
set -e

if [ `ps -ef | grep nginx | wc -l` -lt 2 ];then
	systemctl stop keepalived
	echo "nginx is down"
	exit 0
fi

更多配置參考官網說明

參考網址:

https://www.codercto.com/a/33207.html

https://blog.csdn.net/xianghanscce/article/details/88794346

https://www.cnblogs.com/ywrj/p/9483427.html

https://blog.csdn.net/l1028386804/article/details/72801492

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章