基于 LVS + keepalived 的雙機熱備負載均衡器

1. LVS

1.1 LVS 原理

1.1.1 LVS 集群中的 IP 負載均衡技術

image

詳情參考:LVS 集群中的 IP 負載均衡技術 @章文嵩博士

1.1.2 LVS 集群的負載調(diào)度

LVS 內(nèi)核中的連接調(diào)度算法

詳情參考:LVS 集群的負載調(diào)度 @章文嵩博士

查看 ipvsadm 版本:

# ipvsadm --version
ipvsadm v1.28 2015/02/09 (compiled with popt and IPVS v1.2.1)

2. Keepalived

2.1 Keepalived 架構(gòu)

Keepalived 架構(gòu)圖

2.2 Keepalived 安裝及配置

2.2.1 查詢本機網(wǎng)絡接口

查詢本機 IP 地址命令:ip addr list呕屎、ip addr show颁湖、ip a

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq_codel state UP group default qlen 1000
    link/ether 02:a2:63:89:23:50 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.62/24 brd 10.0.0.255 scope global dynamic eth0
       valid_lft 3505sec preferred_lft 3505sec
    inet6 fe80::a2:63ff:fe89:2350/64 scope link 
       valid_lft forever preferred_lft forever
       
# 配置并啟動網(wǎng)絡接口
# 配置虛擬IP
# 將網(wǎng)絡接口 eth0:1 的 IP 地址設置為:172.27.0.10,子網(wǎng)掩碼設置為:255.255.255.255,
# up:啟動網(wǎng)絡接口
# down:關閉網(wǎng)絡接口
ifconfig eth0:1 172.27.0.10 broadcast 172.27.0.10 netmask 255.255.255.255 up

# 關閉網(wǎng)絡接口
ifconfig eth0:1 172.27.0.10 broadcast 172.27.0.10 netmask 255.255.255.255 down

2.2.2 修改系統(tǒng)配置文件

2.2.2.1 編輯系統(tǒng)配置文件:vim /etc/sysctl.conf

前端 LVS 配置:

# Uncomment the next line to enable packet forwarding for IPv4
# 開啟 IPv4 數(shù)據(jù)包轉(zhuǎn)發(fā)功能
net.ipv4.ip_forward=1
# 允許綁定非本機的IP
net.ipv4.ip_nonlocal_bind=1

參考:

后端 Server 配置:

# Uncomment the next two lines to enable Spoof protection (reverse-path filter)
# Turn on Source Address Verification in all interfaces to
# prevent some spoofing attacks
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.eth0.rp_filter=0

2.2.2.2 使配置文件生效

每次系統(tǒng)啟動時趾徽,初始化腳本 /etc/rc.d/rc.sysinit 會讀取 /etc/sysctl.conf 文件的內(nèi)容啥供,所以修改此文件后每次系統(tǒng)重啟時都會開啟 IP 轉(zhuǎn)發(fā)功能忘伞。但是只修改 sysctl 文件不會馬上生效,如果需要使修改馬上生效可以執(zhí)行下面的命令:

# 使配置文件馬上生效
$ sudo sysctl -p
net.ipv4.ip_forward = 1

2.2.2.3 驗證配置是否生效

# 查看 ip_forward 文件內(nèi)容微峰,默認值 0 表示禁止 IP 轉(zhuǎn)發(fā)舷丹,1 表示開啟 IP 轉(zhuǎn)發(fā)功能。
$ cat /proc/sys/net/ipv4/ip_forward
1

$ cat /proc/sys/net/ipv4/ip_nonlocal_bind
1

2.2.3 下載安裝 Keepalived

# 1. 更新 apt 軟件包
apt-get update && apt-get upgrade

# 2. 安裝相關軟件包
apt-get install -y libssl-dev openssl libpopt-dev
apt install jq
apt install awscli

# 3. 下載安裝 Keepalived
apt-get install keepalived

# 4. 查看 Keepalived 安裝版本
keepalived --version
Keepalived v1.3.9 (10/21,2017)
...

2.3 Keepalived 配置文件詳解

??????

