오류 발생 시 브로커를 복구하려면 메시지 전달 작업 상태를 다시 작성해야 합니다. 그러기 위해서는 브로커가 상태 정보를 영구 데이터 저장소에 저장해야 합니다. 브로커는 다시 시작할 때 저장된 데이터를 사용하여 대상 및 영구 가입을 다시 작성하고 지속성 메시지를 복구하며 열린 트랜잭션을 롤백하고 전달되지 못한 메시지의 라우팅 테이블을 다시 작성합니다. 그런 다음 메시지 전달을 다시 시작할 수 있습니다.
Message Queue는 파일 기반 및 JDBC 기반 지속성 모듈을 모두 지원합니다(그림 4–1 참조). 파일 기반 지속성에서는 개별 파일을 사용하여 영구 데이터를 저장합니다. JDBC 기반 지속성에서는 JDBC™(Java Database Connectivity) 인터페이스를 사용하여 브로커를 JDBC 호환 데이터 저장소에 연결합니다. 일반적으로 파일 기반 지속성은 JDBC 기반보다 빠르지만, JDBC 호환 저장소가 제공하는 중복 및 관리 제어 기능을 선호하는 사용자도 있습니다. 브로커 구성 등록 정보 imq.persist.store(표 14–4 참조)는 사용할 두 가지 형태의 지속성 중 하나를 지정합니다.
기본적으로 Message Queue에서는 파일 기반 영구 데이터 저장소를 사용하는데, 이 저장소에서는 개별 파일이 메시지, 대상, 영구 가입 및 트랜잭션과 같은 영구 데이터를 저장합니다. 파일 기반 지속성과 관련된 브로커 구성 등록 정보는 파일 기반 지속성에 나와 있습니다.
파일 기반 저장소는 데이터 저장소가 속한 브로커 인스턴스의 이름(instanceName)으로 식별되는 디렉토리에 있습니다.
…/instances/instanceName /fs350/
stances 디렉토리의 위치는 부록 A, 플랫폼별 Message QueueTM 데이터 위치를 참조하십시오. 브로커의 각 대상마다 해당 대상으로 전달된 메시지가 들어 있는 고유의 하위 디렉토리가 있습니다.
영구 데이터 저장소에는 중요 정보나 소유 정보를 포함하는 메시지가 있을 수 있기 때문에 …/instances/ instanceName/fs350/ 디렉토리를 인증되지 않은 액세스로부터 보호해야 합니다. 영구 데이터 보안를 참조하십시오.
메시지 이외의 모든 영구 데이터는 개별 파일(대상용 파일, 영구 가입용 파일 및 트랜잭션 상태 정보용 파일)에 저장됩니다. 대부분의 메시지는 가변 크기 레코드로 구성되는 단일 파일에 저장됩니다. 메시지를 추가 및 제거할 때 단편화를 줄이려면 이 파일을 압축할 수 있습니다( 물리적 대상 압축 참조). 또한, 특정 임계값 크기를 초과하는 메시지는 가변 크기 레코드 파일보다는 고유의 개별 파일에 저장됩니다. 브로커 등록 정보 imq.persist.file.message.max_record_size를 사용하여 이 임계값 크기를 구성할 수 있습니다.
브로커는 더 이상 필요하지 않은 파일을 삭제하는 대신 나중에 다른 메시지에 다시 사용할 수 있도록 대상 디렉토리의 사용 가능 파일 풀로 반환하는 방식으로 개별 메시지 파일의 파일 풀을 관리합니다. 브로커 등록 정보 imq.persist.file.destination.message.filepool.limit는 풀의 최대 파일 수를 지정합니다. 대상의 개별 메시지 파일 수가 이 제한을 초과하면 파일이 더 이상 필요하지 않을 때 풀로 반환되지 않고 삭제됩니다.
파일을 파일 풀로 반환하는 경우 이전 내용을 삭제하지 않고 단순히 파일에 재사용 태그를 표시하여 저장소 공간을 절약할 수 있습니다. imq.persist.file.message.filepool.cleanratio 브로커 등록 정보를 사용하면 단순히 재사용 태그를 표시하지 않고 “깨끗한(빈)” 상태로 유지해야 하는 각 대상의 파일 풀에서 파일 비율을 지정할 수 있습니다. 이 값을 높게 설정할수록 파일 풀에 필요한 공간은 줄어들지만, 파일을 풀로 반환 시 파일 내용을 비우는 데 필요한 오버헤드는 더 커집니다. 브로커의 imq.persist.file.message.cleanup 등록 정보가 true이면 풀의 모든 파일이 브로커 종료 시 비워지므로 clean 상태로 유지됩니다. 이렇게 하면 저장소 공간은 절약되지만 종료 프로세스 속도는 느려집니다.
데이터를 영구 저장소에 기록할 때 운영 체제는 데이터를 동기식으로 쓰거나 “느리게(비동기식으로)” 씁니다. 저속 저장소는 데이터가 영구 저장소에 기록되지 않았는데도 브로커에서 기록되었다고 믿는 경우 시스템이 충돌하면 데이터가 손실될 수 있습니다. 성능을 조금 낮추더라도 절대 안정성을 유지하려는 경우에는 브로커 등록 정보 imq.persist.file.sync.enabled를 true로 설정하여 모든 데이터를 동기식으로 기록해야 합니다. 이 경우, 충돌 후 시스템이 다시 백업되면 데이터를 사용할 수 있으므로 브로커는 작업을 안정적으로 다시 시작할 수 있습니다. 그러나, 데이터가 손실되지 않았어도 클러스터화된 브로커에 현재 공유 데이터가 없으므로 클러스터의 다른 브로커는 사용할 수 없습니다.
파일 기반 지속성을 사용하는 대신 JDBC 호환 드라이버를 통해 액세스할 수 있는 데이터 저장소에 액세스하도록 브로커를 설정할 수 있습니다. 이 경우 해당 JDBC 관련 브로커 구성 등록 정보를 설정하고 데이터베이스 관리자 유틸리티(imqdbmgr)를 사용하여 적절한 스키마를 갖는 데이터베이스를 만들어야 합니다. 자세한 내용은 JDBC 기반 저장소 구성을 참조하십시오.
JDBC 기반 지속성에는 JDBC 데이터베이스를 사용하도록 브로커를 구성하기 위한 등록 정보가 나와 있습니다. 이러한 등록 정보는 각 브로커 인스턴스의 인스턴스 구성 파일(config.properties)이나 브로커 유틸리티(imqbrokerd) 또는 데이터베이스 관리자 유틸리티(imqdbmgr)의 -D 명령줄 옵션을 사용하여 지정할 수 있습니다.
imq.persist.jdbc.driver 등록 정보는 데이터베이스에 연결하는 데 사용할 JDBC 드라이버의 Java 클래스 이름을 제공합니다. 또한 기존 데이터베이스 연결(imq.persist.jdbc.opendburl), 새 데이터베이스 작성(imq.persist.jdbc.createdburl) 및 데이터베이스 연결 닫기(imq.persist.jdbc.closedburl) URL을 지정하는 등록 정보도 있습니다.
imq.persist.jdbc.user 및 imq.persist.jdbc.password 등록 정보는 데이터베이스에 액세스하는 데 사용되는 사용자 이름 및 비밀번호를 제공합니다. imq.persist.jdbc.needpassword는 비밀번호가 필요한지 여부를 지정하는 부울 플래그입니다. 보안상의 이유로 비밀번호는 -passfile 명령줄 옵션을 통해 지정된 비밀번호 파일에만 지정해야 합니다. imqbrokerd 및 imqdbmgr 명령은 대화식으로 비밀번호를 묻습니다. 이와 마찬가지로, 명령줄에서 imqbrokerd 명령의 -dbuser 옵션 또는 imqdbmgr 명령의 -u 옵션을 사용하여 사용자 이름을 입력할 수도 있습니다.
여러 브로커 인스턴스에서 공유하는 JDBC 데이터베이스에서 구성 등록 정보 imq.persist.jdbc.brokerid는 각각의 인스턴스에 대해 데이터베이스 테이블 이름에 추가할 고유한 인스턴스 식별자를 지정합니다. 보통 한 브로커 인스턴스에 대해서만 데이터를 저장하는 내장 데이터베이스에는 이 식별자가 필요하지 않습니다. 나머지 JDBC 관련 구성 등록 정보는 각 데이터베이스 테이블마다 한 개의 등록 정보로 구성된 데이터베이스 스키마를 생성하는 SQL 코드를 사용자 정의하는 데 사용됩니다. 예를 들어, imq.persist.jdbc.table.IMQSV35 등록 정보는 버전 테이블, imq.persist.jdbc.table.IMQCCREC35는 구성 변경 레코드 테이블, 그리고 imq.persist.jdbc.table.IMQDEST35는 대상 테이블을 생성하기 위한 SQL 명령을 제공합니다. 전체 목록은 표 14–6을 참조하십시오.
데이터베이스 시스템마다 필요한 정확한 SQL 구문이 다르기 때문에 자세한 내용은 데이터베이스 공급업체에서 제공하는 설명서를 참조하십시오.