keepalive

HA Cluster:

集群類型:LB(lvs/nginx(http/upstream, stream/upstream))、HA、HP

SPoF: Single Point of Failure

系統可用性的公式:A=MTBF/(MTBF+MTTR)
(0,1), 95%
幾個9(指標): 99%, …, 99.999%,99.9999%;
99%: %1, 99.9%, 0.1%

系統故障:
硬件故障:設計缺陷、wear out、自然災害、……
軟件故障:設計缺陷、

提升系統高用性的解決方案之降低MTTR:

手段:冗余(redundant)

active/passive(主備),active/active(雙主) 
active –> HEARTBEAT –> passive 
active <–> HEARTBEAT <–> active

高可用的是“服務”:
HA nginx service:
vip/nginx process[/shared storage]

資源:組成一個高可用服務的“組件”;

(1) passive node的數量?
(2) 資源切換?

shared storage:
NAS:文件共享服務器;
SAN:存儲區域網絡,塊級別的共享;

Network partition:網絡分區
隔離設備:
node:STONITH = Shooting The Other Node In The Head
資源:fence 

quorum:
with quorum: > total/2
without quorum: <= total/2

TWO nodes Cluster?
輔助設備:ping node, quorum disk; 

Failover:故障切換,即某資源的主節點故障時,將資源轉移至其它節點的操作;
Failback:故障移回,即某資源的主節點故障后重新修改上線后,將轉移至其它節點的資源重新切回的過程; 

HA Cluster實現方案:
vrrp協議的實現
keepalived
ais:完備HA集群
RHCS(cman)
heartbeat
corosync

keepalived:

vrrp協議:Virtual Redundant Routing Protocol
術語:
虛擬路由器:Virtual Router 
虛擬路由器標識:VRID(0-255)
物理路由器:
master:主設備
backup:備用設備
priority:優先級
VIP:Virtual IP 
VMAC:Virutal MAC (00-00-5e-00-01-VRID)
GraciousARP

通告:心跳,優先級等;周期性;

搶占式,非搶占式;

安全工作:
認證:
無認證
簡單字符認證
MD5

工作模式:
主/備:單虛擬路徑器;
主/主:主/備(虛擬路徑器1),備/主(虛擬路徑器2)

keepalived:
vrrp協議的軟件實現,原生設計的目的為了高可用ipvs服務:
vrrp協議完成地址流動;
為vip地址所在的節點生成ipvs規則(在配置文件中預先定義);
為ipvs集群的各RS做健康狀態檢測;
基于腳本調用接口通過執行腳本完成腳本中定義的功能,進而影響集群事務;

組件:
核心組件:
vrrp stack
ipvs wrapper
checkers
控制組件:配置文件分析器
IO復用器
內存管理組件

HA Cluster的配置前提:
(1) 各節點時間必須同步;
ntp, chrony
(2) 確保iptables及selinux不會成為阻礙;
(3) 各節點之間可通過主機名互相通信(對KA并非必須);
建議使用/etc/hosts文件實現; 
(4) 各節點之間的root用戶可以基于密鑰認證的ssh服務完成互相通信;(并非必須)

keepalived安裝配置:
CentOS 6.4+隨base倉庫提供;

程序環境:
主配置文件:/etc/keepalived/keepalived.conf
主程序文件:/usr/sbin/keepalived
Unit File:keepalived.service
Unit File的環境配置文件:/etc/sysconfig/keepalived

配置文件組件部分:
TOP HIERACHY
GLOBAL CONFIGURATION
Global definitions
Static routes/addresses
VRRPD CONFIGURATION
VRRP synchronization group(s):vrrp同步組;
VRRP instance(s):每個vrrp instance即一個vrrp路由器;
LVS CONFIGURATION
Virtual server group(s)
Virtual server(s):ipvs集群的vs和rs;

單主配置示例:
! Configuration File for keepalived

global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.19
}

vrrp_instance VI_1 {
state BACKUP
interface eno16777736
virtual_router_id 14
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
10.1.0.91/16 dev eno16777736
}
}

配置語法:
配置虛擬路由器:
vrrp_instance <STRING> {
….
}

專用參數:
state MASTER|BACKUP:當前節點在此虛擬路由器上的初始狀態;只能有一個是MASTER,余下的都應該為BACKUP;
interface IFACE_NAME:綁定為當前虛擬路由器使用的物理接口;
virtual_router_id VRID:當前虛擬路由器的惟一標識,范圍是0-255;
priority 100:當前主機在此虛擬路徑器中的優先級;范圍1-254;
advert_int 1:vrrp通告的時間間隔;
authentication {
auth_type AH|PASS
auth_pass <PASSWORD>
}
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
}
track_interface {
eth0
eth1

}
配置要監控的網絡接口,一旦接口出現故障,則轉為FAULT狀態;
nopreempt:定義工作模式為非搶占模式;
preempt_delay 300:搶占式模式下,節點上線后觸發新選舉操作的延遲時長;