Keepalived 配置文件官方文檔:http://www.keepalived.org/manpage.html

  • keepalived 的配置文件路徑為:/etc/keepalived/keepalived.conf
  • Keepalived 的配置文件都是以塊(block)的形式組織的蜓肆,每個塊的內(nèi)容都包含在 {} 中颜凯,以 “#” 和 “!” 開頭的行都是注釋。
  • 根據(jù) Keepalived 配置文件所實現(xiàn)的功能症杏,可以將配置分為三類:
    1. 全局配置(Global Configuration)装获;
    2. VRRPD 配置;
      1. VRRP 同步組配置厉颤;
      2. VRRP 實例配置穴豫;
    3. LVS 配置;
Keepalived.conf 文件結(jié)構(gòu)
# Define the script used to check if haproxy is still working
# 檢查 haproxy 是否正常運行的腳本
vrrp_script chk_haproxy { 
    script "killall -0 haproxy"
    interval 2 
    weight 2 
}

2.3.1 Keepalived 的全局配置

全局配置就是對整個 Keepalived 都生效的配置。

# Configuration File for keepalived

# ------ 全局配置 ------
# 報警郵件通知設置
# 全局配置以 “global_defs” 作為標識符
global_defs {
    notification_email {
        your@emailaddress.com    # 報警郵件地址精肃,可以設置多個秤涩,每行一個。
                                 # 開啟郵件報警需要開啟本機的 Sendmail 服務司抱。 
    }
    notification_email_from loadb01@domain.ext  # 報警郵件發(fā)送的地址筐眷。
    smtp_server 127.0.0.1     # 郵件的 SMTP 服務器地址。
    smtp_connect_timeout 15   # 連接 SMTP 服務器的超時時間习柠。
    router_id lVS_DEVER       # 運行 Keepalived 服務器的一個標識符匀谣,
                              # 是發(fā)郵件時顯示在郵件主題中的信息。
}

?

2.3.2 Keepalived 的 VRRPD 配置

VRRPD 配置是 Keepalived 所有配置的核心资溃,主要用來實現(xiàn) Keepalived 的高可用功能武翎。
從結(jié)構(gòu)上來看,VRRPD 配置可以分為 VRRP 同步組配置VRRP 實例配置溶锭。

2.3.2.1 VRRP 同步組配置

同步組是相對于多個 VRRP 實例而言的宝恶,在多個 VRRP 實例的環(huán)境中,每個 VRRP 實例所對應的網(wǎng)絡環(huán)境會有所不同趴捅,假設一個實例處于網(wǎng)段A垫毙,另一個實例處于網(wǎng)段B,而如果 VRPD 只配置了A網(wǎng)段的檢測拱绑,那么當B網(wǎng)段主機出現(xiàn)故障時综芥, VRRPD 會認為自身仍處于正常狀態(tài),進而不會進行主備節(jié)點的切換欺栗,這樣問題就出現(xiàn)了毫痕。同步組就是用來解決這個問題的征峦,將所有 VRRP 實例都加入到同步組中迟几,這樣任何一個實例出現(xiàn)問題,都會導致 Keepalived進行主備切換栏笆。

vrrp_sync_group G1 {
    # G1 同步組包含 VI_1类腮、VI_2、VI_5 三個 VRRP 實例
    group {
       # name of the vrrp_instance (see below)
       # Set of VRRP_Instance string
       VI_1
       VI_2
       VI_5
    }
   # to MASTER transition
   # 指定當 Keepalived 進入 Master 狀態(tài)時要執(zhí)行的腳本蛉加,
   # 這個腳本可以是一個狀態(tài)報警腳本蚜枢,也可以是一個服務管理腳本。
   # Keepalived 允許腳本傳入?yún)?shù)针饥,因此靈活性很強厂抽。
   notify_master "usr/local/bin/vrrp.mast arg1 arg2"

   # to BACKUP transition
   # 指定當 Keepalived 進入 Backup 狀態(tài)時要執(zhí)行的腳本,
   # 這個腳本可以是一個狀態(tài)報警腳本丁眼,也可以是一個服務管理腳本筷凤。
   notify_backup "usr/local/bin/vrrp.back arg1 arg2"

   # FAULT transition
   # 指定當 Keepalived 進入 Fault 狀態(tài)時要執(zhí)行的腳本
   notify_fault "usr/local/bin/vrrp.fault arg1 arg2"

   # executed when stopping vrrp
   # 指定 Keepalived 程序終止時需要執(zhí)行的腳本。
   notify_stop "usr/local/bin/vrrp.stop arg1 arg2"                                   
}

