您好,登錄后才能下訂單哦!
億速云負載均衡(Cloud Load Balancer)是對多臺云服務器進行流量分發的服務。億速云負載均衡可以通過流量分發擴展應用系統對外的服務能力,通過消除單點故障提升應用系統的可用性。億速云負載均衡服務通過設置虛擬服務地址(VIP),將位于同一地域的多臺云服務器資源虛擬成一個高性能、高可用的應用服務池。根據應用指定的方式,將來自客戶端的網絡請求分發到云服務器池中。億速云負載均衡服務會檢查云服務器池中云服務器實例的健康狀態,自動隔離異常狀態的實例,從而解決了云服務器的單點問題,同時提高了應用的整體服務能力。今天億速云給大家介紹下什么是高可用負載均衡架構
高可用負載均衡架構
LVS是Linux Virtual Server的簡寫,意即Linux虛擬云服務器,是一個虛擬的服務器集群系統。本項目在1998年5月由章文嵩博士成立,是中國國內最早出現的自由軟件項目之一。目前有三種IP負載均衡技術(VS/NAT、VS/TUN和VS/DR),十種調度算法(rrr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq):
①rr(Round Robin):輪詢調度,輪叫調度
輪詢調度算法的原理是每一次把來自用戶的請求輪流分配給內部中的服務器,從1開始,直到N(內部服務器個數),然后重新開始循環。算法的優點是其簡潔性,它無需記錄當前所有連接的狀態,所以它是一種無狀態調度。【提示:這里是不考慮每臺服務器的處理能力】
②wrr:weight,加權(以權重之間的比例實現在各主機之間進行調度)
由于每臺服務器的配置、安裝的業務應用等不同,其處理能力會不一樣。所以,我們根據服務器的不同處理能力,給每個服務器分配不同的權值,使其能夠接受相應權值數的服務請求。
③sh:source hashing,源地址散列。主要實現會話綁定,能夠將此前建立的session信息保留了
源地址散列調度算法正好與目標地址散列調度算法相反,它根據請求的源IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的并且沒有超負荷,將請求發送到該服務器,否則返回空。它采用的散列函數與目標地址散列調度算法的相同。它的算法流程與目標地址散列調度算法的基本相似,除了將請求的目標IP地址換成請求的源IP地址,所以這里不一個一個敘述。
④Dh:Destination hashing:目標地址散列。把同一個IP地址的請求,發送給同一個server。
目標地址散列調度算法也是針對目標IP地址的負載均衡,它是一種靜態映射算法,通過一個散列(Hash)函數將一個目標IP地址映射到一臺服務器。目標地址散列調度算法先根據請求的目標IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。
①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
如果大家還有什么地方需要了解的可以在億速云官網找我們的專業技術工程師的,億速云技術工程師在行業內擁有十幾年的經驗了,所以會比小編回答的更加詳細專業。億速云官網鏈接www.neiyidaogou.com
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。