大體分兩層結構:用戶空間user space和內核空間kernel space
1:IPVS:IP虛擬服務器(IP Virtual Server),是一種提供負載平衡功能的技術
2:NetLink:提供高級路由及其餘相關的網絡功能
3:WatchDog:負責監控checkers和VRRP進程的情況
4:Checkers:負責真實服務器的健康檢查,是keepalived最主要的功能。能夠沒有
VRRP Stack,但健康檢查healthchecking是必定要有的。
5:VRRP Stack:負責負載均衡器之間的失敗切換FailOver。若是隻用一個負載均衡
器,則VRRP不是必須的。
6:IPVS wrapper:用來發送設定的規則到內核的IPVS部分
7:Netlink Reflector:用來設定VRRP的vip地址等
8:控制面板:對配置文件的編譯和解析。Keepalived不是一次性解析全部的配置文
件,而是用到一個模塊解析一個,所以能夠在每一個模塊看到XXX_parser.c這樣的
文件linux
keepalived 配置:web
配置概述
Keepalived各類功能的實現是經過設置其配置文件keepalived.conf來完成
的。配置大體分紅以下幾類:全局配置、VRRPD配置、LVS配置
一, 全局配置
全局配置包含全局定義和靜態地址路由。
1:全局定義主要設置Keepalived的通知機制和標識
global_defs{
notification_email{
admin@example1.com
}
notification_email_from admin@example.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id my_hostname
vrrp_mcast_group4 224.0.0.18
vrrp_mcast_group6 ff02::12
enable_traps
}算法
(1)notification_email:在有事件時,好比切換的時候,發消息到哪些email,
能夠多個,一行一個
(2)notification_email_from:通知郵件從哪一個地址發出
(3)smpt_server:通知郵件的smtp地址
(4)smtp_connect_timeout:鏈接smtp服務器的超時時間,單位秒
(5)enable_traps:開啓SNMP陷阱
(6)router_id:運行Keepalived的機器的標識,一個網絡內應該是惟一的,一般
爲hostname,但不必定非得是hostname。故障發生時,郵件通知會用到。VRRP協
議中不傳輸這個字段,傳輸的是Vritual route id,在vrrp instance中配置
(7)vrrp_mcast_group4:vrrp心跳的多播組,若是廣播域中有多個Keepalived HA
組的話,不一樣的組建議使用不一樣的多播地址,同時使用不一樣的虛擬路由器ID,可
選, 缺省是224.0.0.18
(8)vrrp_mcast_group6:可選, default ff02::12服務器
2:靜態地址和路由:配置的是是本節點的IP和路由信息,也就是不隨VRRP實例變化而變化的
地址和路由。若是你的機器上已經配置了IP和路由,那麼這兩個區域能夠不用配置。其
實,通常狀況下你的機器都會有IP地址和路由信息的,所以不必再在這兩個區域配置可
以不配置,配置以下:
static_ipaddress{
192.168.1.1/24 brd + dev eth0 scope global
...
}
static_routes{
192.168.2.0/24 via 192.168.1.100 dev eth0
...
}
每行設置一個ip,格式符合linux下ip命令參數的格式,好比上面的:
brd:目的是廣播地址(broadcast)
dev:指定設備名稱
scope:設置地址的有效範圍
via:指定下一跳路由器的地址網絡
二,VRRPD配置:
包含VRRP同步組和VRRP實例兩個部分。
1:VRRP同步組
用來保證組裏面任何一個實例出問題,都會致使切換。好比某個機器在兩
個網段,當一個網段出問題的時候,就應該切換。例如:
vrrp_sync_group VG_1 {
group {
inside_network
outside_network
......
}
notify_master /path/to/to_master.sh
notify_backup /path_to/to_backup.sh
notify_fault "/path/fault.sh VG_1「
notify /path/notify.sh
smtp_alert
}app
(1)inside_network:具體的VRRP實例名
(2)outside_network:對外的ip
(3)notify_master:指定當切換到Master時執行的腳本,能夠傳入參數,用「」
括起來,notify_backup和notify_fault相似
(4)notify:任何狀態的切換變化都會觸發並運行的腳本,參數自動添加:$1 =
「GROUP」|「INSTANCE」;$2 = 組或實例的名字; $3 = 切換成的目標狀態
("MASTER"|"BACKUP"|"FAULT")
(5)smtp_alert:使用全局定義的設置,在切換後發送郵件通知
2: VRRP實例
用來定義對外提供服務的VIP區域及其相關屬性
vrrp_instance inside_network {
state MASTER
interface eth0
use_vmac <VMAC_INTERFACE>
vmac_xmit_base
dont_track_primary負載均衡
track_interface {
eth0
eth1 ...
}
mcast_src_ip <IPADDR>
unicast_src_ip <IPADDR>
unicast_peer {
<IPADDR> ...
}
lvs_sync_daemon_interface eth1
garp_master_delay 10
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}ide
virtual_ipaddress_excluded {
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE>
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE>
...
}
virtual_routes {
src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
192.168.110.0/24 via 192.168.200.254 dev eth1
192.168.111.0/24 dev eth2
192.168.112.0/24 via 192.168.100.254
192.168.113.0/24 via 192.168.200.254 or 192.168.100.254 dev eth1
blackhole 192.168.114.0/24
}
nopreempt
preempt_delay 300
debug
notify_master <STRING>|<QUOTED-STRING>
notify_backup <STRING>|<QUOTED-STRING>
notify_fault <STRING>|<QUOTED-STRING>
notify <STRING>|<QUOTED-STRING>
smtp_alert
}oop
(1)state:指定實例的初始狀態,運行起來後,會動態的改變。只有MASTER和
BACKUP兩種狀態,而且須要大寫這些單詞。
(2)interface:實例綁定的網卡,用來發VRRP包
(3)use_vmac:是否使用VRRP的虛擬MAC地址
(4)vmac_xmit_base:發送和接收VRRP包的虛擬MAC地址
(5)dont_track_primary:忽略VRRP網卡錯誤。(默認未設置)
(6)track_interface:監控如下網卡,任何一個不通就會切換到FALT(可選)
(7)mcast_src_ip:修改vrrp組播包的源地址,默認源地址爲master的IP。(因爲
是組播,所以即便修改了源地址,該master仍是能收到迴應的)
(8)unicast_src_ip:不使用組播的源地址
(9)unicast_peer:不使用多播發送vrrp心跳包, 而改成使用單播發送。這裏要配
置的是單播組的IP, 即在這個單播組的機器會收到vrrp心跳包,因此主備的
Keepalived都須要加進來
(10)lvs_sync_daemon_interface:lvs同步服務綁定的網卡url
(11)garp_master_delay:角色轉換成master後, 延遲多長時間發送免費ARP包. 宣告IP和
MAC對應關係, 主要用於告訴廣播域的其餘主機或路由器當前虛擬IP對應的MAC地址是什麼
(12)virtual_router_id:虛擬路由標識,是一個數字,整個VRRP內惟一
(13)priority:優先級,是一個數字,數值愈大,優先級越高
(14)advert_int:MASTER與BACKUP之間同步檢查的時間間隔,單位爲秒
(15)authentication:驗證,包含驗證類型和驗證密碼。類型主要有PASS、AH兩種,經常使用
PASS,密碼是明文,同一VRRP實例MASTER與BACKUP使用相同的密碼才能正常通訊。AH爲
ipsec 認證頭認證,不須要配置密碼。
(16)virtual_ipaddress:虛擬ip地址,可多個,每一個地址佔一行,不須要指定子網掩碼。
注意:若是用LVS的話,這個ip必須與LVS客戶端設定的vip一致
(17)virtual_ipaddress_excluded:排除心跳包發送的IP地址
(18)virtual_routes:路由配置, 當角色爲主時, 自動添加這些路由, 當角色爲備時, 自動
刪除這些路由
(19)nopreempt:非搶佔式
(20)preempt_delay:搶佔延遲,默認300秒
(21)debug:debug級別
LVS配置
跟LVS相關的配置, 若是不使用LVS的話, 不須要配置。包含虛擬服務器組
和虛擬服務器兩個部分。
1:虛擬服務器組
用來實現一臺真實服務器上的某個服務,能夠屬於多個虛擬服務器,而且
只作一次健康檢查,是可選的。形如:
virtual_server_group <STRING> {
<IPADDR> <PORT> #VIP和端口
...
<IPADDR RANGE> <PORT> #例如:192.168.200.1-10
...
fwmark <INT> #通過iptables 標記過的服務類型,這樣利於按標記進行處理,
#好比:ip rule add fwmark 3 table 3 (fwmark 3是標記,table 3 是
#路由表3。意思就是凡是標記了3 的數據使用table3 路由表)
...
}
2:虛擬服務器
能夠有下面三種定義方式:
(1)virtual_server IP port
(2)virtual_server fwmark int
(3)virtual_server group string
形如:
virtual_server IP port |
virtual_server fwmark int |
virtual_server group string{
delay_loop <INT>
lb_algo rr|wrr|lc|wlc|lblc|sh|dh
ops
lb_kind NAT|DR|TUN
persistence_timeout <INT>
persistence_granularity <NETMASK>
protocol TCP
ha_suspend
virtualhost <STRING>
alpha
omega
quorum <INT>
hysteresis <INT>
quorum_up <STRING>|<QUOTED-STRING>
quorum_down <STRING>|<QUOTED-STRING>
sorry_server <IPADDR> <PORT>
sorry_server_inhibit
real_server <IPADDR> <PORT>
{
weight <INT>
inhibit_on_failure
notify_up <STRING>|<QUOTED-STRING>
notify_down <STRING>|<QUOTED-STRING>
HTTP_GET|SSL_GET
{
url {
path <STRING>
digest <STRING>
status_code <INT>
}
nb_get_retry <INT>
delay_before_retry <INT>
connect_ip <IP ADDRESS>
connect_port <PORT>
bindto <IP ADDRESS>
bind_port <PORT>
connect_timeout <INTEGER>
fwmark <INTEGER>
warmup <INT>
} #HTTP_GET|SSL_GET
TCP_CHECK
{
connect_ip <IP ADDRESS>
connect_port <PORT>
bindto <IP ADDRESS>
bind_port <PORT>
connect_timeout <INTEGER>
fwmark <INTEGER>
warmup <INT>
}
SMTP_CHECK {
host {
connect_ip <IP ADDRESS>
connect_port <PORT>
bindto <IP ADDRESS>
bind_port <PORT>
connect_timeout <INTEGER>
fwmark <INTEGER>
}
connect_timeout <INTEGER>
retry <INTEGER>
delay_before_retry <INTEGER>
helo_name <STRING>|<QUOTED-STRING>
warmup <INT>
}
MISC_CHECK {
misc_path <STRING>|<QUOTED-STRING>
misc_timeout <INT>
warmup <INT>
misc_dynamic
}
} }
(1)delay_loop:延遲輪詢時間(單位秒)
(2)lb_algo:負載均衡調度算法,互聯網應用常使用wlc或rr
(3)ops:爲UDP開啓One-Packet-Scheduling
(4)lb_kind:負載均衡轉發規則。通常包括DR,NAT,TUN3種
(5)persistence_timeout:LVS會話保持的超時時間
(6)persistence_granularity:LVS會話保持粒度,也就是ipvsadm中的-M參數,默認是
0xffffffff,即爲每一個客戶端保持會話
(7)protocol:轉發使用的協議,TCP或UDP
(8)ha_suspend:暫停健康檢查活動
(9)virtualhost:健康檢查時,檢查的web服務器的頭信息
(10)alpha:開啓後,當健康檢查程序啓動失敗時,能夠預防誤報,缺省關閉
(11)omega:當守護進程關閉時,作出合適的處理,缺省關閉
(12)quorum:全部運行的服務器的總權重數的最小值,缺省是1
(13)hysteresis:缺省是0
(14)quorum_up:quorum達到多少就啓動腳本
(15)quorum_down: quorum丟失多少就啓動腳本
(16)sorry_server:當全部real server宕掉時,sorry server頂替
(17)sorry_server_inhibit:在sorry_server直接應用inhibit_on_failure的行爲
(18)real_server:真正提供服務的服務器
(19)weight:權重,默認爲1,0表示失效
(20)inhibit_on_failure:健康檢查失敗時,將weight設置爲0,而不是從ipvs裏面刪除
(21)notify_up/down:當real server宕掉或啓動時執行的腳本
(22)HTTP_GET:健康的檢查方式,HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
(23)url:HTTP/SSL檢查的URL,能夠指定多個
(24)path:請求real serserver上的路徑
(25)digest/status_code:檢查後的摘要信息,和檢查後返回的http狀態碼
(26)nb_get_retry:重試次數
(27)delay_before_retry:下次重試的時間延遲
(28)connect_ip:健康檢查的ip
(29)connect_port:健康檢查,若是端口通則認爲服務器正常
(30)bindto:以此地址發送請求,來對服務器進行健康檢查
(31)bind_port:綁定的端口
(32)connect_timeout:表示超時時長(33)fwmark:通過iptables 標記過的服務類型(34)warmup:開始健康檢查前,隨機延遲的最大時間數,單位秒(35)TCP_CHECK:TCP健康檢查(36)SMTP_CHECK:SMTP健康檢查(37)retry:重試次數(38)delay_before_retry:重鏈接的間隔時間,單位秒(39)helo_name:」smtp helo 「請求命令的參數(40)MISC_CHECK:MISC健康檢查(41)misc_path:外部程序或腳本路徑(42)misc_timeout:腳本執行的超時時間(43)misc_dynamic:若是設置了這個參數,健康檢查程序的退出狀態碼會用來動態調整服務器的權重,以下:a:返回0:健康檢查經過,不修改權重b:返回1:健康檢查失敗,權重設爲0c:返回2-255:健康檢查經過,權重設置爲返回的狀態碼減去2