데이터 무결성

컴퓨팅 분야에서 완전한 수명 주기를 거치며 데이터의 정확성과 일관성을 유지하고 보증하는 것을 가리키며 데이터베이스나 RDBMS 시스템의 중요한 기능이다.

무결성 제한의 유형

데이터 무결성은 일반적으로 일련의 무결성 제한이나 규칙에 의해 데이터베이스 시스템이 강제한다. 이러한 종류들의 무결성 제한들은 관계형 데이터 모델의 기본 기능의 일부로 볼 수 있다.

개체 무결성(Entity Integrity)

기본키를 구성하는 어떤 속성도 NULL 값이나 중복값을 가질 수 없다는 규정

참조 무결성(Referential Integrity)

외래키 값은 NULL이거나 참조 릴레이션의 기본키 값과 동일해야 한다는 규정

도메인 무결성(Domain Integrity)

속성 값이 정의된 도메인에 속한 값이어야 한다는 규정

요약

개체 무결성: 기본키 null 값 안됨

참조 무결성: 외래키

속성 무결성: 도메인

'#개발 > 데이터베이스' 카테고리의 다른 글

INNER JOIN과 OUTER JOIN의 차이  (0) 2021.08.23
관계대수와 관계해석  (0) 2021.07.15
데이터베이스의 설계 단계  (0) 2021.07.14
스키마 정의 및 종류  (0) 2021.07.14
병렬 데이터베이스의 분할 기법  (0) 2021.07.13

요구분석 - 개념적 설계 - 논리적 설계- 물리적 설계 - 구현

1. 요구조건 분석/명세

데이터베이스의 사용자, 사용목적, 사용범위, 제약조건 등에 대한 내용을 정리하고 명세서를 작성

2. 개념적 설계

정보를 구조화하기 위해 추상적으로 표현하는 과정

개념 스키마 모델리오가 트랜잭션 모델링을 병행하고, 요구조건 분석을 통해 DBMS 독립적인 E-R다이어그램을 작성

수행 작업

  • 개념스키마 모델링
  • 트랜잭션 모델링
  • E-R 다이어그램

3. 논리적 설계

자료를 컴퓨터가 이해할 수 있도록 특정 DBMS의 논리적 자료 구조로 변환하는 과정

관계형 데이터베이스인 경우 이 단계에서 테이블을 설계하고, 정규화 과정을 거침

수행 작업

  • 트랜잭션 인터페이스 설계
  • 목표 DBMS에 맞는 논리스키마 설계

4. 물리적 설계

논리적 구조로 표현된 데이터를 물리적 구조의 데이터로 변환하는 과정

수행 작업

  • 저장 구조 및 액세스 경로 설정
  • 레코드 집중의 분석, 설계
  • 저장 레코드 양식 설계

관련 문제
데이터베이스 설계 단계 중 저장 레코트 양식설계, 레코드 집중의 분석 및 설계, 접근 경로 설계와 관계되는 것은?

  1. 논리적 설계
  2. 요구 조건 분석
  3. 개념적 설계
  4. 물리적 설계

'#개발 > 데이터베이스' 카테고리의 다른 글

관계대수와 관계해석  (0) 2021.07.15
데이터 무결성  (0) 2021.07.14
스키마 정의 및 종류  (0) 2021.07.14
병렬 데이터베이스의 분할 기법  (0) 2021.07.13
django - mariadb on AWS EC2 연동  (0) 2021.06.06

내 경우엔 ` ` (코드블록), >(인용문)이 적용되지 않았다.

마크다운에 해당되는 태그를 알아내어 CSS 속성을 추가해주면 해결된다.

code {
  background-color: rgba(34, 37, 38, 0.05);
  color: #e96900;
  font-family: "Fira Code", Consolas, "Lucida Console", "Courier", monospace, "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-size: 1rem;
  font-weight: 500;
  margin: 0 2px;
  padding: 3px 4px 1px;
  border-radius: 4px;
}
blockquote {
  padding: 0.5rem 1rem;
  border-left: 8px solid #2f845e;
  background-color: #222526;
  border-radius: 4px;
}

210828-github night의 blockquote를 따라 적용했다.

blockquote .md-end-block.md-heading {
    color: inherit;
}

blockquote .md-end-block.md-heading:before {
    content: '' !important;
}

blockquote {
    margin: 0 0 1.11111rem;
    padding: .5rem 1.11111rem 0 1.05556rem;
    border-left: .25em solid #3b434b;
}