vrrp_sync_group G2 {
   # G2 同步組包含 VI_3、VI_4 三個 VRRP 實例
   group {
       VI_3
       VI_4
    }                                
}

2.3.2.2 VRRP 實例配置

VRRP 實例配置——配置 Keepalived 的高可用功能藐守。

VRRP 實例段主要用來配置節(jié)點角色(主或從)挪丢、實例綁定的網(wǎng)絡接口、節(jié)點間驗證機制卢厂、集群服務 IP 等乾蓬。

從調(diào)度器的配置與主調(diào)度器基本相同,也包括全局參數(shù)慎恒、熱備參數(shù)任内、服務器池配置,只需要調(diào)整 router_id融柬、state族奢、prority 參數(shù)即可,其余內(nèi)容完全相同丹鸿,配置完成以后重啟keepalived服務越走。

# ------ 虛擬服務器配置 ------
# vrrp 實例配置
# VRRP 配置以 “vrrp_instance” 作為標識符
vrrp_instance VI_1 {
    state MASTER        # 指定 Keepalived 的角色。
                        # MASTER 表示此主機是主服務器靠欢,Backup 表示此主機是備用服務器廊敌。
                        # 因此,在另一臺服務器上設置該值為 BACKUP门怪。
    interface eth0      # 指定 HA 監(jiān)測網(wǎng)絡的接口骡澈。
    virtual_router_id 51 # 虛擬路由ID(0-255),在一個VRRP實例中主備服務器ID必須一樣
    priority 101        # 定義節(jié)點優(yōu)先級掷空。set this to 100 on the other machine
    advert_int 1        # 用于設定 MASTER 與 BACKUP 主機之間同步檢查的時間間隔肋殴,單位是秒。
    mcast_src_ip <IPADDR> # 發(fā)送多播包的地址坦弟。
    garp_master_delay 10
    smtp_alert          # Activate email notifications
  
    # 設置一些額外的網(wǎng)絡監(jiān)控接口
    track_interface {
    eth0
    eth1
    }
    
    # 設定節(jié)點間通信驗證類型和密碼
    authentication {
        auth_type PSAA            # 驗證類型护锤,有 PASS 和 AH 兩種模式。
        auth_pass myPassw0rd      # Set this to some secret phrase
    }
  
    # The virtual ip address shared between the two loadbalancers
    # 虛擬 IP 地址
    virtual_ipaddress {
        #<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL>
        192.168.0.200
        192.168.200.17 dev eth1
        192.168.200.18 dev eth2
    }
     
    # Use the script above to check if we should fail over
    track_script {
        chk_haproxy
    }
    
    nopreempt          # 設置高可用集群中的不搶占功能酿傍。
                       # nopreempt 表示主節(jié)點故障恢復后不再切回到主節(jié)點烙懦,讓服務一直在備用節(jié)點下工作,直到備用節(jié)點出現(xiàn)故障才會進行切換赤炒。
    preemtp_delay 300  # 設置搶占延時時間氯析,單位是秒。
}

2.3.3 Keepalived 的 LVS 配置

由于 Keepalived 屬于 LVS 的擴展項目莺褒,因此掩缓,Keepalived 可以與 LVS無縫整合,輕松搭建一套高性能的負載均衡集群系統(tǒng)遵岩。

LVS 段的內(nèi)容有兩部分組成:

  1. real_server 段你辣;
  2. 健康檢測段;
