我知道如何在一个 Apache 服务器下运行两个或更多个 tomcat。我想知道如何在集群中运行两个或更多个 Apache 服务器并运行我的应用程序。我知道这是可能的。有人可以推荐一个简单的教程吗?有很多关于 Apache - tomcat 集成的文章,但没有关于 Apache 集群的文章。:( 如果你们能推荐一个基本的教程就太好了。谢谢。
答案1
获取软件或硬件负载平衡器并将其放在 apache 服务器前面。
简单教程:
1)安装免费的负载均衡器:“balance”http://www.inlab.de/balance-3.42.tar.gz
2)运行:balance -f 80 服务器1:80 服务器2:80 服务器3:80
高级教程:上述解决方案的问题在于它引入了单点故障。如果您的“平衡”服务器死机,那么您将无法访问其后面的任何东西。
如果您想采用自主开发的解决方案 GPL,那么您需要运行“vvrpd”、“heartbeat”或其他故障转移群集解决方案(或谷歌:linux 负载平衡)。
如果您想使用软件解决方案,但又有钱,您可以看看 Redat Cluster、Veritas Cluster 或其他一些供应商的集群软件。
不过,最好/最可靠的解决方案是获得一对硬件负载平衡器(它将自动执行故障转移)。
答案2
我假设您想在多台机器上运行它(在一台机器上运行多个 Apache 实例没有多大意义)。
不幸的是,你找不到关于 HA 集群的简单教程,因为这不是一个简单的主题。你有很多不同的概念,从低级网络内容到特定于应用程序的项目,如共享数据存储。
我开始我的集群冒险是在http://linuxvirtualserver.org/. 您可能想从http://www.linuxvirtualserver.org/architecture.html然后从那里出发。
答案3
查看一对硬件设备肯定是一个好的开始。您可以在软件中执行此操作,但您可能会发现您的网络团队(如果有)可能会反对您在未经批准的设备上执行与网络相关的功能 - 这可能会限制故障转移技术。
Apache (httpd) 本身对集群 httpd 实例一无所知。因此,您应该有一种方法(即脚本)将配置从一个节点同步到其他工作节点。我假设您的 httpd 实例正在作为反向代理运行,尽管情况不一定如此)。
您肯定会想投入一些时间和精力来集中日志记录,而在这方面,我发现 ELK 堆栈非常有用。这是一个相当扩展的 CustomLog 声明——其中的所有内容在某些时候都被证明是有用的。
# Note also that httpd will escape " to \", plus various others... (see the docs),
# which conveniently matches up with JSON's requirements.
# (well, almost; it doesn't do Unicode correctly)
#
# THINGS TO NOTE/CHECK/ADD/REMOVE:
# Any session cookies are good to log
# Example: JSESSION (change/remove as required)
# Any particular HTTP request headers (particularly for servers behind a reverse proxy)
# my_application_stack
# Set this to something obvious for the stack you're working on (eg. 'main_website')
#
# Also, you'll want to remove the ### comments below, and ensure that the \ is the last character on each line
#
LogFormat "{ \
\"@timestamp\":\"%{%FT%T%z}t\", \
\"client_ip\":\"%a\", \
\"client_port\":\"%{remote}p\", \
\"server_ip\":\"%A\", \
\"X-Forwarded-For\":\"%{X-Forwarded-For}i\", \
\"user\":\"%u\", \ ### Note: probably not useful unless Apache is doing auth (eg. Basic auth)
\"JSESSIONID\":\"%{JSESSIONID}C\", \ ### CHANGE
\"pid\":\"%p\", \
\"protocol\":\"%H\", \
\"http_method\":\"%m\", \
\"vhost\":\"%{Host}i\", \
\"service_port\":\"%p\", \
\"path\":\"%U\", \
\"query_string\":\"%q\", \
\"referer\":\"%{Referer}i\", \
\"user_agent\":\"%{User-agent}i\", \
\"response_code\":\"%>s\", \
\"response_location\":\"%{Location}o\", \
\"Content-Type\":\"%{Content-Type}o\", \
\"bytes_in\":\"%I\", \
\"bytes_out\":\"%O\", \
\"keepalive\":\"%X\", \
\"duration_micros\":\"%D\", \
\"my_application_stack\":\"change_me\", \ ### CHANGE
\"my_environment\":\"prod\" \ ### CHANGE
}" my_logstash_json
CustomLog logs/access_log.logstash_json my_logstash_json
在 Apache 2.2 中记录缓存命中/未命中(这在 2.4 中更好,但我们不使用它):
SetEnv CACHE_MISS 1
然后将其包含%{CACHE_MISS}e
在你的 LogFormat 中
不要忘记 logrotate 规则:
/var/log/httpd/access_log.logstash_json {
rotate 1
# We do reload httpd after each rotation, so we don't want it to be
# too frequent, so set to a reasonably chunky value
size 10M
nocompress
missingok
notifempty
sharedscripts
postrotate
/sbin/service httpd reload > /dev/null 2>/dev/null || true
endscript
}
然后您需要选择一个日志发送器(有很多可供选择),它将跟踪日志文件并将其发送到 ELK 堆栈。
请注意,有时比较配置非常有用...或者更确切地说是审核差异,或者只是找出设置的位置。为此,我编写了一个名为httpd-转储-配置,在配置我们的反向代理配置中的超过 1000 行时我经常使用它。
答案4
如果您有多个 IP 地址,请使用 DNS 轮询,
否则,我鼓励您使用带有 IP 和 Apache 故障转移的 Pacemaker+Corosync