blockquote,
blockquote p {
    line-height: 1.6;
    color: #72808F;
}

스키마

데이터베이스의 구조와 제약조건에 대한 명세를 기술한 것

종류

개념 스키마

사용자데이터베이스 관리자 관점의 스키마/데이터베이스에 실제로 어떤 데이터가 저장되었으며, 데이터 간의 관계는 어떻게 되는지를 정의하는 스키마

  • 전체 관점으로 한개만 존재
  • 보안 및 무결성 등에 관한 정의를 포함한다.

내부 스키마

저장장치와 데이터베이스 설계자개발자 관점의 스키마

  • 개념 스키마를 물리적 저장장치에 구현하는 방법을 정의하는 데 사용
  • 물리적 구조 및 내부 레코드의 물리적 순서 등을 표현

외부 스키마

사용자 관점의 실세계에 존재하는 데이터들을 어떤 형식, 구조, 배치 화면을 통해 사용자에게 보여줄 지 정의한 스키마

  • 사용자 또는 프로그램의 입장에서의 논리적 구조로 여러 개가 존재

'#개발 > 데이터베이스' 카테고리의 다른 글

데이터 무결성  (0) 2021.07.14
데이터베이스의 설계 단계  (0) 2021.07.14
병렬 데이터베이스의 분할 기법  (0) 2021.07.13
django - mariadb on AWS EC2 연동  (0) 2021.06.06
Previewing  (0) 2018.03.01

병렬 데이터베이스란

성능 개선을 목적으로 병렬 컴퓨팅을 통해 데이터 적재, 색인 빌드, 쿼리 평가 등의 데이터베이스 기능들을 수행한다.

특징

  • 다수의 마이크로프로세서를 동시에 사용하여 데이터 처리를 고속으로 수행한다.
  • 주로 멀티프로세서 구조를 통한 병렬 처리를 가리킨다.
  • 그외에 공유 메모리 구조, 공유 디스크 구조, 비공유 구조 등이 있다.

데이터베이스 분할(파티셔닝)

데이터베이스를 여러 부분으로 분할하는 것이다.

목적

데이터베이스 분할은 중요한 튜닝기법으로 데이터가 너무 커져서, 조회하는 시간이 길어질 때 또는 관리 용이성, 성능, 가용성 등의 향상을 이유로 행해지는 것이 일반적이다. 분할된 각 부분을 '파티션'이라고 부른다.

특징

  • 가장 일반적인 것은 분산 데이터베이스 분할 이다. 각 파티션은 여러 노드에 분산 배치되어 사용자가 각 노드에서 로컬 트랜잭션을 수행할 수 있다. 이것은 가용성과 보안을유지 하면서 특정 뷰에 관한 일반 트랜잭션의 성능을 향상시킨다.
  • 파티션 각각이 작은 데이터베이스가 되도록 분할하는 방법과 하나의 테이블만 같이 선택된 요소만 분리하는 방법이 있다.

행과 열로 분할 기법 구분

수평 분할

하나의 테이블의 각 을 다른 테이블에 분산시키는 것이다. 예를 들어 방대한 고객 데이터 테이블을 성별에 따라 '남녀'로 나누어 CustomerMen과 CustomerWomen 두 개의 테이블로 분할한다. 테이블은 2개로 분할되지만, 모든 고객을 나타내기 위해 양자를 결합한 뷰를 생성하면 된다.

수직 분할

테이블의 일부 을 빼내는 형태로 분할한다. 관계의 정규화는 본질적으로 수직 분할에 관련된 과정이다. 수직 분할에는 여러 저장 장치를 사용할 수도 있고, 예를 들어 별로 사용되지 않는 열이나 매우 자릿수가 많은 열을 다른 장치에 두는 등의 조치를 생각할 수 있다. 명시적으로 하거나, 암묵적으로 하는 경우도 있지만, 이런 종류의 분할을 ‘열 분할’(row splitting)이라고도 부른다. 자주 묻는 수직 분할 열 내용의 사용 빈도에 따라 분할하는 것이다. 분할된 테이블들을 포함하는 뷰를 생성하면 원래의 경우보다 성능이 저하되지만, 사용 빈도가 높은 데이터에만 액세스할 경우 성능이 향상된다. 예를 들어, 뉴스를 서비스할 때, 고객들은 최근의 데이터를 가장 많이 조회할 것이다. 이 경우 1개월 전의 데이터를 다른 테이블에 두면, 훨씬 효율적으로 검색할 수 있을 것이다.

