首页 数据库 mysql教程 揭秘企业级web负载均衡完美架构

揭秘企业级web负载均衡完美架构

Jun 07, 2016 pm 03:05 PM
web 企业级 完美 揭秘 架构 负载

【51CTO.com独家特稿】相信很多朋友对 企业 级的 负载 均衡 高可用实例非常感兴趣,此篇 文章 根据成熟的线上环境而写,旨在帮助大家迅速 架构 一个 企业 级的 负载 均衡 高可用的web环境。 此系统 架构 仅映射内网VIP的80及443端口于外网的Juniper防火墙下

 【51CTO.com独家特稿】相信很多朋友对企业级的负载均衡高可用实例非常感兴趣,此篇文章根据成熟的线上环境而写,旨在帮助大家迅速架构一个企业级的负载均衡高可用的web环境。

此系统架构仅映射内网VIP的80及443端口于外网的Juniper防火墙下,其它端口均关闭,内网所有机器均关闭iptables及ipfw防火墙;外网DNS指向即通过Juniper映射出来的外网地址,而此映射的地址对映的其实是内网VIP地址。这里说下端口的问题,有的朋友可能会很疑惑,这样映射端口行不?通过项目实践得知,这样完全是可行的,php-cgi需要的9000端口及MySQL的3306端口均可走内网,完全不影响业务系统的运行。

另外,我维护的电子商务网站并发大约在1000左右,此时,Nginx+Apache集群运行得非常稳定,尤其是apache,并没有想象中那般弱;其实,在内存足够(>=8G)的情况,测试时不连数据库的话,单台apache+php5能顶得住6000并发,而且相当稳定。在网站升级架构方面,我不赞成全面淘汰生级,锦上添花式的升级会更好。

第一部分:Nginx+Keepalived的说明及环境说明

喜欢看我博客或文章的朋友都知道,我一直主力推崇Nginx+Keepalived作web的负载均衡高可用架构,并积极将其用于项目方案中;Nginx负载均衡作服务器遇到的故障一般有①服务器网线松动等网络故障;②服务器硬件故障从而crash;③nginx服务死掉;遇到前二者情况,keeaplived是能起到HA的作用的;然而遇到③种情况就没有办法了,但可以通过shell监控解决这问题,从而实现真正意义上的负载均衡高可用。此篇的最新更新时间为2010年6月25号,下面将其安装步骤详细说明下:

环境:

<ol class="dp-xml">
<li class="alt">centos5.3(64位)、nginx-0.7.51、keepalived-1.1.15   </li>
<li>主nginx<strong>负载</strong><strong>均衡</strong>器:192.168.0.154  </li>
<li class="alt">辅nginx<strong>负载</strong><strong>均衡</strong>器:192.168.9.155  </li>
<li>vip:192.168.0.188 </li>
</ol>
登录后复制

 

第二部分:分别安装Nginx负载均衡器及相关配置脚本

先安装Nginx负载均衡器,nginx负载的配置就用一般的模板来配置了

<ol class="dp-xml">
<li class="alt">#添加运行nginx的用户和组www  </li>
<li>groupadd www   </li>
<li class="alt">useradd -g www www   </li>
<li>wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.8.tar.gz  </li>
<li class="alt">tar zxvf pcre-7.8.tar.gz  </li>
<li>cd pcre-7.8/  </li>
<li class="alt">./configure  </li>
<li>make && make install  </li>
<li class="alt">wget http://sysoev.ru/nginx/nginx-0.7.51.tar.gz  </li>
<li>tar zxvf nginx-0.7.51.tar.gz  </li>
<li class="alt">cd nginx-0.7.51/  </li>
<li>./configure <span class="attribute">--user</span>=<span class="attribute-value">www</span> <span class="attribute">--group</span>=<span class="attribute-value">www</span> <span class="attribute">--prefix</span>=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module  </li>
<li class="alt">make && make install </li>
</ol>
登录后复制

配置nginx负载均衡器的配置文件vim /usr/local/nginx/conf/nginx.conf,此篇文章仅仅只是我的某项目的配置文档,纯80转发;如果对nginx配置有https要求的可参考张宴的相关文章