# 虛擬服務器配置
# LVS 段的配置以“virtual_server”作為開始標識。
virtual_server 192.168.80.200 80 {  # 設置虛擬 IP 地址和服務端口
    delay_loop 6 # 設置健康檢查的時間間隔绢记,單位是秒                    
    lb_kind DR # 設置 LVS IP負載均衡模式扁达,有NAT、TUN蠢熄、DR三個模式
    lb_algo rr # 設置 LVS 負載調(diào)度算法跪解,rr                  
    persistence_timeout 50 # 會話保持時間,單位是秒签孔。
    persistence_granularity <NETMASK> # 子網(wǎng)掩碼叉讥。表示持久連接的粒度。默認是255.255.255.255
    protocol TCP # 指定轉(zhuǎn)發(fā)協(xié)議類型饥追。有 TCP 和 UDP 兩種選項图仓。
    ha_suspend   # 節(jié)點狀態(tài)從 Master 到 Backup 切換時,暫不啟用 real server 節(jié)點的健康檢查但绕。
    virtualhost <string> # 健康檢查時救崔,指定 Web 服務器的虛擬主機地址。
    sorry_server <IPADDR> <PORT> # 當所有 real server 失效后捏顺,指定的 Web 服務器的虛擬主機地址六孵。
    
    # -------- real_server 段配置 --------
    real_server 192.168.80.102 80 {  # 指定 real server1 的IP地址
        weight 3   # 配置節(jié)點權(quán)值,數(shù)字越大權(quán)重越高
        inhibit_on_faliure # 在檢測到 real_server 節(jié)點失效后幅骄,把它的 “Weight” 值設置為0劫窒,而不是從 IPVS 中刪除。
        notify_up <STRING> | <QUOTED-STRING> # 在檢測到 real_server 節(jié)點服務處于 UP 狀態(tài)后執(zhí)行的腳本
        notify_down <STRING> | <QUOTED-STRING> # 在檢測到 real_server 節(jié)點服務處于 DOWN 狀態(tài)后執(zhí)行的腳本
        
        # -------- 健康檢測段配置 -------
        TCP_CHECK { # 配置為 TCP_CHECK 檢測方式
            connect_port 80      # 健康檢查的端口
            connect_timeout 10   # 無響應超時時間拆座。單位是秒主巍。     
            retry 3       # 重試次數(shù)
            delay_before_retry 3 # 重試間隔 
        }  
    }  
    real_server 192.168.80.103 80 {  # 指定 real server2 的IP地址
        weight 3  # 配置節(jié)點權(quán)值,數(shù)字越大權(quán)重越高  
        TCP_CHECK {  
          connect_port 80
            connect_timeout 10  
            retry 3  
            delay_before_retry 3    
        }  
     }  
}

2.4 啟動與停止服務

# 方式一
/etc/init.d/keepalived status # 查看狀態(tài)
/etc/init.d/keepalived stop  # 停止
/etc/init.d/keepalived start # 啟動

# 方式二
sudo service keepalived status
sudo service keepalived start 
sudo service keepalived stop
sudo service keepalived restart

2.5 測試

2.5.1 查看服務進程狀態(tài):ip

必須要有三個keepalived的進程挪凑,這三個分別是keepalived父進程孕索,vrrp子進程、check子進程岖赋;兩個子進程都被系統(tǒng)watchlog看管檬果,兩個子進程各自負責復雜自己的事

2.5.2 其次ip addr查看虛擬 ip 是否創(chuàng)建成功,ping 虛擬 ip 是否相通唐断。

2.5.3 查看集群中服務器ip信息:ipvsadm -ln

2.5.4 查看 Keepalived 日志:cat /var/log/syslog | grep Keepalived

簡書:ipvsadm 指令詳解

# 查看 ipvsadm 版本
$ ipvsadm --version
ipvsadm v1.28 2015/02/09 (compiled with popt and IPVS v1.2.1)

# 查看集群中服務器ip信息
# -l、-list:列出虛擬服務器表
# -n:IP 地址和端口號將以數(shù)字格式打印杭抠,而不是作為主機名和服務分別打印脸甘,這是默認設置。
ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.100:80 lc persistent 60
  -> 10.0.0.102:80                Route   3      0          0
  -> 10.0.0.202:80                Route   3      0          0

