Keepalive概述:
Keepalived是一個免費開源的,用C編寫的,具備第3層、第4層和第7層交換機的功能。主要提供loadbalancing(負載均衡)和 high-availability(高可用)功能,負載均衡實作需要依賴Linux的虛拟服務核心子產品(ipvs),而高可用是通過VRRP協定實作多台機器之間的故障轉移服務。
上圖是Keepalived的功能體系結構,大緻分兩層:使用者空間(user space)和核心空間(kernel space)。 核心空間:主要包括IPVS(IP虛拟伺服器,用于實作網絡服務的負載均衡)和NETLINK(提供進階路由及其他相關的網絡功能)兩個部分。
使用者空間:
WatchDog:負載監控checkers和VRRP程序的狀況
VRRP Stack:負載負載均衡器之間的失敗切換FailOver,如果隻用一個負載均稀器,則VRRP不是必須的。
Checkers:負責真實伺服器的健康檢查healthchecking,是keepalived最主要的功能。換言之,可以沒有
VRRP Stack,但健康檢查healthchecking是一定要有的。
IPVS wrapper:使用者發送設定的規則到核心ipvs代碼
Netlink Reflector:用來設定vrrp的vip位址等。
Keepalived的所有功能是配置keepalived.conf檔案來實作的。
安裝
[[email protected] ~]# yum install keepalived ipvsadm
[[email protected] ~]# rpm -ql keepalived
/etc/keepalived/keepalived.conf 主配置檔案
/etc/sysconfig/keepalived
/usr/bin/genhash
/usr/lib/systemd/system/keepalived.service 啟動腳本
配置檔案說明
[[email protected] ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id maiya #路由id,不能重複
}
vrrp_instance lvs_inst { #定義vrrp執行個體名
state BACKUP #定義vrrp角色,分為MASTER/BACKUP兩種
interface ens33 #指定網絡接口名
virtual_router_id 51 #同一組的vrrp成員,該id需要一緻
priority 150 #優先級,範圍(0-255)
nopreempt #不搶占(隻針對BACKUP生效)
advert_int 1 #發送hello的時間間隔
authentication { #通過密碼身份驗證
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #定義虛拟IP(VIP)
10.18.42.123
}
}
virtual_server 10.18.42.123 80 { #定義VIP相關配置
delay_loop 6
lb_algo rr #使用rr排程算法(rr|wrr|lc |wlc|lblc|sh|dh)
lb_kind DR #使用DR模式 (DR/NAT/TUN)
persistence_timeout 50 #定義persistence保持時間
protocol TCP #tcp協定
real_server 10.18.42.42 80 { #定義real_server
weight 1 #weight權重為1
TCP_CHECK { #定義checker的方法(TCP/HTTP/SSL/MISC)
connect_port 80 #定義tcp的port
connect_timeout 3 #定義本次連接配接的逾時時長為3s
nb_get_retry 3 #定義嘗試3次,如果3次都失敗則宣告本real_server失效
delay_before_retry 3 #定義重連接配接間隔時間為3s
}
}
real_server 10.18.42.6 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
關于配置檔案中的其它項:
HTTP_GET | SSL_GET{
url{ #根據url check,可以指定多個
path / #定義要檢查的URI位址
digest #檢查後的摘要資訊
#(可以使用genhash -s 目标伺服器ip -p 端口号 status_code 200 -u uri位址得到摘要資訊)
status_code 200 #檢查的傳回狀态碼
}
}
notify_master /path/xx.sh #指定當切換到master 時執行的腳本
notify_backup /path/xx.sh #指定當切換到backup 時執行的腳本
notify_fault "path/xx.sh VG_1" #故障時執行的腳本
notify /path/xx.sh
virtualhost #檢查的web伺服器的虛拟主機
sorry_server #備用機的IP,所有的realserver失效後啟用
notify_up #檢測到伺服器up後執行的腳本
notify_down #檢測到伺服器down後執行的腳本
實作MySQL的故障轉移
1)、實作master與slave1兩台主機的複制(AA複制)
2)、利用keepalived 的健康檢查功能,檢測本機的3306端口是否存活,如果端口失效,則自動執行自定義腳本
3)、自定義腳本的内容為:kill 本機的keepalived程序,并删除本機VIP;當本機keepalived程序被kill掉之後,另一台主機的keepalived程序即可獲得虛拟IP,實作的故障轉移
4)、測試:用戶端連接配接keepalived提供的虛拟IP(mysql需要事先授權grant連接配接)
[[email protected] ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id teacher
}
vrrp_instance lvs_inst {
state MASTER
interface ens33
virtual_router_id 51
priority 250
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.18.42.123
}
}
virtual_server 10.18.42.123 3306 {
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 10.18.42.251 3306 {
weight 1
notify_down /etc/keepalived/kill.sh
TCP_CHECK {
connect_port 3306
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[[email protected] ~]# cat /etc/keepalived/kill.sh
#!/bin/bash
pkill keepalived
#systemctl stop keepalived #盡量使用此方式關閉keepalived
ip addr del dev ens33 10.18.42.123/32
haproxy的故障轉移
[[email protected] ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id teacher
}
vrrp_script chk_haproxy {
script "lsof -i:80 | grep haproxy || exit 1"
interval 2
fail 1
}
vrrp_instance lvs_inst {
state MASTER
interface ens33
virtual_router_id 51
priority 250
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_haproxy
}
virtual_ipaddress {
10.18.42.124
}
}