<ol class="dp-xml">
<li class="alt">user www www;  </li>
<li>worker_processes 8;  </li>
<li class="alt"> </li>
<li>pid /usr/local/nginx/logs/nginx.pid;  </li>
<li class="alt">worker_rlimit_nofile 65535;  </li>
<li> </li>
<li class="alt">events  </li>
<li>{  </li>
<li class="alt">use epoll;  </li>
<li>worker_connections 65535;  </li>
<li class="alt">}  </li>
<li>http{  </li>
<li class="alt">include       mime.types;  </li>
<li>default_type application/octet-stream;  </li>
<li class="alt">server_names_hash_bucket_size 128;  </li>
<li>client_header_buffer_size 32k;  </li>
<li class="alt">large_client_header_buffers 4 32k;  </li>
<li>client_max_body_size 8m;  </li>
<li class="alt">sendfile on;  </li>
<li>tcp_nopush     on;  </li>
<li class="alt">keepalive_timeout 60;  </li>
<li>tcp_nodelay on;  </li>
<li class="alt">fastcgi_connect_timeout 300;  </li>
<li>fastcgi_send_timeout 300;  </li>
<li class="alt">fastcgi_read_timeout 300;  </li>
<li>fastcgi_buffer_size 64k;  </li>
<li class="alt">fastcgi_buffers 4 64k;  </li>
<li>fastcgi_busy_buffers_size 128k;  </li>
<li class="alt">fastcgi_temp_file_write_size 128k;  </li>
<li>gzip on;  </li>
<li class="alt">gzip_min_length 1k;  </li>
<li>gzip_buffers     4 16k;  </li>
<li class="alt">gzip_http_version 1.0;  </li>
<li>gzip_comp_level 2;  </li>
<li class="alt">gzip_types       text/plain application/x-javascript text/css application/xml;  </li>
<li>gzip_vary on;  </li>
<li class="alt"> </li>
<li>upstream backend  </li>
<li class="alt">{  </li>
<li>server 192.168.1.102:80;  </li>
<li class="alt">server 192.168.1.103:80;  </li>
<li>server 192.168.1.105:80;  </li>
<li class="alt">}  </li>
<li>server {  </li>
<li class="alt">listen 80;  </li>
<li>server_name www.yuhongchun027.com;  </li>
<li class="alt">location / {  </li>
<li>root /var/www ;  </li>
<li class="alt">index index.jsp index.htm index.html;  </li>
<li>proxy_redirect off;  </li>
<li class="alt">proxy_set_header Host $host;  </li>
<li>proxy_set_header X-Real-IP $remote_addr;  </li>
<li class="alt">proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  </li>
<li>proxy_pass http://backend;  </li>
<li class="alt">}  </li>
<li> </li>
<li class="alt">location /nginx {  </li>
<li>access_log on;  </li>
<li class="alt">auth_basic "NginxStatus";  </li>
<li>auth_basic_user_file /usr/local/nginx/htpasswd;  </li>
<li class="alt">}  </li>
<li> </li>
<li class="alt">log_format access '$remote_addr - $remote_user [$time_local] "$request" '  </li>
<li>'$status $body_bytes_sent "$http_referer" '  </li>
<li class="alt">'"$http_user_agent" $http_x_forwarded_for';  </li>
<li>access_log /var/log/access.log access;  </li>
<li class="alt"> </li>
<li>}  </li>
<li class="alt">} </li>
</ol>
登录后复制

小节:

第一部分和第二部分讲的是如何通过安装Nginx来达到负载均衡后端web集群的过程,Nginx能实现自动切换后端有故障的web服务器;但Nginx负载均衡器出了问题怎么办呢,它们之间是如何实现无故障转移的呢?

第三部分:安装Keepalived,让其分别作web及Nginx的HA

安装keepalived,并将其做成服务模式,方便以后调试。

