日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ngnix+keepalived 实现N主高可用负载均衡web群集

發布時間:2025/7/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ngnix+keepalived 实现N主高可用负载均衡web群集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ngnix+keepalived 實現N主高可用負載均衡web群集

?

思路:
總結一下最近學習的nginx+keepalived 的負載均衡架構,發現linux的群集系統都是負載均衡層加服務器群組層,實現負載均衡高可用的話就需要一主一備,備的那臺機就空閑了,為了合理使用資源,想通過keepalived把備用的也當做web服務器,當主的掛掉后,備的接管負載均衡任務。(想實現類似 于windowns的NLB群集)


原理:

各臺nginx用80端口做負載均衡,81端口提供web服務,通過keepalived將全部服務器做高可用。
當master掛掉后,backup服務器通過優先級選舉新的master接管vip,新的master使用80端口做負載,繼續訪問其他服務器群的81端口,把自己的web服務(81端口)備用。
修復好的服務器,要上線成為master就把keepalived的優先級設高點,只加入提供web服務就把優先級設置得比現有master低即可。

缺點:
每臺服務器都要公網ip,如果只使用一個公網ip(做VIP),就要在路由器上指定到這個ip的靜態路由
中心交換機負荷重,數據流:client->master:80->web1:81->master->client

注意:真實環境還是大多會用前端負載均衡的架構,兩臺負載均衡器做高可用。

?

實驗步驟:
Server 1
Eth0: 192.168.1.1/24
Server 2
Eth0:192.168.1.2/24
Server 3
Eth0: 192.168.1.10/24
Server 4
Eth0: 192.168.1.11/24

軟件:
Nginx 1.22
Keepalived v1.1.19

安裝過程:
網上大把。


需要配置的文件:
/etc/keepalived/keepalived.conf
/usr/local/nginx/conf/nginx.conf

?

