단일 서버 성능 병목 현상, 효과적인 수단이 옆으로 확장 가능한 방식으로 전체 시스템 성능을 향상시킬 때 톰캣 클러스터에 도달한다. Nginx에 높은 성능 HTTP 서버와 리버스 프록시 웹 서버입니다, 톰캣 클러스터로드 밸런싱은 간단한 구성에 의해 달성 될 수있다.
본원에서 사용 톰캣 버전 8.5.35는 Nginx의 버전 1.14.2이다. 다음으로, 프로세스의 구성을 보면 문제는 당신이 마이크로 채널 대중 번호부터 발생할 수있는 "주현절 소스."
1. 개요
웹 응용 프로그램의 경우, 가장 큰 문제는 클러스터 세션 정보 공유, 일반적으로 다음과 같은 솔루션을 가지고있다 :
- 사용 까다로운 세션 IP 해시로드 밸런싱 정책을 사용하여, 예를 들어, 현재 사용자의 요청은 단일 서버에 집중되어, 실패의 단점 단일 지점, 세션 손실
- 사용 세션 복제를 단점은 작은 클러스터에 대한 메모리와 대역폭의 비용, Tomcat이 클러스터의 각 노드에 동기화 세션 복제 전략 세션 정보를 제공하여
- 타사 캐싱 미들웨어를 사용하여 같은 전체 클러스터의 세션 정보, 캐시 레디 스 캐시 응용 프로그램 제어에 의해 세션과 관련된를, 당신은 또한 Tomcat을 적용 할 수 있습니다
- 물론, 세션 정보는 공유 파일 시스템 또는 데이터베이스에 저장 될 수있다
Nginx의 구성 과정에서 다음과 같은 문제가 발생할 수 있습니다 :
- 같은 tomcat_ha으로, 업스트림 이름을 구성 할 때 밑줄을 사용할 수 없습니다, 또는 Tomcat은 [_] 도메인 이름 이상에서 유효 결코 문자를 슬로우합니다
- 창에있는 모든 프로세스를 종료 Nginx.exe,
taskkill /fi "imagename eq nginx.exe" /f
- 창문에 80 개 포트를 점유하는 시스템 프로세스의 PID 4가, 그래서 8000에 의해이 대체 Nginx의 것
구성 프로세스, 관심을 필요로하는 문제에 톰캣 클러스터 :
- web.xml의 구성을 확인하는 것을 <배포 /> 요소
- 컨텍스트 관리자를 확인하는 것은 표준 세션 관리자로 대체하지 마십시오
- Receiver.address가 기본이 127.0.0.1을 준수 할 수 있기 때문에, 자동으로 구성되지; Receiver.port 변경 변경하거나 할 수는 없습니다, 톰캣 사용 가능한 포트 자체는 4000-4100의 범위 감지 자동 충돌
- 다른 서버에있는 경우에, 당신은 할 필요가 방화벽이나 열려있는 포트를 해제 시간 동기화뿐만 아니라,
2. Nginx의 코어 구성
Nginx에 추가하고 다음과 같이 핵심 구성이 수정의 기본 구성을 사용 :
http {
...
#gzip on;
#设置负载均衡的服务器列表和权重
upstream tomcat-ha {
#ip_hash;
server 172.31.1.41:8080 weight=1;
server 172.31.1.42:8080 weight=1;
}
server {
listen 8000;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
#转发请求
proxy_pass http://tomcat-ha;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
...
}
}
3. 톰캣 클러스터 구성
클러스터 구성을 가능하게 <엔진> 요소에서 다음 설정을 추가 :
<!-- channelSendOptions=6 同步复制 -->
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6">
<!-- 集群 Session 管理器 -->
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
<!--
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
-->
<!-- 集群内部通信配置 -->
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="192.168.10.2"
port="5000"
selectorTimeout="100"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
</Channel>
<!-- 此 vavle 拦截请求,并将 Session 信息发给内部节点 -->
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
작동 원리에 대한 간략한 설명 :
- Nginx의 로그인 인증을 요청하는 응답이 리턴되기 전에, Tomcat2 세션에 정보를 복사하여, 쿠키를 생성하는 세션을 생성을 Tomcat1에 요청을 전달
- 요청이 다시의 nginx는 쿠키 세션 Tomcat2에 요청을 전달 걸릴 때, Tomcat2가 성공적으로 인증 된 내부 세션 세션 개체 관련된 수영장이 발견, 더 이상 요청 된 리소스 인증을 반환
4. 그 부하 분산 및 복제 세션을 확인
4.1 테스트 환경
- 이 PC 배포 톰캣 사용하여, 대응은 다음과 같습니다 172.31.1.41 - Tomcat1,172.31.1.42-Tomcat2
- 사용을 기반으로 톰캣 배포는 바람둥이 벤치 마크의 웹 응용 프로그램을 작성, SessionExample 프로그램을 제공
- 내장 된 톰캣 관리자 응용 프로그램, 응용 프로그램이 세션 풀 내부에 배포 된 볼과 결합
4.2 부하 분산
상황에 PARAM 배치 디스크립터 파일을 수정 톰캣 벤치 마크는 브라우저의 요청이 172.31.1.42:8080에서 볼 수있는 접근이 톰캣 구별을 위해 "나는 바람둥이 1/2 해요", 및 Nginx에 Tomcat을 시작하다 서버 간의 스위칭 :
4.3 세션 복사
이해를 돕기 위해, 여기 Nginx에 처음으로로드 밸런싱 정책 설정 ip_hash합니다 :
- Nginx에 항상 요청이 Tomcat1 찾은 다음 Tomcat1에 세션을 생성, 세션에 몇 가지 속성을 추가하는 것으로 가정
- 쿠키를 tomcat2하는 요청을 전달합니다 Nginx에와 세션 전에,이 시간을 Tomcat1 시뮬레이션 오류를 닫은
- 이 사본의 성공을 나타내는 경우이든보기 Tomcat2 세션 정보에 쿠키 (JSESSIONID)와 상관 관계가있다
다음과 같이 전체 프로세스는 다음과 같습니다
방금 설명한 반면 상기 무빙 Tomcat2 세션 정보로부터 알 수있는도는 Tomcat1에 복사된다.
5. 요약
마이크로 신호 "주현절 소스,"응답 "톰캣", 및 Nginx에와 톰캣 구성 파일을 여기에 사용 가능한 엔지니어링 테스트를 검색 할 수 있습니다.