LVS+Keepalived+Nginx高可用實現

 前言

本文搭建LVS+Keepalived+Nignx高可用,搭建以前,先看下如下幾種方案架設示意圖的演進。前端

方案一

起初是一個Nginx服務器,可是當Nginx掛掉後,用戶就直接訪問不了網站,進而演進第二種方案。
watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=linux

方案二

這個方案經過Keepalived解決了Nginx主節點掛掉後,從節點的Nginx會啓用,實現了雙機主備,這樣雖然解決了第一種方案的弊端,可是高迸發場景下,一個Nginx承受不住,不管有多少從節點,仍是會掛掉,從而演進第三種方案。
watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=nginx

方案三

經過LVS+Keepalived+Nginx,搭建了Nginx集羣,對於LVS使用DR模式,請求轉發響應不經過LVS,直接經過Nginx響應給用戶,這樣LVS負載就更高了,從而提升性能,下面以方案三搭建LVS+Keepalived+Nginx高可用
watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=c++

概念

一.LVS

  • 什麼是LVS?

LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集羣系統。本項目在1998年5月由章文嵩博士成立,是中國國內最先出現的自由軟件項目之一。在linux內存2.6中,它已經成爲內核的一部分,在此以前的內核版本則須要從新編譯內核。web

  • 宗旨

使用集羣技術和Linux操做系統實現一個高性能、高可用的服務器. 很好的可伸縮性(Scalability) 很好的可靠性(Reliability) 很好的可管理性(Manageability)面試

  • 特色

可伸縮網絡服務的幾種結構,它們都須要一個前端的負載調度器(或者多個進行主從備份)。咱們先分析實現虛擬網絡服務的主要技術,指出IP負載均衡技術是在負載調度器的實現技術中效率最高的。在已有的IP負載均衡技術中,主要有經過網絡地址轉換(Network Address Translation)將一組服務器構成一個高性能的、高可用的虛擬服務器,咱們稱之爲VS/NAT技術(Virtual Server via Network Address Translation)。在分析VS/NAT的缺點和網絡服務的非對稱性的基礎上,咱們提出了經過IP隧道實現虛擬服務器的方法VS/TUN (Virtual Server via IP Tunneling),和經過直接路由實現虛擬服務器的方法VS/DR(Virtual Server via Direct Routing),它們能夠極大地提升系統的伸縮性。VS/NAT、VS/TUN和VS/DR技術是LVS集羣中實現的三種IP負載均衡技術。 算法

二.Keepalived

Keepalived的做用是檢測服務器的狀態,若是有一臺web服務器宕機,或工做出現故障,Keepalived將檢測到,並將有故障的服務器從系統中剔除,同時使用其餘服務器代替該服務器的工做,當服務器工做正常後Keepalived自動將服務器加入到服務器羣中,這些工做所有自動完成,不須要人工干涉,須要人工作的只是修復故障的服務器。 數據庫

搭建

一.準備

準備4臺虛擬機(CentOS 7),用於測試使用vim

主機 IP 做用
主機1 192.168.232.130 Nginx1
主機2 192.168.232.131 Nginx2
主機3 192.168.232.132 Keepalived Master
主機4 192.168.232.133 Keepalived Backup
192.168.232.150 虛擬IP(VIP)

二.軟件安裝

192.168.232.130192.168.232.131主機上安裝Nginx; 在192.168.232.132192.168.232.133主機上安裝Keepalived設計模式

1.依賴環境安裝

必定要先安裝依賴環境,若是下面安裝的過程當中遇到一些錯誤信息,按照提示安裝如下依賴

yum install gcc-c++

yum install -y pcre pcre-devel

yum install -y zlib zlib-devel

yum install -y openssl openssl-devel

yum install -y libnl libnl-devel

yum install -y libnfnetlink-devel

2.Nginx安裝,若是已經安裝能夠跳過這步

192.168.232.130192.168.232.131主機上安裝Nginx,將下載好的Nginx上傳到Linux系統,而後解壓

#解壓命令,版本替換爲你本身下載的版本
tar -zxvf nginx-1.61.1.tar.gz

編譯以前,先建立nginx臨時目錄,若是不建立,在啓動nginx的過程當中會報錯

mkdir /var/temp/nginx -p

在nginx目錄中,輸入以下命令配置,目的是爲了建立makefile文件

./configure 
--prefix=/usr/local/nginx 
--pid-path=/var/run/nginx/nginx.pid 
--lock-path=/var/lock/nginx.lock 
--error-log-path=/var/log/nginx/error.log 
--http-log-path=/var/log/nginx/access.log 
--with-http_gzip_static_module 
--http-client-body-temp-path=/var/temp/nginx/client 
--http-proxy-temp-path=/var/temp/nginx/proxy 
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi 
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi 
--http-scgi-temp-path=/var/temp/nginx/scgi 
--with-http_ssl_module 
--with-http_stub_status_module

