Browsing Tag

Support Master

NCP

[NCP] Cloud DB for MSSQL의 모든 것

안녕하세요 ManVSCloud 김수현입니다.

금일 포스팅은 Cloud DB for MSSQL에 대해 모두 알아보는 것을 목표로 포스팅해보았습니다.


Cloud DB for MSSQL

Cloud DB for MSSQL은 완전 관리형 서비스입니다.
완전 관리형 서비스란 무엇이냐? 네이버 클라우드 플랫폼에서 장비, OS 설치 및 데이터 베이스 솔루션 설치 등을 모두 관리하게 됩니다.

관리형과 완전 관리형의 차이? : 관리형은 네이버 클라우드 플랫폼의 Server, 완전 관리형은 Cloud DB for MSSQL이라고 하면 어떤 차이가 있는지 쉬울 것같습니다.
둘 다 물리적 장비와 OS를 제공하고 관리하지만 Server는 DB와 같은 솔루션은 사용자가 직접 설치하고 관리해야하며 백업이나 가용성 등에 대해 모두 관리해야합니다.
다만 완전 관리형은 DB솔루션이 이미 설치된 상품이고 백업이나 고가용성 기능이 있어 선택만하면 됩니다.

  • 데이터베이스 최적화 설정
  • 모니터링과 알람
  • 데이터 자동 백업 지원
  • 용이한 쿼리 분석
  • 2TB까지 자동 증가하는 데이터 스토리지
  • 자동 페일오버(Failover) 기본 제공
  • 읽기 슬레이브(Slave) 서버 제공

VPC 기준 라이센스는 Standard Edition, Enterprise Edition을 지원하고 있습니다.

↓ 민간용 Cloud DB for MSSQL 링크

↓ 금융 Cloud DB for MSSQL 링크


Functional Check

※ DB Server 타입

— 초기 생성 시 Standard / High Memory 선택 후 DB 스펙 변경 시 처음 선택한 타입에서만 스펙 변경이 가능합니다.
(Standard 선택 시 Standard 크기에서만 변경 가능, High Memory, High CPU로 변경 불가)

※ 재시작 (Failover)

Without FailOver
(NCP 설명 : SSMS 로 설정한 내용이 그대로 보장되지만, service down time 이 깁니다. (몇 분 이상))

With FailOver : 고가용성이 아닌 단일 구성은 With FailOver 기능을 사용할 수 없습니다.
(NCP 설명 : service down time 이 짧지만(30초이내), 사용자께서 SSMS로 설정한 내용이 유실 될 수 있습니다.)

서버장애등으로 자동 조치중이면, failover 및 재부팅이 진행되지 않습니다.

테스트 결과 :

테스트 진행 시 Without FailOver, With FailOver 둘 다 “재부팅중 – 설정중 – 운영중” 모든 과정에 소요되는 시간이 6분 이상 소요되었으며 두 방식 동일하게 1분 가량 1회의 Service Down이 발생되었습니다.
(몇회 시도시 해당 서비스 다운 이후 일시적으로 추가적인 10초 가량의 Service Down도 있었습니다.)

“실운영 및 데이터 증가 시에는 방식에 따라 시간 차이가 있을 것으로 보여집니다.”

‘Without FailOver’ 방식으로 진행될 경우
[Cloud Activity Tracer] 작업 내역에 “Restart DB Server”로 로그가 남습니다.

→ ‘With FailOver’ 방식으로 진행될 경우
[Cloud Activity Tracer] 작업 내역에 “Restart DB Service With Failover”, “Switch to Mirror DB Server Due to Failover”, “Switch to Principal DB Server Due to Failover”의 로그가 남습니다.
(Cloud Activity Tracer에 남는 로그는 재시작 시 로그가 아니라 재시작 후 정상 운영중 상태가 되었을 때 로그에 남게됩니다.)

→ 장애로 인한 FailOver의 경우에는 Event에서 FailOver쪽으로 추가 확인이 필요해보입니다.
  • SQL Server Management Studio(SSMS)를 이용하거나 직접 데이터베이스를 생성하는 경우 옵션에서 복구 모델을 전체(full)로 선택해야 미러링(Mirroring) 구성이 가능
    (복구 모델이 Full이 아닐 경우 자동 Failover에 문제가 발생할 수 있습니다.)

— Cloud DB for MSSQL에서 자동으로 미러링 활성화된 후에는 데이터베이스 미러링을 제거하지 않으면 CLI에서는 직접적으로 데이터베이스가 삭제되지 않습니다.

1> USE master;
2> GO
3> DROP DATABASE test1;
4> GO

미러링이 진행된 Database 삭제 시 발생하는 에러

m-11181583-002) Msg 3743 (severity 16, state 1) from M-11181583-002 Line 1: “The database ‘test1’ is enabled for database mirroring. Database mirroring must be removed before you drop the database.”

// FailOver 후 Database DROP 시도
m-11181583-001) Msg 3743 (severity 16, state 1) from M-11181583-001 Line 1: “The database ‘test1’ is enabled for database mirroring. Database mirroring must be removed before you drop the database.”