# -c:連接輸出偏灿。使用此選項的 list 命令將列出當前的 IPVS 連接
ipvsadm -lnc
IPVS connection entries
pro expire state       source             virtual            destination
TCP 00:48  NONE        111.187.40.59:0    10.0.0.138:80      10.0.0.214:80
TCP 00:59  SYN_RECV    111.187.40.59:5196 10.0.0.138:80      10.0.0.214:80
TCP 00:59  SYN_RECV    111.187.40.59:5197 10.0.0.138:80      10.0.0.214:80
TCP 00:59  SYN_RECV    111.187.40.59:5198 10.0.0.138:80      10.0.0.214:80

# 查看
arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
10.0.0.202               ether   02:fb:fd:00:12:ae   C                     eth0
10.0.0.1                 ether   02:06:a0:5b:39:d2   C                     eth0
10.0.0.2                 ether   02:06:a0:5b:39:d2   C                     eth0
10.0.0.102               ether   02:2b:7d:01:b6:68   C                     eth0
10.0.0.199               ether   02:63:16:9e:f2:08   C                     eth0
10.0.0.100                       (incomplete)                              eth0

2.5.5 驗證 VIP 漂移

systemctl stop keepalived.service

2.5.6 測試抓取數(shù)據(jù)包

tcpdump -i eth0 -p -n -vv port 80

AWS 下的部署實例

參考

在私有環(huán)境中部署keepalived本身并沒有好說的丹诀,但是aws中存在諸多限制,其中三個需要明確指出的:

  1. VRRP協(xié)議的組播被禁止,也就是說keepalived需要調(diào)整心跳的通知方式铆遭,修改/etc/keepalived/keepalived.conf配置文件中的通知為單播模式硝桩,一般配 web 服務器上數(shù)量較少,所以也不會損失太多網(wǎng)絡帶寬枚荣。

    unicast_src_ip 172.*.*.1 # 本機IP
    
    unicast_peer {
    172.*.*.124 # 備用節(jié)點 IP
    }
    

    AWS 常見問題匯總

  2. 配置了VIP(floating ip)以后碗脊,AWS的VPC并不知道,嘗試下arp也學習不到該vip的mac地址橄妆,所以必須要通過配置ENI(Elastic Network Interface彈性網(wǎng)絡接口)使得該VIP可達衙伶。

  3. 然而當你關了Master以后,ENI的網(wǎng)絡配置并不會自動切換漂移IP害碾,為了故障切換矢劲,我利用切換VIP的通知機制,通過調(diào)用添加和移除private-ip-addresses的方式達到漂移IP的效果慌随。下面詳細介紹芬沉。

還要新建一個 IAM 賬戶,以允許運行 AWS CLI 命令阁猜,并在服務器上進行注冊花嘶。

aws configure

綁定輔助私有IP ??????

亞馬遜云雖然不允許廣播 ARP,但可以用命令行指定網(wǎng)卡(ENI)的 Secondary-private-ip-address蹦漠。這個命令的具體形式如下:

AWS CLI Command Reference:assign-private-ip-addresses

# 將一個或多個輔助私有 IP 地址分配給指定的網(wǎng)絡接口椭员。
# ENI:網(wǎng)卡實例 ID
# VIP:虛擬 IP 地址
aws ec2 assign-private-ip-addresses \
--network-interface-id $ENI \ 
--private-ip-addresses $VIP \ 
--allow-reassignment


# 示例:指定一個IP地址(10.0.0.100)作為網(wǎng)卡的私有IP地址
aws ec2 assign-private-ip-addresses --network-interface-id eni-0a8a8f03710ecbb9e --private-ip-addresses 10.0.0.100 --allow-reassignment


aws ec2 assign-private-ip-addresses --network-interface-id eni-0eff36fde0c99958e --private-ip-addresses 10.0.0.100 --allow-reassignment

keepalived 配置:

notify_master "/home/keepalived/scripts/mysql_be_master.sh 172.*.*.201 eni-*"

彈性IP配置的腳本文件

add_eip.sh

作用:分離彈性 ip,并將彈性 ip 綁定到自身網(wǎng)口上

授權(quán):chmod -R 711 /etc/keepalived/scripts

#/bin/bash
EIP=13.*.*.201                          # 彈性 ip 地址(公網(wǎng) ip)
INSTANCE_ID=i-0b2d*************   #此服務器(EC2)的實例的 id
aws ec2 disassociate-address --public-ip $EIP

