Data Store
DB 이중화 / 클러스터링
2020.09.23 : Data StoreDB 클러스터링 DB 장애 시 가용성을 유지하기 위한 클러스터링 방안 Oracle 기준이긴 하지만, 다른 DB에서도 비슷한 옵션이 있는 경우 있음. HA ( High Availability ) 같은 장비를 Active 1대 , Standby 1대로 구성해서 Active에 문제 생기면 Standby로 서비스 하는 방식. Active, Standby 각자가 별도 storage를 가지고 있음. => Active와 Standby의 데이터 동기화 문제 및 성능 저하 => Active 가 죽고 Standby로 전환되기 전 그 사이에 발생하는 트랜잭션은 유실됨 *** 오라클에서는 데이터 가드 라는 이름으로 제공하고 있다. *** 위와 같은 문제점 때문에 OPS 방식이 8i 버전까지 사용되었음. OPS ( Oracle..
redis
2020.03.10 : Data Store기본 포트는 6379 Java Redis Client는 다음 두 가지 Jedis Lettuce SpringBoot 2.0부터 lettuce가 기본 Client Lettuce is a fully non-blocking Redis client built with netty providing Reactive, Asynchronous and Synchronous Data Access . Redis의 LRU eviction docs https://github.com/lettuce-io/lettuce-core/wiki/Connection-Pooling default expire time은 없다. 그래서 웬만하면 설정해 주는 것이 좋다. Redis command ( api ) java RedisTemplate api..
[DB] 성능 최적화
2019.11.28 : Data Store서브 쿼리는 일반적으로 지양하는 편이 좋다 스칼라 서브쿼리는 리턴되는 건수마다 결과를 수행하기 때문에 대량의 결과가 리턴되는 쿼리에서는 성능이 몹시 떨어진다. 스칼라 서브쿼리란? subquery 위치에 따라서 다음과 같이 부른다. SELECT 절에 있는 서브쿼리 : 스칼라 서브쿼리 FROM 절에 있는 서브쿼리 : 인라인 뷰 WHERE 절에 있는 서브쿼리 : 서브쿼리 상황에 따라 이를 OUTER JOIN 등으로 변경할 수 있다. 실행 계획 (PLAN) 보기 Query는 비절차형 언어이기 때문에, 원하는 결과를 얻기 위한 시스템의 동작을 개발자가 하나하나 지정하는게 아니라 DBMS에게 Query를 주면 알아서 실행하고 결과를 돌려준다. 내가 넘긴 Query를 DBMS가 어떤 식으로 해석하고 실행할 것인가?를..
[DB] 분산 DB, 파티셔닝 ( partitioning ), 샤딩 (sharding)
2019.08.25 : Data Store파티셔닝(단편화) 란? 저장해야 하는 정보가 많은 대규모 시스템의 경우 하나의 DB에 모든 정보를 저장해서는 제대로 된 응답성을 기대할 수 없다. read가 많이 발생하든, write가 많이 발생하든 DB 저장하는 정보가 많을 수록 스캔 속도도 느려지고, 요청이 많은 경우 큐에 작업이 쌓이면서 응답도 느려진다. 그래서 DB를 여러대 운용해서 응답을 좀 분산해보자, 라는 생각을 하게 되는데, 가장 쉽게 생각해 볼만한건 Master DB의 데이터를 복제한 Slave DB를 두고, read를 분산하는 것이다. 스캔 속도는 그대로겠지만 요청을 분산할 수 있다. 그러나 이 방법은 write는 분산되지 않는다. Master에 write가 발생하면 이를 Slave에 복제 해줘야 하므로, 복제하면서 같은 내용의 wri..
[Transaction] lost update problem (isolation level, deadlock, update lock)
2019.07.23 : Data Store포인트 읽기 - 포인트 차감 순으로 DB 작업이 발생하는 상황이었다.```java@Transactionalpublic foo bar() { // SELECTMemberRestMileageInfo member = getMemberMileageByKey(memberKey); ... // UPDATEmemberInfoMapper.update(member); }``` 이런 상황에서 같은 `` memberKey`` 를 대상으로 빠르게 두 번 요청하면 갱신 손실 문제가 발생한다.``` T1 T2start transaction start transactionSELECT SELECTUPDATE UPDATE```즉, 먼저 들어온 트랜잭션이 UPDATE 하기 전에 다른 트랜잭션이 SELECT를 해버리면, 먼저 들어온 트랜..
Oracle 오라클
2019.05.31 : Data StoreDBGuide.net 오라클 오라클 장점? 왜 기업에서 오라클을 선호하는가? 성능이 좋고 다양한 옵션이나 기능을 제공한다는 장점도 있긴 하지만, 가장 큰 이유 중 하나는 RAC를 통한 고가용성. DB 이중화 / 클러스터링 타입 관련 팁 숫자 타입은 `` NUMBER``를 쓰는 것이 좋다. `` NUMBER(, )``로, 가변길이 타입이다 문자열은 `` CHAR || VARCHAR2``로 쓰는 것이 좋다. 그냥 VARCHAR는 추후 다른 용도로 쓰일 수 있다고 Oracle에서 사용하지 않기를 권고함. 날짜 저장은 `` DATE``를 사용하는 것이 좋다. 삽입할 때 TRUNC()함수로 시분초를 잘라 넣어라. CONSTRAINT를 걸어서 항상 시분초를 자른 값이 들어오도록 제한할 수 있다. 키는 보통 `` l..
DB 접근 툴 : Universal Database Tool
2019.05.27 : Data Storehttps://www.eversql.com/top-7-mysql-gui-tools-for-windows/ DBeaver 다양한 DB들을 지원하고, Enterprise 버전이면 NoSQL들도 지원함. SQL developer Oracle을 쓸거라면 무난하고 괜찮음. Sequel Pro 괜찮은 듯? JetBrain DataGrip JetBrain에서 나온거라 친숙하고 여러모로 괜찮을 듯 유료라는 것만 빼면 ㅎ IntelliJ 내장 DB Tool 뭐 대단한 작업 할게 아니면 그냥 IntelliJ에 내장되어 있는 DB Tool 기능을 활용한다. 스마트 서치에서 Database 입력하면 있음. 단점은 intelliJ 프로젝트 마다 각각 DB연결 설정을 따로 해줘야 한다는 점. 뭔가 좀 더 복잡한 작업을 해야 하거..
확장성 해싱 VS 선형 해싱 : Shard key
2019.01.18 : Data Store선형 해싱 vs 확장성 해싱확장성 해싱은 global 디렉터리 구조(bucket address table)를 유지해야 한다는 단점이 있지만, 무조건 한 번의 쿼리로 데이터를 읽어올 수 있다. 선형 해싱은 global 디렉터리 구조를 유지하지 않는다는 장점이 있지만, 다음과 같은 단점이 있다.* overflow chain = synonym chain = 동거자 체인어디서 오버플로우가 발생하든, Next가 가리키는 앞쪽 버킷부터 split한다. - 선형 해싱은 어디까지 3비트로 읽어야 할지를 앞에서 부터 Next 이전까지는 3비트로, Next 부터는 2비트로 읽는 방식을 사용한다.어디서 overflow가 발생하든 앞에서 부터 순차적으로 split해 나간다. 따라서 맨 마지막 버킷에서 계속 overflow가 ..
[DB] ER 스키마 사상 / 정규화
2018.04.12 : Data StoreERD 중요성 ERD 같은거 메인으로 유지하고 있는게 꼭 필요하겠다. 스키마 변경이나 테이블 추가 같은거 할 때 이 ERD 수정하고 반영할 수 있도록. 이게 없으면 기존 구조를 파악하기가 어렵고, 구조가 한 눈에 안들어오다보니 새로운 컬럼이나 테이블을 추가하면서 역정규화 되거나, 같은 내용의 컬럼이 서로 다른 테이블 2개에 각각 생성되거나 한다. 이렇게 되면 갱신이상 등 데이터 불일치가 발생할 여지가 생긴다. 또한 이런 식으로 테이블 막 추가하다 보면 돌이킬 수 없어짐... 나중에 정규화 하려고 했는데 기존 레코드를 싹 다 복사해서 2개로 나눠주어야만 한다거나... ER 스키마 >> 릴레이션 사상 간단한 요소에서 복잡한 요소 순으로 사상한다. 단계 1: 정규 엔티티 타입 단계 2: 약한 엔티티 타입 단계..
[mysql] 일반적인 SQL
2017.06.11 : Data Store쿼리 테스트 (MySQL을 쓰는건지 모르겠지만 간단한 쿼리는 어차피 공통 문법이라) https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all MySQL String Functions https://dev.mysql.com/doc/refman/5.7/en/string-functions.html CREATE TABLE | VIEW | DOMAIN CREATE TABLE Syntax & Options 자주 사용하는 옵션만 포함하면 이렇다. ```sql CREATE TABLE tbl_name( col_name1 data_type [NOT NULL] [AUTO_INCREMENT] [PRIMARY KEY], user_id BIGINT UNSIGNED ..
[mysql] 초기 설정 및 계정, DB
2017.06.11 : Data Store```bashsudo service mysql startsudo mysql 또는 mysql -u root [-p] [db_name]```ERROR 1045 (28000): Access denied for user 뜨면서 안될 때는 패스워드를 설정해준다.```bashmysqladmin -u root -p password``` SHOW자주 쓰는 ``sql SHOW`` 명령어```sqlhelp show; SHOW DATABASES;SHOW TABLES;SHOW FIELDS FROM tbl_name; -- Type | Null | Key | Default | Extra``` SET PASSWORD```sqlSET PASSWORD FOR user@host = PASSWORD('pw');````` root@loca..