→ 데이터베이스 삭제 방법 : [콘솔] – “Cloud DB for MSSQL / DB Server” – [DB 관리] – [Database관리] 에서 DB를 삭제해주면 정상 삭제가 됩니다.

※ Slave

  • “Slave 서버는 24시간 읽기가 가능하지 않기때문에 읽기 가능 시간대를 설정하여 사용해야합니다. (batch 및 BI 등의 목적에 적합)

— 최대 5개까지 생성 가능
— 최대 20시간까지 설정 가능
— 설정한 읽기 가능 시간대에는 data sync가 되지 않습니다.
— Slave의 spec을 변경하면 Principal와 Mirror 서버의 스펙도 함께 변경됩니다.

※ Monitoring

해당 Monitoring은 Cloud DB for MSSQL 서비스에 포함되어있는 서비스라 추가적인 비용이 발생하지 않습니다.

첫번째 DB Dashboard 페이지에서는 CPU 사용률, 분당 실행된 쿼리 횟수, 쿼리 수행 횟수 대비 CPU 소모량 및 메모리 읽기 수를 보여주는 페이지 입니다.

조금 더 세부적인 모니터링을 원하시는 경우 Performance 탭을 클릭하여 볼 수 있습니다.

Performance에서 모니터링 할 수 있는 목록은 다음과 같습니다.

  • CPU used
  • CPU Queue length
  • Context Switches
  • disk read latency
  • disk write latency
  • disk Queue Length
  • disk read mbyte
  • disk write mbyte
  • network in
  • network out
  • network packet
  • DB lazy write
  • Free Memory
  • Page Life Expectancy
  • Memory Grants Pending
  • execute queries count
  • DB buffer lookup
  • DB buffer reads
  • DB buffer writes
  • db latch wait
  • db lock wait
  • sql compile
  • sql re-compile
  • connections
  • availableMemory

추가로 모니터링 정보는 (기간 : 최근 1시간 기준) 매 1분 수집된 평균값 기준입니다.
기간에 따라 수집 주기가 달라집니다.
ex) 기간 : 최근 7일 기준일 때 매 30분 수집된 평균값 기준 등 선택한 기간에 따라 주기가 다름.
즉, 최근 1일로 볼때와 최근 7일 기준으로 볼 때 모니터링 그래프가 다르다는 궁금증을 가지는 분들이 있습니다.

하지만 이는 당연한 것입니다.
최근 1일 기준으로 보았을 때 매 1분간 수집된 결과의 평균값이 그래프로 나타나고 최근 7일 기준으로 보면 매 30분 수집된 평균값으로 그래프로 나타나므로 그래프가 다르게 보이는 것입니다.

마지막으로 Monitoring 페이지에서는 DB Logs도 확인을 할 수 있습니다.

설정한 기간 동안의 에러 로그 내용이 표시되게 됩니다.

※ Backup

— 약 1시간 소요되었으며 DB 용량에 따라 더 오랜 시간이 소요될 것으로 보입니다.

— 선택한 시간대에 가장 가까운 백업 파일을 이용하여 새로운 서버가 생성됩니다.
(VPC, Subnet 등을 설정할 수 없습니다.)

“Cloud DB for MSSQL” to 외부 또는 “외부 to Cloud DB for MSSQL” 백업 및 복원은 DMT 툴을 이용하여 가능합니다.
(업로드, 다운로드 모두 가능합니다.)

Backup으로 복원한 DB Server는 Multi Zone이 Y에서 N로 생성됩니다.
(기존에 Multi Zone으로 운영중이었더라도 복원 시 하나의 Zone에 Principal와 Mirror가 생성되어 Zone 장애 발생 시 문제가 될 수 있으니 이 부분을 미리 인지하고 방안을 생각해두는 것이 좋아보입니다.)
※ 복원 시 싱글존/멀티존, AZ 등 이러한 선택지에 대한 옵션은 4분기 정도에 개선될 예정입니다.

※ Event

  • Cloud DB for MSSQL 서버에서 발생한 이벤트 이력을 확인할 수 있습니다.
  • Metric 이벤트를 Cloud Insight에서 설정하여 메일 또는 SMS로 알림을 받을 수 있습니다.

확인 가능한 이벤트와 설정 가능한 이벤트 항목은 아래 링크를 통해 확인하실 수 있습니다.

— 수동으로 재시작한 Failover는 [Event] – [필터]의 ‘이벤트 이름 : Restart’에 남습니다.
즉, 장애로 인한 Failover만 [Event] – [필터]의 ‘이벤트 이름 : Failover’ 에 남겨질 것으로 보입니다.

※ Config Group

— Config Group에 설정된 Config값은 Console에서만 변경이 가능합니다.
기본적으로 생성되는 default Config Group에서는 Config 변경이 되지않습니다.
(재시작이 필요한 변경은 Cloud DB 서버 재시작 후에 적용)

— Config Group에서 network packet size 수치 변경 후 CLI에서 확인 시 정상 변경 확인

Config Group에서 설정 값 변경 후 서버 내 적용된 값 확인 해보기

