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群集的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。