'프로그래밍/DB'에 해당되는 글 2건

  1. 2016.01.25 샤딩(Sharding)이란?
  2. 2016.01.21 SP란? Stored Procedure [수정필요] (1)

출처 : http://hanburn.tistory.com/106


[DB] DB Sharding은 무엇이고, 적용 전략은? ( 적용시 고려사항 )

개발 2012.02.15 17:44


작성자 : hanburn

작성일 : 2012-01-17

 

1. 샤딩 ( sharding ) 이란 무엇인가?

2. 샤딩 및 전략

 2.1 vertical partitioning

 2.2 Range Based Partitioning

 2.3 Key or Hash Based Partitioning

 2.4 Directory Based Partitioning

3. 샤딩 적용시 고려사항

  

 

 

1. 샤딩 ( sharding ) 이란 무엇인가?

관계형 데이터베이스에서 대량의 데이터를 처리하기 위해서 데이터를 파티셔닝하는 기술이다. (partitioning->분할함) 파티셔닝은 DBMS에서 지원하기도 하는데일부 DBMS ( MySQL 5.1 미만에서는 지원 안함에서는 지원안하기도 한다. 샤딩은 DBMS 레벨에서 데이터를 나누는 것이 아니고 데이터베이스 자체를 분할하는 방식이다따라서 어플리레이션 레벨에서 구현해야 한다.

간단하게 예를 들면전 세계의 고객 데이터를 저장하는 대형 데이터베이스를 분산한다고 할때미국 고객의 경우는 샤드A, 아시아 고객의 경우는 샤드B, 유럽 고객의 경우는 샤드C로 분할해서 저장할수 있다.  

 

 

2. 샤딩 및 전략

샤딩에서 데이터베이스를 분할하는 방법에 대해서 살펴본다각 방법마다 장단점과 주의할 점이 있으므로 서비스에 맞게 적절하게 선택하거나 조합하여 사용 한다.

 

2.1 Vertical Partitioning

    테이블 별로 서버를 분할하는 방식이다예를들면 사용자 프로필정보용 서버사용자 친구리스트용 서버사용자가 만든 컨텐츠사진같은것 ) 용 서버등으로 분할하는 방식이다.

    장점 : 구현이 간단하고전체 시스템에 큰변화가 필요 없다.

    단점 : 각 서버의 데이터가 점점 거대해지면 추가 샤딩이 필요해진다. ( 1천만명이 1000장의 사진을 생성한다면 컨텐츠 서버에 또 샤딩이 필요할 것이다. )

 

  2.2 Range Based Partitioning

    하나의 feature(또는 table)가 점점 거대해지는 경우 서버를 분리하는 방식이다. 예를들면 사용자가 많은경우 사용자의 지역정보를 이용해서 user 별로 서버를 분리하거나일정데이터라면 년도별로 분리거래정보라면 우편번호를 이용하는 방식이다.

    주의점 데이터를 분할하는 방법이 예측가능해야 한다.

 

  2.3 Key or Hash Based Partitioning

    이방식은 웹2.0 사이트에서 기본 파티셔닝 방식으로 알려져있다엔티티를 해쉬함수에 넣어서 나오는 값을 이용해서 서버를 정하는 방식이다사용자ID가 숫자일 경우 나머지연산( module operation)을 이용하는 방법이다.

    주의점 : 해쉬결과 데이터가 균등하게 분포되도록 해쉬함수를 정하는게 중요하다.

    단점 : 서버의 수를 늘리기 위해서 해쉬함수를 변경하는 작업이 무지무지 비싼 작업이다.

 

  2.4 Directory Based Partitioning

    파티셔닝 메커니즘을 제공하는 추상화된 서비스를 만드는 것이다.(데이터베이스 액세스 코드와는 떨어져 있는)  샤드키를 look-up 할수 있으면 되므로구현은 DB cach를 적절히 조합해서 만들수 있다.

 

 

