최근 퓨어스토리지는 미션 크리티컬 애플리케이션을 퍼블릭 클라우드에서 운영할 수 있도록 해주는 클라우드 블록 스토어(Cloud Block Store™)를 출시했습니다. 이제 고객들은 온프레미스 플래시어레이(FlashArray™)에서 운영되는 데이터와 애플리케이션을 클라우드 블록 스토어를 통해 클라우드 환경에서도 원활하게 확장할 수 있게 되었습니다.
하이브리드 아키텍처를 구현함으로써 얻을 수 있는 가장 큰 혜택 중 하나는 민첩하게 비즈니스의 변화하는 니즈를 충족할 수 있다는 것입니다. Oracle 데이터베이스의 경우, 그러한 니즈는 개발, 테스트, 품질 보증(QA) 등을 위해 새로운 인스턴스를 실행하는 것이 될 것입니다.
이번 블로그에서는 온프레미스 Oracle 데이터베이스를 AWS용 퓨어스토리지 클라우드 블록 스토어에 복제하는 것이 얼마나 쉽고 빠른 작업인지 보여드리겠습니다.
데모를 보여드리기에 앞서, 클라우드 블록 스토어가 이미 구현되어 있는 것으로 가정하겠습니다. 클라우드 블록 스토어를 설치하는 자세한 방법은 AWS용 클라우드 블록 스토어 구축 및 설정 가이드를 참고하십시오.
환경 설정
데모 환경 설정은 아래와 같습니다. 온프레미스에서 구동되는 VISPROD라는 운영 데이터베이스가 있습니다. AWS용 클라우드 블록 스토어에 VISDEV의 개발 복사본을 생성해보겠습니다.
온프레미스 | 클라우드 블록 스토어 | |
데이터베이스명 | VISPROD | VISDEV |
호스트 IP 주소 | 10.21.121.126 | 10.0.3.105 |
플래시어레이 IP 주소 | 10.21.121.102 | 10.0.3.136 |
AWS에서 환경 설정하기
AWS에 데이터베이스 복사본을 생성하기 전에 먼저 데이터베이스 호스트를 설정해야 합니다. 간단하게 그 과정을 설명해드리겠습니다.
(Oracle 설치를 위해 호스트를 설정하는 자세한 방법은 플래시어레이에 Oracle 데이터베이스 18c를 설치하는 방법을 참고하십시오.)
- 온프레미스로 구동되는 소스 데이터베이스와 같은 버전의 OS로 AWS 인스턴스를 생성합니다. 소스 데이터베이스 호스트에 적용된 OS 패치를 적용합니다.
- 스토리지 -> 호스트 메뉴바로 이동하여 생성된 인스턴스를 플래시어레이에 호스트 오브젝트로 추가합니다.
- VISDEV를 위해 소스 데이터베이스(VISPROD)의 프로텍션 그룹(Protection Group) 스냅샷에 있는 볼륨에 상응하는 새로운 볼륨을 생성합니다. 이 두 볼륨의 사이즈는 동일해야 합니다.
- 새로 생성된 볼륨을 앞서 생성한 호스트 오브젝트에 연결합니다.
- 호스트에서 rescan-scsi-bus.sh를 실행하여 scsi bus를 재스캔합니다. lsscsi를 사용해 호스트가 이 볼륨들을 인식할 수 있는지 확인합니다.
- 나중에 쉽게 참조할 수 있도록 각 볼륨의conf 파일에 alias를 만듭니다.
- Service multipathd restart를 실행하여멀티패스(multipath) 서비스를 재실행합니다.
- Multipath-ll를 사용해 디바이스가 올바른 이름과 사이즈로 표시되는지 확인합니다.
- 플래시어레이를 위한 Oracle 데이터베이스 권장 설정에 기재된 권장사항이 올바르게 구현되었는지 확인합니다.
- 온프레미스 소스 데이터베이스 호스트에 설치된 것과 동일한 버전의 Oracle 데이터베이스를 AWS 인스턴스에 설치합니다. AWS 인스턴스에 생성된 OS 사용자 및 그룹 ID들은 온프레미스와 일치해야 합니다. ASM 데이터베이스인 경우, 그리드 인프라스트럭처(Grid Infrastructure)도 설치해야 합니다.
이것으로 호스트 설정이 완료됩니다.
이제 VISDEV를 위한 init.ora 파일을 생성해야 합니다. 가장 손쉬운 방법은 VISPROD의 init.ora 파일을 복사해 필요한 변경을 하는 것입니다.
온프레미스 플래시어레이 설정
GUI를 사용해 단 한번에 설정하고, 전체 과정이 자동으로 정기적으로 수행되도록 작업을 스크립팅 합니다.
- AWS용 클라우드 블록 스토어를 온프레미스 플래시어레이에 비동기식 복제 타깃으로 연결합니다.
클라우드 블록 스토어에 로그인해서 커넥션 키(Connection Key)를 가져옵니다.
그 다음, 커넥션 키를 복사합니다.
온프레미스 플래시어레이에서, 스토리지 -> 어레이 메뉴바로 이동한 후 커넥티드 어레이(Connected Arrays) 섹션에서 추가(Add) 아이콘을 클릭합니다.
연결이 되면, 클라우드 블록 스토어가 커넥티드 어레이(Connected Arrays) 목록에 나타납니다.
2. 소스 플래시어레이에 Oracle 데이터베이스의 모든 데이터베이스 파일이 포함된 프로텍션 그룹을 생성합니다. 그리고 클라우드 블록 스토어를 복제 타깃으로 추가합니다.
3. 그 후, 프로텍션 그룹을 복제 타깃으로 스냅샷을 생성합니다. 이 때, 퓨어스토리지의 CLI이나 Python REST API를 사용하면 됩니다.
모든 과정을 거치면, 데이터베이스의 모든 볼륨에 대한 일관된 스냅샷이 제공되어 특정 시점 기반의 재해 복구를 수행합니다.
추후에 특정 시점의 데이터베이스를 복구해야 하는 경우, 위의 명령어를 실행하기 전에 데이터베이스를 핫 백업(Hot Backup) 모드로 설정해 두어야 합니다. 이 때, “ALTER DATABASE BEGIN BACKUP” 명령어를 실행하면 됩니다.
- 스냅샷을 생성한 후에는 “ALTER DATABASE END BACKUP” 명령어를 실행하여 핫 백업(Hot Backup) 모드를 해제합니다.
- 클라우드 블록 스토어에서 스토리지 -> 프로텍션 그룹 메뉴바로 이동해 스냅샷이 복제되었는지 확인합니다.
- 온프레미스 플래시어레이에서 복제된 프로텍션 그룹을 찾습니다. 이 때, 프로텍션 그룹의 포맷은 <플래시어레이명>:<프로텍션 그룹명>입니다.
- 클릭하면 세부 내역 페이지로 이동합니다.
프로텍션 그룹 스냅샷(Protection Group Snapshots) 아래, 복제된 스냅샷이 있습니다. 이 때, 스냅샷의 포맷은 <플래시어레이명>:<프로텍션 그룹명>.<접미사(suffix)>입니다. 도표는 전송된 바이트는 물론 소요된 시간 등 복제 작업 현황을 제공합니다.
프로텍션 그룹 스냅샷이 완전히 전송되면, VISDEV 데이터베이스 생성 과정을 시작할 수 있습니다.
VISDEV 데이터베이스 생성하기
- 리프레시의 경우, VISDEV가 이미 존재한다면 먼저 VISDEV를 종료합니다.
- 그 다음, 데이터베이스를 호스트하는 파일 시스템(File Systems)을 언마운트합니다. ASM의 경우, ASM DISK GROUPS를 언마운트합니다.
- VISPROD 프로텍션 그룹 스냅샷의 볼륨을 각 상응하는 클라우드 블록 스토어의 볼륨으로 복사합니다. 이전 단계에서 VISDEV 볼륨을 이미 생성했기 때문에, 볼륨을 복사를 하는 동안 덮어쓰기(overwrite) 옵션을 사용해야 합니다.
- 파일 시스템을 마운트합니다. ASM을 사용하는 경우, ASM DISK GROUPS를 마운트합니다.
- VISDEV 네이밍 규칙에 맞게 디렉토리 이름들을 변경합니다.
- 인스턴트 노마운트 단계를 실행합니다.
- VISDEV를 위한 컨트롤 파일(control file)을 생성합니다.
- 취소할 때까지 백업 컨트롤 파일을 사용해 데이터베이스를 복구합니다.
- 마지막으로, RESETLOGS 옵션으로 데이터베이스를 시작합니다.
여러 단계를 거치는 것처럼 보이지만, 이 모든 것은 쉽게 자동화될 수 있습니다. 클라우드 블록 스토어에서 실행되는 3개의 비운용 복사분에 대한 데이터베이스 리프레시 작업을 자동화하는 방법을 보여주는 데모 영상을 만들었으니 참고하시기 바랍니다.
다음은 퓨어스토리지의 파이썬(Python) REST API를 사용하는 것이 얼마나 쉬운지를 보여주는 예시입니다. 이 스크립트는 프로텍션 그룹 스냅샷의 볼륨을 온프레미스에서 클라우드 블록 스토어의 볼륨으로 복제합니다.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
def get_pgroup_snaps(array,pg_name,suffix): pgrp_snaps = array.get_pgroup(pg[‘name’],snap=True) for snap in array.get_pgroup(pg[‘name’],snap=True): if snap[‘name’] == pg_name+‘.’+suffix: return snap; def get_vol_for_pg_snap(cbs_array,pgrp_snap): tgt_volumes = cbs_array.list_volumes(pending=False,snap=True,pgrouplist=pgrp_snap[‘name’]) for tgtvol in tgt_volumes: tgt_vol_name = tgtvol.get(‘name’); return tgt_volumes if __name__ == “__main__”: parser = argparse.ArgumentParser(description=‘Oracle Database Snapshot & Replicate script’) parser.add_argument(‘–prem-array-name’, help=‘FlashArray Hostname or IP address’, required=True) parser.add_argument(‘–cbs-array’, help=‘FlashArray Hostname or IP address’, required=True) parser.add_argument(‘–user’, help=‘Username to connect to the FlashArray’, default=“pureuser”) parser.add_argument(‘–password’,help=‘Password to connect to the FlashArray’, action=“store”, default=“pureuser”) parser.add_argument(‘–src-name-pattern’,help=”, required=True,action=‘store’) parser.add_argument(‘–tgt-name-pattern’,help=”, required=True,action=‘store’) parser.add_argument(‘–srcPG’,help=‘Protection Group that makes up source DB’, required=True,action=‘store’) parser.add_argument(‘–suffix’, help=‘Optional suffix for Volume snapshot’, default=“%Y%m%d-%H-%M-%S”) args = vars(parser.parse_args()) # Connect to CBS Array try: cbs_array = purestorage.FlashArray(args[‘cbs_array’],args[‘user’],args[‘password’]) cbs_array_info = cbs_array.get() except ValueError: print(“Error in connecting to the Array. Check credentials or the REST version !!”) sys.exit(–1) except Exception as err: print(“Error in connecting to the Array!! “) sys.exit(–1) # Extract Source Volumes try: for pg in cbs_array.list_pgroups(pending=True, filter=“name='{}:{}'”.format(args[‘prem_array_name’],args[‘srcPG’])): pgrp_snap = get_pgroup_snaps(cbs_array,pg[‘name’],args[‘suffix’]) vol_in_pg_snap_list = get_vol_for_pg_snap(cbs_array,pgrp_snap) # for each volume in snapshot, copy it with overwrite option for vol in vol_in_pg_snap_list: local_vol_name = vol[‘name’].split(‘.’)[2].replace(args[‘src_name_pattern’],args[‘tgt_name_pattern’]) cbs_array.copy_volume(vol[‘name’],local_vol_name,overwrite=True) except Exception as err: print(“Source Protection Group Error !!”) sys.exit(–1) |
클라우드 블록 스토어는 온프레미스 플래시어레이와 동일한 퓨리티(Purity) 운영 환경에서 실행되며, 동일한 GUI와 API는 물론, 공간 절약형 스냅샷, 상시 암호화, 데이터 절감 등 동일한 데이터 서비스를 제공합니다.
지금까지 온프레미스 Oracle 데이터베이스를 AWS용 클라우드 블록 스토어로 복제하는 것이 얼마나 쉬운지 보여드렸습니다. 지금 바로 AWS 마켓플레이스에서 클라우드 블록 스토어 제품 페이지를 확인해보십시오.