一、軟件安裝配置
1. 軟件安裝
yum install -y keepalived
2. 服務配置
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs { --- 全局配置部分
notification_email { --- 設置發送郵件信息的收件人
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected] --- 設置連接的郵件服務器信息
smtp_server 163.smtp.xxx_
smtp_connect_timeout 30
router_id LVS_DEVEL --- 高可用集羣主機身份標識(集羣中主機身份標識名稱不能重複)
}
vrrp_instance southbay { --- Vrrp協議家族
state MASTER --- 標識所在家族中的身份 (MASTER/BACKUP)
interface eth0 --- 指定虛擬IP地址出現在什麼網卡上
virtual_router_id 51 --- 標識家族身份信息 多臺高可用服務配置要一致
priority 100 --- 設定優先級 優先級越高,就越有可能成爲主
advert_int 1 --- 定義組播包發送的間隔時間(秒) 主和備配置一樣 1
authentication { --- 實現通訊需要有認證過程
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { --- 配置虛擬IP地址信息
192.168.200.16
192.168.200.17
192.168.200.18
}
}
二、高可用服務應用
1. 高可用服務常見異常問題---腦裂問題
由於某些原因,導致兩臺高可用服務器對在指定時間內無法檢測到對方的心跳消息,各自取得資源及服務的所有權,而此時的兩臺高可用服務器對都還活着並在正常運行,這樣就會導致同一個IP或服務在兩端同時存在而發生衝突,最嚴重的是兩臺主機佔用同一個VIP地址,當用戶寫入數據時可能會分別寫入到兩端,這可能會導致服務器兩端的數據不一致或造成數據丟失,這種情況就被稱爲裂腦。
一般來說,導致裂腦發生的原因有以下幾種:
(1)高可用服務器對之間心跳線鏈路故障,導致無法正常通信。
ロ心跳線壞了(包括斷了、老化)。
ロ網卡及相關驅動壞了,IP配置及衝突問題(網卡直連)。
ロ心跳線間連接的設備故障(網卡及交換機)。
ロ仲裁的機器出問題(採用仲裁的方案)。
(2)高可用服務器對上開啓了 Iptables防火牆阻擋了心跳消息傳輸。
(3)高可用服務器對上心跳網卡地址等信息配置不正確,導致發送心跳失敗。
(4)其他服務配置不當等原因,如心跳方式不同、心跳廣播衝突、軟件BUG等。
(5)Keepalived配置裏同一VRRP實例如果 virtual_router_id參數兩端配置不一致,也會導致裂腦問題發生。
在實際生產環境中,我們可以從以下幾個方面來防止裂腦問題發生:
1)同時使用串行電纜和以太網電纜連接,同時用兩條心跳線路,這樣一條線路壞了另一個還是好的,依然能傳送心跳消息。
2)當檢測到裂腦時強行關閉一個心跳節點(這個功能需特殊設備支持,如 Stonith、fence)。相當於備節點接收不到心跳消息,發送關機命令通過單獨的線路關閉主節點的電源。
3)做好對裂腦的監控報警(如郵件及手機短信等或值班),在問題發生時人爲第時間介入仲裁,降低損失。倒如,百度的監控報警短信就有上行和下行的區別。報警信息報到管理員手機上,管理員可以通過手機回覆對應數字或簡單的字符串操作返回給服務器,讓服務器根據指令自動處理相應故障,這樣解決故障的時間更短。
常見的解決 Keepalived裂腦的方案
作爲互聯網應用服務器的高可用,特別是前端Web負載均衡器的高可用,裂腦的問題對普通業務的影響是可以忍受的,如果是數據庫或者存儲的業務,一且出現裂腦問題就非常嚴重了。因此,可以通過增加冗餘心跳線路來避免裂腦問題的發生,同時加強對系統的監控,以便裂腦發生時人爲快速介人解決問題。
ロ如果開啓防火牆,一定要讓心跳消息通過,一般通過允許IP段的形式解決
ロ可以拉一條以太網網線或者串口線作爲主被節點心跳線路的冗餘
ロ開發監測程序通過監控軟件(如 Nagios)監測裂腦
下面是生產場景下檢測裂腦故障的一些思路:
(1)簡單判斷的思想:只要備節點出現VIP就報警,這個報警有兩種情況,一是主機宕機了備機接管了;二是主機沒宕,裂腦了。不管屬於哪個情況都進行報警。然後由人工查看判斷及解決。
(2)比較嚴的判斷:備節點出現對應VIP。並且主節點及對應服務(如果能遠程連接主節點查看是否有VIP就更好了)還活着,就說明發生裂腦了。
腦裂報警腳本:
[root@lb02 scripts]# cat check_split_brain.sh
#!/bin/sh
lb01_vip=10.0.0.3
lb01_ip=10.0.0.5
while true
do
ping -c 2 -W 3 $lb01_ip &>/dev/null
if [ $? -eq 0 -a 'ip add|grep "$lb01_vip"|wc -l' -eq 1]
then
echo "lb01 is split brain.warning"
else
ehco "lb01 is ok"
fi
sleep 5
done
2. 高可用集羣雙主配置
a. 配置第一臺服務器
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_instance V1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3/24
}
}
vrrp_instance V2 {
state BACKUP
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.4/24
}
}
b. 配置第二臺服務器
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02
}
vrrp_instance V1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3/24
}
}
vrrp_instance V2 {
state MASTER
interface eth0
virtual_router_id 52
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.4/24
}
}
3. 高可用服務安全配置
[root@lb01 ~]# cd /etc/nginx/conf.d/
[root@lb01 conf.d]# vim www.conf
upstream southbay {
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80;
}
server {
listen 10.0.0.3:80;
server_name www.southbay.com;
location / {
proxy_pass http://southbay;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
}
server {
listen 10.0.0.4:80;
server_name bbs.southbay.com;
location / {
proxy_pass http://southbay;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
# 設置網卡上沒有的地址
[root@lb01 ~]# echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf
[root@lb01 ~]# sysctl -p