3. 샤딩 적용시 문제점들 및 고려사항

 3.1 데이터 재분배 ( Rebalancing data )

  Sharding DB의 물리적인 용량한계나 성능한계에 다르면 shard의 수를 늘리는 scale-up 작업이 필요하다비스 정지 없이 scale-up 할수 있도록 설계방향을 잡아야 한다.

 

 3.2 샤딩으로부터 데이터 조인하기 ( Joining data from multiple shards )

   Sharding-db 간에 조인이 불가능 하기에 처음부터 역정규화를 어느정도 감수해야 한다. Shard의 목정이 대용량 데이터 처리이므로대용량처리시 수행성능을 위해서 데이터 중복은 trade-off 관계 ( 완전 고용과 물가 안정의 관계. 곧, 실업률(失業率)을 줄이면 물가가 상승하고, 물가를 안정시키면 실업률이 높아진다는 모순적 관계를 이르는 말임.) 임을 이미 알고 있다.

 

 3.3 샤드에 데이터를 파티션하는 방법 ( How do you partition your data in shards? )

  shard 해쉬함수를 잘 설계해야 한다.

 

 3.4 샤드간의 트랜잭션 문제

  Global Transaction을 사용하면 shard DB간의 트랜잭션도 가능하다그 유명한 XA인데성능저하의 문제가 있다.

 

 3.5 Global Unique Key

  DBMS 에서 제공하는 auto-increament를 사용하면 key가 중복될수 있기 때문에, application 레벨에서 Key 생성을 담당해야 한다.

 

 3.6 데이터는 작게

  Table의 단위를 가능한 작게 만들어야 한다.


'프로그래밍 > DB' 카테고리의 다른 글

샤딩(Sharding)이란?  (0) 2016.01.25
SP란? Stored Procedure [수정필요]  (1) 2016.01.21
Posted by GENESIS8

댓글을 달아 주세요


SP란 무엇일까? 

물론 스페셜 포스나 스킬 포인트는 아니다.


SP란 stored procedure의 약자라고 한다.


store - 가게 , 매장 , 상점 이 보통이지만, 여기서의 stroe는

'저장' , '비축' 등의 의미로 쓰인다.


ed

  • 명사 붙어서 「… 있는」 「… 가진  형용사 만듦

설마, 내가 이걸 다시 보고 궁금할 까봐 적어놓는다.
store + ed 라서 stored인 이유는 다음의 링크에 소개되어 있다.
http://www.eec.co.kr/student/tutor?action=knowledge&topArticleNo=3123&page=749&screenState=S&viewCountGubun=Y

결론적으로
stored -> 저장하는.. / 저장 중인.. 과 같이 되겠다.

procedure - 절차 , 처리등을 의미한다.
그렇지만 그냥 프로시저다. 리턴 값이 없는 함수라고 간소하게 생각하자.

저장 프로시저?? 프로시저를 저장해놓는다는 의미일까?

위키의 친절한 설명을 보겠다.
저장 프로시저 또는 스토어드 프로시저(stored procedure)는 일련의 쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합이다. 데이터베이스에 대한 일련의 작업을 정리한 절차를 관계형 데이터베이스 관리 시스템에 저장한(지속성) 것으로, 영구저장모듈(Persistent Storage Module)이라고도 불린다.


즉 DB에 대한 작업을 정리한 절차(procedure)를 RDBMS에 저장한 쿼리의 집합이다.

그래도 잘 모르겠다.

http://itability.tistory.com/51

에서 좋은 내용들을 퍼온다.


음.. 일단 간단히 가자면 쿼리문의 함수화 버전이다.

쿼리문을 일일히 쳐야하는 작업이 있다. 근데 그게 여러번 해야하는 작업이라면 SP로 만들어두면 함수 쓰듯이 계속해서 쉽게 처리할 수 있게 된다.


1. SP는 최적화 되고 캐싱 된다.



SP는 최초 실행될 때 최적화된 상태로 컴파일이 되고 이후에 DB에 캐싱되어 저장된다.