Config Group에서 network packet size 의 기본값 4096을 8192로 변경 후
서버에 접속하여 변경된 값을 쿼리로 확인해보았습니다.
1> EXEC sp_configure @configname='network packet size';
2> GO
name    minimum maximum config_value    run_value
network packet size (B) 512     32767   8192    8192
(1 row affected)
(return status = 0)

How to connect to Cloud DB for MSSQL

Cloud DB for MSSQL에 접속하는 방법은 크게 세가지 방법이 존재합니다.

  1. 네이버 클라우드 플랫폼 서버에서 private 도메인 이용하여 접근
  2. SSL VPN을 이용하여 접근
  3. Public 도메인을 이용하여 접근

먼저 1번은 네이버 클라우드 플랫폼에서 서버를 생성하여 해당 서버를 통해 private 통신으로 연결하는 방법입니다.

2번째 방법으로는 SSL VPN을 이용하여 접근하는 방법입니다.

Public 하게 사용하는 것을 권장하지 않으므로 3번의 경우 줄을 먼저 그어놓았습니다.
(1, 2번의 방법을 사용합시다. 😎)


Test Environment & Collection of Queries Used

## SERVER : 
* 버전 : centos-7.8-64 (+ Apache 2.4.6, PHP 7.4.30 ) 

## Cloud DB for MSSQL : 
* 버전 : Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) Sep 24 2019 13:48:23 Copyright (C) 2019 Microsoft Corporation Standard Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) (Hypervisor)

* SERVER에서 Cloud DB for MSSQL 접속 시 사용된 CLI 명령어
sqlcmd -S 'Cloud DB For MSSQL의 엔드포인트' -U 계정명 -P '패스워드' 
또는 
tsql -S 'Cloud DB For MSSQL의 엔드포인트' -p 1433 -U 계정명 -P '패스워드' 

sqlcmd를 사용하기 위해서는 mssql-tools를 설치하면 되고
tsql을 사용하시려면 freetds를 설치하면 됩니다.

※ 테스트 시 사용된 쿼리

--------------------------------------------------------------------------
// 데이터베이스 생성
CREATE DATABASE test1;
GO


// 데이터베이스 삭제
USE master;
GO
DROP DATABASE test1;
GO


// 테이블 생성
CREATE TABLE emp 
(
    empno    INT NOT NULL PRIMARY KEY,
    ename    VARCHAR(10),
    job      VARCHAR(9),
    mgr      INT,
    hiredate DATE,
    sal      NUMERIC(7, 2),
    comm     NUMERIC(7, 2),
    deptno   INT
)
GO


// 테이블 조회
SELECT *
  FROM INFORMATION_SCHEMA.TABLES
  ORDER BY TABLE_NAME
GO


// sp_configure 설정값 조회
USE master;
GO
EXEC sp_configure @configname='network packet size';
GO


// 복구 모델 확인
SELECT name, recovery_model_desc  
   FROM sys.databases  
      WHERE name = 'model' ;  
GO

// 사용자 생성
-- Creates the login AbolrousHazem with password '340$Uuxwp7Mcxo7Khy'.  
CREATE LOGIN AbolrousHazem   
    WITH PASSWORD = '340$Uuxwp7Mcxo7Khy';  
GO  

-- Creates a database user for the login created above.  
CREATE USER AbolrousHazem FOR LOGIN AbolrousHazem;  
GO  
--------------------------------------------------------------------------
  • MSSQL 데이터베이스 사용 권한 쿼리 참고

※ 테스트 시 MSSQL + PHP 연동 소스

<?php 
$serverName = "서버아이피";
$connectionOptions = array(
    "database" => "database_name", // 데이터베이스명
    "uid" => "user_name",   // 유저 아이디
    "pwd" => "user_passwd"    // 유저 비번
);

// DB커넥션 연결
$dbconn = sqlsrv_connect($serverName, $connectionOptions); 

// 쿼리
$query = "SELECT name, age FROM test"; 

// 쿼리를 실행하여 statement 를 얻어온다
$stmt = sqlsrv_query($dbconn, $query);

// statement 를 돌면서 필드값을 가져온다
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC))

{
    echo $row['name'];
    echo $row['age'];
    echo "<br>";
}

// 데이터 출력후 statement 를 해제한다
sqlsrv_free_stmt($stmt);

// 데이터베이스 접속을 해제한다
sqlsrv_close($dbconn);

echo
echo "현재 날짜 : ". date("Y-m-d")."<br/>";
echo "현재 시간 : ". date("H:i:s")."<br/>";
echo "현재 일시 : ". date("Y-m-d H:i:s")."<br/>";

?>
  • MSSQL + PHP 연동 시 참고한 URL

Personal Comments

지금까지 Cloud DB for MSSQL에 대해서 알아보았습니다.

Cloud DB for MSSQL 서비스를 사용하시는 데에 큰 도움이 됐으면 하는 바람입니다.
다음 포스팅은 더욱 흥미로운 포스팅으로 준비해보겠습니다.

긴 글 읽어주셔서 감사합니다.