<ol class="dp-xml">
<li class="alt">wget http://www.keepalived.org/software/keepalived-1.1.15.tar.gz  </li>
<li>#tar zxvf keepalived-1.1.15.tar.gz  </li>
<li class="alt">#cd keepalived-1.1.15  </li>
<li>#./configure <span class="attribute">--prefix</span>=/usr/local/keepalived  </li>
<li class="alt">#make   </li>
<li>#make install  </li>
<li class="alt">#cp /usr/local/keepalived/sbin/keepalived /usr/sbin/  </li>
<li>#cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/  </li>
<li class="alt">#cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/  </li>
<li>#mkdir /etc/keepalived  </li>
<li class="alt">#cd /etc/keepalived/  </li>
<li> </li>
<li class="alt">vim keepalived.conf  </li>
<li>! Configuration File for keepalived  </li>
<li class="alt">global_defs {  </li>
<li>   notification_email {  </li>
<li class="alt">   yuhongchun027@163.com  </li>
<li>        }  </li>
<li class="alt">   notification_email_from keepalived@chtopnet.com  </li>
<li>   smtp_server 127.0.0.1  </li>
<li class="alt">   smtp_connect_timeout 30  </li>
<li>   router_id LVS_DEVEL  </li>
<li class="alt">}  </li>
<li>vrrp_instance VI_1 {  </li>
<li class="alt">    state MASTER  </li>
<li>    interface eth0  </li>
<li class="alt">    virtual_router_id 51  </li>
<li>    mcast_src_ip 192.168.0.154    <span class="tag">==主nginx的IP地址  </span>
</li>
<li class="alt">    priority 100  </li>
<li>    advert_int 1  </li>
<li class="alt">    authentication {  </li>
<li>        auth_type PASS  </li>
<li class="alt">        auth_pass chtopnet  </li>
<li>    }  </li>
<li class="alt">    virtual_ipaddress {  </li>
<li>        192.168.0.188                      <span class="tag">==vip地址  </span>
</li>
<li class="alt">    }  </li>
<li>}  </li>
<li class="alt">#service keepalived start </li>
</ol>
登录后复制

我们来看一下日志:

<ol class="dp-xml">
<li class="alt">[root@ltos ~]# tail /var/log/messages  </li>
<li>Oct 6 03:25:03 ltos avahi-daemon[2306]: Registering new address record for 192.168.0.188 on eth0.  </li>
<li class="alt">Oct 6 03:25:03 ltos avahi-daemon[2306]: Registering new address record for 192.168.0.154 on eth0.  </li>
<li>Oct 6 03:25:03 ltos avahi-daemon[2306]: Registering HINFO record with values 'I686'/'LINUX'.  </li>
<li class="alt">Oct 6 03:25:23 ltos avahi-daemon[2306]: Withdrawing address record for fe80::20c:29ff:feb9:eeab on eth0.  </li>
<li>Oct 6 03:25:23 ltos avahi-daemon[2306]: Withdrawing address record for 192.168.0.154 on eth0.  </li>
<li class="alt">Oct 6 03:25:23 ltos avahi-daemon[2306]: Host name conflict, retrying with <span class="tag"><span class="tag-name">ltos-31</span><span class="tag">></span> </span>
</li>
</ol>
登录后复制

很显然vrrp已经启动,我们还可以通过命令来检查

<ol class="dp-xml">
<li class="alt">[root@ltos html]# ip addr  </li>
<li>1: lo: <span class="tag"><span class="tag-name">LOOPBACK</span>,UP,LOWER_UP<span class="tag">></span> mtu 16436 qdisc noqueue   </span>
</li>
<li class="alt">    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00  </li>
<li>    inet 127.0.0.1/8 scope host lo  </li>
<li class="alt">    inet6 ::1/128 scope host   </li>
<li>       valid_lft forever preferred_lft forever  </li>
<li class="alt">2: eth0: <span class="tag"><span class="tag-name">BROADCAST</span>,MULTICAST,UP,LOWER_UP<span class="tag">></span> mtu 1500 qdisc pfifo_fast qlen 1000  </span>
</li>
<li>    link/ether 00:0c:29:ba:9b:e7 brd ff:ff:ff:ff:ff:ff  </li>
<li class="alt">    inet 192.168.0.154/24 brd 192.168.0.255 scope global eth0  </li>
<li>    inet 192.168.0.188/32 scope global eth0  </li>
<li class="alt">    inet6 fe80::20c:29ff:feba:9be7/64 scope link   </li>
<li>       valid_lft forever preferred_lft forever  </li>
<li class="alt">3: sit0: <span class="tag"><span class="tag-name">NOARP</span><span class="tag">></span> mtu 1480 qdisc noop   </span>
</li>
<li>    link/sit 0.0.0.0 brd 0.0.0.0 </li>
</ol>
登录后复制