而後之行如下命令,進行編譯安裝

make && make install

進入nginx安裝目錄下的sbin

#啓動nginx
./nginx

#中止nginx
./nginx -s stop

#從新加載nginx
./nginx -s reload

打開瀏覽器,訪問虛擬機所處內網ip便可打開nginx默認頁面,此時表示已經安裝成功。

注意事項:虛擬機安裝須要關閉防火牆,不然訪問不

3.Keepalived安裝,若是也已經安裝能夠跳過這個步驟

192.168.232.132192.168.232.133主機上安裝Keepalived,將下載好的Keepalived安裝包上傳到Linux系統,而後解壓

#解壓命令,版本替換爲你本身下載的版本
tar -zxvf keepalived-2.0.18.tar.gz

#進入到keepalived解壓目錄
cd keepalived-2.0.18

配置keepalived

./configure --prefix=/usr/local/keepalived --sysconf=/etc

而後之行如下命令,進行編譯安裝

make && make install

而後到keepalived安裝目錄

cd /usr/local/keepalived

cd sbin

#啓動keepalived
./keepalived

爲了方便啓動,將Keepalived註冊到Linux系統,進入到解壓的keepalived目錄(注意:這裏是一開始解壓的目錄,不是keepalived安裝目錄)

#keepalived目錄中有個文件夾keepalived,下面還有個etc,進入
cd keepalived/etc

#而後執行,若是提示是否覆蓋,輸入y覆蓋
sudo cp init.d/keepalived /etc/init.d/

sudo cp sysconfig/keepalived /etc/sysconfig/ 

#使配置生效
systemctl daemon-reload

#啓動keepalived
systemctl start keepalived.service

#中止keepalived
systemctl stop keepalived.service

#重啓keepalived
systemctl restart keepalived.service

4.ipvsadm安裝

用於查看lvs轉發及代理狀況的工具,只須要在192.168.232.132192.168.232.133上安裝便可

yum install ipvsadm -y

三.配置

1.配置Nginx服務器,在192.168.232.130192.168.232.131構建虛擬網絡接口子接口

進入到/etc/sysconfig/network-scripts

cd /etc/sysconfig/network-scripts

拷貝一份ifcfg-lo命名爲ifcfg-lo:1

cp ifcfg-lo ifcfg-lo:1

修改裏面配置文件

DEVICE=lo:1
IPADDR=192.168.232.150
NETMASK=255.255.255.255

重啓網絡,就會看到lo下面多個虛擬IP

service network restart

配置ARP

vim /etc/sysctl.conf

添加如下配置

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2

刷新文件

sysctl -p

添加一個host,去接收報文交給lo:1處理

#這樣添加劇啓後會失效
route add -host 192.168.232.150 dev lo:1

#查看
route -n

#添加開啓自啓動
echo "route add -host 192.168.232.150 dev lo:1" >> /etc/rc.local

2.配置keepalived,在192.168.232.132和192.168.232.133上

  • 配置MASTER,進入192.168.232.132服務器
cd /etc/keepalived

vim keepalived.conf

修改配置內容

global_defs {
   router_id LVS_132  # 設置lvs的id,在一個網絡內惟一標識
}
vrrp_instance VI_1 {
    state MASTER   #指定Keepalived的角色,MASTER爲主,BACKUP爲備 記得大寫
    interface ens33  #網卡id 換成你本身電腦的網卡id,查看:ip addr
    virtual_router_id 41  #虛擬id,主備要一致
    priority 100  #定義優先級,數字越大,優先級越高,主DR必須大於備用DR
    advert_int 1  #檢查間隔,默認爲1s
    authentication { 
	#密碼主備一致
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.232.150  #設置虛擬IP(VIP)
    }
}
#配置集羣地址訪問的IP+端口,端口和nginx保持一致,都是80
virtual_server 192.168.232.150 80 {
    delay_loop 6 #健康檢查時間,單位:秒
    lb_algo rr # 配置負載均衡的算法,默認爲輪詢
    lb_kind DR # 配置LVS的模式,有NAT、TUN、DR三個模式
    persistence_timeout 5 #設置會話持久化的時間
    protocol TCP #協議 -t
    #負載均衡的真實服務器,也就是nginx節點的具體的真實ip地址
    real_server 192.168.232.130 80 {  
        weight 1    #輪詢的默認權重配比設置爲1
	#設置健康檢查
        TCP_CHECK {
           #檢查的80端口
	   connect_port 80
	   #檢查超時時間
           connect_timeout 2
	   #重試的次數
           nb_get_retry 3
	   #間隔時間
           delay_before_retry 3
        }
    }
    #負載均衡的真實服務器,也就是nginx節點的具體的真實ip地址
    real_server 192.168.232.131 80 {  
        weight 1    #輪詢的默認權重配比設置爲1
        TCP_CHECK {
	   #檢查的80端口
	   connect_port 80
	   #檢查超時時間
           connect_timeout 2
	   #重試的次數
           nb_get_retry 3
	   #間隔時間
           delay_before_retry 3
        }
     }
}