분할 키 기준 분할 기법 구분

범위 분할

분할 키 값이 범위 내에 있는지 여부로 구분한다.

예를 들어, 우편 번호를 분할 키로 수평분할하는 경우이다. 또한 일별, 월별, 분기별 등의 순차적인 데이터를 관리하는 테이블에 많이 사용된다.

목록 분할

특정 컬럼의 특정 값을 기준으로 파티셔닝을 하는 방식이다.

예를 들어, Country 라는 컬럼의 값이 Iceland , Norway , Sweden , Finland , Denmark 중 하나에 있는 행을 빼낼 때 북유럽 국가 파티션을 구축 할 수 있다.

특정 파티션에 저장 될 데이터에 대한 명시적 제어가 가능하며 주로 이질적인 값이 많지 않고 분포도가 비슷하고 대소문자를 구분하는데 허용문자 외 다른 문자를 입력시 에러가 발생한다. 다양한 SQL의 액세스 패스에서 해당 컬럼의 조건이 많이 들어오는 경우에 유용하게 사용된다.

해시 분할

특정 컬럼 값에 해시 함수를 적용하여 분할하는 방식으로, 데이터의 관리 보다는 성능 향상에 목적을 둔다.

예를 들어, 4개의 파티션으로 분할하는 경우 해시 함수는 0-3의 정수를 돌려준다.

레인지 파티셔닝은 각 범위에 따라 데이터의 양이 일정하지 않아 분포도가 일정하지 않은 단점이 있지만, 해시 파티셔닝은 이러한 단점을 보완하여 일정한 분포도를 가진 파티션으로 나누고, 균등한 분포도를 가질 수 있도록 조율하여 병렬 프로세싱으로 성능을 높인다. 실제로 분포도를 정의하기 어려운 테이블을 파티셔닝을 할 때 많이 이용하고 2의 제곱수로 파티셔닝하는 것이 일반적이다. 해시 파티셔닝으로 구분된 파티션들은 동일한 논리, 물리적 속성을 가진다. 또한 레인지 파티션과 달리 각 파티션에 지정된 값들을 데이터베이스 관리 시스템이 결정하므로 각 파티션에 어떤 값들이 들어있는지 알 수가 없다. 하지만 대용량의 분포도가 일정치 않은 테이블을 마이그레이션 할 때는 프로그램 병렬 방식과 유용하게 쓰일 수 있다.

합성 분할

상기 기술을 결합하는 것을 의미한다. 예를 들면 먼저 범위 분할을 하고, 다음에 해시 분할 같은 것을 생각한다. 컨시스턴트 해시법은 해시 분할 및 목록 분할의 합성으로 간주 될 수 있고 키 공간을 해시 축소하므로써 알람할 수 있게 한다.

라운드로빈 분할

라운드로빈 분할은 파티션에 행의 고른 분포를 원할 때 사용한다. 그러나, 해시분할과 달리 분할 칼럼을 명시할 필요가 없다. 라운드 로빈 분할로 회전하면서 새로운 행이 파티션에 할당된다. 테이블은 기본키가 반드시 필요하진 않다.

참고 자료

라운드로빈

관련 문제

병렬 데이터베이스 환경 중 수평 분할에서 활용되는 분할 기법이 아닌 것은?

 1.    라운드-로빈
 2.    범위 분할
 3.    예측 분할
 4.    해시 분할

3

'#개발 > 데이터베이스' 카테고리의 다른 글

데이터 무결성  (0) 2021.07.14
데이터베이스의 설계 단계  (0) 2021.07.14
스키마 정의 및 종류  (0) 2021.07.14
django - mariadb on AWS EC2 연동  (0) 2021.06.06
Previewing  (0) 2018.03.01

개요

DevOps, CI(Continuous Integration), CD(Continuous Delivery) 가 무엇인지 알아보고 등장배경 및 필요성을 알아본다.

👬→🙍‍DevOps의 등장

전통적인 개발 조직은 개발자와 오퍼레이터 두 부류로 나뉘어 운영되었다. 개발자는 비즈니스 요구사항에 따라 코드를 완성합니다. 빠른 시간 내에 요구사항을 충족시켜, 필요로 하는 기능을 완성시키는 데 기여합니다. 그리고 오퍼레이트는 완성된 소스코드를 빌드하고 배포합니다. 시간을 준수하여 실수 없이 코드를 배포하는데 집중하며, 업무를 자동화 하는데 기여합니다. 이렇게 애플리케이션을 실제로 서비스하는데까지 두 역할이 서로 다른 목표를 위해 업무를 수행하다보니 시간이 오래 걸리는 이슈에 부딪히게 되었습니다. 그래서 이를 통합적으로 수행하고자 하는 니즈가 DevOps 문화이고 이를 실현하는 DevOps 조직이 출현하게 되었습니다.

