keepalived 安裝部署

有形无形發表於2024-09-14
一、keepalived 安裝
官網地址:http://www.keepalived.org/download.html

1、Keepalived 環境準備
各節點時間必須同步:ntp, chrony
關閉防火牆及SELinux
各節點之間可透過主機名互相通訊:非必須
建議使用/etc/hosts檔案實現:非必須
各節點之間的root使用者可以基於金鑰認證的ssh服務完成互相通訊:非必須


2、下載後解壓安裝即可
# tar xzf keepalived-2.2.8.tar.gz
# cd keepalived-2.2.8
# ./configure --prefix=/usr/local/keepalived/
# make && make install

Tips 1:安裝過程中提示:*** WARNING – this build will not support IPVS with IPv6. 
Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.

# yum install -y libnl3.x86_64
# yum install -y libnl3-devel.x86_64

Tips 2:configure: error: !!! Please install libnfnetlink headers. !!!

# yum install -y libnfnetlink.x86_64 
# yum install -y libnfnetlink-devel.x86_64


3、也可以 yum安裝
yum install -y keepalived 

# 安裝完成後 主程式在 /usr/sbin/keepalived,配置檔案在 /etc/keepalived/keepalived.conf 



二、配置檔案
vim /etc/keepalived/keepalived.conf

# 全域性配置
global_defs {

   #郵件通知 notification
   #指定keepalived在發生切換時需要傳送email到的物件,一行一個
   
   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伺服器地址
   smtp_connect_timeout 30                                 # 指定smtp連線超時時間
   
  
   #路由id: 當前安裝的keepalived節點主機的識別符號,用主機名即可,兩個節點保持一致
   router_id jqma   

   # 下面兩個配置不寫的話,許可權不足,無法啟動keepalived
   script_user root
   enable_script_security
   
   #下面幾個使用預設配置即可
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

#vrrp 例項配置
vrrp_instance VI_1 {  # VI_1 自定義,可以隨便起,一般叫VI_數字(1,2,3等)
    state MASTER      # 要大寫,主是MASTER  備是 BACKUP
    interface eth0    # 網路卡,根據實際填寫
    virtual_router_id 51   # 虛擬路由標識,是一個數字,同一個vrrp 例項使用唯一的標識,MASTER和BACKUP 的 同一個 vrrp_instance 下 這個標識必須保持一致(取值0-255)
    priority 100           # 權重,BACKUP 要比 MASTER 小
    advert_int 1           # MASTER 與BACKUP 負載均衡器之間同步檢查的時間間隔(一定時間傳送一個報文給backup。如果backup沒有收到就自己成為master),單位為秒,兩個節點設定必須一樣。
    
	#叢集兩個節點之間通訊,驗證authentication。包含驗證型別和驗證密碼。型別主要有PASS、AH 兩種,通常使用的型別為PASS,
    #MASTER 與BACKUP 使用相同的密碼才能正常通訊。
	authentication {
        auth_type PASS
        auth_pass 1111    # 密碼隨便寫一個
    }
	
	#單播模式
	unicast_src_ip 172.21.62.19   #本機真實ip
    unicast_peer {             #單播模式
            172.21.62.18       #另一個節點真實ip
    }
	
	#虛擬ip配置一行代表一個VIP
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
	############################ 無需配置 #######################################
	# 當前節點成為master時,通知指令碼執行任務,一般不需要寫
    # notify_master "/etc/keepalived/start_haproxy.sh start" 
    # 當前節點成為backup時,通知指令碼執行任務
    # notify_backup "/etc/keepalived/start_haproxy.sh stop"
    # 噹噹前節點出現故障,執行的任務;
    # notify_fault  "/etc/keepalived/start_haproxy.sh stop"
	####################################################################
}

#健康檢查部分,如果不做健康檢查可以不配置,監聽 ip + 埠號 看一個服務是否健康
virtual_server 192.168.167.100 3306 {   # 虛擬IP 埠號  
        delay_loop 2
        lb_algo wrr
        lb_kind DR
        persistence_timeout 60
        protocol TCP      #使用的協議
		#以上配置使用預設即可
		
		
        real_server 192.168.167.150 3306 { #本節點 真實ip 
                weight 3
                notify_down "/etc/keepalived/shutdown_keepalived.sh"   # 監聽的埠down時關閉keepalived,得用network,不能用NetworkManager

                TCP_CHECK {
                        connect_timeout 10
                        connect_port 3306
                }
        }
}

#關閉keepalived的指令碼
vim /etc/keepalived/shutdown_keepalived.sh
#!/bin/sh    
pkill keepalived 



#啟動,注意:要先啟動主上的keepalived,再啟動備上的,非搶佔式 誰先啟動,VIP就在哪個節點上
/usr/sbin/keepalived/ -f /etc/keepalived/keepalived.conf

#關閉
pkill keepalived

#快捷啟動
service status keepalived      #Redhat7以前
systemctl status keepalived    #redhat7以後




三、相關元件介紹
keepalived 核心元件:

vrrp stack:VIP訊息通告
checkers:監測real server
system call:標記real server權重
SMTP:郵件元件
ipvs wrapper:生成IPVS規則
Netlink Reflector:網路介面
WatchDog:監控程序
-控制元件:配置檔案解析器
-IO複用器
-記憶體管理元件


#Keepalived程序樹,keepalived啟動之後有三個程序
Keepalived  <-- Parent process monitoring children
Keepalived   <-- VRRP child
Keepalived   <-- Healthchecking child


#####################  keepalived 高階 ###################
單播(Unicast):是一個傳送者和一個接收者之間透過網路進行的通訊。
組播
組播產生背景:
傳統的網路通訊有兩種,一種是源主機和目標主機兩臺裝置之間進行的一對一的通訊方式,也就是單播;另一種,
一臺源主機和網路中的所有其他主機進行的通訊,即廣播,在廣播方式下,資訊會傳送到不需要該資訊的主機從而浪費頻寬資源,
甚至引起廣播風暴;在單播方式下,會因為資料包的多次重複兒浪費頻寬資源,源主機的負荷會因為多次的資料複製兒加大
在單播和廣播有問題情況下,組播技術就應用而生了。

組播定義:組播又稱多目標廣播、多播。網路中使用的一種傳輸方式,它允許把所發訊息傳送給所有有可能目的地中的一個經過選擇的子集,
即明確指出的多種地址傳送資訊,是一種在一個傳送者和多個接受者之間進行通訊的方法


一、keepalived單播模式
如果網路不允許組播(可能是交換機策略設定),又要使用keepalived,那麼開啟單播。
使用單播模式,即使網路環境內有相同的virtual_router_id,也沒有關係

單播配置,在 vrrp_instance 裡配置,(keepalived預設是搶佔式,組播的 方式 )
#vrrp 例項配置
vrrp_instance VI_1 {  # VI_1 自定義,可以隨便起,一般叫VI_數字(1,2,3等)
    state MASTER      # 要大寫,主是MASTER  備是 BACKUP
    interface eth0    # 網路卡,根據實際填寫
    virtual_router_id 51   # 虛擬路由標識,是一個數字,同一個vrrp 例項使用唯一的標識,MASTER和BACKUP 的 同一個 vrrp_instance 下 這個標識必須保持一致(取值0-255)
    priority 100           # 權重,BACKUP 要比 MASTER 小
    advert_int 1           # MASTER 與BACKUP 負載均衡器之間同步檢查的時間間隔,單位為秒,兩個節點設定必須一樣。
    
	#叢集兩個節點之間通訊,驗證authentication。包含驗證型別和驗證密碼。型別主要有PASS、AH 兩種,通常使用的型別為PASS,
    #MASTER 與BACKUP 使用相同的密碼才能正常通訊。
	authentication {
        auth_type PASS
        auth_pass 1111    # 密碼隨便寫一個
    }
	
	#單播模式
	 unicast_src_ip 172.21.62.19   #本機真實ip
        unicast_peer {             #單播模式
                172.21.62.18       #另一個節點真實ip
        }

	
	
	#虛擬ip配置一行代表一個VIP
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }



二、keepalived 非搶佔式
keepalived預設是搶佔式,組播的 方式 ,當master down 時,backup 會接管vip 地址,當master啟動後又會把vip搶過來。
搶佔式的缺點:會因為網路抖動,vip頻繁飄移, 造成不必要的切換,推薦使用非搶佔式。

配置 keepalived 非搶佔模式,注意點如下:
(1) 主裝置、 從裝置中的 state 都設定為 BACKUP
(2) 預設主裝置(priority 值大的 Keepalived 節點) 配置一定要加上 nopreempt,否則非搶佔不起作用
(3) 防火牆配置允許組播(主、備兩臺裝置上都需要配置, keepalived 使用 224.0.0.18 作為 Master 和Backup 健康檢查的通訊 IP)
(4)如果使用 非搶佔模式,就不能透過優先順序 priority 來判斷誰應該是MASTER或者SLAVE.



三、非搶佔模式+單播模式配置
#vrrp 例項配置
vrrp_instance VI_1 {  # VI_1 自定義,可以隨便起,一般叫VI_數字(1,2,3等)
    state BACKUP      # 非搶佔式,主從都要寫BACKUP
    interface eth0    # 網路卡,根據實際填寫
    virtual_router_id 51   # 虛擬路由標識,是一個數字,同一個vrrp 例項使用唯一的標識,MASTER和BACKUP 的 同一個 vrrp_instance 下 這個標識必須保持一致(取值0-255)
    priority 100           # 權重,BACKUP 要比 MASTER 小
	nopreempt              #主上要寫這個,否則非搶佔不起作用,從上不用寫(也就是在權重高的節點上寫)
    advert_int 1           # MASTER 與BACKUP 負載均衡器之間同步檢查的時間間隔,單位為秒,兩個節點設定必須一樣。
    
	#叢集兩個節點之間通訊,驗證authentication。包含驗證型別和驗證密碼。型別主要有PASS、AH 兩種,通常使用的型別為PASS,
    #MASTER 與BACKUP 使用相同的密碼才能正常通訊。
	authentication {
        auth_type PASS
        auth_pass 1111    # 密碼隨便寫一個
    }
	
	#單播模式
	 unicast_src_ip 172.21.62.19   #本機真實ip
        unicast_peer {             #單播模式
                172.21.62.18       #另一個節點真實ip
        }

	#虛擬ip配置一行代表一個VIP
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}



四、指令碼呼叫

vrrp_script <string name> {
	script "/etc/keepalived/nginx_check.sh"   						# 可以是個指令碼,也可以直接寫個命令,如下一行
	script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"      # 直接寫命令
    interval 1  # 設定執行間隔
    weight 10  # 執行成功則升級權重+10,否則-10
}



# 然後在 vrrp_instance 裡呼叫上述的vrrp_script 的名字
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16
    }
	
	# 呼叫上面 vrrp_script 定義的指令碼
	track_script {
	chk_down
	chk_nginx
	}
	
	# 下面四個一般不需要
    #notify_master "/usr/local/bin/vrrp.mast arg1 arg2"
    #notify_backup "/usr/local/bin/vrrp.back arg1 arg2"
    #notify_fault "/usr/local/bin/vrrp.fault arg1 arg2"
    #notify_stop "/usr/local/bin/vrrp.stop arg1 arg2"
}