設置好一臺服務器的配置文件,可以使用scp 命令復制到其他服務器里:

  • scp?/usr/local/nginx/conf/nginx.conf?192.168.1.2:/usr/local/nginx/conf/?
  • scp?/etc/keepalived/keepalived.conf?192.168.1.2:/etc/keepalived/?
  • .....
  • 開始配置nginx Server 1 的/usr/local/nginx/conf/nginx.conf文件如下:
  • #運行用戶?
  • ????user??www?www;?
  • #啟動進程,通常設置成和cpu的數量相等?
  • ????worker_processes??1;???
  • #最好與ulimit?-n的值保持一致?
  • ????worker_rlimit_nofile?65535;?
  • ?
  • #全局錯誤日志及PID文件?
  • ????#error_log??logs/error.log;?
  • ????#error_log??logs/error.log??notice;?
  • ????#error_log??logs/error.log??info;?
  • ????#pid????????logs/nginx.pid;?
  • ?
  • #google加速?
  • google_perftools_profiles?/tmp/tcmalloc;?
  • ?
  • #工作模式及連接數上限?
  • ??events?{?
  • ????worker_connections??65535;?
  • #epoll是多路復用IO(I/O?Multiplexing)中的一種方式,但是僅用于linux2.6以上內核,可以大大提高nginx的性能?
  • ????use?epoll;?
  • ???}?
  • ?
  • #設定http服務器,利用它的方向代理功能提供負載均衡?
  • ??http?{?
  • #設定mime類型,類型由mime.type文件定義?
  • ????include???????mime.types;?
  • ????default_type??application/octet-stream;?
  • #隱藏nginx版本?
  • server_tokens?off;?
  • ?
  • #?設定日志格式?
  • ????log_format??main??'$remote_addr?-?$remote_user?[$time_local]?"$request"?'?
  • ??????????????????'$status?$body_bytes_sent?"$http_referer"?'?
  • ?????????????????'"$http_user_agent"?"$http_x_forwarded_for"';?
  • #使用日志格式?
  • ????access_log??logs/access.log??main;?
  • ?
  • #允許客戶端請求的最大單文件字節數?
  • ????????client_max_body_size?10m;?
  • ##緩沖區代理緩沖用戶端請求的最大字節數,?
  • ????????client_body_buffer_size?128k;?
  • ?
  • #防止網絡阻塞?
  • ????#tcp_nopush?????on;?
  • #sendfile?指令指定?nginx?是否調用?sendfile?函數(zero?copy?方式)來輸出文件,對于普通應用,?
  • #必須設為?on,如果用來進行下載等應用磁盤IO重負載應用,可設置為?off,以平衡磁盤與網絡I/O處理速度,降低系統的uptime.?
  • ????sendfile?on;?
  • #連接超時時間?
  • ????keepalive_timeout??65;?
  • #允許客戶端請求的最大單文件字節數?
  • ##緩沖區代理緩沖用戶端請求的最大字節數,?
  • #開啟gzip壓縮??
  • ????gzip??on;?
  • #設置允許壓縮的頁面最小字節數,頁面字節數從header頭得content-length中進行獲取。默認值是0,不管頁面多大都壓縮。>建議設置大于1k的字節數,小于1k可能會越壓越大。?
  • ????gzip_min_length?1k;?
  • #設置系統獲取幾個單位的緩存用于存儲gzip的壓縮結果數據流。4?16k代表以16k為單位,安裝原始數據大小以16k為單位的4倍申請內存。?
  • ????gzip_buffers?16?64k;?
  • #識別http的協議版本(1.0/1.1)?
  • ????gzip_http_version?1.1;?
  • #gzip壓縮比,1壓縮比最小處理速度最快,9壓縮比最大但處理速度最慢(傳輸快但比較消耗cpu)?
  • ????gzip_comp_level?6;?
  • #匹配mime類型進行壓縮,無論是否指定,”text/html”類型總是會被壓縮的。?
  • ????gzip_types?text/plain?application/x-javascript?text/css?application/xml;?
  • #和http頭有關系,加個vary頭,給代理服務器用的,有的瀏覽器支持壓縮,有的不支持,所以避免浪費不支持的也壓縮,所以根據客戶端的HTTP頭來判斷,是否需要壓縮?
  • ????gzip_vary?on;?
  • ?
  • #指定連接到后端FastCGI的超時時間。?
  • fastcgi_connect_timeout?300;?
  • #向FastCGI傳送請求的超時時間,這個值是指已經完成兩次握手后向FastCGI傳送請求的超時時間。?
  • fastcgi_send_timeout?300;?
  • #接收FastCGI應答的超時時間,這個值是指已經完成兩次握手后接收FastCGI應答的超時時間。?
  • fastcgi_read_timeout?300;?
  • #定讀取FastCGI應答第一部分需要用多大的緩沖區,一般第一部分應答不會超過1k,由于頁面大小為4k,所以這里設置為4k。?
  • fastcgi_buffer_size?64k;?
  • #指定本地需要用多少和多大的緩沖區來緩沖FastCGI的應答。?
  • fastcgi_buffers?4?64k;?
  • #只知道默認值是fastcgi_buffers的兩倍。?
  • fastcgi_busy_buffers_size?128k;?
  • #在寫入fastcgi_temp_path時將用多大的數據塊,默認值是fastcgi_buffers的兩倍。?
  • fastcgi_temp_file_write_size?128k;?
  • #這個指令為Nginx配置FastCGI緩存指定一個路徑,目錄結構等級,關鍵字區域存儲時間和非活動刪除時間。?
  • fastcgi_cache_path?/usr/local/nginx/fastcgi_cache?levels=1:2?keys_zone=TEST:10m?inactive=5m;?
  • #指定讀取FastCGI應答第一部分需要用多大的緩沖區,一般第一部分應答不會超過1k,由于頁面大小為4k,所以這里設置為4k。?
  • fastcgi_cache?TEST;?
  • #為指定的應答代碼指定緩存時間,如上例中將200,302應答緩存一小時,301應答緩存1天,其他為1分鐘。?
  • #fastcgi_cache_valid?200?302?1h;?
  • #fastcgi_cache_valid?301?1d;?
  • #fastcgi_cache_valid?any?1m;?
  • ?
  • ?
  • #添加一組真實的服務器地址池mysrv?端口為81?
  • ??upstream?mysrv?{?
  • #后臺如果有動態應用的時候,ip_hash指令可以通過hash算法將客戶端請求定位到同一臺后端服務器上,解決session共享,?
  • #?但建議用動態應用做session共享?
  • ????#ip_hash;??
  • #server用于指定一個后端服務器的名稱和參數?
  • #weight代表權,重默認為1,權重越高被分配的客戶端越多?
  • #max_fails?指定時間內對后端請求失敗的次數?
  • #fail_timeout?達到max_fails指定的失敗次數后暫停的時間?
  • #down參數用來標記為離線,不參與負載均衡.在ip_hash下使用?
  • #backup僅僅在非backup服務器宕機或繁忙的時候使用?
  • ????server??192.168.1.10:81?;?
  • ????server??192.168.1.11:81?;?
  • ????server??192.168.1.2:81?;?
  • #自己為備用服務器,當其他服務器都故障了才使用本機的web服務?
  • ????server??192.168.1.1:81?backup;?
  • ????}??
  • ?
  • server?{?
  • #設置80端口負責負載均衡?
  • ????????listen???????80;?
  • ????????server_name??www.xzr.com;?
  • location?/?{?
  • ????root?/var/www/html;?
  • #將根負載調度到后端web服務器的81端口?
  • ????proxy_pass?http://mysrv;??
  • ????proxy_redirect?off;?
  • #如果后端的服務器返回502,504,執行超時錯誤等信息,自動將請求轉發到upstream負載均衡池中?
  • ????proxy_next_upstream?http_404?http_502?http_504?error?timeout?invalid_header;?
  • #?#后端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP?
  • ????????proxy_set_header?Host?$host;?
  • ????????proxy_set_header?X-Real-IP?$remote_addr;?
  • ????????proxy_set_header?X-Forwarded-For?$proxy_add_x_forwarded_for;?
  • #nginx跟后端服務器連接超時時間(代理連接超時)?
  • ????????proxy_connect_timeout?90;?
  • #后端服務器數據回傳時間(代理發送超時)?
  • ????????proxy_send_timeout?90;?
  • #連接成功后,后端服務器響應時間(代理接收超時)?
  • ????????proxy_read_timeout?90;?
  • #設置代理服務器(nginx)保存用戶頭信息的緩沖區大小?
  • ????????proxy_buffer_size?4k;?
  • #proxy_buffers緩沖區,網頁平均在32k以下的話,這樣設置?
  • ????????proxy_buffers?4?32k;?
  • ##高負荷下緩沖大小(proxy_buffers*2)?
  • ????????proxy_busy_buffers_size?64k;?
  • #設定緩存文件夾大小,大于這個值,將從upstream服務器傳?
  • ????????proxy_temp_file_write_size?64k;?
  • ?
  • }??
  • ????error_page???500?502?503?504??/50x.html;?
  • ????????location?=?/50x.html?{?
  • ????root???html;?
  • ????????}?
  • }?
  • #定義本機81端口提供web服務?
  • server?{?
  • ????????listen???????81;?
  • ????????server_name??www.xzr.com;?
  • ????????root?/var/www/html;?
  • ????????index??index.php?index.html?index.htm?index.jsp;?
  • ##設定查看Nginx狀態的地址?
  • ????location?/status?{?
  • ????stub_status?on;?
  • ????access_log?off;?
  • ????auth_basic??"NginxStatus";?
  • #認證登錄使用htpasswd命令?-c?指定文件?用戶?
  • #0.6.7版本以后這里指定的文件是nginx.conf所在目錄的相對路徑,而不是--prefix指定的路徑。?
  • ????auth_basic_user_file?htpasswd;?
  • ????}?
  • #靜態文件直接讀取?
  • ????location?~*?\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$?{??
  • ????expires?1d;??
  • ????}??
  • #所有php后綴的,都通過fastcgi發送到9000端口上?
  • ??location?~?\.php$?{?
  • ????fastcgi_pass???127.0.0.1:9000;?
  • ????fastcgi_index??index.php;?
  • ????include????????fastcgi.conf;?
  • ????}?
  • }?
  • }
  • Server 2的/usr/local/nginx/conf/nginx.conf需要修改的地方
  • #去掉服務器1的backup,設置自己為backup???
  • server??192.168.1.2:81?backup;?
  • Server 3的/usr/local/nginx/conf/nginx.conf需要修改的地方
  • #去掉服務器1的backup,設置自己為backup???
  • server??192.168.1.10:81?backup;?
  • Server 4的/usr/local/nginx/conf/nginx.conf需要修改的地方
  • #去掉服務器1的backup,設置自己為backup????
  • server??192.168.1.11:81?backup;?
  • 開始配置:keepalived Server 1的/etc/keepalived/keepalived.conf文件如下:
  • !?Configuration?File?for?keepalived?
  • global_defs?{?
  • ?????notification_email?{?#發生事件切換的時候,發送的郵箱,可以有多個,每行一個?
  • ?????xzrgg@21cn.com?
  • ?????}?
  • ?????notification_email_from?xzrgg@21cn.com??#指定發件人?
  • ?????smtp_server?127.0.0.1??#指定smtp服務器地址?
  • ?????smtp_connect_timeout?30????#指定smtp連接超時時間?
  • ?????router_id?nginx_1??#運行keepalived機器的一個標識主備不能相同?
  • ?????}?
  • ?
  • #vrrp_script區域定義腳本名字和腳本執行的間隔和腳本執行的優先級變更?
  • vrrp_script?check_nginx?{?
  • #定義監控nginx的命令,命令的$?返回1就改變優先級。?
  • ????????script?"ps?-C?nginx?--no-header"?
  • ????????interval?5?????#腳本執行間隔?
  • ????????weight?-10???#腳本結果1導致的優先級變更:10表示優先級+10;-10則表示優先級-10?
  • ????fall???2?????#?檢測幾次返回1為失敗?
  • ????rise???1?????#?檢測幾次返回0成功為ok?
  • ????????}?
  • ?
  • #VIP?
  • vrrp_instance?VI_1?{????#監控多個網段的實例?
  • ?????state?BACKUP?????#全部服務器都設為BACKUP,讓優先級高的自動為master?
  • #????dont?track?primary?????#忽略VRRP的interface錯誤?
  • ?????track_interface?{?
  • ?????eth0?????????????????#跟蹤接口,設置額外的監控,里面任意一塊網卡出現問題,都會進入故障(FAULT)狀態?
  • ?????#eth1?
  • ?????}?
  • ?????interface?eth0?????????#實例綁定的網卡?
  • ?????virtual_router_id?51???#這里非常重要,相同的VRID為一個組?
  • ?????priority?100???????????#優先級,?
  • ?????advert_int?1???????????#檢查間隔,默認1s?
  • #?????nopreempt????????????#設置搶占,優先級高就做master?
  • ?????authentication?{???????#認證?
  • ?????auth_type?PASS?????????#認證的方式,支持PASS和AH?
  • ?????auth_pass?123?????????#認證的密碼?
  • ?????}?
  • ?????virtual_ipaddress?{?????#指定漂移地址(VIP)?
  • ?????192.168.1.100?????????#如果有多個VIP,繼續換行填寫?
  • ?????}?
  • ????track_script?{?????#執行定義的命令?
  • ????check_nginx?
  • ????}?
  • }?
  • Server 2的/etc/keepalived/keepalived.conf 需要修改的地方
  • router_id?nginx_2???????#運行keepalived機器的一個標識主備不能相同?
  • priority?99???????????#優先級?
  • Server 3的/etc/keepalived/keepalived.conf 需要修改的地方
  • router_id?nginx_3???????#運行keepalived機器的一個標識主備不能相同?
  • priority?98???????????#優先級?
  • Server 4的/etc/keepalived/keepalived.conf 需要修改的地方
  • router_id?nginx_4???????#運行keepalived機器的一個標識主備不能相同?
  • iority?97???????????#優先級?
  • 啟動nginx和keepalived服務:
  • nginx?
  • service?keepalived?start
  • 客戶機驗證:一直刷新,始終看不到server 1提供的web頁面,因為負載均衡設置本機為
    backup,這時server 1就只做為一個負載均衡器。

    客戶機驗證:一直刷新,始終看不到server 1提供的web頁面,因為負載均衡設置本機為
    backup,這時server 1就只做為一個負載均衡器。

    測試keepalived
    在server 1 上關掉nginx進程,server 1自動成為backup狀態。


    看server 2能否成為master:,這里server2 接管了vip,server 2成為了負載均衡器

    客戶機刷新網頁,只能看到server 3 和server 4 的頁面。(因為前面server 1的nginx進程關掉了所以看不到server 1的頁面)

    這時把server 1的nginx進程啟動,server 1檢測到ngxin進程在就開始搶占vip成為master

    客戶機瀏覽:server 2 優先級不夠server1高,只好乖乖的成為web服務器。

    把server 1,2,3的nginx 進程關掉,server 4成為了負載均衡器,不過這時web服務器群
    只剩servr4,客戶機只能瀏覽server4 到的頁面!

    至此,ngnix+keepalivd 實現N主高可用負載均衡web群集的實驗結束。

    網上的nginx+keepalived 都是通過腳本實現nginx進程的監控,其實不用那么麻煩,用keepalived 自帶就命令定義就可以了,這里檢測到nginx進程不在了,就會降低優先級(-10),讓高優先級的成為master接管vip,并沒有關閉keepalived。

    ?

  • #vrrp_script區域定義腳本名字和腳本執行的間隔和腳本執行的優先級變更?
  • vrrp_script?check_nginx?{?
  • #定義監控nginx的命令,命令的$?返回1就改變優先級。?
  • ????????script?"ps?-C?nginx?--no-header"?
  • ????????interval?5?????#腳本執行間隔?
  • ????????weight?-10???#腳本結果1導致的優先級變更:10表示優先級+10;-10則表示優先級-10?
  • ????fall???2?????#?檢測幾次返回1為失敗?
  • ????rise???1?????#?檢測幾次返回0成功為ok?
  • ????????}?
  • ?

    轉載于:https://blog.51cto.com/xzregg/976793

    總結

    以上是生活随笔為你收集整理的ngnix+keepalived 实现N主高可用负载均衡web群集的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。