🏭CI/CD 의 등장

그러나 소프트웨어 개발 수명 주기는 점점 복잡해지고 업데이트와 배포가 잦아지는 환경 속에서 업무 효율을 낼 수 있는 도구를 필요로 하게 되었습니다. CI/CD는 '자동화된' 지속적인 통합과 배포를 의미합니다. CI 단계에서는 자동화된 빌드 및 테스트가 수행된 후, 개발자가 코드 변경을 레포지토리에 정기적으로 병합하는 개발을 수행합니다. CD 단계에서는 코드 변경 사항을 레포지토리에서 고객이 사용 가능한 프로덕션 환경까지 자동으로 릴리스하는 개발을 수행합니다. (이 둘은 서로 다른 역할이지만 보통 함께 구축되기 때문에 CI, CD를 묶어서 부릅니다.) 이를 통해 응용 프로그램의 빌드, 테스트 및 배포의 자동화를 통해 애플리케이션을 더 짧은 주기로 고객에게 제공하게 됩니다.

👎온프레미스 상에서의 CI/CD 구축의 어려움

한 설문조사 결과 CI/CD를 업무에 도입하고 있지 못하는 가장 큰 이유로 스킬셋의 부족함, 툴 선정의 어려움, Best Practice에 대한 지식 부족, 전통적 개발 방식에서 벗어나기 어려움 등이 뽑혔습니다. 실제로 온프레미스 상에서 CI/CD 환경을 구축하는 것은 쉽지 않습니다. 여러 가지 제품 중에 우리 회사에 가장 적합한 제품을 조사하고 검증해야 합니다. 제품을 선택한 이후에는 수많은 환경을 구축하고 연계하고 운영까지 하는데 많은 시간과 공수가 들게 됩니다.

👍클라우드 상에서의 CI/CD 효과

하지만 클라우드에서라면 앞서 한 고민을 덜어줄 수 있습니다. 직접 구축할 필요 없이 클라우드 서비스 제공자가 만든 CI/CD 도구를 쉽게 사용할 수 있습니다. 빠르고 쉽게 리소스를 생성할 수 있는 클라우드의 장점을 누릴 수 있습니다. 온프레미스 상에서 존재했던 복잡한 방화벽 설정이 없고, 보안 환경을 간편하게 설정할 수 있습니다.

'PM' 카테고리의 다른 글

