Apache與jboss集羣配置,實現負載均衡與容錯的功能。Apache做爲軟件負載均衡器,負責請求的分發。Jboss做爲應用服務器,利用jgroup協議,處理容錯及狀態複製與轉移。
一 apache的配置
a. 將下載的apache mod_jk重命名爲mod_jk.so,複製到APACHE_HOME/modules/中,修改 APACHE_HOME/conf/httpd.conf ,在文件末添加:Include conf/mod-jk.conf
b. 在APACHE_HOME/conf/目錄創建新文件mod-jk.conf,內容如下:
# Load mod_jk module
# Specify the filename of the mod_jk lib
LoadModule jk_module modules/mod_jk.so
# Where to find workers.properties
JkWorkersFile conf/workers.properties
# Where to put jk logs
JkLogFile logs/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
# JkOptions indicates to send SSK KEY SIZE
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat
JkRequestLogFormat "%w %V %T"
# Mount your applications
JkMount /application/* loadbalancer
# You can use external file for mount points.
# It will be checked for updates each 60 seconds.
# The format of the file is: /url=worker
# /examples/*=loadbalancer
JkMountFile conf/uriworkermap.properties
# Add shared memory.
# This directive is present with 1.2.10 and
# later versions of mod_jk, and is needed for
# for load balancing to work properly
JkShmFile logs/jk.shm
# Add jkstatus for managing runtime data
<Location /jkstatus/>
JkMount status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
JkMount: 連接你的Web應用上下文, 比如:JkMount /cluster-test/* loadbalancer
c. 在 在APACHE_HOME/conf/目錄創建新文件uriworkermap.properties,置爲空,這個文件主要是做url 路由的,來配置哪些請求由JK處理哪些請求讓APACHE處理. 基本格式爲/url=worker_name;
/jmx-console=loadbalancer
/jmx-console/*=loadbalancer
/web-console=loadbalancer
/web-console/*=loadbalancer
d. 在 APACHE_HOME/conf/目錄創建新文件workers.properties,內容如下:
# Define list of workers that will be used
# for mapping requests
worker.list=loadbalancer,status
# Define Node1
# modify the host as your host IP or DNS name.
worker.node1.port=8009
worker.node1.host=node1.mydomain.com
worker.node1.type=ajp13
worker.node1.lbfactor=1
worker.node1.cachesize=10
# Define Node2
# modify the host as your host IP or DNS name
worker.node2.port=8009
worker.node2.host= node2.mydomain.com
worker.node2.type=ajp13
worker.node2.lbfactor=1
worker.node2.cachesize=10
# Load-balancing behaviour
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=node1,node2
worker.loadbalancer.sticky_session=1
#worker.list=loadbalancer
# Status worker for managing load balancer
worker.status.type=status
上面的文件中配置了兩個節點,name分別爲node1,node2,指定兩個節點的IP,並在worker.loadbalancer.balance_workers中指定所有的node列表,worker.loadbalancer.sticky_session設置是否啓用“粘着的”Session,sticky session是指來自同一IP的請求將被髮送到同一個Jboss節點,sticky session設爲0的話同一session的不同請求會被負載均衡分發到不同的jboss節點上。
二JBoss節點配置
a. 修改JBOSS_HOME/server/all/deploy/jboss-web.deployer/server.xml文件
註釋掉http connector(8080)
b. 修改JBOSS_HOME/server/all/deploy/jboss-web.deployer/server.xml文件,AJP13 connector:
將Engine 修改如下:
<Engine defaultHost="localhost" jvmRoute="node1">
...
</Engine>
node1和node2分別對應相應ip的jboss;
c. 修改 JBOSS_HOME/server/all/deploy/ jboss-web.deployer /META-INF/jboss-service.xml,找到<attribute>該爲:<attribute>true</attribute>
/********************** 說明 begin *****************************/
snapshotMode: 複製髒會話的時機
“instant”: 在每個請求處理之後(缺省值)
“interval”: 間隔複製。異步會話複製消息每隔X毫秒發送;在該模式下,強制保持會話粘性保持
snapshotInterval: 當snapshotMode爲”interval”時,使用該設置的值,單位爲毫秒。缺省值爲1000ms
cacheName: JBossCache服務的JMX名字,缺省爲"jboss.cache:service=TomcatClusteringCache“
useJK: 如果使用mod_jk作爲負載均衡器則設爲true
/********************** 說明 end ******************************/
三 設置Session同步
a. 編輯JBOSS_HOME/server/all/deploy/jbossweb-cluster.sar/META-INF/jboss-service.xml,找到<attribute>,有udp和tcp兩種方式,UDP採用多播方式,但問題比較多,所以採用TCP方式。
找到<config> <tcp,將><config>到</config>生效.並對該部分進行以下修改:
將全部down_thread和up_thread的false都改爲true. windows平臺lookloop = true
將bind_addr改爲本機ip,<tcpping initial_hosts 值設爲:node1 IP[7810],node2 IP[7810] ;
/********************** 說明 begin *****************************/
用於JBossWeb集羣的TreeCache服務在deploy/jboss-web-cluster.sar下的META-INF/jboss-service.xml文件中配置
CacheMode屬性
REPL_ASYNC(缺省)
複製消息被異步發送()發完即丟失
提高應用的響應性
REPL_SYNC
複製消息被同步發送
如果不保持會話粘性可使用此模式
JGroups協議棧配置
/********************** 說明 end ******************************/
b. 修改應用程序的web.xml文件,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd ">
<distributable />
...
</web-app>
/********************** 說明 begin *****************************/
會話複製在每個Web應用的WEB-INF/web.xml中使能
加入空的<distributable/>元素
/********************** 說明 end ******************************/
c. 在web-inf中添加jboss-web.xml文件,內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss-web PUBLIC
"-//JBoss//DTD Web Application 4.2//EN"
"http://www.jboss.org/j2ee/dtd/jboss-web_4_2.dtd">
<jboss-web>
<replication-config>
<replication-trigger>SET_AND_NON_PRIMITIVE_GET</replication-trigger>
<replication-granularity>SESSION</replication-granularity>
<replication-field-batch-mode>true</replication-field-batch-mode>
</replication-config>
<context-root>/</context-root>
</jboss-web>
/********************** 說明 begin *****************************/
針對每一個Web應用配置會話複製WEB-INF/jboss-web.xml
“replication-config”元素:複製粒度
Session, Attibute,Field
“replication-trigger”元素:決定一個髒會話的條件
“SET_AND_GET”:任何屬性被訪問時標記爲髒會話
“SET_AND_NON_PRIMITIVE_GET“:任何返回非原始值的屬性被訪問時標記爲髒會話。爲缺省值
“SET”: 任何屬性被修改時標記爲髒會話
“replicationFieldBatchMode”
如果爲True, 對每個請求的所有Fied修改以批處理方式複製
僅在複製粒度爲Fied時有效
/********************** 說明 end ******************************/
四 啓動負載均衡器apache
在/usr/local/apache2/bin目錄下執行./httpd –k start
在/usr/local/apache2/logs/mod_jk.log中,看到apache初始化mod_jk的日誌:
[Wed Aug 01 10:36:11 2007][6636:63168] [info] init_jk::mod_jk.c (2743): mod_jk/1.2.23 initialized
[Wed Aug 01 10:36:11 2007][6637:63168] [info] init_jk::mod_jk.c (2743): mod_jk/1.2.23 initialized
後面如有錯誤信息,是因爲集羣中的節點尚未啓動,暫時忽略。
啓動Jboss節點
在集羣各機器的/usr/local/jboss/bin,分別執行/run.sh –c all -b ip