CentOS 6 에는 가상화로 KVM만 지원합니다. Xen은 빼버렸습니다. 가상화로 KVM을 하게되면 사용할 수 있게됩니다. 그런데, KVM을 활성화하게 되면 virbr0 라는 가상의 이더넷이 생성이되는데 이것이 NAT로 동작하게 됩니다. 그러니까 KVM의 게스트들은 virbr0 의 NAT를 이용해서 인터넷을 하게 되는 것입니다.
그런데 제가 집에서 사용하는 인터넷 사용환경은 공유기를 이용해서 각 피시에서 private ip 주소를 할당해서 사용합니다. 그래서 KVM의 게스트들도 직접 공유기로 부터 private ip 주소를 할당 받기를 원했습니다. 그렇게 하기위해서는 virbr0 를 NAT를 정지시키고 br0 을 만들어서 eth0와 br0를 Bridged 시키면 됩니다.
이 문서는 이것을 설명한 것입니다.
처음 KVM을 설치해서 보면 다음과 같이 나옵니다. NAT로 동작하고 있다는 증거입니다.
KVM의 NAT 네트워크
ZSH
1
2
3
4
5
6
7
8
9
# ifconfig virbr0
virbr0 Link encap:Ethernet HWaddr00:00:00:00:00:00
위 예제는 access.2017-04-13.log 파일에 로깅을 하는데 combinedio 로 정의된 로그 포맷대로 기록하며 86400(1day) 하루에 한번 로그 로테이션을 하도록 설정한 것이다.
그런데, 만일 기록되어지는 로그중에 특정 형식의 URI 로 시작하는 경우에 별도의 로그 파일에 기록하고 싶다면 어떻게 해야할까?
Apache 2.4 로그
1
192.168.96.11--[13/Apr/2017:23:43:03+0900]"POST /wp-admin/admin-ajax.php HTTP/1.1"20058"http://linux.systemv.pe.kr/wp-admin/edit.php""Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.54 Safari/537.36""-"
위 처럼 /wp-admin 으로 시작하는 URI 를 별도 파일로 기록하고 싶다면 다음과 같이 하면 된다.
위와같이 mod_setenvif 모듈이 제공하는 SetEnvIfNoCase 문을 이용해 URI 에 형태를 정규표현식을 이용해 매칭시키고 이것을 변수로 등록한다. 그리고 CustomLog 를 하나 더 추가해 ‘combinedio env=object_is_admin’ 처럼 환경변수를 인식 시켜준다.
위와같이 하면 access_wp_admin.%Y-%m-%d.log 파일에는 /wp-admin 으로 시작하는 URI 에 대해서만 기록하게 된다.
한가지 주의할 것은 기존의 access.%Y-%m-%d.log 파일에도 여전히 /wp-admin 으로 시작하는 URI 도 함께 기록된다는 것이다. 이를 피하기 위해서 다음과 같이 지정해줄 수 있다.
Nginx 는 전세계적으로 인기있는 웹 서버 입니다. 기존 웹 서버들과 달리 고속이며 대량의 접속을 적은 자원으로 처리해줍니다. 또, Nginx 는 Reverse Proxy 기능도 아주 훌륭하게 수행하며 이에 더해서 로드밸런싱 기능도 제공하는듯 다양한 기능을 다른 웹서버들보다 훌륭하게 수행합니다.
아키텍쳐(Architecture)
먼저 다음과 같은 아키텍쳐를 생각해 봅시다.
AWS 에 흔히 볼수 있는 기본적인 아키텍쳐입니다. 외부 접속은 External ELB가 담당하고 이것을 뒤에 Nginx 서버가 ELB의 접속을 받아서 Nginx 뒤에 있는 Jboss EAP 서버에 분배 접속을 하도록 하는 것입니다.
Nginx 로드 밸런싱(Load Balancing)
Nginx 는 자체적으로 로드 밸런싱 기능을 제공합니다. 이는 Nginx 의 Upstream 모듈을 통해서 제공 합니다. 기본적인 설정 방법은 다음과 같습니다.
Nginx 의 upstream 기본 설정.
Apache
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
http{
upstreammyapp1{
serversrv1.example.com;
serversrv2.example.com;
serversrv3.example.com;
}
server{
listen80;
location/{
proxy_passhttp://myapp1;
}
}
}
ELB 에서 Nginx 로 80 포트(port)로 접속을하면 proxy_pass 에 정의된 upstream 인 myapp1 으로 연결을 시켜주며 myapp1 upstream 에 정의된 서버 3대 중에 하나에 연결을 시켜줍니다.
upstream 에서 다양한 옵션을 제공 합니다. 대표적인 것이 Nginx 뒤에 서버의 연결 상태를 어떻게 체크할 것인가 하는 것입니다. 예를들면,
srv1.example.com 서버는 30초 동안 최대 3번 접속이 실패하면 30초 동안 접속이 불가한 것으로 판단 합니다. 30초가 지나면 또 최대 3번의 접속 실패가 발생하고 나서야 30초동안 접속을 하지 않습니다.
지속적인 서비스를 제공해야하는 상황에서 접속이 잘되는지 안되는지 실제로 접속을 해봐야만 한다면 고객들에게 불편을 제공할 것입니다.
AWS ELB 방식
AWS ELB 방식은 위 Nginx 의 max_fails 방법과는 다릅니다. ELB 는 뒤에 연결되는 인스턴스(Instance)가 살았는지 죽었는지를 판단하는 Health Check 기능을 제공합니다. 이것은 5초에 한번 Health Check 를 하고 10번이상 성공했다면 인스턴스가 살았다라고 판단해(InService 상태) 연결을 활성화 해줍니다. 만일 5초에 한번 Health Check 를 하는데 2번 실패를 했다면 인스턴스가 죽었다고 판단해(OutOfService 상태) 더 이상 연결을 시도하지 않습니다.
즉, 일정한 기준을 만족해야만 연결을 활성화 해준다는 겁니다. Nginx 에서도 이렇게 동작하면 얼마나 좋을까?
nginx_http_upstream_check_module
nginx_http_upstream_check_module 모듈은 Nginx.org 에서 배포하지 않고 개인 개발자가 개발한 Third Party 모듈 입니다. 이 모듈은 앞에서 언급했던 ELB 의 Health Check 기능을 제공해 줍니다. 특정한 기준을 통과하면 연결을 활성화 시켜주는 것입니다.
이를 활용하기 위해서는 Nginx 설치시에 같이 컴파일 설치를 해줘야 합니다.
Nginx 설치
이번 Nginx 설치는 Upstream Health Check Module 를 함께 설치하는 과정을 포함 합니다.
설치 환경은 다음과 같습니다.
Ubuntu 14.04 64bit
컴파일을 위해서 설치한 패키지들: build-essential, automake, unzip, patch, libpcre++-dev, zlib1g-dev, geoip-bin, libgeoip-dev
먼저 7번째 줄에 Nginx 에서 실제 IP를 ‘X-Forewarded-For’ 헤더 값이라고 알려 주도록 설정한 것입니다. 8번째 줄은 AWS ELB 의 주소 범위를 말합니다. Nginx 는 AWS ELB 로부터 접속을 받기 때문에 그것을 지정해줄 필요가 있는데 그것이 바로 8줄 설정입니다. 12줄 ~ 14줄은 뒤에 WAS 서버에 넘겨줄 헤더값을 지정해주고 있습니다. WAS 서버도 실제 Client IP가 필요하기 때문에 이것을 ‘X-Forewarded-For’ 에 지정해 줍니다. 그외에 ‘X-Forewarded-Server’, ‘X-Forewarded-Host’ 도 지정해 줍니다.
18번째 줄부터는 이제 upstream 설정하는 부분인데, 24줄이 Health Checker 를 해주는 부분으로 nginx_http_upstream_check_module 기능 입니다. 3초에 한번 체크를 하는데 그 방법은 TCP를 이용하고 5번 연속으로 실패할 경우에 뒤에 서버는 다운된것으로 하고 2번 연속 성공하면 뒤에 서버가 살아있는것으로 해서 연결을 시켜줍니다. 마치 AWS ELB 처럼 동작하는 것입니다.
/status URL 을 호출하면 다음과 같이 나옵니다.
Rise Counts, Fall counts 는 3초마다 체크해서 그 수를 센 것입니다. 현재 뒤에 WAS 서버들이 하나는 살아 있고, 하나는 죽은것으로 되어 있고 Down 된 서버는 빨강색으로 표시됩니다.
체크하난 프로토콜을 변경할 수 있는데, http 를 이용할 경우에 보내는 url 과 기대되는 리턴되는 http 의 상태값(status)를 지정해주면 됩니다.
WebLogic 11g 기동시 JAVA OPTION 넣기위해서 setDomainEnv.sh 나 commonEnv.sh 를 수정하는 경우가 있다. 하지만 이렇게 하면 WebLogic 11g 를 구성하는 Admin, NodeManager, ManagedServer 에 각각 따로따로 적용해주기위해서 앞에서 언급한 쉘 스크립트에 조건식을 줘야 한다.
setDomainEnv.sh 나 commonEnv.sh 는 WebLogic 서버에서 전역적으로 사용하는 것이기 때문에 특정한 부분을 위해서 수정하는 경우는 지양해야 한다.
최신의 WebLogic 11g 에서는 이러한 특정부분만을 위해 적용할 수 있는 JAVA OPTION 변수를 제공하는데 그것이 바로 USER_MEM_ARGS 이다. 쉘 환경변수로서 이것을 활용하면 Admin, NodeManager, ManagedServer 기동시에 JAVA OPTION을 줄 수 있다.
예를들어 Admin 서버를 기동할때에 사용하는 스크립트인 ${DOMAIN_HOME}/startWebLogic.sh 를 보자.
WebLogic 11g 에서는 ManagedServer 를 클러스터 설정을 제공합니다. 역시나 Admin Web Console 을 통해서 클릭으로만으로 쉽게 간단하게 설정이 가능합니다.
WebLogic 11g 클러스터 설정
Admin Web Console 에서 다음과 같이 설정이 가능 합니다.
왼쪽에서 클러스터를 누르고나면 위 화면과 같이 나오고 “새로 만들기” 버튼을 눌러서 생성을 할 수 있습니다.
생성할 클러스터 이름을 입력해 줍니다. 적절한 이름을 입력해주면 됩니다. 두번째로 클러스터 멤버간 메시징을 위한 방법을 정의해줍니다. 유니캐스트와 멀티캐스트가 있는데 유니캐스트의 경우에는 클러스터 노드가 많지 않을 경우에 사용하는게 적절해 보이며 반대일 경우에는 멀티캐스트로 하는것이 적절해 보입니다.
생성이 완료되면 이제 생성된 클러스터에 대해서 설정을 해야 합니다. 클러스터 메뉴에서 생성된 클러스터를 클릭하면 다음과 같은 화면을 보실 수가 있습니다.
로드 알고리즘은 클러스터간 로드를 어떻게 분배할 것인가에 대한 것으로 서비스 형태에 따라 적절히 선택해주면 됩니다. 클러스터 주소의 서버 수는 클러스터에 나열할 서버 개수를 지정해 줍니다.
클러스터 메뉴에서 서버 탭에서 추가 버튼을 클릭해서 서버를 추가 할 수 있습니다. 서버를 추가할때에는 기존의 생성된 서버를 추가할 수 있고 서버를 생성하면서 추가할 수도 있습니다. 서버를 추가하면서 생성할때에는 NodeManager 서버가 실행중이여야 합니다.
Session Replication between Cluserted Node
클러스터내 서버끼리 세션을 복재하고 공유하기위해서는 weblogic.xml 을 다음과 같이 설정 해 주어야 합니다.
#It is recommended to haveaminimum of256as value forevery4MBof RAM you have.
#So for8GBRAM=2048*4MB=2048*256=524288
fs.file-max=6815744
#It sets the maximum number of shared memory segments that server can handle.
#As Oracle recommends the value should be at least4096,
#it says that we cannot find more than4096number of shared memory segments at any instance on the server.
#Note that SHMMNI value is innumbers.
#
#No change it should be4096.It must be increased ifyou have more than at least one fourth(1024)Oracle Databases running on the server.Which we never recommend.
kernel.shmmni=4096
#It defines the total amount of shared memory PAGES that can be used system-wide.
#It means that to the use all the physical memory this value should be less than or equal to total physical memory size.
#ForDBA's, it means that sum of all SGA sizes on the server should be less than or equal to SHMALL value.
# Note that SHMALL value is a number of pages.
#
# If you want the maximum size of SGA on this server to be 5GB, then this parameter value should be 5*1024*1024*1024 = 5368709120 bytes. This, in turn, says that you should not have any database with more than 5GB of SGA. But you can have multiple databases with each 5GB of SGA or even less. This is the fact why Oracle recommends to have this value more than half of the memory to utilize it for SGA(s).
#
# By chance, if your SGA size is more than 5GB say it is 7GB then 2 shared memory areas will be allocated to SGA with one of 5GB and two of 2GB sizes, which doesn'sperform well.
kernel.shmmax=2147483648
#It defines the total amount of shared memory PAGES that can be used system-wide.It means that to the use all the physical memory this value should be less than or equal to total physical memory size.ForDBA's,it means that sum of all SGA sizes on the server should be less than or equal to SHMALL value.Note that SHMALL value isanumber of pages.
#By default the page size on Linux is4KB.The total size of RAM is8GB.Let usleave at least1GBof RAM forLinux kernel to run,with which consider7GBcan be used forOracle Databases.Now value of SHMALL can be:
#
#(7*1024*1024)KB/4KB=1835008
kernel.shmall=95325
kernel.sem=25032000100128
#This parameter defines the range of port numbers that system can use forprograms which want to connect to the server withoutaspecific port number.
#
#Now,it makes sense ifyou have come across somebody advising you not to use port numbers forlistener beyond9000.Also,just look back to documents on OEM installation,Oracle uses and advises all the default port numbers less than9000.
net.ipv4.ip_local_port_range=900065500
#This parameter defines the default and maximum RECEIVE socket memory through TCP.
net.core.rmem_default=262144
net.core.rmem_max=4194304
#This parameter defines the default and maximum SEND socket memory through TCP.
#It is recommended to haveaminimum of256as value forevery4MBof RAM you have.
#So for8GBRAM=2048*4MB=2048*256=524288
fs.file-max=6815744
#It sets the maximum number of shared memory segments that server can handle.
#As Oracle recommends the value should be at least4096,
#it says that we cannot find more than4096number of shared memory segments at any instance on the server.
#Note that SHMMNI value is innumbers.
#
#No change it should be4096.It must be increased ifyou have more than at least one fourth(1024)Oracle Databases running on the server.Which we never recommend.
kernel.shmmni=4096
#It defines the total amount of shared memory PAGES that can be used system-wide.
#It means that to the use all the physical memory this value should be less than or equal to total physical memory size.
#ForDBA's, it means that sum of all SGA sizes on the server should be less than or equal to SHMALL value.
# Note that SHMALL value is a number of pages.
#
# If you want the maximum size of SGA on this server to be 5GB, then this parameter value should be 5*1024*1024*1024 = 5368709120 bytes. This, in turn, says that you should not have any database with more than 5GB of SGA. But you can have multiple databases with each 5GB of SGA or even less. This is the fact why Oracle recommends to have this value more than half of the memory to utilize it for SGA(s).
#
# By chance, if your SGA size is more than 5GB say it is 7GB then 2 shared memory areas will be allocated to SGA with one of 5GB and two of 2GB sizes, which doesn'sperform well.
kernel.shmmax=4294967296
#It defines the total amount of shared memory PAGES that can be used system-wide.It means that to the use all the physical memory this value should be less than or equal to total physical memory size.ForDBA's,it means that sum of all SGA sizes on the server should be less than or equal to SHMALL value.Note that SHMALL value isanumber of pages.
#By default the page size on Linux is4KB.The total size of RAM is8GB.Let usleave at least1GBof RAM forLinux kernel to run,with which consider7GBcan be used forOracle Databases.Now value of SHMALL can be:
#
#(7*1024*1024)KB/4KB=1835008
kernel.shmall=1835008
kernel.sem=25032000100128
#This parameter defines the range of port numbers that system can use forprograms which want to connect to the server withoutaspecific port number.
#
#Now,it makes sense ifyou have come across somebody advising you not to use port numbers forlistener beyond9000.Also,just look back to documents on OEM installation,Oracle uses and advises all the default port numbers less than9000.
net.ipv4.ip_local_port_range=900065500
#This parameter defines the default and maximum RECEIVE socket memory through TCP.
net.core.rmem_default=262144
net.core.rmem_max=4194304
#This parameter defines the default and maximum SEND socket memory through TCP.
복구를 위해서 다른 서버를 준비해야 합니다. 그 서버에는 기본적으로 다음과 같은 사항이 정리되어 있어야 합니다.
원본 서버와 동일한 자바(JAVA) 가 설치되어 있어야 한다.
원본 서버와 동일한 WebLogic 디렉토리를 가지고 있어야 한다.
WebLogic Home 복구
WebLogic Home 복구는 jar 파일을 jar 명령어로 압축해제함으로써 완료 됩니다.
ZSH
1
2
3
]$cd/opt/WebLogic/
]$jar-xf/home/systemv/mwhome.jar
]$
별거 없습니다. 위 명령어로 복구가 완료 됩니다.
여기서 한가지 더 해줘야 할 것이 nodemanager 를 위한 복구 프로세스 입니다. nodemanager 는 WebLogic Admin 서버와 통신을 하면서 Node 를 관리하는 역활을 담당합니다. Node 에 Managed Server 를 생성하거나 삭제, 시작, 중지등을 Admin 서버에서 하기위해서는 nodemanager 서버가 있어야 합니다.
문제는 nodemanager 서버는 서버에 종속되는 설정값을 가져야 하기 때문에 서버를 복제하고 난후에 서버환경을 다시 인식시켜줘야 합니다. 방법은 다음과 같습니다.
Node Manager 를 실행하면 nodemanager.properties 파일에 각종 환경설정을 정리하고 nodemanager.domains 파일을 생성합니다. 그런데, nodemanager.properties 에 내용을 변경해야하기 때문에 Node Manager 를 중단시킨 겁니다.
nodemanager.properties 파일중에 다음과 같이 수정해 줍니다.
1
2
-17SecureListener=true
+17SecureListener=false
WebLogic Domain 복구
복제할때에 ‘pack.sh’ 명령어를 썼었는데 복구할때는 ‘unpack.sh’ 명령어를 사용 합니다.
복구가 완료 되면, 이제 Domain 설정파일에서 호스트 이름을 현 시스템으로 바꿉니다. 그것은 /home/systemv/wl_domain/mCloud/config/config.xml 파일인데, 여기서 호스트명을 현 시스템으로 바꿔주고 불필요한 Managed Server 리스트, deployment 를 삭제처리 해줍니다.
Weblogic 10.3.6 에는 Node Manager 가 존재합니다. Node Manager 는 하나의 도메인에 존재하는 서버로 말 그대로 노드를 관리하는 기능을 합니다. 좀 더 들어가면, Node Manager 의 주요 기능은 도메인에 추가된 Managed Server 를 생성,삭제,시작,중지등을 가능하도록 해줍니다.
만일 Node Manager 가 존재하지 않는다면, Managed Server 를 Web Console 을 통해서 생성을 할 수 있지만 Managed Server 를 시작하기 위해서는 터미널에서 커맨드 라인으로 직접 시작 명령을 주거나 아니면 WST 를 이용해서 시작을 시켜줘야 합니다.
Admin Server, Managed Server 는 도메인에 귀속되지만 Node Manager 는 머신(Machine)에 귀속됩니다. 그래서 시작스크립트도 $MW_HOME 에 존재합니다.
최초로 Node Manager 를 실행하면 화면에 Node Manager 설정 관련 내용이 화면에 출력됩니다. 이 내용은 $MW_HOME/common/nodemanager 디렉토리에 nodemanager.properties 파일에 기록 됩니다. 여기서 자세히 보면 “SecureListener=true” 로 된 것이 보입니다. 이것은 NodeManager 와의 연결을 SSL 을 통해서 하겠다는 겁니다.
위 설정은 $MW_HOME/common/nodemanager/nodemanager.properties 파일에 저장되어 있고 SecureListener 부분을 false 로 바꾸고 Node Manager 를 재 실행해 줍니다.
이제 Node Manager 를 등록해 줍니다.
Node Manager 등록
Node Manager 등록은 WebLogic 의 관리자 페이지에서 ‘환경->시스템’ 에서 할 수 있습니다. 관리자 콘솔에서는 Node Manager 등록이라고 안하고 시스템이라고 표현합니다.
‘새로 만들기’ 를 클릭해서 등록 화면으로 넘어갑니다.
시스템 이름을 지정해 줍니다. ‘다음’ 으로 넘어 갑니다.
여기서 ‘유형’ 을 일반으로 해줍니다. 앞에서 SeucureListener 를 false 로 해줬기 때문에 일반 접속 유형으로 Node Manager 가 통신을 합니다. 그리고 수신 주소, 수신 포트 등을 알맞게 입력하고 ‘완료’ 해 줍니다.
서버 설정
이렇게 Node Manager 를 등록하게 되면 이미 생성된 서버나 생성할 서버에 ‘시스템’ 을 지정해 줄 수 있습니다. 서버 목록중에 생성된 서버를 클릭해서 들어가면 ‘일반’ 탭에 서버 정보가 나오는데, 여기서 시스템을 드롭박스를 이용해서 선택해줍니다. 이렇게 되면 이 서버는 선택한 시스템에 생성되고 제어 됩니다.