notify_master、notify_backup、notify_fault和notify_stop四個選項,這是Keepalived配置中的一個通知機制,也是Keepalived包含的四種狀態。
下面介紹每個選項的含義:
notify_master :指定當Keepalived進入MASTER狀態時要執行的指令碼,這個指令碼可以是一個狀態報警指令碼,也可以是一個服務管理指令碼。Keepalived允許指令碼傳入引數,因此靈活性很強。
notify_backup : 指定當Keepalived進入BACKUP狀態時要執行的指令碼,同理,這個指令碼可以是一個狀態報警指令碼,也可以是一個指令碼管理指令碼。
notify_fault :指定當Keepalived進入FAULT狀態時要執行的指令碼,指令碼功能與前兩個類似。
notify_stop : 指定當Keepalived程式終止時需要執行的指令碼。




五、健康檢查模組

virtual_server 172.21.62.24 3306 {   # 虛擬IP 埠號  
        delay_loop 2
        lb_algo wrr
        lb_kind DR
        persistence_timeout 60
        protocol TCP
		#以上配置使用預設即可
		
        real_server 172.21.62.19 3306 { #本節點 真實ip 
                weight 3
                notify_down "/etc/keepalived/shutdown_keepalived.sh"   # 有資料庫down時關閉keepalived

                TCP_CHECK {
                        connect_timeout 10
                        connect_port 3306
                }
        }
}