github로 코드리뷰 하기  (0) 2021.08.28
우리팀 Confluence 사용하는 법  (0) 2021.04.19
JIRA의 scrum보드 활용법  (0) 2021.04.15
Jira를 통해 스크럼 관리하기  (0) 2021.04.15
애자일 Scrum(스크럼) 이해하기  (0) 2021.04.15
  1. mariadb 내 데이터베이스 생성(데이터베이스 이름 기억)
    • DB 확인: show databases;
    • DB 생성: create database airsm;
    • DB 사용: use airsm;
  2. 서버측 연동 드라이버 설치: pip install mysqlclient
  3. settings.py 파일 수정
  4. 데이터베이스에 반영
    • python [manage.py](http://manage.py) makemigrations
    • python [manage.py](http://manage.py) migrate
  5. 데이터베이스에 접속하여 반영된 테이블 확인
    • show tables;

DB connection error 문제

django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on '3.37.7.183' (10060)")

EC2 보안 인바운드 규칙과 관련이 있다. 모든 TCP의 모든 포트에 대해서 허용하니 DB connect 문제를 해결할 수 있었다. ping은 모든 ICMP에 대해 허용하니 작동한다.

'#개발 > 데이터베이스' 카테고리의 다른 글

데이터 무결성  (0) 2021.07.14
데이터베이스의 설계 단계  (0) 2021.07.14
스키마 정의 및 종류  (0) 2021.07.14
병렬 데이터베이스의 분할 기법  (0) 2021.07.13
Previewing  (0) 2018.03.01

1.6.9에서 발생하는 이슈. 1.6.10에서는 해결된 이슈

도커 아닌 우분투에 직접 1.6.10 설치해서 해결

https://github.com/eclipse/mosquitto/issues/1983

→ how to install mosquitto 1.6.10 로 검색

→ 다음 레퍼런스를 찾음🤩

https://gist.github.com/smoofit/dafa493aec8d41ea057370dbfde3f3fc

이외 레퍼런스

https://www.npmjs.com/package/mqtt

https://yonghyunlee.gitlab.io/node/node-mqtt/

연결 확인

이전에 사용하고 있던 포트 종료하기

특정 포트 사용 여부 확인 : sudo lsof -i:[포트번호]

프로세스 죽이기: sudo kill -9 [pid]

연동 완료

MQTT.js 연동 코드

var mqtt = require('mqtt');
var client  = mqtt.connect('mqtt://[ip]:9001');
onClick={()=>{client.publish("abc","hellosub");}}

CLI로 확인하기

mqtt sub -t abc -h [ip] -p 1883

참고 자료

https://www.youtube.com/watch?v=p_T5G1hJ35g

❌주의. 1.6.9 버전(websocket 설정하기 위해선 1.6.10 버전 이상으로 설치해야 한다.)

Dockerfile 생성

sudo vim Dockerfile # 파일 새로 만들기 (열기)

# Dockerfile 내용

    FROM ubuntu

    RUN apt-get update
    RUN apt-get install -y mosquitto
    RUN apt-get install -y mosquitto-clients

    CMD mosquitto # mosquitto 실행 명령

cat Dockerfile # 파일 저장 확인

Dockerfile 이미지로 만들기

[issue]

error checking context: 'no permission to read from '/home/ubuntu/.Xauthority''.

[solution]

https://stackoverflow.com/questions/60118436/docker-build-question-no-permission-to-read-from

이미지 실행

이미지 실행 확인

이미지 확인

컨테이너 실행

docker run -it mqtt_mosquitto:v1 /bin/bash

1. EC2 접속

2. 최신 mariadb docker image로 설치

  • docker pull mariadb

3. MariaDB 컨테이너 추가 및 구동

docker run --name mariadb -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mariadb mariadb

  • —name mariadb: 컨테이너 이름을 mariadb로 지정
  • -d: 컨테이너를 백그라운드로 실행
  • -p: 3306:3306: 호스트-컨테이너 간 포트 연결. 호스트에서 3306 포트 접속 시 컨테이너 3306 포트로 포워딩 됨
  • -e MYSQL_ROOT_PASSWORD=mariadb: 컨테이너 내 환경변수 설정. root 계정의 패스워드를 mariadb로 지정
  • mariadb: 다운로드 받은 이미지 이름

4. mariadb로 접속

  • docker exec -it mariadb /bin/bash
    • 정상적으로 접속되면 root 계정으로 컨테이너의 bash에 접속이 된다.
    • mariadb로 접속. 패스워드는 앞서 입력한 MYSQL_ROOT_PASSWORD 값mysql -u root -p

5. 한글을 사용하기 위해 characterset 변경

  1. status 명령어로 mariadb 상태 및 characterset 참조
  2. mariadb 컨테이너의 /etc/mysql/my.cnf 파일 수정
    • client → utf8mb4
    • mysql → utf8mb4
    • mysqld →
      • collation-server=utf8_unicode_ci
      • init-connect='SET NAMES utf8'
      • character-set-server = utf8
    • 변경된 내용 저장 후, 컨테이너 bash 접속 종료
    • 컨테이너 재가동
      • docker restart mariadb
    • 컨테이너 bash 접속, mariadb 접속 후 status 로 characterset utf8로 변경 확인한글을 사용하기 위해 characterset 변경
  3.  

 

cf. 컨테이너에서 vi 설치 (my.cnf 수정 중에 vi 가 없을 경우)

  1. 컨테이너의 os 확인: cat /etc/*-release
  2. vi 설치
apt-get update
apt-get install nano
apt-get install vim

 

다른 컨테이너에서 이미 이미지를 사용할 경우 발생하는 이슈

그 컨테이너가 실행 중이든 아니든 이미지를 사용한 컨테이너가 존재하고 있으면 이러한 충돌이 발생한다.

그 컨테이너를 다시 살려서 사용하든가 삭제한 후 다시 컨테이너를 생성해야 한다.

컨테이너 전체 목록 확인(stopped container 포함): docker ps -a

컨테이너 재실행: docker restart [containerId]

실행중인 컨테이너 확인: docker ps

+ Recent posts