## 拓撲圖
下載安裝軟件
下載
官網 下載軟件
我這裏使用的是 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