# Postgres: A Proven Track Record

---------------------------


1. Postgres

        

- VS mysql

- 라이센스 정책 이슈 가 없어 사용하기 좋다

- Versioning

          

- 9.0 streaming 지원

- 9.5 parelle scan (table) ... 지원

- version up 됨에 따라 기능, 파라미터의 삭제 case 도 있다

- 제품군

- Postgres (community ver)

- EDB Postgres Advanced Server (enterprise ver)

- hint ? 가 있다

- Postgres Plus Cloud (enterprise ver)


2. physical database 구조

   

- cluster == DB (최근 일반화된 cluster 의 정의와는 다르다)

       - 포터블 하다

       - 각 database 는 하나의 폴더 구조를 가진다 == /install-path/9.5AS/data/

            - pg_tblspc : 각각의 tablespace 에 각각의 관계가 저장된다

            - base :

        - 각각의 table 이나 index 의 경우 각각 다른 파일로 저장된다 (OID 숫자 파일로 생성)

        - OID 숫자는 pg_class.relfilenode 에서 찾을 수 있다

        - 하나의 파일은 최대 1GB

       - page structure

         

            - tuple 8 kb , 조정 불가

            - toast 라는 메커니즘을 통해 8 kb 이상의 가변 길이 데이터를 따로 저장한다


4. process

   

    - multi process 구조 이다 (최근 많이 사용하는 multi thread 구조, 비동기 구조 와는 다르다)

        - 클라이언트에서 pool 로 관리하여 DB 에 접속하기 때문에 변경할 필요는 없다

        - 각자 판단하여 각자 업무를 한다 == utility process 가 별로로 존재

        - 클라이언트 의 응답용 backend process 가 있다

    - Postmaster

listener 가 네트워크 서버 역할, 자식 process 를 만든다

- 하나의 master process 만 생성하기 때문에 port 도 하나만 사용한다

    - Postgres == Server Process == backend process

- postmaster 에 의해 생성되며 client 의 요청을 수행하는 프로세스

- 데이터의 입출력을 담당한다

    - Utility process

        - background writer : write dirty data to disk

- WAL writer : write WAL file to disk

- checkpoint process

- ...


5. DB I/O 의 특징

- DB 의 모든 데이터의 접근은 server process 가 memory 를 통한다

- DB 의 성능을 좌우한다

- read path

- step1. memory 영역 조회

- step2. 없으면 memory 할당을 받음

- step3. 직접 Disk 를 조회

- step4. memory write

- step5. client 에 전달

        - write path

       

            - step1. buffer cache 조회

            - step2. memory 확보

         - step3. 변경내용 log buffer (WAL buffer)에 기록

            - step4. memory 데이터 변경 > transaction log 기록 (utility process 중 background writer)

            - -------------- write 보장 / commit --------------

            - step5. DB File 에 완전히 기록 된 것을 확인 (utility process 중 WAL writer)

        - commit && check point

            - before commit : data in memory

     - after commit : data in transaction log

        - after check point : data in data file


6. transaction log == WAL log

- 순차적으로 변경사항을 기록 (DB file 에 직접 쓰는 것보다 성능적으로 우수하다)

- commit 완료되기 전에 DB file 에 기록

- long transaction 의 경우 commit 되기 전에 주기적으로 기록

- archive log 폴더로 별도의 백업이 이루어진다


7. check point : DB 의 성능을 좌우한다

- 동작

- step1. WAL 파일에 REDO point 를 지정

- step2. 지정된 시점의 WAL 파일을 buffer 에 기록

- step3. pg_control 파일 업데이트

- step4. 공유 버퍼 풀에 있는 모든 dirty page 를 스토리지에 기록 후 플러시

        - 주기 조절이 중요하다

- 빈번한 수행 : 

+ 장애 복구 시 신속한 복구 가능

- disk I/O 가 많아져 성능 저하 이슈

- 긴 주기 수행 : 

disk I/O 가 적어 성능 좋음

- 장애시, 복구할 WAL file 이 많아져 이슈가 될 수 있음 

 - 역할 : 

- 주기적으로 biffer cache 의 변경된 block(dirty buffer) 를 file 에 기록

- 모든 변경 내용이 기록된 transaction log 파일을 release 하여 해당파일 삭제

- 버전 관리

- a > a1 : wal log 에 기록 후 buffer memory 기록

- if 장애 발생시, disk 에 블록 header 부분에 변경사항을 기록한다 , wal log 의 변경사항 비교


참고 https://www.postgresql.org/docs/

'Database > postgreSQL' 카테고리의 다른 글

postgreSQL 설치  (0) 2016.08.25
postgreSQL 주요 기능  (0) 2016.08.25
Posted by 감각적신사
,

Nosql 등장

Nosql 2016. 8. 23. 07:33

0. 데이터 분산 모델

- Master-Slave 복제

- master node : read/write 가능

- slave node : read 만 가능, master node 의 데이터를 동기화 한다

- Peer to Peer 복제

- 모든 node 에 대한 read/write 가능

- 하나의 node 에 대한 write 요청이 실패할 경우, write 실패

- Sharding

- write 에 대한 수평확장을 제공

- 저장 node 에 대한 매커니즘(샤딩키)을 정의 하여 사용

- 샤딩 적용시 고려사항