캐쉬에 저장되면 최적화와 컴파일 작업을 다시 하지 않는다. 따라서 하나의 SP가 여러 번 쓰

일 때 성능에 향상이 있다.

 

2. 네트워크 트래픽을 감소 시킨다.

SP를 사용하면 SQL문이 서버에 저장된다. SP를 사용하면 수백개의 SQL문이 필요한 일도

서버에서 SP로 처리 하기 때문에 쿼리문 자체를 전달하지 않아도 된다. 이 때 각각의 클라이

언트는 매개변수만 전달한다.


보안측면

SP에서 참조하고 있는 테이블에 접근을 허용하지 않을 수 있다. 내부적으로 Update하는

쿼리를 가진 SP의 경우 민감할 수 있다. 무기, 레벨, 재화 등등의 저장을 SP를 통해서만

하게 하면 외부의 조작으로부터 하나의 보호막을 만들 수 있는 것이다.

 



SP는 CREATE PROCEDURE 쿼리문을 통해 만들 수 있다.

@가 붙어 있는 name은 매개 변수이다. 매개 변수 이름과 타입을 지정해 놓았다.

SET NOCOUNT ON/OFF는 중요하다.

SET NOCOUNT OFF 일 경우 반환하는 값은 SP 내부에서 SELECT, UPDATE 등을 사용한

횟수이다. 따라서 원하는 값을 반환 받기 위해서는 SET NOCOUNT ON으로 설정해주어야 한

다. 여기서는 앞서 맏늘어 놓은 PlayerTable에 전달 받은 @name으로 새로운 Player를

만들고 있다.

 


음 뭔 지는 대충 알겠는데.. 아직 감이 안온다. 겨울이라 그럴지도.
http://egloos.zum.com/decalruma/v/397650
를 참고해보자

데이타 베이스에서 프로시저란 보통 저장 프로시저(stored procedure)
를 말합니다.

그것은 원론적으로 말해서 일반 함수가 하는것과 거의 비슷한 일을 하고
개념도 비슷합니다. 다만 그것은 DB서버측에 위치한다는 것입니다.
DB 서버측에 만들어 두는 함수 정도로 이해하시면 되겠습니다.
(* 리턴값을 넘겨주는 방식에서 함수와는 약간의 차이가 있습니다.)

여기서 중요한 것은 프로시져는 서버측(Server side)에 탑재된다는 것입니다.
그렇다면 클라이언트에서 그냥 함수 만들어서 쓸것이지, 왜 골아프게 저장 프로시져
같은걸 만들어서 DB서버측에 넣어놓나? 하실겁니다.

그 이유는.. DB 서버측에 저장 프로시져로 넣어놓으면 일관성있고.. 관리가 쉬워지며
유지보수가 용이하다는 장점이 있기 때문입니다.
프로시져를 애용하는 어떤 프로그래머들은 대부분의 기능을 클라이언트 어플리케이션에 구현하지 않고 DB서버에다가 프로시져로 만들어놓고 사용한다는(?) 괴설도 들어본적이 있습니다. ㅡ_ㅡ;;

예를들어 사용자가 100만명으로 운용되는 시스템이 있는데, 어떤 기능을 변경해야 한다면... 각 어플리케이션이 새로 접속할때마다 업그레이드를 해주거나 업그레이드 패치를 100만명에게 새로 배포해야 할 것입니다.

그러나 변경해야 할 기능을 프로시져로 만들어 두었다면 DB서버에서 해당 프로시져를 한번 수정해 주는것으로 수정사항이 즉시 모든 사용자들에게 반영이 됩니다.
놀라운 효과죠?...

이런 등등의 이유로 저장 프로시져란 것을 사용하는 것으로 알고 있습니다. 



쿼리문을 함수화 해서 넣어두면
SQL이 자체적으로 컴파일을 해서 씁니다..
만약 쿼리문을 그냥 프로그램안에 둔다면..
요청->실행->응답 이런 순이겠지요..
만약 요청이 5번이라면 실행도 5번이 됩니다.

