高可用負載均衡架構javascript
LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集羣系統。本項目在1998年5月由章文嵩博士成立,是中國國內最先出現的自由軟件項目之一。目前有三種IP負載均衡技術(VS/NAT、VS/TUN和VS/DR),十種調度算法(rrr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq):php
①rr(Round Robin):輪詢調度,輪叫調度css
輪詢調度算法的原理是每一次把來自用戶的請求輪流分配給內部中的服務器,從1開始,直到N(內部服務器個數),而後從新開始循環。算法的優勢是其簡潔性,它無需記錄當前全部鏈接的狀態,因此它是一種無狀態調度。【提示:這裏是不考慮每臺服務器的處理能力】html
②wrr:weight,加權(以權重之間的比例實如今各主機之間進行調度)前端
因爲每臺服務器的配置、安裝的業務應用等不一樣,其處理能力會不同。因此,咱們根據服務器的不一樣處理能力,給每一個服務器分配不一樣的權值,使其可以接受相應權值數的服務請求。java
③sh:source hashing,源地址散列。主要實現會話綁定,可以將此前創建的session信息保留了node
源地址散列調度算法正好與目標地址散列調度算法相反,它根據請求的源IP地址,做爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的而且沒有超負荷,將請求發送到該服務器,不然返回空。它採用的散列函數與目標地址散列調度算法的相同。它的算法流程與目標地址散列調度算法的基本類似,除了將請求的目標IP地址換成請求的源IP地址,因此這裏不一個一個敘述。linux
④Dh:Destination hashing:目標地址散列。把同一個IP地址的請求,發送給同一個server。nginx
目標地址散列調度算法也是針對目標IP地址的負載均衡,它是一種靜態映射算法,經過一個散列(Hash)函數將一個目標IP地址映射到一臺服務器。目標地址散列調度算法先根據請求的目標IP地址,做爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,不然返回空。web
①lc(Least-Connection):最少鏈接
最少鏈接調度算法是把新的鏈接請求分配到當前鏈接數最小的服務器,最小鏈接調度是一種動態調度短算法,它經過服務器當前所活躍的鏈接數來估計服務器的負載均衡,調度器須要記錄各個服務器已創建鏈接的數目,當一個請求被調度到某臺服務器,其鏈接數加1,當鏈接停止或超時,其鏈接數減一,在系統實現時,咱們也引入當服務器的權值爲0時,表示該服務器不可用而不被調度。
簡單算法:active*256+inactive(誰的小,挑誰)
②wlc(Weighted Least-Connection Scheduling):加權最少鏈接。
加權最小鏈接調度算法是最小鏈接調度的超集,各個服務器用相應的權值表示其處理性能。服務器的缺省權值爲1,系統管理員能夠動態地設置服務器的權限,加權最小鏈接調度在調度新鏈接時儘量使服務器的已創建鏈接數和其權值成比例。
簡單算法:(active*256+inactive)/weight【(活動的鏈接數+1)/除以權重】(誰的小,挑誰)
③sed(Shortest Expected Delay):最短時間望延遲
基於wlc算法
簡單算法:(active+1)*256/weight 【(活動的鏈接數+1)*256/除以權重】
④nq(never queue):永不排隊(改進的sed)
無需隊列,若是有臺realserver的鏈接數=0就直接分配過去,不須要在進行sed運算。
⑤LBLC(Locality-Based Least Connection):基於局部性的最少鏈接
基於局部性的最少鏈接算法是針對請求報文的目標IP地址的負載均衡調度,不籤主要用於Cache集羣系統,由於Cache集羣中客戶請求報文的布標IP地址是變化的,這裏假設任何後端服務器均可以處理任何請求,算法的設計目標在服務器的負載基本平衡的狀況下,將相同的目標IP地址的請求調度到同一個臺服務器,來提升個太服務器的訪問局部性和主存Cache命中率,從而調整整個集羣系統的處理能力。
基於局部性的最少鏈接調度算法根據請求的目標IP地址找出該目標IP地址最近使用的RealServer,若該Real Server是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處於一半的工做負載,則用「最少連接」的原則選出一個可用的服務器,將請求發送到該服務器。
⑥LBLCR(Locality-Based Least ConnectionswithReplication):帶複製的基於局部性最少連接
帶複製的基於局部性最少連接調度算法也是針對目標IP地址的負載均衡,該算法根據請求的目標IP地址找出該目標IP地址對應的服務器組,按「最小鏈接」原則從服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器;若服務器超載,則按「最小鏈接」原則從這個集羣中選出一臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以下降複製的程度。
l NAT:地址轉換(相似於DNAT)
1、集羣點跟director必須工做在同一個IP的網絡中
2、RIP一般是私有地址,僅用於各集羣節點間的的通訊
3、director位於client和real server之間,並負責處理進出的全部通道。
4、realserver必須將網關執行DIP
5、director支持端口映射
6、realserver可使用任何類型的操做系統(os)
7、較大規模應用場景中,director易成爲系統瓶頸
l DR:直接路由(及用於做爲源地址)
1、各集羣節點跟director必須在同一個物理網絡中;
2、RIP可使用公網地址,實現便攜的遠程管理和監控;
3、director僅負責處理入站請求,形影報文則有realserver直接發往客戶端
4、realserver不能將網關指向DIP,而是直接指向前端網關;
5、director不支持端口映射
6、大多數操做系統可以用在realserver
7、director可以處理更多的realserver
l TUN:隧道
1、集羣節點能夠跨越Internet
2、RIP必須是公網地址
3、director僅負責處理入站請求,形影報文則有realserver直接發往客戶端
4、realserver網關不能指向director
5、只有咫尺隧道功能的OS才能用於realserver
6、不支持端口映射
Keepalived在這裏主要用做RealServer的健康狀態檢查以及Master主機和BackUP主機之間failover的實現下面,搭建基於LVS+Keepalived的高可用負載均衡集羣,其中,LVS實現負載均衡,可是,簡單的LVS不能監控後端節點是否健康,它只是基於具體的調度算法對後端服務節點進行訪問。同時,單一的LVS又存在單點故障的風險。在這裏,引進了Keepalived,能夠實現如下幾個功能:
1. 檢測後端節點是否健康。
2. 實現LVS自己的高可用。
HAProxy是一個使用C語言編寫的自由及開放源代碼軟件[1],其提供高可用性、負載均衡,以及基於TCP和HTTP的應用程序代理。
HAProxy特別適用於那些負載特大的web站點,這些站點一般又須要會話保持或七層處理。HAProxy運行在當前的硬件上,徹底能夠支持數以萬計的併發鏈接。而且它的運行模式使得它能夠很簡單安全的整合進您當前的架構中,同時能夠保護你的web服務器不被暴露到網絡上。
HAProxy實現了一種事件驅動, 單一進程模型,此模型支持很是大的併發鏈接數。多進程或多線程模型受內存限制、系統調度器限制以及無處不在的鎖限制,不多能處理數千併發鏈接。事件驅動模型由於在有更好的資源和時間管理的用戶空間(User-Space)實現全部這些任務,因此沒有這些問題。此模型的弊端是,在多核系統上,這些程序一般擴展性較差。這就是爲何他們必須進行優化以 使每一個CPU時間片(Cycle)作更多的工做。
架構圖說明:
1,LVS兩臺服務器,虛擬IP使用在Haproxy服務器上,保證高可用。
2,Haproxy主要做用是誇網段IP支持,LVS不支持誇網段。
3,Nginx Proxy主要有緩存做用增長性能。
4,後端數據庫層次,再次使用了LVS高可用,虛擬IP使用在mycat服務器上。
5,Mycat做用是讀寫分離,增長性能和高可用Mysql。正常狀況下寫是Mysql Master1,讀是Mysql Master2,Mysql Slave,如Mysql Master1出現故障。則讀寫切換到Mysql Master2。
PS:最上層兩臺LVS服務器建議用高性能物理機。
系統版本:Centos 7 64位
服務器角色 |
服務器IP |
Nginx Proxy1 |
192.168.8.14 |
Nginx Proxy2 |
192.168.8.15 |
Nginx Web1 |
192.168.8.16 |
Nginx Web2 |
192.168.8.17 |
Tomcat1 |
192.168.8.18 |
Tomcat2 |
192.168.8.19 |
Tcpserver(ftp)1 |
192.168.8.20 |
Tcpserver(ftp)2 |
192.168.8.21 |
(192.168.8.14和192.168.8.15)兩臺服務器操做
vi /etc/yum.repos.d/nginx.repo
[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 |
yuminstall nginx
vi/etc/nginx/nginx.conf
user nginx; worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000;
error_log logs/error.log notice;
events { use epoll; worker_connections 1024; }
http { include mime.types; default_type application/octet-stream;
log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $remote_addr';
#access_log logs/access.log main;
sendfile on; tcp_nopush on; tcp_nodelay on;
server_names_hash_bucket_size 128; large_client_header_buffers 4 128k; client_max_body_size 128m; client_header_buffer_size 32k; keepalive_timeout 120;
fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 128k; fastcgi_buffers 4 128k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k;
gzip on; gzip_vary on; gzip_min_length 1k; gzip_buffers 4 64k; gzip_http_version 1.0; gzip_comp_level 9; gzip_types text/plain application/x-javascript text/css text/javascript application/javascript application/xml p_w_picpath/jpeg p_w_picpath/gif p_w_picpath/png;
proxy_cache_path /etc/nginx/cache levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=30g;
upstream testweb { server 192.168.8.16:80; server 192.168.8.17:80; }
upstream testtomcat { server 192.168.8.18:8080; server 192.168.8.19:8080; }
server { listen 80; server_name testweb.com.cn;
access_log logs/testweb.access.log main;
location ~ .*\.(css|js|gif|jpg|png)$ { proxy_pass http://testweb; proxy_cache cache_one; proxy_cache_valid 200 301 302 5m; proxy_cache_valid any 1m; proxy_cache_key $host$uri$is_args$args; expires 30d; }
location / { proxy_pass http://testweb; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 300; proxy_send_timeout 300; proxy_read_timeout 300; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; }
error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
server { listen 80; server_name testtomcat.com.cn;
access_log logs/testtomcat.access.log main;
location / { proxy_pass http://testtomcat; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 300; proxy_send_timeout 300; proxy_read_timeout 300; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; }
error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } |
mkdir/etc/nginx/logs/
啓動nginx
/etc/init.d/nginxstart
(192.168.8.16和192.168.8.17)兩臺服務器操做
vi /etc/yum.repos.d/nginx.repo
[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 |
yuminstall nginx
略,根據生產狀況配置
在網站根目錄配置一個測試文件,如:
192.168.8.16服務器:
cattest.html
web16
192.168.8.17服務器:
web17
啓動nginx
/etc/init.d/nginxstart
(192.168.8.18和192.168.8.19)兩臺服務器操做
yum install–y java-1.8.0-openjdk
官網下載http://tomcat.apache.org/
tarzxvf apache-tomcat-8.5.20.tar.gz
mvapache-tomcat-8.5.20 /usr/local/
cd/usr/local/apache-tomcat-8.5.20/webapps/ROOT/
192.168.8.18服務器:
vitest.html
tomcat18
192.168.8.19服務器:
vitest.html
tomcat19
啓動tomcat
/usr/local/apache-tomcat-8.5.20/bin/startup.sh
(192.168.8.20和192.168.8.21)兩臺服務器操做
yuminstall vsftpd
vi/etc/vsftpd/vsftpd.conf
增長配置:
pasv_enable=YES pasv_promiscuous=YES port_enable=YES port_promiscuous=NO pasv_min_port=10001 pasv_max_port=10010 #若是用戶較多,能夠放大 |
啓動ftp
/etc/init.d/vsftpdstart
系統版本:Centos 7 64位
服務器角色 |
服務器IP |
Haproxy |
192.168.8.12 |
Haproxy |
192.168.8.13 |
(192.168.8.12和192.168.8.13)兩臺服務器操做
tarzxvf haproxy-1.7.7.tar.gz
makeTARGET=linux2628 PREFIX=/usr/local/haproxy
#」TARGET」指定編譯對應的os對應的內核版本,經過」uname -r」查詢內核版本呢,README文件可查詢對應關係。
makeinstall PREFIX=/usr/local/haproxy
groupaddhaproxy
useradd-g haproxy haproxy -s /sbin/nologin
默認安裝目錄下沒有配置文件,只有」doc」,「sbin」,「share」三個目錄,可手工建立目錄及配置文件。
haproxy的配置文件主要是如下5部分:
global全局配置、defaults默認配置、監控頁面配置、frontend配置、backend配置。
mkdir-p /usr/local/haproxy/etc
cd/usr/local/haproxy/etc/
vimhaproxy.cfg
global #定義全局日誌, 配置在本地, 經過local0 輸出, 默認是info級別,可配置兩條 log 127.0.0.1 local0 warning #定義日誌級別【error warning info debug】 #log 127.0.0.1 local1 info
#運行路徑 chroot /usr/local/haproxy #PID 文件存放路徑 pidfile /var/run/haproxy.pid
#設置每haproxy進程的最大併發鏈接數, 其等同於命令行選項「-n」; 「ulimit -n」自動計算的結果參照此參數設定. maxconn 4096
#運行haproxy 用戶, 或者使用關鍵字uid user haproxy #運行haproxy 用戶組, 或者使用關鍵字gid group haproxy
#後臺運行haproxy daemon
#設置啓動的haproxy進程數量, 只能用於守護進程模式的haproxy; #默認只啓動一個進程, 鑑於調試困難等多方面的緣由, 通常只在單進程僅能打開少數文件描述符的場景中才使用多進程模式. nbproc 1 #設置每進程所可以打開的最大文件描述符數目, 默認狀況其會自動進行計算, 所以不推薦修改此選項. #ulimit-n 819200
#調試級別, 通常只在開啓單進程時調試, 且生產環境禁用. #debug #haproxy啓動後不會顯示任何相關信息, 這與在命令行啓動haproxy時加上參數「-q」相同 #quiet
#定義統計信息保存位置 stats socket /usr/local/haproxy/stats
#默認配置 defaults #默認的模式【tcp:4層; http:7層; health:只返回OK】 mode http
#繼承全局的日誌定義輸出 log global
#日誌類別, httplog #option httplog
#若是後端服務器須要記錄客戶端真實ip, 須要在HTTP請求中添加」X-Forwarded-For」字段; #但haproxy自身的健康檢測機制訪問後端服務器時, 不該將記錄訪問日誌,可用except來排除127.0.0.0,即haproxy自己. #option forwardfor except 127.0.0.0/8 option forwardfor
#開啓http協議中服務器端關閉功能, 每一個請求完畢後主動關閉http通道, 使得支持長鏈接,使得會話能夠被重用,使得每個日誌記錄都會被記錄. option httpclose
#若是產生了一個空鏈接,那這個空鏈接的日誌將不會記錄. option dontlognull
#當與後端服務器的會話失敗(服務器故障或其餘緣由)時, 把會話從新分發到其餘健康的服務器上; 當故障服務器恢復時, 會話又被定向到已恢復的服務器上; #還能夠用」retries」關鍵字來設定在斷定會話失敗時的嘗試鏈接的次數 option redispatch retries 3
#當haproxy負載很高時, 自動結束掉當前隊列處理比較久的連接. option abortonclose
#默認http請求超時時間 timeout http-request 10s #默認隊列超時時間, 後端服務器在高負載時, 會將haproxy發來的請求放進一個隊列中. timeout queue 1m #haproxy與後端服務器鏈接超時時間. timeout connect 5s #客戶端與haproxy鏈接後, 數據傳輸完畢, 再也不有數據傳輸, 即非活動鏈接的超時時間. timeout client 1m #haproxy與後端服務器非活動鏈接的超時時間. timeout server 1m #默認新的http請求鏈接創建的超時時間,時間較短時能夠儘快釋放出資源,節約資源. timeout http-keep-alive 10s #心跳檢測超時時間 timeout check 10s
#最大併發鏈接數 maxconn 2000
#設置默認的負載均衡方式 #balance source #balnace leastconn
#統計頁面配置, frontend和backend的組合體, 監控組的名稱可按需自定義 listen admin_status #配置監控運行模式 mode http
#配置統計頁面訪問端口 bind 0.0.0.0:1080
#統計頁面默認最大鏈接數 maxconn 10
#http日誌格式 option httplog
#開啓統計 stats enable
#隱藏統計頁面上的haproxy版本信息 stats hide-version
#監控頁面自動刷新時間 stats refresh 30s
#統計頁面訪問url stats uri /stats
#統計頁面密碼框提示文本 stats realm mCloud\ Haproxy
#監控頁面的用戶和密碼:admin, 可設置多個用戶名 stats auth admin:admin
#手工啓動/禁用後端服務器, 可經過web管理節點 stats admin if TRUE #設置haproxy錯誤頁面 errorfile 400 /usr/local/haproxy/errorfiles/400.http errorfile 403 /usr/local/haproxy/errorfiles/403.http errorfile 408 /usr/local/haproxy/errorfiles/408.http errorfile 500 /usr/local/haproxy/errorfiles/500.http errorfile 502 /usr/local/haproxy/errorfiles/502.http errorfile 503 /usr/local/haproxy/errorfiles/503.http errorfile 504 /usr/local/haproxy/errorfiles/504.http
#監控haproxy後端服務器的監控狀態 listen site_status bind 0.0.0.0:1081 #監聽端口 mode http #http的7層模式 log 127.0.0.1 local2 err #[err warning info debug] monitor-uri /site_status #網站健康檢測URL,用來檢測HAProxy管理的網站是否能夠用,正常返回200,不正常返回503 acl site_dead nbsrv(php_server) lt 1 #定義網站down時的策略當掛在負載均衡上的指定backend的中有效機器數小於1臺時返回true acl site_dead nbsrv(html_server) lt 1 acl site_dead nbsrv(backend_default) lt 1 monitor fail if site_dead #當知足策略的時候返回503,網上文檔說的是500,實際測試爲503 monitor-net 192.168.4.171/32 #來自192.168.4.152的日誌信息不會被記錄和轉發 monitor-net 192.168.4.172/32
#frontend, 名字自定義 frontend HAproxy_Cluster #定義前端監聽端口, 建議採用bind *:80的形式,不然作集羣高可用的時候有問題,vip切換到其他機器就不能訪問. bind 0.0.0.0:80
#acl後面是規則名稱,當請求的url末尾是以.php結尾時,匹配觸發php_web規則,如下兩種寫法都可.
#當請求的url末尾是以.css、.jpg、.png、.jpeg、.js、.gif結尾時,匹配並觸發static_web規則. #acl static_web path_end .gif .png .jpg .css .js .jpeg #acl static_web url_reg /*.(css|jpg|png|jpeg|js|gif)$ #-i爲忽略大小寫,當被請求的是以www.test.com開頭的主機時,匹配並觸發dns_name規則. acl html_web hdr_beg(host) -i www.haproxytest.com #acl html_web hdr_beg(host) 10.11.4.152 #當客戶端的IP是x.x.x.x時,匹配並觸發src_ip規則. #acl src_ip src x.x.x.x #若是匹配acl規則php_web,將請求轉交到php_server組處理;若是匹配acl規則html_web,將請求轉交到html_server組處理. use_backend php_server if php_web use_backend html_server if html_web #若是以上規則都不匹配時,將請求轉交到default_backend組處理. default_backend backend_default
#backend後端配置, 配置php_server組與html_server組 backend php_server #定義負載均衡方式爲roundrobin方式, 即基於權重進行輪詢調度的算法, 在服務器性能分佈較均勻狀況下推薦. #另有以下幾種負載均衡方式: #-- static-rr: 也是基於權重進行輪轉調度, 但屬於靜態方法, 運行時調整後端機組權重不會使用新的權重; #-- source: 基於請求源IP進行hash運算匹配後端服務器組; #-- leastconn: 不適合會話較短的環境, 如基於http的應用; #-- uri: 對整個URI進行hash運算; #-- uri_param: 對URI中的參數進行轉發; #-- hdr(<name>):根據http頭進行轉發, 無該頭部則轉爲使用roundrobin. balance roundrobin mode http #容許插入serverid到cookie中,serverid後面可定義 cookie SERVERID #心跳檢測方式爲檢測後端服務器index.html文件,還有其餘方式 option httpchk GET /index.html #後端服務器定義, maxconn 1024表示該服務器的最大鏈接數, cookie 1表示serverid爲1, weight表明權重(默認1,最大爲265,0則表示不參與負載均衡), #check inter 1500是檢測心跳頻率, rise 2是2次正確認爲服務器可用, fall 3是3次失敗認爲服務器不可用. server php1 192.168.4.171:80 maxconn 1024 cookie 1 weight 3 check inter 1500 rise 2 fall 3
backend html_server balance source mode http server html1 192.168.4.172:80 maxconn 1024 cookie 1 weight 3 check inter 1500 rise 2 fall 3
backend backend_default balance source mode http server default1 192.168.4.171:80 maxconn 1024 cookie 1 weight 3 check inter 1500 rise 2 fall 3 |
global log 127.0.0.1 local0 warning chroot /usr/local/haproxy pidfile /var/run/haproxy.pid maxconn 4096 user haproxy group haproxy daemon nbproc 1 stats socket /usr/local/haproxy/stats
defaults mode http log global option forwardfor except 127.0.0.0/8 option httpclose option dontlognull option redispatch retries 3 option abortonclose timeout http-request 10s timeout queue 1m timeout connect 5s #timeout client 1m #timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 200000
listen admin_status mode http bind 0.0.0.0:1080 maxconn 10 option httplog stats enable stats hide-version stats refresh 30s stats uri /stats stats realm mCloud\ Haproxy stats auth admin:123456 stats admin if TRUE errorfile 400 /usr/local/haproxy/errorfiles/400.http errorfile 403 /usr/local/haproxy/errorfiles/403.http errorfile 408 /usr/local/haproxy/errorfiles/408.http errorfile 500 /usr/local/haproxy/errorfiles/500.http errorfile 502 /usr/local/haproxy/errorfiles/502.http errorfile 503 /usr/local/haproxy/errorfiles/503.http errorfile 504 /usr/local/haproxy/errorfiles/504.http
listen site_status bind 0.0.0.0:1081 mode http log 127.0.0.1 local2 err monitor-uri /site_status acl site_dead nbsrv(nginx_proxy1) lt 1 monitor fail if site_dead monitor-net 192.168.8.14/32 monitor-net 192.168.8.15/32 monitor-net 192.168.8.20/32 monitor-net 192.168.8.21/32 frontend nginx_cluster mode http bind 0.0.0.0:80 acl nginx_1 hdr_beg(host) -i testweb.com.cn acl nginx_2 hdr_beg(host) -i testtomcat.com.cn use_backend nginx_proxy1 if nginx_1 use_backend nginx_proxy1 if nginx_2 backend nginx_proxy1 mode http balance roundrobin server nginx1 192.168.8.14:80 maxconn 10240 cookie 1 weight 3 check inter 1500 rise 2 fall 3 server nginx2 192.168.8.15:80 maxconn 10240 cookie 2 weight 3 check inter 1500 rise 2 fall 3 listen ftp_service bind 0.0.0.0:21 bind 0.0.0.0:10001-10010 mode tcp option tcplog balance roundrobin server ftp_20 192.168.8.20 weight 2 check port 21 inter 10s rise 1 fall 2 server ftp_21 192.168.8.21 weight 2 check port 21 inter 10s rise 1 fall 2 |
error文件
cp -r/usr/local/src/haproxy-1.7.7/examples/errorfiles/ /usr/local/haproxy/
日誌文件
mkdir-p /usr/local/haproxy/log
touch/usr/local/haproxy/log/haproxy.log
ln -s/usr/local/haproxy/log/haproxy.log /var/log/
chownhaproxy:haproxy /var/log/haproxy.log
vim/etc/sysconfig/rsyslog
SYSLOGD_OPTIONS="-c2 -r -m 0"
cd/etc/rsyslog.d/
touchhaproxy.conf
chownhaproxy:haproxy haproxy.conf
vimhaproxy.conf
# Provides UDP syslog reception $ModLoad imudp $UDPServerRun 514 # haproxy.log # local0.* /usr/local/haproxy/log/haproxy.log #local1.* /usr/local/haproxy/log/haproxy.log local2.* /usr/local/haproxy/log/haproxy.log &~ |
systemctlrestart rsyslog.service
#haproxy默認沒有日誌,依靠rsyslog收集日誌;
#文件最末尾的「&~」,若是沒有此配置,日誌除寫入指定文件外,會同步寫入messages文件;
chown-R haproxy:haproxy /usr/local/haproxy/
mkdir-p /etc/haproxy
ln -s/usr/local/haproxy/etc/haproxy.cfg /etc/haproxy/
chown-R haproxy:haproxy /etc/haproxy
cp/usr/local/src/haproxy-1.7.7/examples/haproxy.init /etc/rc.d/init.d/haproxy
chownhaproxy:haproxy /etc/rc.d/init.d/haproxy
#/etc/rc.d/init.d/haproxy會有一個報錯:
/etc/init.d/haproxy:line 26: [: =: unary operator expected
修改haproxy
vihaproxy
26行:
[[${NETWORKING} = "no" ]] && exit 0
chmod+x /etc/rc.d/init.d/haproxy
ln -s/usr/local/haproxy/sbin/haproxy /usr/sbin/
chownhaproxy:haproxy /usr/sbin/haproxy
啓動haproxy
/etc/init.d/haproxystart
服務器角色 |
服務器IP |
VIP1 |
192.168.8.100 |
LVS1 |
192.168.8.10 |
LVS2 |
192.168.8.11 |
(192.168.8.10和192.168.8.11)兩臺服務器操做
yum install -y keepalived ipvsadm
vim/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs { notification_email { acassen@firewall.loc #設置報警郵件地址,能夠設置多個,每行一個。 failover@firewall.loc #需開啓本機的sendmail服務 sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc #設置郵件的發送地址 smtp_server 127.0.0.1 #設置smtp server地址 smtp_connect_timeout 30 #設置鏈接smtp server的超時時間 router_id LVS_DEVEL #表示運行keepalived服務器的一個標識。發郵件時顯示在郵件主題的信息 }
vrrp_instance VI_1 { state BACKUP #指定keepalived的角色,MASTER表示此主機是主服務器,BACKUP表示此主機是備用服務器,但主掛了以後,再恢復會致使搶資源現象。因此這邊都設置BACKUP,爲了防止搶資源。 interface eth0 #指定HA監測網絡的接口 virtual_router_id 51 #虛擬路由標識,這個標識是一個數字,同一個vrrp實例使用惟一的標識。即同一vrrp_instance下,MASTER和BACKUP必須是一致的 priority 100 #定義優先級,數字越大,優先級越高,在同一個vrrp_instance下,MASTER的優先級必須大於BACKUP的優先級 advert_int 1 #設定MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒 nopreempt #不搶佔資源,意思就是它活了以後也不會再把主搶回來 authentication { #設置驗證類型和密碼 auth_type PASS #設置驗證類型,主要有PASS和AH兩種 auth_pass 1111 #設置驗證密碼,在同一個vrrp_instance下,MASTER與BACKUP必須使用相同的密碼才能正常通訊 } virtual_ipaddress { #設置虛擬IP地址,能夠設置多個虛擬IP地址,每行一個 192.168.8.97 } }
virtual_server 192.168.8.97 3306 { #設置虛擬服務器,須要指定虛擬IP地址和服務端口,IP與端口之間用空格隔開 delay_loop 6 #設置運行狀況檢查時間,單位是秒 lb_algo rr #設置負載調度算法,這裏設置爲rr,即輪詢算法 lb_kind DR #設置LVS實現負載均衡的機制,有NAT、TUN、DR三個模式可選 nat_mask 255.255.255.0 persistence_timeout 50 #會話保持時間,單位是秒。這個選項對動態網頁是很是有用的,爲集羣系統中的session共享提供了一個很好的解決方案。有了這個會話保持功能,用戶的請求會被一直分發到某個服務節點,直到超過這個會話的保持時間。須要注意的是,這個會話保持時間是最大無響應超時時間,也就是說,用戶在操做動態頁面時,若是50秒內沒有執行任何操做那麼接下來的操做會被分發到另外的節點,可是若是用戶一直在操做動態頁面,則不受50秒的時間限制 protocol TCP #指定轉發協議類型,有TCP和UDP兩種
real_server 192.168.8.90 3306 { #配置服務節點1,須要指定real server的真實IP地址和端口,IP與端口之間用空格隔開 weight 1 #配置服務節點的權值,權值大小用數字表示,數字越大,權值越高,設置權值大小能夠爲不一樣性能的服務器。分配不一樣的負載,能夠爲性能高的服務器設置較高的權值,而爲性能較低的服務器設置相對較低的權值,這樣才能合理地利用和分配系統資源 TCP_CHECK { #realserver的狀態檢測設置部分,單位是秒 connect_timeout 3 #表示3秒無響應超時 nb_get_retry 3 #表示重試次數 delay_before_retry 3 #表示重試間隔 connect_port 3306 #健康檢查端口 } } real_server 192.168.8.91 3306 { #配置服務節點1,須要指定real server的真實IP地址和端口,IP與端口之間用空格隔開 weight 1 #配置服務節點的權值,權值大小用數字表示,數字越大,權值越高,設置權值大小能夠爲不一樣性能的服務器。分配不一樣的負載,能夠爲性能高的服務器設置較高的權值,而爲性能較低的服務器設置相對較低的權值,這樣才能合理地利用和分配系統資源 TCP_CHECK { #realserver的狀態檢測設置部分,單位是秒 connect_timeout 3 #鏈接超時時間 nb_get_retry 3 #重連次數 delay_before_retry 3 #表示重試間隔 connect_port 3306 #健康檢查端口 } } } |
LVS-DR-Master上,其配置以下(192.168.8.10操做):
! Configuration File for keepalived
global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL }
vrrp_instance VI_1 { state BACKUP interface ens160 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.8.100 } }
virtual_server 192.168.8.100 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP
real_server 192.168.8.12 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } }
real_server 192.168.8.13 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
virtual_server 192.168.8.100 21 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP
real_server 192.168.8.12 21 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 21 } }
real_server 192.168.8.13 21 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 21 } } } |
LVS-DR-Backup上,其配置以下(192.168.8.11操做):
! Configuration File for keepalived
global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL }
vrrp_instance VI_1 { state BACKUP interface ens160 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.8.100 } }
virtual_server 192.168.8.100 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP
real_server 192.168.8.12 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } }
real_server 192.168.8.13 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
virtual_server 192.168.8.100 21 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP
real_server 192.168.8.12 21 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 21 } }
real_server 192.168.8.13 21 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 21 } } } |
haproxy服務器(192.168.8.12和192.168.8.13)操做
chmod+x /etc/rc.d/init.d/functions
vi/usr/local/bin/realserver.sh
#!/bin/bash #description: Config realserver
VIP=192.168.8.100
/etc/rc.d/init.d/functions
case "$1" in start) /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP /sbin/route add -host $VIP dev lo:0 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce sysctl -p >/dev/null 2>&1 echo "RealServer Start OK" ;; stop) /sbin/ifconfig lo:0 down /sbin/route del $VIP >/dev/null 2>&1 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce echo "RealServer Stoped" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac
exit 0 |
啓動腳本
/usr/local/bin/realserver.shstart
LVS-DR-Master(192.168.8.12)和LVS-DR-Backup(192.168.8.13)分別操做:
/etc/init.d/keepalivedstart
經過ipvsadm -L命令查看VIP是否能成功映射到後端服務。若是失敗了,可經過/var/log/messages日誌定位keepalived啓動失敗的緣由。
IPVirtual Server version 1.2.1 (size=4096)
ProtLocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP test1:ftp rr persistent 50
-> 192.168.8.12:ftp Route 1 0 0
-> 192.168.8.13:ftp Route 1 0 0
TCP test1:http rr persistent 50
-> 192.168.8.12:http Route 1 0 0
-> 192.168.8.13:http Route 1 0 0