Linux下集群Tomcat+MySql部署
在集群部署时需要考虑以下几个问题:
1.session同步问题
2.分布式缓存问题
3.ID 主键冲突问题
4.消息队列问题
1.部署拓仆结构图
1.nginx 提供对外服务
2.部署多台应用服务器
3.redis可以一台或多台集群
3.消息队列可以使用 ACTIVEMQ 或者 KAFKA.
2. 软件准备
1.NGINX
2.TOMCAT
3.ACTIVEMQ 或 KAFKA
4.REDIS
3.部署过程
3.1 程序的安装
1.部署tomcat和应用
安装好tomcat 并将应用放到 webapp目录。
2.部署nginx
https://www.cnblogs.com/yg_zhang/p/10197954.html
3.部署redis
https://www.cnblogs.com/yg_zhang/p/10196397.html
4.部署 KAFKA 或 ACTIVEMQ
https://www.cnblogs.com/yg_zhang/p/10184185.html
3.2.缓存和session同步的配置
3.2.1 J2cache 配置
在平台中如果使用分布式部署,需要配置缓存为J2Cache。
J2Cache属性文件配置
编辑config/j2cache.properties文件
比如 我们redis 安装为哨兵模式
则配置文件如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
######################################### redis.mode = sentinel #redis storage mode (generic|hash) redis.storage = generic ## redis pub/sub channel name redis.channel = j2cache ## redis pub/sub server (using redis.hosts when empty) redis.channel.host = #cluster name just for sharded redis.cluster_name = mymaster ## redis cache namespace optional, default[empty] redis.namespace = ## connection # Separate multiple redis nodes with commas, such as 192.168.0.10:6379,192.168.0.11:6379,192.168.0.12:6379 redis.hosts = 202.10.79.170:16001,202.10.79.170:16002,202.10.79.170:16003 redis.timeout = 10000 redis.password = redis.database = 0 ## redis pool properties redis.maxTotal = 100 redis.maxIdle = 10 redis.maxWaitMillis = 5000 redis.minEvictableIdleTimeMillis = 60000 redis.minIdle = 1 redis.numTestsPerEvictionRun = 10 redis.lifo = false redis.softMinEvictableIdleTimeMillis = 10 redis.testOnBorrow = true redis.testOnReturn = false redis.testWhileIdle = true redis.timeBetweenEvictionRunsMillis = 300000 |
主要修改 :
redis.hosts:redis主机
redis.cluster_name:redis集群名称
redis.maxTotal :连接池最大数
redis.maxIdle:最大空闲redis连接数
3.2.2 缓存配置
编辑配置文件 spring-base.xml
<!--
<bean id="iCache" class="com.redxun.core.cache.EhCache">
<property name="cacheName" value="tokenCache"></property>
</bean>
-->
<bean id="iCache" class="com.redxun.core.cache.J2CacheImpl" init-method="init" destroy-method="destroy"></bean>
将默认的ehcache 缓存实现改成 J2Cache 的实现。
3.2.3 session同步配置
编辑 web.xml
将下面的配置注释去掉,让其生效。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
< filter > < filter-name >j2cache-session-filter</ filter-name > < filter-class >com.redxun.saweb.filter.J2CacheSessionFilter</ filter-class > < init-param > < param-name >session.maxSizeInMemory</ param-name > < param-value >2000</ param-value > </ init-param > < init-param > < param-name >session.maxAge</ param-name > < param-value >1800</ param-value > </ init-param > < init-param > < param-name >cookie.name</ param-name > < param-value >J2CACHE_SESSION_ID</ param-value > </ init-param > < init-param > < param-name >cookie.path</ param-name > < param-value >/</ param-value > </ init-param > < init-param > < param-name >cookie.domain</ param-name > < param-value ></ param-value > </ init-param > </ filter > < filter-mapping > < filter-name >j2cache-session-filter</ filter-name > < url-pattern >*</ url-pattern > </ filter-mapping > |
这样配置后,系统的session管理将使用 j2cache 进行管理。
3.3 使用KAFKA作为消息队列
3.3.1 修改spring-all.xml
将下面的配置注释掉
<import resource="spring-jms.xml"/>
打开下面的注释
<import resource="spring-kafka-producer.xml"/>
<import resource="spring-kafka-consumer.xml"/>
3.3.2 修改 spring-bean.xml
将下面配置注释
<bean id="messageProducer" class="com.redxun.core.jms.producer.ActiveMqProducer"/>
打开下面的注释
<bean id="messageProducer" class="com.redxun.core.jms.producer.KafkaProducer"/>
3.3.3 修改 app.properties
修改 kafka.brokerurl=202.10.79.170:9001,202.10.79.170:9002 为实际的kafka实例地址,这样平台的消息队列就改成了kafka。
3.4 使用ACTIVEMQ作为独立消息队列服务器
在默认情况下平台使用了内置的消息队列服务器,这种情况下队列不需要安装。我们可以参考 spring-jms.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
|
< amq:broker useJmx = "false" persistent = "true" dataDirectory = "${jms.dir}/jms" > < amq:managementContext > < amq:managementContext createConnector = "false" /> </ amq:managementContext > < amq:persistenceAdapter > < amq:kahaDB directory = "${jms.dir}" > </ amq:kahaDB > </ amq:persistenceAdapter > < amq:transportConnectors > < amq:transportConnector uri = "tcp://${jms.ip}:${jms.port}" /> </ amq:transportConnectors > </ amq:broker > |
如果独立安装,上面的就需要注释掉。
如果我们不使用内置的消息队列,我们可以单独部署ACTIVEMQ服务。
这种情况下我们修改配置文件app.properties 就好了
jms.ip=127.0.0.1
jms.port=62222
这里改成实际的ACTIVEMQ 的端口。
3.5 nginx 配置
看部署架构图比如我们的配置如下
地址
|
用途
|
---|---|
192.168.1.100:80 | nginx服务器 |
192.168.1.101:8080 | tomcat 1 |
192.168.1.102:8080 | tomcat 2 |
nginx 配置文件如下:
upstream linuxidc { server 192.168.1.101:8080; server 192.168.1.102:8080; } location / { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://linuxidc; } |
这样通过nginx 就可以将请求转发到后端的服务器,实现负载均衡。
3.6 ID产生机制配置
平台中我们的ID是使用代码产生的,每台服务器都会有一个ID前缀,可以参考表
mi_db_id.
我们在 app.properties 文件中配置
machine.name=mansanpc
如果这个配置留空,那么我们会获取当前的机器名称来产生前缀,因此我们需要保证每台服务器的机器名不同。
修改机器名可以参考:
https://jingyan.baidu.com/article/574c52192a1d8d6c8d9dc1ce.html