하지만 프로시져라면
요청->컴파일->실행->응답 이 되구요..
5번이라면 
요청->실행(메모리)->응답이 됩니다.
훨씬 빠른 속도로 수행이 되죠..
게다가 쿼리문을 보호하는 기능도 됩니다.. 


음 대충 느낌이 온다. 이제 위키의 친절한 예제를 보자.

CREATE OR REPLACE PROCEDURE helloworld (str IN VARCHAR2)
  AS
     hw VARCHAR2 (100) : = 'Hello World!';
  BEGIN
     DBMS_OUTPUT. PUT_LINE ( 'Hello World!');
     DBMS_OUTPUT. PUT_LINE ( 'VARIABLE hw ='| | hw);
     DBMS_OUTPUT. PUT_LINE ( 'Parameter str ='| | str);
  END;
  /

데이터베이스 언어 표준 SQL에서는 SQL / PSM 기준으로 책정되어 있다. 벤더(제조사) 각사 모두 정적, 동적 SQL에 커서 처리 및 제어 구문, 예외 처리 등을 포함한 사양의 확장 언어로 절차를 설명할 수 있는 DBMS를 제공하는 경우가 많다. 또한 C 언어로 작성된 컴파일한 외부 모듈(공유 라이브러리) 및 Java 클래스 라이브러리에서 함수나 클래스 메소드를 호출하는 것으로 실현하는 ‘외부 프로시저’ 기능을 구현하는 것도 있다. 저장프로시저를 사용하여 다음과 같은 장점이 있다.

  1. 하나의 요청으로 여러 SQL문을 실행 할 수 있다. (네트워크에 대한 부하를 줄일 수 있다.)
  2. 미리 구문 분석 및 내부 중간 코드로 변환을 끝내야 하므로 처리 시간이 줄어든다.
  3. 데이터베이스 트리거와 결합하여 복잡한 규칙에 의한 데이터의 참조무결성 유지가 가능하게 된다. 간단히 말하면 응용 프로그램 측 로직을 가지지 않고도 데이터베이스의 데이터 앞뒤가 맞게 될 수 있다.
  4. JAVA 등의 호스트 언어와 SQL 문장이 확실하게 분리된 소스 코드의 전망이 좋아지는 것, 또한 웹사이트 등 운용 중에도 저장프로시저의 교체에 의한 수정이 가능하기 때문에 보수성이 뛰어나다.

장점만 있는 줄 알았더니 단점이 있다.

저장프로시저를 많이 사용하면 다음과 같은 단점이 있다.

  1. 데이터베이스 제품에 대해 설명하는 구문 규칙이 SQL / PSM 표준과의 호환성이 낮기 때문에 코드 자산으로의 재사용성이 나쁘다.
  2. 비즈니스 로직의 일부로 사용하는 경우 업무의 사양 변경 시 외부 응용 프로그램과 함께 저장프로시저의 정의를 변경할 필요가 있다. 이때 불필요한 수고와 변경 실수에 의한 장애를 발생시킬 가능성이 있다.



프로시저와 스토어드 프로시저는 다르다는 점

SP가 보안을 강화시킬 수 있다는 점
SP가 속도를 빠르게 할 수있다는 점
Parameter Sniffing을 방지할 수 있다는 점
들에 대해서는 좀 더 구체적인 수집이 필요할듯.. 수정 필요

http://www.sqler.com/392656

ㄴ의 글이 많은 도움이 될 것 같다.



'프로그래밍 > DB' 카테고리의 다른 글

샤딩(Sharding)이란?  (0) 2016.01.25
SP란? Stored Procedure [수정필요]  (1) 2016.01.21
Posted by GENESIS8

댓글을 달아 주세요

  1. 방문자1 2018.01.12 11:12  댓글주소  수정/삭제  댓글쓰기

    링크 클릭이 안되서 당황;;