1. 程式人生 > >lvs+keepalived 高可用及負載均衡

lvs+keepalived 高可用及負載均衡

module pri gzip cal flv -i poll ORC 虛擬ip

一、環境準備

VIP:10.18.43.30
dr1:10.18.43.10
dr2:10.18.43.20
web1:10.18.43.13
web2:10.18.43.14

  結構圖

技術分享圖片

(一)、預處理

  (1)、關閉所有機器selinux,

vim /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is
enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected
. # mls - Multi Level Security protection. SELINUXTYPE=targeted

-------------------------------------------------------------
setenforce 0                    #退出保存,執行setenforce 0 當前生效

  (2)、關閉所有機器firewalld

systemctl stop firewalld.service 

  (3)、添加網卡  

  在DR1與DR2機器添加個添加一張網卡,(也可以不用添加使用本機網卡,主機有兩塊網卡,其中一塊可以用來檢測心跳,MASTER和BACKUP如果無法接收到彼此的組播通知,但是兩個節點實際上都處於工作狀態,這時兩個節點均為MASTER強行綁定虛擬IP,從而導致腦裂。)

(二)、部署處理

部署要使用的相關軟件; 

   

  (1)、後端部署      

nginx編譯安裝,(在web1和web2執行相同的操作,此處省略web2操作步驟)



groupadd nginx                          #創建nginx組
useradd -r -g nginx -s /bin/nologin nginx          #創建nginx用戶並取消shell
 
wget http://nginx.org/download/nginx-1.14.0.tar.gz        #下載nginx軟件包
tar xf nginx-1.14.0.tar.gz -C /tpm/              #解壓nginx源碼包
cd /tmp/nginx-1.14.0/
                                  
./configure --prefix=/usr/local/nginx --without-select_module --without-poll_module --with-debug --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_xslt_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module --with-cc=`which gcc`

make -j 2 && make install

  (2)、啟動nginx服務

cd /usr/local/nginx/
sbin/nginx
[root@web1- nginx]# lsof -i:80 
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

nginx   1134   root    6u  IPv4  27680      0t0  TCP *:http (LISTEN)

nginx   1135  nginx    6u  IPv4  27680      0t0  TCP *:http (LISTEN)

  (3)、設置lo回環地址

       (在web1和web2,執行相同的操作)

[root@web1-1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
[root@web1-1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@web1-1 ~]# ip a a dev lo 10.18.43.30/32 
[root@web1-1 ~]# 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
    inet 10.18.43.30/32 scope global 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 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:ed:d6:71 brd ff:ff:ff:ff:ff:ff
    inet 10.18.43.13/24 brd 10.18.43.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:feed:d671/64 scope link  
       valid_lft forever preferred_lft forever

  測試後端web服務是否正常,(web1,web2執行相同操作)

[root@web1-1 ~]# curl 10.18.43.13
web1

  (4)、負載均衡

  下載ipvsadm,keepalived,

yum -y install ipvsadm keepalived  

  (5)、keepalived部署詳解

[root@DR-1-1 ]# vim /etc/keepalived/keepalived.conf 
global_defs {
   router_id lvs                                       #全局配置
}

vrrp_instance lvs_keepalived {                           #庫名稱
    state BACKUP                                        #角色:MASTER    BACKUP
    interface eth0                                      #網卡:這裏我們拿eth0做為心跳測試,檢測另一臺BACKUP存活狀態
    virtual_router_id 51                                #小組段:默認是51 
    priority 100                                        # 服務的優先權最高255
    nopreempt                                           # BACKUP 不搶IP
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111                                   #小組密碼
    }
    virtual_ipaddress {
         10.18.43.30/32 dev eth1                         # 虛擬ip
    }
}

virtual_server 10.18.43.30 80 {                    
    delay_loop 6                                         #延時環 6秒
    lb_algo rr                                           #輪詢規則rr 
    lb_kind DR                                           #使用的工作模式
    persistence_timeout 50                               #連接超時 時間
    protocol TCP                                         #使用的協議

    real_server 10.18.43.13 80 {
        weight 1                                         #權重
        TCP_CHECK {
            connect_port 80                              #監聽端口
            connect_timeout 3                            #連接超時3秒
            nb_get_retry 3                               #重試連接3次
            delay_before_retry 3                         #連接超時3重試連接3次
        }
    }
    real_server 10.18.43.14 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

將這份配置發給dr2,只需要修改優先級;

[root@DR-2-2 ]# vim /etc/keepalived/keepalived.conf 
global_defs {
   router_id lvs                                       #全局配置,全局必須一致
}

vrrp_instance lvs_keepalived {                           #庫名稱
    state BACKUP                                        #角色:MASTER    BACKUP
    interface eth0                                      #網卡:這裏我們拿eth0做為心跳測試,檢測另一臺BACKUP存活狀態
    virtual_router_id 51                                #小組段:默認是51 
    priority 150                                        #註意這裏的優先級
    nopreempt                                           # BACKUP 不搶IP
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111                                   #小組密碼
    }
    virtual_ipaddress {
         10.18.43.30/32 dev eth1                         # 虛擬ip
    }
}

