前言
使用集羣是網站解決高併發、海量數據問題的經常使用手段。當一臺服務器的處理能力、存儲空間不足時,不要企圖去換更強大的服務器,對大型網站而言,無論多麼強大的服務器,都知足不了網站持續增加的業務需求。這種狀況下,更恰當的作法是增長一臺服務器分擔原有服務器的訪問及存儲壓力。經過負載均衡調度服務器,未來自瀏覽器的訪問請求分發到應用服務器集羣中的任何一臺服務器上,若是有更多的用戶,就在集羣中加入更多的應用服務器,使應用服務器的負載壓力再也不成爲整個網站的瓶頸。css
摘自《大型網站技術架構_核心原理與案例分析》html
環境準備
server1 192.168.200.111:nginx + keepalived masternginx
server2 192.168.200.112:nginx + keepalived backupcentos
server3 192.168.200.113:tomcat瀏覽器
server4 192.168.200.114:tomcattomcat
虛擬ip(VIP):192.168.200.254,對外提供服務的ip,也可稱做浮動ipbash
各個組件之間的關係圖以下:服務器
tomcat作應用服務器
nginx作負載均衡
nginx.conf內容以下網絡
user nginx nginx; worker_processes 2;
worker_cpu_affinity 01 10;
worker_rlimit_nofile 102400;
error_log logs/error.log; pid logs/nginx.pid; events { use epoll; worker_connections 4096; }
http { include mime.types; default_type application/octet-stream;
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;
sendfile on;
keepalive_timeout 65;
upstream tomcat_pool {
server 192.168.200.112:8080 weight=4 max_fails=2 fail_timeout=30s; server 192.168.200.113:8080 weight=4 max_fails=2 fail_timeout=30s; } server { listen 80; server_name localhost; charset utf-8; location / { proxy_pass http://tomcat_pool;
proxy_set_header Host $http_host; } location ~ \.(jsp|jspx|dp)$ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://tomcat_pool; } location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { expires 30d; }
location ~ .*\.(js|css)${ expires 1h; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
配置好後,啓動nginx,路徑要寫本身的
/usr/local/nginx/sbin/nginx
keepalived實現nginx高可用(HA)
keepalived主要起到兩個做用:實現VIP到本地ip的映射; 以及檢測nginx狀態。
master上的keepalived.conf內容以下:
global_defs { notification_email { 997914490@qq.com } notification_email_from sns-lvs@gmail.com smtp_server smtp.hysec.com smtp_connection_timeout 30 router_id nginx_master # 設置nginx master的id,在一個網絡應該是惟一的 } vrrp_script chk_http_port { #引用腳本文件 script "/usr/local/check_nginx_pid.sh" #腳本文件絕對路徑 interval 2 #(檢測腳本執行的間隔,單位是秒) weight -20 # 權重要比 BACKUP 小 } vrrp_instance VI_1 { state MASTER # 指定keepalived的角色,MASTER爲主,BACKUP爲備 interface ens32 # 當前進行vrrp通信的網絡接口卡(當前centos的網卡) virtual_router_id 66 # 虛擬路由編號,主從要相同 priority 100 # 優先級,數值越大,獲取處理請求的優先級越高 advert_int 1 # 檢查間隔,默認爲1s(vrrp組播週期秒數) authentication { auth_type PASS auth_pass 1111 } track_script { chk_http_port #(調用檢測腳本) } virtual_ipaddress { 192.168.200.254 # 定義虛擬ip(VIP),可多設,每行一個 } }
backup上的keepalived.conf內容以下:
global_defs { notification_email { 997914490@qq.com } notification_email_from sns-lvs@gmail.com smtp_server smtp.hysec.com smtp_connection_timeout 30 router_id nginx_backup # 設置nginx backup的id,在一個網絡應該是惟一的 } vrrp_script chk_http_port { script "/usr/local/check_nginx_pid.sh" interval 2 #(檢測腳本執行的間隔) weight -20 } vrrp_instance VI_1 { state BACKUP # 指定keepalived的角色,MASTER爲主,BACKUP爲備 interface ens32 # 當前進行vrrp通信的網絡接口卡(當前centos的網卡) virtual_router_id 66 # 虛擬路由編號,主從要相同 priority 90 # 優先級,數值越大,獲取處理請求的優先級越高 advert_int 1 # 檢查間隔,默認爲1s(vrrp組播週期秒數) authentication { auth_type PASS auth_pass 1111 } track_script { chk_http_port #(調用檢測腳本) } virtual_ipaddress { 192.168.200.254 # 定義虛擬ip(VIP),可多設,每行一個 } }
nginx檢測腳本check_nginx_pid.sh內容以下:
#!/bin/bash count=$(ps -C nginx --no-header |wc -l) if [ $count -eq 0 ];then /usr/local/nginx/sbin/nginx #重啓nginx if [ $(ps -C nginx --no-header |wc -l) -eq 0 ];then #nginx重啓失敗 systemctl stop keepalived fi fi
腳本加權限
chmod +x /usr/local/check_nginx_pid.sh
啓動keepalived
systemctl start keepalived