定義通知腳本:
notify_master <STRING>|<QUOTED-STRING>:當前節點成為主節點時觸發的腳本;
notify_backup <STRING>|<QUOTED-STRING>:當前節點轉為備節點時觸發的腳本;
notify_fault <STRING>|<QUOTED-STRING>:當前節點轉為“失敗”狀態時觸發的腳本;

notify <STRING>|<QUOTED-STRING>:通用格式的通知觸發機制,一個腳本可完成以上三種狀態的轉換時的通知;

回顧:
HA Cluster:
A=MTBF/(MTBF+MTTR)
99.5%, …, 99.9999%

實現:
vrrp協議:keepalived
ais:OpenAIS

vrrp:
virtual router:
VRID,VIP,VMAC,priority, …

keepalived:
vrrp/ipvs_wrapper/checkers

keepalived(2)

雙主模型示例:
! Configuration File for keepalived

global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.19
}

vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 14
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
10.1.0.91/16 dev eno16777736
}
}

vrrp_instance VI_2 {
state BACKUP
interface eno16777736
virtual_router_id 15
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass 578f07b2
}
virtual_ipaddress {
10.1.0.92/16 dev eno16777736
}
}

通知腳本的使用方式:
示例通知腳本:

!/bin/bash

contact=’root@localhost’

notify() {
mailsubject=”$(hostname) to be $1, vip floating”
mailbody=”$(date +’%F %T’): vrrp transition, $(hostname) changed to be $1″
echo “$mailbody” | mail -s “$mailsubject” $contact
}

case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo “Usage: $(basename $0) {master|backup|fault}”
exit 1
;;
esac

腳本的調用方法:
notify_master “/etc/keepalived/notify.sh master”
notify_backup “/etc/keepalived/notify.sh backup”
notify_fault “/etc/keepalived/notify.sh fault”

虛擬服務器:
配置參數:
virtual_server IP port |
virtual_server fwmark int 
{

real_server {

}

}

常用參數:
delay_loop <INT>:服務輪詢的時間間隔;
lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定義調度方法;
lb_kind NAT|DR|TUN:集群的類型;
persistence_timeout <INT>:持久連接時長;
protocol TCP:服務協議,僅支持TCP;
sorry_server <IPADDR> <PORT>:備用服務器地址;
real_server <IPADDR> <PORT>
{
weight <INT>
notify_up <STRING>|<QUOTED-STRING>
notify_down <STRING>|<QUOTED-STRING>
HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { … }:定義當前主機的健康狀態檢測方法;
}

HTTP_GET|SSL_GET:應用層檢測

HTTP_GET|SSL_GET {
url {
path <URL_PATH>:定義要監控的URL;
status_code <INT>:判斷上述檢測機制為健康狀態的響應碼;
digest <STRING>:判斷上述檢測機制為健康狀態的響應的內容的校驗碼;
}
nb_get_retry <INT>:重試次數;
delay_before_retry <INT>:重試之前的延遲時長;
connect_ip <IP ADDRESS>:向當前RS的哪個IP地址發起健康狀態檢測請求
connect_port <PORT>:向當前RS的哪個PORT發起健康狀態檢測請求
bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址;
bind_port <PORT>:發出健康狀態檢測請求時使用的源端口;
connect_timeout <INTEGER>:連接請求的超時時長;
}

TCP_CHECK {
connect_ip <IP ADDRESS>:向當前RS的哪個IP地址發起健康狀態檢測請求
connect_port <PORT>:向當前RS的哪個PORT發起健康狀態檢測請求
bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址;
bind_port <PORT>:發出健康狀態檢測請求時使用的源端口;
connect_timeout <INTEGER>:連接請求的超時時長;
}

高可用的ipvs集群示例:
! Configuration File for keepalived

global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.19
}

vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 14
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
10.1.0.93/16 dev eno16777736
}
notify_master “/etc/keepalived/notify.sh master”
notify_backup “/etc/keepalived/notify.sh backup”
notify_fault “/etc/keepalived/notify.sh fault”
}

virtual_server 10.1.0.93 80 {
delay_loop 3
lb_algo rr
lb_kind DR
protocol TCP

sorry_server 127.0.0.1 80

real_server 10.1.0.69 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 10.1.0.71 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}

博客作業:第一部分
雙主模式的lvs集群,拓撲、實現過程;

配置示例(一個節點):

! Configuration File for keepalived

global_defs {
notification_email {
root@localhost
}
notification_email_from kaadmin@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.67
}

vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 44
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass f1bf7fde
}
virtual_ipaddress {
172.16.0.80/16 dev eno16777736 label eno16777736:0
}
track_interface {
eno16777736
}
notify_master “/etc/keepalived/notify.sh master”
notify_backup “/etc/keepalived/notify.sh backup”
notify_fault “/etc/keepalived/notify.sh fault”
}

vrrp_instance VI_2 {
state BACKUP
interface eno16777736
virtual_router_id 45
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass f2bf7ade
}
virtual_ipaddress {
172.16.0.90/16 dev eno16777736 label eno16777736:1
}
track_interface {
eno16777736
}
notify_master “/etc/keepalived/notify.sh master”
notify_backup “/etc/keepalived/notify.sh backup”
notify_fault “/etc/keepalived/notify.sh fault”
}

virtual_server fwmark 3 {
delay_loop 2
lb_algo rr
lb_kind DR
nat_mask 255.255.0.0
protocol TCP
sorry_server 127.0.0.1 80

real_server 172.16.0.69 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.16.0.6 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 3
}
}
}

keepalived調用外部的輔助腳本進行資源監控,并根據監控的結果狀態能實現優先動態調整;
分兩步:(1) 先定義一個腳本;(2) 調用此腳本;
vrrp_script <SCRIPT_NAME> {
script “”
interval INT 
weight -INT 
}

track_script {
SCRIPT_NAME_1
SCRIPT_NAME_2

}

示例:高可用nginx服務

! Configuration File for keepalived

global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.19
}

vrrp_script chk_down {
script “[[ -f /etc/keepalived/down ]] && exit 1 || exit 0”
interval 1
weight -5
}

vrrp_script chk_nginx {
script “killall -0 nginx && exit 0 || exit 1”
interval 1
weight -5
fall 2
rise 1
}

vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 14
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
10.1.0.93/16 dev eno16777736
}
track_script {
chk_down
chk_nginx
}
notify_master “/etc/keepalived/notify.sh master”
notify_backup “/etc/keepalived/notify.sh backup”
notify_fault “/etc/keepalived/notify.sh fault”
}

博客作業:
(1)雙主模型的ipvs高可用集群;
(2)雙主模型的nginx proxy高可用集群; 

測試:ipvs使用sh算法或持久連接時,故障切換后,同一個客戶端是否依然能關聯至此前綁定的RS;
  nginx使用ip_hash或hash $request_uri算法時,故障切換后,同一個客戶端是否依然能關聯至此前綁定的upstream server;
  

原創文章,作者:shewei,如若轉載,請注明出處:http://www.www58058.com/76696

(0)
sheweishewei
上一篇 2017-05-22 08:25
下一篇 2017-05-22 18:36

相關推薦

  • Bashe Shell之數組及bash配置文件解析

    數組   數據結構,數據序列,保存了連續的多個數據,可以使用索引獲取相關元素,相當于多個變量的集合   §數組名和索引 索引:編號從0開始,屬于數值索引   注意:所以可支持使用自定義的格式,而不僅是數值格式,即關聯索引,bash4.0版本之后開始支持,bash的數組支持稀疏格式(索引不連續)   §聲明數組 &nbs…

    Linux干貨 2016-08-24
  • 正則表達式之一grep

    grep :文本過濾( 模式:pattern) 工具 包括:grep, egrep, fgrep (不 支持正則表達式 搜索) 用法格式: grep [OPTIONS] PATTERN [FILE…]            &n…

    2017-02-27
  • 數組和字符串處理

    數組:存儲多個元素的連續的內存空間,相當于多個變量的集合     1)定義數組:        declare -a ARRAY_NAME 定義普通數組 可省略declare -a ]#arr=(a b&nbs…

    Linux干貨 2016-08-24
  • 第一周的博客作業

    1.計算機的組成以及功能:     cpu:就是中央處理器,運算和判斷計算機的數據;     儲設器:存儲計算機的數據;     主板:鏈接多的計算機的硬件;     I/O設備:輸入,輸出設備,,如…

    Linux干貨 2017-01-05
  • linux基礎練習

    馬哥教育23期網絡班+第6周課堂練習 Linux 基礎練習 一、linux基礎練習題 1、復制/etc/rc.d/rc.sysinit 文件至/tmp 目錄,將/tmp/rc.sysinit 文件中的以至少一個空白字符開頭的行的行首加#; 2、復制/boot/grub/grub.conf 至/tmp目錄中 刪除/tmp/grub.conf 文件中的行首的空白…

    Linux干貨 2016-11-01
  • 基于rsyslog的iptables.log配置

                                                      …

    Linux干貨 2016-01-15
欧美性久久久久