前言本文搭建LVS+Keepalived+Nignx高可用,搭建以前,先看下如下幾種方案架設示意圖的演進。前端
起初是一個Nginx服務器,可是當Nginx掛掉後,用戶就直接訪問不了網站,進而演進第二種方案。linux
這個方案經過Keepalived解決了Nginx主節點掛掉後,從節點的Nginx會啓用,實現了雙機主備,這樣雖然解決了第一種方案的弊端,可是高迸發場景下,一個Nginx承受不住,不管有多少從節點,仍是會掛掉,從而演進第三種方案。nginx
經過LVS+Keepalived+Nginx,搭建了Nginx集羣,對於LVS使用DR模式,請求轉發響應不經過LVS,直接經過Nginx響應給用戶,這樣LVS負載就更高了,從而提升性能,下面以方案三搭建LVS+Keepalived+Nginx高可用c++
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的做用是檢測服務器的狀態,若是有一臺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.130和192.168.232.131主機上安裝Nginx; 在192.168.232.132和192.168.232.133主機上安裝Keepalived設計模式
必定要先安裝依賴環境,若是下面安裝的過程當中遇到一些錯誤信息,按照提示安裝如下依賴
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
在192.168.232.130和192.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默認頁面,此時表示已經安裝成功。
注意事項:虛擬機安裝須要關閉防火牆,不然訪問不
在192.168.232.132和192.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
用於查看lvs轉發及代理狀況的工具,只須要在192.168.232.132和192.168.232.133上安裝便可
yum install ipvsadm -y
進入到/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
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
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,能夠正常顯示如下兩張圖
停用主Keepalived
systemctl stop keepalived.service
此時經過192.168.232.150能夠正常訪問,當把主Keepalived重啓啓動後,VIP從新回到主Keepalived
測試停用nginx1
絕大多數公司到這一步基本就能解決接入層高可用、擴展性、負載均衡的問題了。假設LVS每秒能處理10w的請求,一天也只能處理80億的請求(10w秒吞吐量*8w秒),那萬一系統的日PV超過80億怎麼辦呢?這裏補充說明下,可使用DNS輪詢,搭建多個虛擬IP(VIP),每一個VIP的配置都和上面的配置同樣,這樣經過DNS去解析多個VIP,就能夠達到更高的負載能力。
一直想整理出一份完美的面試寶典,可是時間上一直騰不開,這套一千多道面試題寶典,結合今年金三銀四各類大廠面試題,以及 GitHub 上 star 數超 30K+ 的文檔整理出來的,我上傳之後,毫無心外的短短半個小時點贊量就達到了 13k,說實話仍是有點難以想象的。
內容涵蓋:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、SpringBoot、SpringCloud、RabbitMQ、Kafka、Linux等技術棧(485頁)
內容涵蓋:Java基礎、JVM、高併發、多線程、分佈式、設計模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、數據庫、雲計算等
因爲篇幅限制,詳解資料太全面,細節內容太多,因此只把部分知識點截圖出來粗略的介紹,每一個小節點裏面都有更細化的內容!
須要的小夥伴,能夠一鍵三連,下方獲取免費領取方式!