高可用性、可靠性的运营是任何网站所必须面临和解决的问题,现给出如下两种方案来解决网站运营过程中可能会出现的负载均衡问题。
负载均衡,即负载的分流,它可以保证系统的负载可以有效的分配到多台web服务器。从而可以缓解单台服务器负载过大、用户响时间过长及单台服务器宕机后造成服务的不可用。
对于目前的负载均衡,较为简单的策略有如下两种:
1、nginx + keepalived + web服务器
nginx做前端负载均衡器及反向代理服务器;
keepalived做为心跳检测器,用于检测nginx的前端负载均衡器是否可用;
web服务器,用于处理具体的业务逻辑,较常用的有nginx、tomcat、apache等
2、haproxy + keepalived + web服务器
haproxy做为前端负载均衡器;
keepalived做为心跳检测器,用于检测haproxy的前端负载均衡器是否可用;
web服务器功能如下所述。
3、 LVS + ldirectord + heartbeat + web服务器
ldirectord做为前端负载均衡器,用于完成负载调度的任务。
keepalived做为心跳检测器,用于检测ldirectord的前端负载均衡器是否可用;
web服务器功能如下所述。
下面将对上述前两种方案在Ubuntu中的实施做具体的配置。
方案一:nginx + keepalived + tomcat
其中IP的分配如下:
nginx(主): 172.16.11.245
nginx(从):172.16.11.247
tomcat(web server 1) : 172.16.11.142
tomcat(web server 2) : 172.16.11.149
虚拟IP:172.16.11.246
分别对在两台负载均衡器nginx上做如下的配置,即nginx.cfg文件 :
###############################################################################
worker_processes 1;
worker_rlimit_nofile 5000;
events {
use epoll;
worker_connections 10000;
}
http {
include mime.types;
default_type application/octet-stream;
server_tokens off;
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;
log_format access '$remote_addr - $remote_user [$time_local] "$request" $status $bytes_sent $request_time';
access_log /usr/local/nginx/logs/access.log access buffer=32k;
upstream examples.testing.com{
ip_hash; #有两种不同方式来分配任务,此处采用ip_hash方式,还有一种weight方式。
server 172.16.11.142:8001; #web server 1
server 172.16.11.149:8001; #web server 2
}
server {
listen 80;
server_name 172.16.11.246; #前端虚拟IP地址
location /examples { #通过该地址即可以访问到真正的业务方法
proxy_pass http://examples.testing.com;
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 -c nginx.cfg即可以利用该配置文件来重启nginx.
在配置完一台nginx负载均衡器后,可以通过该IP地址直接访问:http://172.16.11.246/进入tomcat的首页面,再访问http://172.16.11.246/examples地址,即
可以访问tomcat中的实例。
由于nginx做为前端负载均衡器,所有访问后端web服务的请求都必经过nginx,为了确保nginx的宕机不会造成对后端请求的失败,在此可以采用keepalived做为心
跳检测器,来检测nginx当前是否可用。
它的具体配置如下:
##########################################################################################
vrrp_script chk_nginx {
script "/opt/nginx_pid.sh"
interval 2 #每次2秒检查一次
weight 2
vrrp_instance VI_1 {
interface eth0
state MASTER
virtual_router_id 51
priority 101 #101为主,100为从
virtual_ipaddress{
172.16.11.246 #虚拟IP地址
}
track_script {
chk_nginx
}
}
}
#########################################################################################
#########################################################################################
vrrp_script chk_nginx {
script "/opt/nginx_pid.sh"
interval 2 #每次2秒检查一次
weight 2
vrrp_instance VI_1 {
interface eth0
state MASTER
virtual_router_id 51
priority 100 #101为主,100为从
virtual_ipaddress{
172.16.11.246 #虚拟IP地址
}
track_script {
chk_nginx
}
}
}
#########################################################################################
编写测试脚本nginx_pid.sh
#########################################################################################
cd /opt
vim /opt/nginx_pid.sh
#!/bin/bash
A=`ps -C nginx --no-header | wc -l` ## 查看是否有 nginx进程 把值赋给变量A
if [ $A -eq 0 ];then ## 如果没有进程值得为 零
/usr/local/nginx/sbin/nginx ## 则启动 nginx 服务
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then ##再次判断 nginx进程是否为零
killall keepalived ## 则结束 keepalived 进程
fi
fi
###########################################################################################
方案二、haproxy + keepalived + tomcat
其中IP的分配如下:
haproxy(主): 172.16.11.245
haproxy(从):172.16.11.247
tomcat(web server 1) : 172.16.11.142
tomcat(web server 2) : 172.16.11.149
虚拟IP:172.16.11.246
分别对在两台负载均衡器haproxy上做如下的配置,即haproxy.cfg文件 :
###########################################################################################
global
log 127.0.0.1 local0 info
maxconn 8192
user haproxy
group haproxy
daemon
spread-checks 4
tune.maxaccept 4
tune.maxpollevents 100
#nbproc 8
quiet
defaults
#log global
#log 127.0.0.1 local0 info
mode http
#option httplog
#option logasap
#option dontlognull
retries 3
option redispatch
#option persist
option forwardfor
maxconn 8192
timeout connect 50000
timeout client 50000
timeout server 50000
stats uri /haproxy-stats
stats hide-version
stats refresh 10m
stats enable
stats uri /haproxy-stats
stats realm Haproxy/ statistics
stats auth nmting:c23cbfd563
stats refresh 1m
frontend test
bind 0.0.0.0:80
acl examples_rule path_beg /examples
use_backend examples_group if examples_rule
default_backend default_group
backend default_group
mode http
balance roundrobin
cookie SRV insert indirect nocache
option httpclose
option transparent
option httpchk HEAD /check.jsp HTTP/1.0
server s1 172.16.11.142:8001 cookie s1 check inter 10000 rise 1 fall 2
server s2 172.16.11.149:8001 cookie s2 check inter 10000 rise 1 fall 2
backend examples_group
mode http
balance roundrobin
cookie SRV insert indirect nocache
option httpclose
option forwardfor
option transparent
option httpchk HEAD /check.jsp HTTP/1.0
server s1 172.16.11.142:8001 cookie s1 check inter 10000 rise 1 fall 2
server s2 172.16.11.149:8001 cookie s2 check inter 10000 rise 1 fall 2
###########################################################################################
在配置完成后,采用$haproxy -f haproxy.cfg即可以利用该配置文件来重启haproxy.
在配置完一台haproxy负载均衡器后,可以通过该IP地址直接访问:http://172.16.11.246/进入tomcat的首页面,再访问http://172.16.11.246/examples地址,
即可以访问tomcat中的实例。
由于haproxy做为前端负载均衡器,所有访问后端web服务的请求都必经过haproxy,为了确保haproxy的宕机不会造成对后端请求的失败,可以采用keepalived做为
心跳检测器,来检测haproxy当前是否可用。
##########################################################################################
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2 #每次2秒检查一次
weight 2
vrrp_instance VI_1 {
interface eth0
state MASTER
virtual_router_id 51
priority 101 #101为主,100为从
virtual_ipaddress{
172.16.11.246 #虚拟IP地址
}
track_script {
chk_haproxy
}
}
}
#########################################################################################
#########################################################################################
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2 #每次2秒检查一次
weight 2
vrrp_instance VI_1 {
interface eth0
state MASTER
virtual_router_id 51
priority 100 #101为主,100为从
virtual_ipaddress{
172.16.11.246 #虚拟IP地址
}
track_script {
chk_haproxy
}
}
}
#########################################################################################
经典的网站负载方案及配置
最新推荐文章于 2023-12-05 14:13:07 发布