keepalived

簡介:

    vrrp, virtual routing redundant protocol, 虛擬路由協議, 是為了解決局域網中配置靜態網關出現單點失敗現象的路由協議; 設計目標時是支持特定情況下IP數據流量失敗轉移不會引起混亂, 允許主機使用單路由器, 以及及時在實際第一跳路由器使用失敗的情形下, 仍然能夠維護路由器間的連通性. keepalived的是vrrp協議的軟件實現; 作用是檢測服務器的狀態, 如果有一臺web服務器死機, 或工作出現故障, keepalived將檢測到, 并將有故障的服務器從系統中剔除, 同時使用其他服務器代替該服務器的工作, 當服務器工作正常后keepalived自動將服務器加入到服務器集群中, 這些工作全都自動完成, 不需要人工干涉, 需要人工做的只是修復故障的服務器.

keepalived的安裝前提:

    (1) 各節點時間必須同步;

    (2) 確保iptables及selinux不會成為阻礙;

    (3) 各節點之間可通過主機名互相通信(對KA并非必須);

        建議使用/etc/hosts文件實現;

    (4) 各節點之間的root用戶可以基于密鑰認證的ssh服務完成互相通信;

keepalived的安裝配置

程序環境

    配置文件:/etc/keepalived/keepalived.conf

    主程序:/usr/sbin/keepalived

    Unit File:keepalived.service

配置文件組件部分

    TOP HIERACHY
    GLOBAL CONFIGURATION
    Global definitions
    Static routes/addresses
    VRRPD CONFIGURATION
    VRRP synchronization group(s)
    VRRP instance(s)
    LVS CONFIGURATION
    Virtual server group(s)
    Virtual server(s)

配置語法


1. 配置虛擬路由器

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> #通用格式的通知觸發機制,一個腳本可完成以上三種狀態的轉換時的通知

2. 虛擬服務器

配置參數

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 {
    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>  #連接請求的超時時長
}

配置示例

示例一: 單主模型

前提:

1. 在兩臺server上添加/etc/hosts解析文件

2. 建立ssh的連接

步驟:

在node1上生成自己的公鑰

ssh-keygen -t rsa -P ''

將自己的公鑰拷貝給node2

ssh-copy-id -i .ssh/id_rsa.pub root@node2

    同樣的在node2上建立與node1的連接

4. 確定ssh通信是否成功, 同時確定時間是否完全同步

date && ssh node2 'date'

若不能同步, 使用ntpdate TIME_SERVER_IP同步

直到時間完全同步為止

配置文件

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 #需要打開多播, 
    # ip link set dev eno16777736 multicast on
}

vrrp_instance VI_1 {
    state MASTER
    interface eno16777736
    virtual_router_id 15
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
    virtual_ipaddress {
        10.1.52.123/24 dev 16777736
    }
}

配置完之后, 實驗, 當兩個同時啟動, IP地址主節點上, 當主節點的服務停止后, 備用節點將IP地址拿到; 當主節點的服務啟動后, 又把IP地址搶回來.

示例二: 雙主模型

global_defs {
    notification_email {
    root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_mcast_group4 224.0.52.19
   }
   vrrp_instance VI_1 {
       state MASTER
       interface eno16777736
       virtual_router_id 167   #兩個虛擬路由ID要不同
       priority 100
       advert_int 1
       authentication {
           auth_type PASS
           auth_pass 536ecfc2
       }
       virtual_ipaddress {
           10.1.52.234/16  dev eno16777736
       }
}

vrrp_instance VI_2 {
    state BACKUP
    interface eno16777736
    virtual_router_id 168   #與上邊的虛擬路由要不同
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass b823e7f0
    }
    virtual_ipaddress {
        10.1.52.235/16 dev eno16777736
    }
}

首先啟動第一個節點, 能夠拿到兩個IP, 當第二節點也啟動后, 將備用IP搶奪過去; 第一個節點服務停止后, 第二個節點能夠將另外一個IP地址也拿到;

示例三: 基于lvs-dr模型的keepalived單主實踐

規劃:

    10.1.52.2和10.1.52.3當做RS主機, 安裝httpd, 搭建lvs-dr.

    10.1.52.11和10.1.51.22提供負載均衡

RS配置腳本

#!/bin/bash
#
vip='10.1.52.123'
vport='80'
netmask='255.255.255.255'
iface='lo:0'

case $1 in
start)
	echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
	echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
	echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
	echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

	ifconfig $iface $vip netmask $netmask broadcast $vip up
	route add -host $vip dev $iface
	;;
stop)
	ifconfig $iface down
	echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
	echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
	echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
	echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
esac

提供負載均衡主機的keepalived配置文件

global_defs {
   notification_email {
    root@localhost
   }

   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_mcast_group4 224.0.52.19
}

