Apache 负载平衡器服务器备份

Apache 负载平衡器服务器备份

我想使用 apache 负载平衡器,以便一个 tomcat 服务器是主服务器,并且仅当第一个服务器关闭时辅助服务器才在线。该怎么做?

答案1

如果你只打算进行负载平衡,我建议使用比 Apache 更轻量级的版本,例如HA代理,但我们假设您将使用 apache。

负载平衡有多种方法,因此您应该花一点时间熟悉它们。Willy Tarreau 有一篇很棒的文章,名为使用负载平衡使应用程序可扩展值得你花时间去读。

有几种工具可以使 Apache 成为负载均衡器,也许最简单的(我知道的)是使用mod_proxy_balancer. 唯一的问题是它似乎没有进行故障转移负载平衡(这是您想要的:高可用性,而不是真正的负载平衡)。

既然你正在使用 Tomcat,为什么不使用mod_jk,Apache tomcat 连接器?

假设我们使用的是 Redhat 系统(我使用的是 CentOS 5.5),该系统配置为编译一些东西(例如,有 gcc 和适当的库(这在生产系统上不是一个好主意。现在不是讨论这个问题的时间或地点)RPM 打包, 尽管)

 yum install httpd httpd-devel

这将安装 Apache 以及制作模块的开发工具,配置目录为 /etc/httpd/

当前(20110130)的 Tomcat Connectors 是 1.2.31(但您可以检查最新版本这里),因此请下载它们:

 wget http://mirror.cc.columbia.edu/pub/software/apache//tomcat/tomcat-connectors/jk/source/jk-1.2.31/tomcat-connectors-1.2.31-src.tar.gz

提取、编译并安装它们:

 tar zxvf tomcat-connectors-1.2.31-src.tar.gz 
 cd tomcat-connectors-1.2.31-src/native
 ./configure --with-apxs=/usr/sbin/apxs 
 make 
 sudo make install 

验证 mod_jk.so 是否已安装:

 ls -al /etc/httpd/modules/mod_jk.so 
 -rwxr-xr-x 1 root root 903072 Jan 30 15:21 /etc/httpd/modules/mod_jk.so

现在,我们可以开始实际配置它了。

编辑/etc/httpd/conf.d/jk.conf:

 # This actually tells apache to load the module we built
 LoadModule jk_module modules/mod_jk.so 

 # This file holds the instructions for which servers the proxy will be talking to
 JKWorkersFile /etc/httpd/conf.d/workers.properties

 # This is (obviously) the logfile that it will write to. Change to whatever you want
 JKLogFile /var/log/httpd/mod_jk.log 

 # Simplistically, we'll set up a virtualhost that listens on all IPs on port 80. 
 # HTTPS is left as an exercise for the reader
 NameVirtualHost *:80
 <VirtualHost *:80>
     ServerAdmin [email protected] 
     ServerName thedomainnameoftheproxy.com

     # The following line says "send anything to the JK Worker named MyProxyCluster"
     JKMount /* MyProxyCluster

 </VirtualHost>
 #EOF

好的,这告诉 Apache 我们想要使用 mod_jk,我们想要使用一个名为 /etc/httpd/conf.d/workers.properties 的文件,并且我们有一个虚拟主机,所有内容都会发送到 worker。太好了,现在让我们配置 worker。编辑 /etc/httpd/conf.d/workers.properties:

 # We're telling mod_jk which workers it needs to look for. We're going to define 
 # a total of 3 workers: MyProxyCluster (the load balancer job), worker1, and worker2 
 # (the two backend servers) 
 worker.list=MyProxyCluster

 worker.worker1.port=8009
 worker.worker1.host=hostname.or.ip.of.1st.tomcat.server

 # ajp13 means Apache JServ Protocol version 1.3, and is apparently universal
 worker.worker1.type=ajp13

 worker.worker1.lbfactor=1

 # When worker1 dies, we're going to want it to go to worker2
 worker.worker1.redirect=worker2

 ### End of worker1 config

 # repeat the same things for worker2
 worker.worker2.port=8009
 worker.worker2.host=hostname.of.ip.of.2nd.tomcat.server
 worker.worker2.type=ajp13
 worker.worker2.lbfactor=1
 # Disable worker2 except when it fails over
 worker.worker2.activation=disabled

 # make the actual load balancer worker that we referenced in the beginning
 worker.MyProxyCluster.type=lb
 worker.MyProxyCluster.balance_workers=worker1,worker2
 # EOF

现在,我们有两个实际的工作程序和一个虚拟负载均衡器。您现在可以启动 Apache:

 service httpd start 

通过浏览机器进行测试,它应该转到第一个 tomcat 服务器。您应该能够通过查看 /var/log/httpd/mod_jk.log(或您指向的任何位置)来验证这一点。

祝你好运!

答案2

这是一个使用 AJP 代替 JK 的更简单的解决方案:

<Proxy balancer://cluster>
    BalancerMember ajp://127.0.0.1:8009 route=jvm1 status=-D
    BalancerMember ajp://127.0.0.2:8009 route=jvm2 status=+H
</Proxy>

ProxyPass /app balancer://cluster/app

您可以设置更多配置属性,例如,如果您有更多后端,则设置不同的负载因子、不同的平衡算法、平衡器集等:请参阅 Apache mod_proxy 文档,但上面的操作完全符合您的指定。-D 表示“未禁用”,+H 表示“热备用”。您也可以在运行时交换它们。

您只需要运行两个 Tomcat,AJP 连接器在端口 8009 上运行,地址为“127.0.0.1”,地址为“127.0.0.2”等,根据需要分别使用和<Engine jvmRoute="jvm1"><Engine jvmRoute="jvm2">请注意端口的经济性:您也可以对关闭端口执行相同操作。丢弃 Tomcat 配置中引用 JK、mod_jk 等的所有内容。您也不需要那些可怕的workers.properties文件。您还可以丢弃所有 HTTP 和 HTTPS 连接器并在 Apache HTTPD 终止入站 SSL,这可以让您对 SSL 进行更细粒度的控制。

相关内容