virtual_server 10.18.43.30 80 {                    
    delay_loop 6                                         #延時環 6秒
    lb_algo rr                                           #輪詢規則rr 
    lb_kind DR                                           #使用的工作模式
    persistence_timeout 50                               #連接超時 時間
    protocol TCP                                         #使用的協議

    real_server 10.18.43.13 80 {
        weight 1                                         #權重
        TCP_CHECK {
            connect_port 80                              #監聽端口
            connect_timeout 3                            #連接超時3秒
            nb_get_retry 3                               #重試連接3次
            delay_before_retry 3                         #連接超時3重試連接3次
        }
    }
    real_server 10.18.43.14 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

  (6)、啟動keepalived

  (在DR1和DR2執行相同操作)

[root@DR-1-1 ~]# systemctl start keepalived.service
[root@DR-2-2 ~]# systemctl start keepalived.service

  (7)、查看結果

  DR1與RD2先啟動那個機器,虛擬VIP就會在那個主機的第二張網卡上,(第一張網卡是用來做心跳測試的,)

[root@DR-1-1 keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    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 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:c9:8e:89 brd ff:ff:ff:ff:ff:ff
    inet 10.18.43.10/24 brd 10.18.43.255 scope global dynamic eth0
       valid_lft 41215sec preferred_lft 41215sec
    inet6 fe80::70de:1853:c4c6:aa/64 scope link 
       valid_lft forever preferred_lft forever
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:51:4b:4f brd ff:ff:ff:ff:ff:ff
    inet 10.18.43.12/24 brd 10.18.43.255 scope global dynamic eth1
       valid_lft 43069sec preferred_lft 43069sec
    inet 10.18.43.30/32 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::e958:18e:3504:b3f/64 scope link 
       valid_lft forever preferred_lft forever

二、概念補充

(1)、腦裂

一般來說,腦裂的發生,有一下幾種原因;

1、高可用服務器對之間心跳線鏈路發生故障,導致無法正常通信;

2、因心跳線壞了,(包括斷了,老化等一些物理上的原因)

3、因網卡及相關驅動壞了,IP配置及沖突問題(網卡直連)

4、因心跳線間鏈接的設備故障(網卡及交換機)

5、因仲裁的機器出問題(采用仲裁的方案)

6、高可用服務器上開啟了iptables防火強阻擋了心跳消息傳輸

7、高可用服務器上心跳網卡地址等信息配置不正確,導致心跳失敗;

8、其他服務配置不當等原因,如心跳方式不同,心跳廣播沖突,軟件Bug等。

  提示:keepalived配置裏同一VRRP實例如果virtual_router_id兩端參數配置不一致也後悔導致腦裂問題發生;

(2)、常見解決方案

在實際生產環境中,我們可以從以下幾個方面來防止腦裂問題的發生;

1、同時使用串行電纜和以太網電纜鏈接,同時使用兩跳心跳線路,這樣一條線路壞了,另一條還是好的,依然能傳送心跳消息

2、當檢測到腦裂時,強行關閉一個心跳節點,

3、做好對腦裂的監控報警,在問題發生時人為第一時間介入仲裁,降低損失。

(3)、keepalived配置

  在這裏主要解釋一下我的配置沒有寫入MASTER,在有nopreempt參數的情況下,是可以不要MASTER,為了確保vip在一臺機器上的穩定性,我們需要在配置文件中添加nopreempt參數,而且取消MASTER角色;

如果MASTER角色存在,那麽MASTER角色宕機之後,他的vip會漂移到BACKUP角色主機上,這時如果是以為網絡抖動的原因造成的,當MASTER服務鏈接正常時,MASTER角色就會將原有的vip搶回來,反復來回幾次之後,keepalived就會宕機,造成不可設想的後果;

如果取消MASTER角色,添加nopreempt參數,vip會按照服務啟動的先回順序和優先級來決定他在那臺機器上,有一臺keepalived宕機,vip就會漂移到另一臺BACKUP機器上,當另一臺keepalived正常只會,他不會去搶vip,這樣就不會造成vip來回在keepalived機器上飄來飄去;

lvs+keepalived 高可用及負載均衡