说明vip已经启动,这样主服务器就配置好了,辅机的配置大致一样,除了配置文件有少部分的变化,下面贴出辅机的配置文件:

<ol class="dp-xml">
<li class="alt">! Configuration File for keepalived  </li>
<li>global_defs {  </li>
<li class="alt">   notification_email {  </li>
<li>   yuhongchun027@163.com  </li>
<li class="alt">        }  </li>
<li>   notification_email_from keepalived@chtopnet.com  </li>
<li class="alt">   smtp_server 127.0.0.1  </li>
<li>   smtp_connect_timeout 30  </li>
<li class="alt">   router_id LVS_DEVEL  </li>
<li>}  </li>
<li class="alt">vrrp_instance VI_1 {  </li>
<li>    state BACKUP  </li>
<li class="alt">    interface eth0  </li>
<li>    virtual_router_id 51  </li>
<li class="alt">    mcast_src_ip 192.168.0.155              <span class="tag">==辅nginx的IP的地址  </span>
</li>
<li>    priority 100  </li>
<li class="alt">    advert_int 1  </li>
<li>    authentication {  </li>
<li class="alt">        auth_type PASS  </li>
<li>        auth_pass chtopnet  </li>
<li class="alt">    }  </li>
<li>    virtual_ipaddress {  </li>
<li class="alt">        192.168.0.188  </li>
<li>    }  </li>
<li class="alt">} </li>
</ol>
登录后复制

 

第四部分:针对Keepalived的不足,用Nginx_pid.sh来监控nginx进程,实现真正意义上的负载均衡高可用。

针对Nginx+Keepalived,编写nginx监控脚本nginx_pid.sh,此脚本思路其实也很简单,即放置在后台一直监控nginx进程;如进程消失,尝试重启nginx,如是失败则立即停掉本机的keepalived服务,让另一台负载均衡器接手,此脚本直接从生产环境下载:

<ol class="dp-xml">
<li class="alt">vim /root/nginx_pid.sh   </li>
<li>#!/bin/bash  </li>
<li class="alt">while  :  </li>
<li>do  </li>
<li class="alt"> <span class="attribute">nginxpid</span>=`ps -C nginx --no-header | wc -l`  </li>
<li> if [ $nginxpid -eq 0 ];then  </li>
<li class="alt">  /usr/local/nginx/sbin/nginx  </li>
<li>  sleep 5  </li>
<li>nginxpid=`ps -C nginx --no-header | wc -l`</li>
<li class="alt">   if [ $nginxpid -eq 0 ];then  </li>
<li>   /etc/init.d/keepalived stop  </li>
<li class="alt">   fi  </li>
<li> fi  </li>
<li class="alt"> sleep 5   </li>
<li>done </li>
</ol>
登录后复制

然后置于后台运行 sh /root/nginx_pid.sh &,这种写法是错误的,这样你用root用户logout后,此进程会消失;正确写法为nohup/bin/bash /root/nginx_pid.sh &,附带下注释:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出root帐户之后继续运行相应的进程。nohup就是不挂起的意思( no hang up),哈哈,差点老马失蹄了。

后记:

我的线上环境网络非常复杂,这也是LVS+Keepalived失败的原因。目前此套架构在1000并发的电子商务网站非常稳定,带来的直接影响就是nginx_backup一直处于闲置状态。相对于张宴的双机轮询而言,我感觉他的可能更加完美,因为目前我的Nginx仅仅只做了负载均衡器,如果以后有机会我会尝试做负载均衡器/反向代理加速。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何在HAProxy中实现SSL通过 如何在HAProxy中实现SSL通过 Mar 20, 2024 am 09:30 AM

保持Web服务器负载平衡是预防停机的关键措施之一。使用负载平衡器是一种可靠的方法,其中HAProxy是一个备受推崇的选择。使用HAProxy,您可以精确配置负载平衡方式,同时支持SSL直通,从而保障客户端与服务器之间的通信安全。首先探讨在HAProxy中实现SSL直通的重要性,随后详细讨论了实施此功能所需的步骤,并提供了一个示例以便更好理解。什么是SSL通过?为什么它很重要?作为负载均衡器,HAProxy接受并分配流向您Web服务器的负载,在已配置的服务器上进行分发。负载的分配是针对客户端设备和

