負載均衡是由多臺服務器以對稱方式組成服務器集群,每臺服務器都具等價關系,均可多帶帶對外提供服務且無需其他服務器輔助。通過對應負載分擔均衡,將外部發送請求按既定規則分發到對稱集群架構其中一臺服務器上,對應接收請求服務器也獨立地回應客戶端請求。均衡負載能夠平均分配客戶請求到服務器陣列,以快速獲取數據,解決大并發訪問服務的洪峰問題。此種集群技術可用最少的投入獲得超高的性能,是一種性價比較高的并發解決方案之一。
負載均衡建立在網絡層之上,提供了一種廉價有效透明的方法擴展網絡設備和服務器帶寬、增加吞吐量、加強網絡數據處理能力、提高網絡的靈活性和可用性。
負載均衡(LoadBalance)其原意就是前端請求分攤到多個操作單元進行取數執行操作,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工作任務。
這是一種比較古老的方式,目主要通過提供不同的線路、不同服務器鏈接的方式,來實現負載均衡。
這種方式在一些提供下載、在線影院、直播等網站比較常見。
1、部署簡單,新增服務器或鏈路只需增加對應的入口即可
2、維護方便,如果有服務器宕機只需關閉對應入口即可
1、智能化程度不高,需用戶手動切換
2、分配不可控,容易出現服務器訪問量極不平衡等情況
大多域名注冊商都支持多條A記錄的解析,這就是DNS輪詢,DNS服務器將解析請求按照A記錄的順序,逐一分配到不同的IP上,這樣就完成了簡單的負載均衡。
1、基本上無成本,因為往往域名注冊商的這種解析都是免費的;
2、部署方便,除了網絡拓撲的簡單擴增,新增的Web服務器只要增加一個公網IP即可。
1、健康檢查,如果某臺服務器宕機,DNS服務器是無法知曉的,仍舊會將訪問分配到此服務器。修改DNS記錄全部生效起碼要3-4小時,甚至更久;
2、分配不均,如果幾臺Web服務器之間的配置不同,能夠承受的壓力也就不同,但是DNS解析分配的訪問卻是均勻分配的。其實DNS也是有分配算法的,可以根據當前連接較少的分配、可以設置Rate權重分配等等,只是目前絕大多數的DNS服務器都不支持;
現代負載均衡技術通常操作于OSI網絡模型的第四層或第七層。第四層負載均衡將一個Internet上合法注冊的IP地址映射為多個內部服務器的IP地址,對每次TCP連接請求動態使用其中一個內部IP第,達到負載均衡的目的。在第四層交換機中,此中均衡技術得到廣泛的應用,一個目標地址是服務器群VIP連接請求的數據包流經交換機,交換機根據源端和目的IP地址、TCP或者UDP端口號和一定的負載策略,在服務器IP和VIP間進行映射,選取服務器群眾最好的服務器來處理連接請求。
第七層負載均衡控制應用層服務的內容,提供一種對訪問流量的高層控制方式,適合對HTTP服務器群的應用。第七層負載均衡技術通過檢查流經的HTTP報頭,根據報頭內的信息來執行負載均衡任務。
硬件負載均衡交換機,代表有F5、array等。
軟件負載均衡器,Nginx/LVS/HAProxy是目前使用最廣泛的三種負載均衡軟件。
1.軟件四層負載均衡
代表作為LVS,LVS是一個開源的軟件,可以實現linux平臺下的簡單負載均衡。lvs集群采用IP負載均衡技術和基于內容請求分發技術。調度器具有很好的吞吐率,將請求均衡的轉移到不同的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。整個服務器集群的結構對客戶是透明的,而且無需修改客戶端和服務器端的程序。
LVS通過修改數據包Ip地址,Mac地址實現負載均衡。
LVS由ipvs(內核中),ipvsadm(用戶態)組成。LVS需要理解tcp,ip頭部。
當tcp握手信號,SYN數據包達到時,ipvs選擇一個后端服務器,將數據包進行轉發。在此之后,所有包含相同的ip,tcp頭部的數據包都會被轉發到之前選擇的服務器上。很明顯,ipvs無法感知數據包內容。
2.軟件的七層負載均衡
大多HTTP反向代理方式,代表產品有nginx、haproxy等,nginx的反向代理負載均衡能夠很好的支持虛擬主機,可配置性很強,可以按輪詢、IP哈希、URL哈希、權重等多種放肆對后端服務器做負載均衡,同時還支持后端服務器的健康檢查。
nginx負載均衡工作在7層,它會與client、upstream分別建立tcp連接,nginx需要維護這兩個連接的狀態。
nginx的stream模塊可以用于4層負載均衡,主要用于tcp、udp的負載均衡。
在輪循算法的基礎上加上權重,即為權重輪循算法,當使用該算法時,權重和用戶訪問成正比,權重值越大,被轉發的請求也就越多。可以根據服務器的配置和性能指定權重值大小,有效解決新舊服務器性能不均帶來的請求分配問題。
upstream myapp1 {
server 172.1.1.103 weight=1;
server 172.1.1.104 weight=2;
}
每個請求按客戶端IP 的 hash結果分配,當新的請求到達時,先將其客戶端IP通過哈希算法哈希出一個值,在隨后的客戶端請求中,客戶IP 的哈希值只要相同,就會被分配至同一臺服務器,該調度算法可以解決動態網頁的session 共享問題,但有時會導致請求分配不均,即無法保證1:1 的負載均衡,因為在國內大多數公司都是NAT 上網模式,多個客戶端會對應一個外部IP,所以,這些客戶端都會被分配到同一節點服務器,從而導致請求分配不均。LVS負載均衡的 -P參數、keepalived配置里的persistence_timeout 50 參數都類似這個Nginx 里的ip_hash 參數,其功能均為解決動態網頁的session 共享問題。注意:當負載調度算法為ip_hash時,后端服務器在負載均衡調度中的狀態不能有weight 和backup ,即使有也不會生效。
upstream myapp1 {
ip_hash;
server 172.1.1.103;
server 172.1.1.104;
}
按客戶端請求順序把客戶端的請求逐一分配到不同的后端節點服務器,如果后端節點服務器宕機(默認情況下nginx只檢測80端口)。宕機的服務器會自動從節點服務器池中剔除,以便客戶端的用戶訪問不受影響。新的請求會分配給正產的服務器。
upstream myapp1 {
server 172.1.1.103;
server 172.1.1.104;
}
調度算法會根據后端節點服務器的響應時間來分配請求,響應時間短的優先分配。這是更加智能的調度算法。此種算法可以依據頁面大小和加載時間長短智能地進行負載均衡,也就是根據后端服務器的響應時間來分配請求,響應時間短的優先分配。Nginx本身是不支持 fair調度算法的,如果需要使用這種調度算法,必須下載Nginx 的相關模塊upstream_fair。
upstream myapp1 {
fair;
server 172.1.1.103;
server 172.1.1.104;
}
按訪問URL 的 hash結果來分配請求,使每個URL定向到同一個后端服務器,可以進一步提高后端緩存服務器的效率命中率。(多用于后端服務器為緩存時的場景下)Nginx本身是不支持rul_hash的,如果需要使用這種調度算法,必須安裝Nginx 的hash模塊軟件包。
upstream myapp1 {
server 172.1.1.103;
server 172.1.1.104;
hash $request_uri;
hash_method crc32;
}
在Nginxupstream模塊中,可以設定每臺后端服務器在負載均衡調度中的狀態,常用的狀態有:
1、down,表示當前的server暫時不參與負載均衡
2、backup,預留的備份機器。當其他所有的非backup機器出現故障或者忙的時候,才會請求backup機器,因此這臺機器的訪問壓力最低
3、max_fails,允許請求失敗的次數,默認為1,當超過最大次數時,返回proxy_next_upstream模塊定義的錯誤。
4、fail_timeout,請求失敗超時時間,在經歷了max_fails次失敗后,暫停服務的時間。max_fails和fail_timeout可以一起使用。
upstream模塊控制HTTP的負載均衡。這個模塊定義了一個目的池,這個目的池可以用IP地址和DNS記錄,或者混合使用。
upstream模塊模塊還定義了任何單個請求是如何分配給任何上游服務器。
在下邊的例子中,srv1不參與負載,srv2只有在其他服務器宕機或忙時才參與負載,srv3、srv4參與負載,其中每六次srv3訪問五次,srv4一次。所有的請求被代理到服務組node,然后nginx負載均衡的分發請求。
nginx反向代理實現包括下面這些負載均衡HTTP、HTTPS、FastCGI、uwsgi,SCGI和memcached。
要配置HTTPS的負載均衡,只需使用“https”開頭的協議。
當要設置FastCGI,uwsgi,SCGI,或者memcached的負載平衡,分別使用fastcgi_pass,uwsgi_pass,scgi_pass和memcached_pass指令。
upstream node {
server 192.9.191.31:8001 down;
server 192.9.191.31:8002 backup;
server www.aa.com:8003 weight=5;
server 192.9.191.31:8004 max_fail=1 fail_timeout=10s;
}
server{
listen 80;
server_name www.test.com test.com;
location / {
proxy_pass http://node;
}
}
Nginx使用了一個新的stream模塊來實現TCP負載均衡,這個模塊,類似于http和mail模塊,允許我們配置一組監聽TCP連接的服務。允許你配置多個服務的TCP連接,通過在upstream的server組中配置proxy_pass指令。
TCP負載均衡支持Nginx原有的調度算法,包括輪詢調度,哈希(選擇一致)等。同時,調度信息數據也會和健壯性檢測模塊一起協作,為每個連接選擇適當的目標上游服務器。
和其他upstream模塊一樣,TCP的stream模塊也支持自定義負載均和的轉發權重(配置weight),還有backup和down的參數,用于踢掉失效的上游服務器。max_conns參數可以限制一臺服務器的TCP連接數量,根據服務器的容量來設置恰當的配置數值,尤其在高并發的場景下,可以達到過載保護的目的。
stream{
upstream mysql_read {
server read1.example.com:3306 weight=5;
server read2.example.com:3306;
server 10.10.12.34:3306 backup;
}
server {
listen 3306;
proxy_pass mysql_read;
}
}
后端3臺tomcat服務器以2主一備的形式通過2臺nginx服務器實現負載均衡,同時nginx通過keepalived實現主備配置
nginx:172.1.1.106、172.1.1.107
VIP地址:172.1.1.108
tomcatIP:172.1.1.102、172.1.1.103、172.1.1.105
安裝java環境:
chmod +x jdk-6u16-linux-i586.bin
./jdk-6u16-linux-i586.bin
ln -s /usr/local/jdk-1.6.0-16/bin/java /usr/bin/java
ln -s /usr/local/jdk-1.6.0-16/bin/javac /usr/bin/javac
ln -s /usr/local/jdk-1.6.0-16 /usr/local/jdk
ln -s /usr/local/jdk-1.6.0-16/jre /usr/local/jre
tar zxvf apache-tomcat-6.0.20.tar.gz
mv apache-tomcat-6.0.20 /usr/local/tomcat
設置環境變量:
JAVA_HOME=/usr/local/jdk
export JAVA_HOME
JRE_HOME=/usr/local/jre
export JRE_HOME
CLASSPATH=/usr/local/tomcat/common/lib/:/usr/local/jdk/lib:/usr/local/jre/lib
export CLASSPATH
PATH=$PATH:/usr/local/tomcat/bin/:/usr/local/apache/bin:/usr/local/jdk/bin:/usr/local/jre/bin
export PATH
TOMCAT_HOME=/usr/local/tomcat
export TOMCAT_HOME
下載及安裝nginx:
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.7.tar.gz
tar zxvf pcre-7.7.tar.gz
cd pcre-7.7/
./configure
make && make install
wget http://sysoev.ru/nginx/nginx-0.7.17.tar.gz
tar zxvf nginx-0.7.17.tar.gz
cd nginx-0.7.17/
./configure --prefix=/usr/local/nginx
make && make install
nginx.conf配置文件,兩臺nginx服務器保持一致
user nobody nobody;
worker_processes 1;
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
}
http{
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
upstream node
{
server 172.1.1.102:8080;
server 172.1.1.103:8080;
server 172.1.1.105:8080 backup;
}
server {
listen 80;
server_name test.com;
location / {
root /var/www ;
index index.jsp index.htm index.html;
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;
proxy_pass http://node;
}
log_format access $remote_addr - $remote_user [$time_local] "$request"
$status $body_bytes_sent "$http_referer"
"$http_user_agent" $http_x_forwarded_for;
access_log /var/log/access.log access;
}
}
Keepalived下載安裝:
wget http://www.keepalived.org/software/keepalived-1.1.15.tar.gz
http://www.keepalived.org/software/keepalived-1.2.13.tar.gz
tar zxvf keepalived-1.1.15.tar.gz
cd keepalived-1.1.15
./configure
make
make install
cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived
cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/sbin/keepalived /usr/sbin/
service keepalived start|stop
兩臺nginx服務器上keepalived配置文件
172.1.1.106主機:
ip avrrp_instance VI_INET1 {
state MASTER
interface eth0
virtual_router_id 53
priority 200
advert_int 1
authentication {
auth_type pass
auth_pass yourpass
}
virtual_ipaddress {
172.1.1.108
}
}
172.1.1.107主機:
vrrp_instance VI_INET1 {
state BACKUP
interface eth0
virtual_router_id 53
priority 100
advert_int 1
authentication {
auth_type pass
auth_pass yourpass
}
virtual_ipaddress {
172.1.1.108
}
}
以上步驟即可完成nginx主備下的負載均衡配置,具體負載策略大家可以根據現場環境實際情況進行調整,配置僅供參考。
在流量陡增的互聯網面前,接口限流也是很有必要的,尤其是針對高并發的場景。Nginx的限流主要是兩種方式:限制訪問頻率和限制并發連接數。該案例就是一個通過限制單個IP并發連接數防止后端服務器過載的例子。
維護人員接到告警發現tuxedo中間件多個服務出現堵塞,嘗試擴服務或重啟均無法解決。
對比業務量情況,發現同比環比均超30%以上
隨即調整nginx限流策略,配置及注釋如下
http {
include mime.types;
default_type application/octet-stream;
proxy_intercept_errors on;
#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;
log_format main $remote_addr - $remote_user [$time_local] "$request"
$status $body_bytes_sent "$http_referer"
"$http_user_agent" "$http_x_forwarded_for";
log_format acc "$remote_addr $remote_user [$time_local] $request_method $uri $args $server_protocol"
" $status $body_bytes_sent $request_time $http_referer $upstream_addr $upstream_cache_status"
" $upstream_status $http_x_forwarded_for $cookie_route $http_host $http_user_agent <<$request_body>> <<$resp_body>> ";
access_log logs/access_acc$hostname$year$month$day.log acc ;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
client_header_timeout 60;
client_body_timeout 60;
reset_timedout_connection on;
send_timeout 60;
server_tokens off;
proxy_next_upstream error timeout;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 65;
proxy_send_timeout 120;
proxy_read_timeout 120;
proxy_buffer_size 8k;
proxy_buffers 8 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_http_version 1.1;
limit_conn_zone $binary_remote_addr zone=one:10m;
##定義一個10M的名字為one的內存區域,用于記錄訪問頻次;
upstream dt_cluster {
server 172.1.1.230:17001;
server 172.1.1.230:17002;
server 172.1.1.230:17003;
server 172.1.1.230:17004;
keepalive 32;
check interval=5000 rise=2 fall=3 timeout=10000;
}
lua_package_path "/usr/local/nginx/lua/lua-resty-redis/lib/?.lua;;";
#gzip on;
server {
listen 7001;
listen 7002;
listen 7003;
listen 7004;
#server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
set $resp_body "";
location /OpenEbus {
proxy_pass http://dt_cluster;
# include body_filter_by_lua.conf;
# lua_need_request_body on;
# body_filter_by_lua
# local resp_body = string.sub(ngx.arg[1], 1, 1000)
# ngx.ctx.buffered = (ngx.ctx.buffered or "") .. resp_body
# if ngx.arg[2] then
# ngx.var.resp_body = ngx.ctx.buffered
# end
# ;
limit_conn one 250;
##限制并發連接最多250個;
}
location /hello {
default_type text/plain;
content_by_lua ngx.say("hello, lua");
}
location /mockService {
proxy_pass http://dt_cluster;
}
location / {
return 403;
}
}
}
通過使用limit_conn_zone 和limit_conn 對某個目錄或指定后綴,比如.html或.jpg進行并發連接限制。有了連接數限制,相當于限制了客戶端瀏覽器和Nginx之間的管道個數,瀏覽器通過管道運輸請求,如同向自來水管中放水,水的流速和壓力對于管道另外一端是有影響的。為了防止不信任的客戶端通過這個管道瘋狂發送請求,消耗CPU內存等資源,以及防止URL不斷發出連接請求,必須對請求的速度進行限制,如同對水流速度限制一樣。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/130213.html
摘要:負載均衡與緩存服務也是屬于的實用場景之一,因為模塊相對重要,所以沒有一同放入入門到實戰場景實現篇文章中,將其單獨提取出來一負載均衡負載均衡的實現方法就是我們上章介紹的反向代理。 負載均衡與緩存服務也是屬于 nginx 的實用場景之一,因為模塊相對重要,所以沒有一同放入 Nginx入門到實戰(2)場景實現篇 文章中,將其單獨提取出來 一、負載均衡 負載均衡的實現方法就是我們上章介紹的反向...
摘要:負載均衡與緩存服務也是屬于的實用場景之一,因為模塊相對重要,所以沒有一同放入入門到實戰場景實現篇文章中,將其單獨提取出來一負載均衡負載均衡的實現方法就是我們上章介紹的反向代理。 負載均衡與緩存服務也是屬于 nginx 的實用場景之一,因為模塊相對重要,所以沒有一同放入 Nginx入門到實戰(2)場景實現篇 文章中,將其單獨提取出來 一、負載均衡 負載均衡的實現方法就是我們上章介紹的反向...
摘要:注意本篇文章為負載均衡的理論篇后續找個機會推出實戰篇。理論篇主要講述如何配置負載均衡配置負載均衡不難。常用的狀態有,表示當前的暫時不參與負載均衡。注,當負載調度算法為時,后端服務器在負載均衡調度中的狀態不能是和。 注意,本篇文章為負載均衡的理論篇,后續找個機會推出實戰篇。理論篇主要講述如何配置負載均衡,配置負載均衡不難。但實戰中要要注意幾個點,比如如何做到多服務器之間的數據共享(ses...
閱讀 1351·2023-01-11 13:20
閱讀 1696·2023-01-11 13:20
閱讀 1209·2023-01-11 13:20
閱讀 1901·2023-01-11 13:20
閱讀 4160·2023-01-11 13:20
閱讀 2739·2023-01-11 13:20
閱讀 1393·2023-01-11 13:20
閱讀 3662·2023-01-11 13:20