- 샤딩키 : 성능을 좌우하는 결정적 요소, 

                                        cardinality (==분포도) 가 적절한 필드 선택해야 한다 (낮으면 한 노드에 집중될수도...)

- 샤딩키 분배방식

- range : 데이터 분포를 예측 할수 있어야 한다

- hash

- 데이터 재분배 rebalancing

- 샤드간 데이터 조인 최소화

- 한 node 로 부터 요청에 대한 데이터를 얻을 수 있도록 데이터를 분산시켜야 한다

- Sharding + Peer to Peer 복제

- column family 형 nosql 에서 주로 사용하는 전략

- Scalability 에 따른 데이터 분산 모델

         


1. 관계형 DB 의 한계

- 관계형 DB 의 Scalability

- MPP(massively parallel processing) 방식의 scale out 아키텍처를 통해 RDB의 DW 계열의 Scalability 를 지원하지만, OLTP 용도의 DB, OSS DB 로 적합한 제품을 찾기 어렵다

- 관계형 DB 의 Sharding 구현

                - 자동으로 샤딩 기능 지원 하는 DBMS 사용

                - sharding 플랫폼 도입

                - application 단에서 처리하는 방법

                    - 다양한 용도로 사용하기 어렵다

                    - ex : user key 를 샤딩키로 적용하여 application 단에서 DB 를 선택적으로 이용


2. NOSQL 배경

        - 새로운 데이터 타입의 등장 / 방대한 양의 데이터

        - 확장성(Scalability) 에 대한 needs 의 증가 >> 관계형 DB 의 Scalability 는 기술적으로 제한된다

        - 주로 DB 가 병목지점이다

        - read 분산은 쉬우나 write 분산은 쉽지 않다


3. NOSQL 개념

        - 정의 : 비관계형/비구조적 데이터 를 저장하기 위한 분산 저장 시스템

        -  특징

            - 조인 기능 없음

            - 대부분 open source

            - 클러스터 환경에서 구동하며 자동 샤딩을 제공한다

            - 분산, 수평적 확장이 용이

            - auto failover 지원

- 제품 분류

 



Posted by 감각적신사
,

MongoDB 소개

Nosql/MongoDB 2016. 8. 22. 07:47

1. 정의 

- C++로 작성된 오픈소스 문서지향(Document-Oriented) 적 Cross-platform 데이터베이스


2. 데이터 모델

- Database : Collection 들의 물리적인 컨테이너 로 파일시스템에 여러파일들로 저장된다

- Collection : MongoDB Document의 그룹 으로 schemaless 하다

- Document

- Document는 RDMS의 record 와 비슷한 개념으로 한개이상의 key-value pair 으로 이뤄져있습니다

{

"_id": ObjectId("4b866f08234ae01d21d89604"),

"username": "mr.sense",

"address": { city: "seoul", zipcode: "11140"" }

}

- _id 는 12bytes의 hexadecimal 값으로서, 각 document의 유일함(uniqueness)을 제공 _

- Document 는 동적(dynamic)의 schema 를 갖는다


3. architecture

 

- 구성

- mongos

- mongos demon : router

- config server : sharding meta 정보를 관리한다

- mongod

- primary : read/write

- secondary : read only

4. features

    - hash, range 방식의 sharding 방식 지원

    - auto failover 지원

        - primary node 가 down 시, election 을 통해 secondary 가 primary 로 선출

    - replica

    - primary 의 write 이후 작성되는 oplog 를 전송받아 secondary 에 write 한다(최대 11)


5. 데이터 구조

- 논리 데이터 구조 

- 하나의 collection 에 대해 b-tree 구조 로 복수개의 index 를 관리한다

- extent : 데이터가 저장되는 논리적인 단위

- document : 정렬된 key/value의 집합

- 물리 데이터 구조

- OS에 의해서 제공되는 Virtual Memory를 사용하게 되는데, Pysical Memory 양이 작더라도 Virtual Memory는 훨씬 큰 공간을 가질 수 있다

(하지만 메모리 사이즈가 작으면 page fault 가 자주 발생해서 시스템이 느려진다)

- Virtual Memory는 page라는 블럭 단위로 나뉘어 지고, 이 Block들은 Disk의 block에 mapping이되고, 이 block들의 집합이 하나의 데이타 파일이 된다

- memory block -- OS 에 의한 write --> disk block


6. read / write

    - write 

        

        - step1. primary memory 에 write

        - step2. primary disk 로 flush

        - step3. secondary 요청으로 Oplog 를 복사 후 적용

        - (*) 이 때, write 성공의 조건은 write concern type 에 의해 결정된다

          

    - read

    - https://docs.mongodb.com/manual/core/read-preference/

    - "local" readConcern :  reads from the primary reflect the latest writes in absence of a failover;

- "majority" readConcern : read operations from the primary or the secondaries have eventual consistency.


7. lock

- database 단위의 lock 을 지원한다 == document 의 변경시 database 전체가 write lock 발생


참고

https://docs.mongodb.com

http://bigmatch.i-um.net/2013/12/mongodb%EB%A5%BC-%EC%93%B0%EB%A9%B4%EC%84%9C-%EC%95%8C%EA%B2%8C-%EB%90%9C-%EA%B2%83%EB%93%A4/

Posted by 감각적신사
,