aws ec2 associate-address --public-ip $EIP --instance-id $INSTANCE_ID

del_eip.sh

授權(quán) chmod +x ./add_eip.sh chmod -R 711 add_eip.sh

#/bin/bash
EIP=13.*.*.201                                 #彈性 ip 地址(公網(wǎng) ip)
INSTANCE_ID=i-0b2d*************   #備服務器(EC2)的實例的 id
aws ec2 disassociate-address --public-ip $EIP

aws ec2 associate-address --public-ip $EIP --instance-id $INSTANCE_ID


# 取消關聯(lián)需要傳關聯(lián) ID笛园,而不是分配 ID隘击。
aws ec2 disassociate-address --association-id $ASSOCIATION_ID
aws ec2 disassociate-address --association-id eipassoc-09fe640e36c9d53b1

把外網(wǎng) EIP 作為 VIP,先釋放研铆,再關聯(lián)給一個網(wǎng)卡的輔助私有IP地址:

參考:AWS CLI:associate-address

aws ec2 disassociate-address --public-ip $EIP

aws ec2 associate-address \
  --allocation-id eipalloc-09ce336dc7a1e8da7 \ # 分配 ID
  --network-interface-id eni-0a8a8f03710ecbb9e \
  --private-ip-address 10.0.0.100 \
  --allow-reassociation


# 關聯(lián)彈性公網(wǎng) IP 到 網(wǎng)卡
aws ec2 associate-address --allocation-id eipalloc-09ce336dc7a1e8da7 --network-interface-id eni-0a8a8f03710ecbb9e --private-ip-address 10.0.0.100 --allow-reassociation
# 根據(jù)實例 ID 找到網(wǎng)卡 ID
aws ec2 describe-instances \
  --instance-ids i-0260f608cf698958c | \
  jq -r \
  '.Reservations[0].Instances[0].NetworkInterfaces[0].NetworkInterfaceId'
  

# 實例
aws ec2 describe-instances --instance-ids i-0260f608cf698958c | jq -r '.Reservations[0].Instances[0].NetworkInterfaces[0].NetworkInterfaceId'
eni-0a8a8f03710ecbb9e

配置文件

EC2_01

# Keepalived的全局配置
global_defs {
    router_id LVS_Master

    # 通知腳本設置
    script_user root        
    enable_script_security  
}

# VRRP的實例Group_LVS_1配置
vrrp_instance Group_LVS_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1

    track_interface {
        eth0
    }

    # AWS 上 VRRP 協(xié)議的組播被禁止埋同,因此這里配置心跳通知為單播模式
    unicast_src_ip 10.0.0.36  
    unicast_peer {            
        10.0.0.56
    }

    authentication {
        auth_type PASS
        auth_pass 123456
    }

    virtual_ipaddress {
        10.0.0.100
    }

    # 切換虛擬 IP 的腳本文件
    notify_master "/etc/keepalived/scripts/assign_private_ip.sh 18.223.129.244 10.0.0.100 i-0260f608cf698958c"
    notify_backup "/etc/keepalived/scripts/unassign_private_ip.sh 18.223.129.244 10.0.0.100 i-0260f608cf698958c"
}