Spring Data JPA 的架构和工作原理是什么? Spring Data JPA 的架构和工作原理是什么? Apr 17, 2024 pm 02:48 PM

SpringDataJPA基于JPA架构,通过映射、ORM和事务管理与数据库交互。其存储库提供CRUD操作,派生查询简化了数据库访问。此外,它使用延迟加载,仅在必要时检索数据,从而提高了性能。

1.3ms耗时!清华最新开源移动端神经网络架构 RepViT 1.3ms耗时!清华最新开源移动端神经网络架构 RepViT Mar 11, 2024 pm 12:07 PM

论文地址:https://arxiv.org/abs/2307.09283代码地址:https://github.com/THU-MIG/RepViTRepViT在移动端ViT架构中表现出色,展现出显着的优势。接下来,我们将探讨本研究的贡献所在。文中提到,轻量级ViTs通常比轻量级CNNs在视觉任务上表现得更好,这主要归功于它们的多头自注意力模块(MSHA)可以让模型学习全局表示。然而,轻量级ViTs和轻量级CNNs之间的架构差异尚未得到充分研究。在这项研究中,作者们通过整合轻量级ViTs的有效

Golang生死未卜?谷歌态度揭秘 Golang生死未卜?谷歌态度揭秘 Mar 06, 2024 pm 05:42 PM

互联网行业的发展日新月异,编程语言也在不断演进。在众多编程语言中,Golang(Go)作为一种相对年轻的语言,自问世以来备受关注。然而,关于Golang的前景和发展态势一直有着各种不同的观点和猜测。究竟Golang的生死未卜?谷歌对于Golang的态度又是如何的呢?Golang作为一种由Google开发的开源编程语言,自诞生以来就备受关注。它的设计初衷是为了

真我身世揭秘:究竟是OPPO的子品牌吗? 真我身世揭秘:究竟是OPPO的子品牌吗? Mar 23, 2024 pm 09:24 PM

“真我”身世揭秘:究竟是OPPO的子品牌吗?随着智能手机市场的不断发展,各个手机品牌纷纷推出新款产品来满足消费者不断变化的需求。其中,一款名为“真我”的手机品牌近年来备受关注,其高性价比和优质的用户体验受到了许多消费者的欢迎。然而,关于“真我”手机的身世和品牌背景,一直以来都笼罩着一层神秘的面纱。近日,有消息称“真我”手机是OPPO的子品牌,这一消息在手机圈

golang框架架构的学习曲线有多陡峭? golang框架架构的学习曲线有多陡峭? Jun 05, 2024 pm 06:59 PM

Go框架架构的学习曲线取决于对Go语言和后端开发的熟悉程度以及所选框架的复杂性:对Go语言的基础知识有较好的理解。具有后端开发经验会有所帮助。复杂性不同的框架导致学习曲线差异。

如何从驾驶舱Web用户界面启用管理访问 如何从驾驶舱Web用户界面启用管理访问 Mar 20, 2024 pm 06:56 PM

Cockpit是一个面向Linux服务器的基于Web的图形界面。它主要是为了使新用户/专家用户更容易管理Linux服务器。在本文中,我们将讨论Cockpit访问模式以及如何从CockpitWebUI切换Cockpit的管理访问。内容主题:驾驶舱进入模式查找当前驾驶舱访问模式从CockpitWebUI启用Cockpit的管理访问从CockpitWebUI禁用Cockpit的管理访问结论驾驶舱进入模式驾驶舱有两种访问模式:受限访问:这是驾驶舱的默认访问模式。在这种访问模式下,您不能从驾驶舱Web用户

手撕Llama3第1层: 从零开始实现llama3 手撕Llama3第1层: 从零开始实现llama3 Jun 01, 2024 pm 05:45 PM

一、Llama3的架构在本系列文章中,我们从头开始实现llama3。Llama3的整体架构:图片Llama3的模型参数:让我们来看看这些参数在LlaMa3模型中的实际数值。图片[1]上下文窗口(context-window)在实例化LlaMa类时,变量max_seq_len定义了context-window。类中还有其他参数,但这个参数与transformer模型的关系最为直接。这里的max_seq_len是8K。图片[2]词汇量(Vocabulary-size)和注意力层(AttentionL

See all articles