lvs-keepalived

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服務完成互相通信;(并非必須)

程序環境:
           主配置文件:/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>:通用格式的通知觸發機制,一個腳本可完成以上三種狀態的轉換時的通知;

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
}
}
}

配置示例(一個節點):

! 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”
}

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

(0)
sheweishewei
上一篇 2017-05-13 19:37
下一篇 2017-05-13 20:34

相關推薦

  • 如何加密/混亂C源代碼

    之前發表了《6個變態的C語言Hello World程序》[酷殼鏈接] [CSDN鏈接],主要是是像大家展示了一些C語言的變態玩法。也向大家展示了一下程序是可以寫得讓人看不懂的,在那篇文章中,可以看到很多人的留言,很多人都覺得很好玩,是的,那本來是用來供朋友們“消遣作樂”,供娛樂娛東而已,不必太過認真。 不過,通過這種極端的寫法,大家可以看到源代碼都可以寫得那…

    Linux干貨 2016-05-08
  • Linux網絡屬性管理(一)

    MarkdownPad Document Linux網絡屬性管理(一) 將一臺linux主機接入互聯網一般需要配置以下幾個方面的參數: IP/mask –>  IP地址和子網掩碼 路由 –> 默認網關 DNS服務器 配置方式 靜態指定:   1、ifcfg:ifconfig,route,netstat   2、i…

    Linux干貨 2016-06-12
  • 學習的第二周

    硬鏈接不能跨分區,硬鏈接不支持對目錄的創建, 硬鏈接的本質是一個文件N個節點  ls |xargs rm 解決參數太長 無法正常刪除的問題。   軟連接 依賴于原始文件 刪除就沒了軟連接可以跨分區,可以根據目錄創建軟連接,而且還可以針對文件夾 軟連接依賴于原始文件。原始文件刪了軟連接就打不開了  相對路徑一般相對當前工作目錄,但…

    Linux干貨 2017-05-30
  • Linux上bash的部分基礎特性:

    命令補全: tab      shell程序在接收到用戶執行命令的請求,分析完成后,最左側的字符串會被當做命令 命令查找機制:     查找內部命令:     根據PATH環境變量中設定的目錄,自左而右逐個搜索目錄下的文件名 &n…

    Linux干貨 2017-03-28
  • LVS+keepalived高可用web集群搭建的疑惑

    參考文章是這一份:http://ox0spy.github.io/debian/2014/06/26/setup-lvs-and-keepalived-on-debian/ 一:操作系統與ip               ip地址形式:19…

    Linux干貨 2016-02-14
  • 基礎腳本編程練習題

        Shell腳本其實就是以一系列命令組合起來的文本文件,這些命令組合起來完成一個或者一項功能。因為Shell似乎是各UNIX系統之間通用的功能,并且經過POSIX(表示可移植操作系統接口Portable Operating System Interface of UNIX,縮寫為 POSIX)的標準化。因此,Sh…

    2017-08-05
欧美性久久久久