vrrp_instance VI_1 {
    state MASTER
    interface eno16777736
    virtual_router_id 167
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 536ecfc2
    }
    virtual_ipaddress {
        10.1.52.123/16  dev eno16777736
    }
}
virtual_server 10.1.52.123 80 {
    delay_loop 3
virtual_server 10.1.52.123 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    protocol TCP
    real_server 10.1.52.2 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.52.3 80 {
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 1
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}

示例四: 基于lvs-dr模型的雙主實踐

規劃:

    10.1.52.2和10.1.52.3當做RS主機, 安裝httpd, 搭建lvs-dr.

    10.1.52.11和10.1.51.22提供負載均衡

RS配置腳本

#!/bin/bash
#
vip_1='10.1.52.123'
vip_2='10.1.52.124'
vport='80'
netmask='255.255.255.255'
iface_1='lo:0'
iface_2='lo:1'

case $1 in
start)
	echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
	echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
	echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
	echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

	ifconfig ${iface_1} ${vip_1} netmask $netmask broadcast ${vip_1} up
	route add -host ${vip_1} dev ${iface_1}
	ifconfig ${iface_2} ${vip_2} netmask $netmask broadcast ${vip_2} up
	route add -host ${vip_2} dev ${iface_2}
	;;
stop)
	ifconfig $iface_1 down
	ifconfig $iface_2 down
	echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
	echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
	echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
	echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
esac

其中一臺keepalived服務的配置示例

global_defs {
       notification_email {
   	    root@localhost
       }

       notification_email_from keepalived@localhost
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id LVS_DEVEL
       vrrp_mcast_group4 224.0.52.19
}

vrrp_instance VI_1 {
	state MASTER
	interface eno16777736
	virtual_router_id 167
	priority 100
	advert_int 1
	authentication {
		auth_type PASS
		auth_pass 536ecfc2 
	}
	virtual_ipaddress {
		10.1.52.123/16	dev eno16777736
	}
}

virtual_server 10.1.52.123 80 {
	delay_loop 3
	lb_algo rr
	lb_kind DR
	protocol TCP
	real_server 10.1.52.2 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.52.3 80 {
		weight 1
		HTTP_GET {
			url {
				path /
				status_code 200
			}
			connect_timeout 1
			nb_get_retry 3
			delay_before_retry 1
		}
	}
}

vrrp_instance VI_2 {
	state BACKUP
	interface eno16777736
	virtual_router_id 163
	priority 98
	advert_int 1
	authentication {
		auth_type PASS
		auth_pass 536ecfc2 
	}
	virtual_ipaddress {
		10.1.52.124/16	dev eno16777736
	}
}
virtual_server 10.1.52.124 80 {
	delay_loop 3
	lb_algo rr
	lb_kind DR
	protocol TCP
	real_server 10.1.52.2 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.52.3 80 {
		weight 1
		HTTP_GET {
			url {
				path /
				status_code 200
			}
			connect_timeout 1
			nb_get_retry 3
			delay_before_retry 1
		}
	}
}

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

(0)
black_fishblack_fish
上一篇 2016-11-11
下一篇 2016-11-11

相關推薦

  • 無插件Vim編程技巧

    相信大家看過《簡明Vim教程》也玩了《Vim大冒險》的游戲了,相信大家對Vim都有一個好的入門了。我在這里把我日常用Vim編程的一些技巧列出來給大家看看,希望對大家有用,另外,也是一個拋磚引玉的過程,也希望大家把你們的技巧跟貼一下,我會更新到這篇文章中。另外,這篇文章里的這些技巧全都是vim原生態的,不需要你安裝什么插件。我的Vim的版本是7.2。 瀏覽代碼…

    Linux干貨 2015-04-01
  • 馬哥教育網絡21期+第十二周練習博客中

    4、建立httpd服務器(基于編譯的方式進行),要求:  提供兩個基于名稱的虛擬主機: (a)www1.stuX.com,頁面文件目錄為/web/vhosts/www1;錯誤日志為/var/log/httpd/www1.err,訪問日志為/var/log/httpd/www1.access; (b)www2.stuX.com,頁面文件目錄為/web…

    Linux干貨 2016-10-17
  • 強大的vim編輯器

    vim編輯器 一、Vim編譯器的概述 vi: Visual Interface,文本編輯器 v 文本:ASCII, Unicode v  文本編輯種類:      行編輯器: sed      全屏編輯器:nano,   &nbs…

    Linux干貨 2016-08-12
  • LVM邏輯卷管理

    一、lvm介紹     1.lvm概念                        &n…

    Linux干貨 2016-09-02
  • LAMP搭建wordpress博客站點

    使用WordPress可以搭建功能強大的網絡信息發布平臺,但更多的是應用于個性化的博客。針對博客的應用,WordPress能讓您省卻對后臺技術的擔心,集中精力做好網站的內容。本文將教您如何通過LAMP搭建自己的wordpress博客站點。 LAMP聽起來很高大上,其實是集中技術合起來的稱呼: L:linux A:apache httpd M:mysql、ma…

    2017-06-01
  • 管窺Linux史

    管窺Linux史 眾所周知,絕大部分發行版本都被稱為類Unix系統,要說Linux就應該先了解Unix的歷史,Unix的起源應該贅述MULTICS的歷史,Unix的父輩是頗具開拓性的Multics項目…… Unix創世紀 二戰結束以后,冷戰開始了。1957年蘇聯發射了第一顆人造衛星,進而開始籌備發射載人宇宙飛船。與此同時,美國宇航局的研究卻連連受挫。航天領域…

    Linux干貨 2016-10-14
欧美性久久久久