# Virtual Server 的配置 for Real Service
virtual_server 10.0.0.100 80 {
    delay_loop 5
    lb_algo lc
    lb_kind DR
    persistence_timeout 60
    protocol TCP

    # Real Server 1 的配置
    real_server 10.0.0.80 80 {
        weight 3
        inhibit_on_failure
        TCP_CHECK {
            connect_timeout 10
            retry 3
            delay_before_retry 3
            connect_port 80
        }
    }

    # Real Server 2 的配置
    real_server 10.0.0.194 80 {
        weight 3
        inhibit_on_failure
        TCP_CHECK {
            connect_timeout 10
            retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

EC2_02

# Keepalived的全局配置
global_defs {
    router_id LVS_Master

    # 通知腳本設置
    script_user root
    enable_script_security
}

# VRRP的實例Group_LVS_1配置
vrrp_instance Group_LVS_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1

    track_interface {
        eth0
    }

    # AWS 上 VRRP 協(xié)議的組播被禁止,因此這里配置心跳通知為單播模式
    unicast_src_ip 10.0.0.56
    unicast_peer {            
        10.0.0.36
    }

    authentication {
        auth_type PASS
        auth_pass 123456
    }

    virtual_ipaddress {
        10.0.0.100
    }

    # 切換虛擬 IP 的腳本文件
    notify_master "/etc/keepalived/scripts/assign_private_ip.sh 18.223.129.244 10.0.0.100  i-0f74aba2dc5e49679"
    notify_backup "/etc/keepalived/scripts/unassign_private_ip.sh 18.223.129.244 10.0.0.100 i-0f74aba2dc5e49679"
}

# Virtual Server 的配置 for Real Service
virtual_server 10.0.0.100 80 {
    delay_loop 5
    lb_algo lc
    lb_kind DR
    persistence_timeout 60
    protocol TCP

    # Real Server 1 的配置
    real_server 10.0.0.80 80 {
        weight 3
        inhibit_on_failure
        TCP_CHECK {
            connect_timeout 10
            retry 3
            delay_before_retry 3
            connect_port 80
        }
    }

    # Real Server 2 的配置
    real_server 10.0.0.194 80 {
        weight 3
        inhibit_on_failure
        TCP_CHECK {
            connect_timeout 10
            retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

Server 服務器腳本

#!/bin/bash
# 配置realserver的lo和運用noarp
# chmod 755 /usr/local/sbin/server
# 執(zhí)行server棵红,啟動realserver的LVS服務凶赁,/etc/init.d/lvsrs start

VIP=10.0.0.100
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

sysctl -p
#end

/etc/init.d/lvsrs start

#!/bin/bash
# 配置realserver的lo和noarp
# chmod 755 /etc/init.d/lvsrs
# 執(zhí)行server,啟動realserver的LVS服務逆甜,/etc/init.d/lvsrs start

VIP=10.0.0.100

/etc/rc.d/init.d/functions

case "$1" in
start)
 ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
 /sbin/route add -host $VIP dev lo:0
 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
 echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
 echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
 echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
 sysctl -p >/dev/null 2>&1
 echo "RealServer Start OK"
 ;;
stop)
 ifconfig lo:0 down
 route del $VIP >/dev/null 2>&1
 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
 echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
 echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
 echo "RealServer Stoped"
 ;;
*)
 echo "Usage: $0 {start|stop}"
 exit 1
esac

exit 0

參考

1. LVS

2. Keepalived

3. 第三方博客虱肄、文章

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末交煞,一起剝皮案震驚了整個濱河市咏窿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌素征,老刑警劉巖集嵌,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萝挤,死亡現(xiàn)場離奇詭異,居然都是意外死亡根欧,警方通過查閱死者的電腦和手機怜珍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凤粗,“玉大人酥泛,你說我怎么就攤上這事〕藁Γ” “怎么了揭璃?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長亭罪。 經(jīng)常有香客問我瘦馍,道長,這世上最難降的妖魔是什么应役? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任情组,我火速辦了婚禮,結(jié)果婚禮上箩祥,老公的妹妹穿的比我還像新娘院崇。我一直安慰自己,他們只是感情好袍祖,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布底瓣。 她就那樣靜靜地躺著,像睡著了一般蕉陋。 火紅的嫁衣襯著肌膚如雪捐凭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天凳鬓,我揣著相機與錄音茁肠,去河邊找鬼。 笑死缩举,一個胖子當著我的面吹牛垦梆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仅孩,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼托猩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了杠氢?” 一聲冷哼從身側(cè)響起站刑,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鼻百,沒想到半個月后绞旅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡温艇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年因悲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勺爱。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡晃琳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出琐鲁,到底是詐尸還是另有隱情卫旱,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布围段,位于F島的核電站顾翼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏奈泪。R本人自食惡果不足惜适贸,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涝桅。 院中可真熱鬧拜姿,春花似錦、人聲如沸冯遂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛤肌。三九已至壁却,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寻定,已是汗流浹背儒洛。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留狼速,地道東北人琅锻。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像向胡,于是被迫代替她去往敵國和親恼蓬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容