保存退出,重啓keepalived服務

systemctl restart keepalived
  • 配置BACKUP,進入192.168.232.133服務器
cd /etc/keepalived

vim keepalived.conf

修改配置內容

global_defs {
   router_id LVS_133  # 設置lvs的id,在一個網絡內惟一標識
}
vrrp_instance VI_1 {
    state BACKUP     #指定Keepalived的角色,MASTER爲主,BACKUP爲備 記得大寫
    interface ens33  #網卡id 換成你本身電腦的網卡id,查看:ip addr
    virtual_router_id 41  #虛擬id,主備要一致
    priority 50  #定義優先級,數字越大,優先級越高,主DR必須大於備用DR
    advert_int 1  #檢查間隔,默認爲1s
    authentication { 
	#密碼主備一致
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.232.150  #設置虛擬IP(VIP)
    }
}
#配置集羣地址訪問的IP+端口,端口和nginx保持一致,都是80
virtual_server 192.168.232.150 80 {
    delay_loop 6 #健康檢查時間,單位:秒
    lb_algo rr # 配置負載均衡的算法,默認爲輪詢
    lb_kind DR # 配置LVS的模式,有NAT、TUN、DR三個模式
    persistence_timeout 5 #設置會話持久化的時間
    protocol TCP #協議 -t
    #負載均衡的真實服務器,也就是nginx節點的具體的真實ip地址
    real_server 192.168.232.130 80 {  
        weight 1    #輪詢的默認權重配比設置爲1
	#設置健康檢查
        TCP_CHECK {
           #檢查的80端口
	   connect_port 80
	   #檢查超時時間
           connect_timeout 2
	   #重試的次數
           nb_get_retry 3
	   #間隔時間
           delay_before_retry 3
        }
    }
    #負載均衡的真實服務器,也就是nginx節點的具體的真實ip地址
    real_server 192.168.232.131 80 {  
        weight 1    #輪詢的默認權重配比設置爲1
        TCP_CHECK {
	   #檢查的80端口
	   connect_port 80
	   #檢查超時時間
           connect_timeout 2
	   #重試的次數
           nb_get_retry 3
	   #間隔時間
           delay_before_retry 3
        }
     }
}

保存退出,重啓keepalived服務

systemctl restart keepalived
測試

查看當前配置的虛擬服務和各個RS的權重

ipvsadm -Ln

查看當前ipvs模塊中記錄的鏈接

ipvsadm -Lnc

經過訪問192.168.232.150,能夠正常顯示如下兩張圖 watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=
watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=停用主Keepalived

systemctl stop keepalived.service
  • 停用前,主keepalived的VIP還在

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

  • 停用後,VIP出如今從keepalived上

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=
此時經過192.168.232.150能夠正常訪問,當把主Keepalived重啓啓動後,VIP從新回到主Keepalived

測試停用nginx1

  • 停用前兩臺nginx存在

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

  • 停用nginx1,發現只有一個192.168.232.131的ip,掛掉的服務已經被移除,此時再去訪問只能訪問192.168.232.131的nginx

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

補充:

絕大多數公司到這一步基本就能解決接入層高可用、擴展性、負載均衡的問題了。假設LVS每秒能處理10w的請求,一天也只能處理80億的請求(10w秒吞吐量*8w秒),那萬一系統的日PV超過80億怎麼辦呢?這裏補充說明下,可使用DNS輪詢,搭建多個虛擬IP(VIP),每一個VIP的配置都和上面的配置同樣,這樣經過DNS去解析多個VIP,就能夠達到更高的負載能力。

  一直想整理出一份完美的面試寶典,可是時間上一直騰不開,這套一千多道面試題寶典,結合今年金三銀四各類大廠面試題,以及 GitHub 上 star 數超 30K+ 的文檔整理出來的,我上傳之後,毫無心外的短短半個小時點贊量就達到了 13k,說實話仍是有點難以想象的。

一千道互聯網 Java 工程師面試題

內容涵蓋:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、SpringBoot、SpringCloud、RabbitMQ、Kafka、Linux等技術棧(485頁)

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《Java核心知識點合集(283頁)》

內容涵蓋:Java基礎、JVM、高併發、多線程、分佈式、設計模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、數據庫、雲計算等

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《Java中高級核心知識點合集(524頁)》

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《Java高級架構知識點整理》

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk= watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

 因爲篇幅限制,詳解資料太全面,細節內容太多,因此只把部分知識點截圖出來粗略的介紹,每一個小節點裏面都有更細化的內容!

須要的小夥伴,能夠一鍵三連,下方獲取免費領取方式!

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

 

相關文章
相關標籤/搜索