Apache 集群

Apache 集群

我知道如何在一个 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

如何在 CentOS 7 上使用 Pacemaker 设置 Apache 主动 - 被动集群

相关内容