임시비밀번호 변경

ALTER USER '[user명]'@'localhost' IDENTIFIED BY '[변경할 비밀번호]';

 

USER 생성, 권한 부여

user 생성

CREATE USER '[user명]'@'[접근가능범위]' IDENTIFIED BY '[비밀번호]';

# 내부 접근을 허용하는 user 생성
CREATE USER '[user명]'@'localhost' IDENTIFIED BY '[비밀번호]';

# 외부 접근을 허용하는 user 생성
CREATE USER '[user명]'@'%' IDENTIFIED BY '[비밀번호]';

# 특정 IP만 허용하는 user 생성
CREATE USER '[user명]'@'192.168.188.122' IDENTIFIED BY '[비밀번호]';

# 특정 IP 대역을 허용하는 user 생성
CREATE USER '[user명]'@'192.168.%' IDENTIFIED BY '[비밀번호]';

접근가능범위

  1. localhost : 내부 IP만 접근 가능
  2. % : 외부에서 접근 가능
  3. 특정 IP : 정해진 IP에서만 접근 가능

user 권한 부여

# 계정이 이미 존재하는데 'identfied by '비밀번호'' 부분을 추가하면 비밀번호가 변경된다.
GRANT ALL PRIVILEGES ON [database명].[table명] TO [user id]@host IDENTIFIED BY '비밀번호';
# 모든 원격지에서 접속 권한 추가
GRANT ALL PRIVILEGES ON [database명].[table명] TO [user명]@'%' IDENTIFIED BY '비밀번호';
# host에 '200.100.%' 로 하면 IP주소가 200.100.X.X 로 시작되는 모든 IP에서 원격 접속을 허용한다는 의미
# host에 '200.100.100.50' 으로 하면 IP주소가 200.100.100.50 인 곳에서만 원격 접속을 허용한다는 의미

변경된 내용을 메모리에 반영(권한 적용)

flush privileges;

 

DB 조회 및 생성

DB 조회

SHOW DATABASES;

DB 생성

CREATE DATABASE [database명];

 

Table 생성

CREATE TABLE [table명] (column1 datatype1, column2 datatype2, ...);

 

데이터 입출력

데이터 삽입

INSERT INTO [table명] (column1, column2, ...) VALUES (value1, value2, ...), (value1, value2, ...), ...;

데이터 조회

SELECT [column명] FROM [table명];

 

MySQL config 내용 확인

# 압축파일 설치
cat /home/centos/mysql/my.cnf

# yum 설치
cat /etc/my.cnf

✅ 공식문서

https://docs.nhncloud.com/ko/TOAST/ko/Overview/

 

⬇️ MySQL 설치 전에 인스턴스 생성하는 방법 ⬇️

2023.01.08 - [인프라/NHN Cloud] - NHN Cloud 인스턴스 생성하기


인스턴스 환경

  • OS : CentOS 7.9
  • 아키텍쳐: x86_64

 

0. 설치 전 확인

인스턴스에 MySQL을 처음 설치한다는 가정으로 설치를 진행한다.

  • 설치 여부 확인
rpm -qa | grep mysql


아래와 같이 나오면 설치가 되어 있는 것이다.

재설치를 하기 위해서는 삭제를 먼저 하고 설치를 진행한다.

yum remove mysql-server

 

1. 설치 과정

( 1 / 8 ) 인스턴스에 SSH 방식으로 접속

ssh -i [키페어이름.pem] centos@[플로팅IP]

 

( 2 / 8 ) yum을 통해 다운로드

sudo yum -y install https://dev.mysql.com/get/mysql80-community-release-el7-4.noarch.rpm
  • yum repository에 다운 받은 MySQL이 추가되었는지 확인
yum repolist enabled | grep "mysql.*-community.*"

💡 yum이란?

2023.01.13 - [프로그래밍/Linux] - Yum이란? 개념, 사용법 및 동작방식에 대해서

 

( 3 / 8 ) MySQL 설치

sudo yum install mysql-community-server

 

( 4 / 8 ) MySQL version 확인

mysql --version

 

( 5 / 8 ) MySQL 시작

sudo systemctl start mysqld

 

( 6 / 8 ) 임시비밀번호 확인

sudo grep '임시비밀번호' /var/log/mysqld.log

 

( 7 / 8 ) root 계정에 임시비밀번호로 MySQL 접속

mysql -u root -p

 

( 8 / 8 ) root 계정의 임시비밀번호 변경

ALTER USER 'root'@'localhost' IDENTIFIED BY '[변경할 비밀번호]';

 

2. 설치 결과

sudo systemctl start mysqld
sudo systemctl status mysqld

✅ 공식문서

https://docs.nhncloud.com/ko/TOAST/ko/Overview/

 

⬇️ MySQL 설치 전에 인스턴스 생성하는 방법 ⬇️

2023.01.08 - [인프라/NHN Cloud] - NHN Cloud 인스턴스 생성하기


인스턴스 환경

  • OS : CentOS 7.9
  • 아키텍쳐: x86_64

 

0. 설치 전 확인

인스턴스에 MySQL을 처음 설치한다는 가정으로 설치를 진행한다.

  • 설치 여부 확인
mysql --version

아래와 같은 형식으로 나오면 설치가 되어 있는 것이다.

재설치를 하기 위해서는 삭제를 먼저 하고 설치를 진행한다.

rm -rf /var/lib/mysql

데이터 파일이나 config 파일까지 삭제해야 한다.

1. 설치 과정

( 1 / 12 ) 인스턴스에 SSH 방식으로 접속

ssh -i [키페어이름.pem] centos@[플로팅IP]

 

( 2 / 12 ) wget 다운로드

sudo yum install wget

💡 wget이란?
'web get'의 줄임말로, 네트워크 상에서 데이터를 다운로드하는 기능을 수행한다. HTTP, HTTPS, FTP 프로토콜을 지원하며, HTTP proxy에서 데이터를 가져올 수도 있다.

( 3 / 12 ) MySQL 바이너리 버전 압축파일 다운로드

wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz

 

( 4 / 12 ) 편리하도록 mv를 이용하여 폴더 이름 변경

mv mysql-8.0.27-linux-glibc2.12-x86_64/ mysql

 

( 5 / 12 ) mysql 폴더 소유자 지정

# sudo chown -R [사용자명]:[실행OS명] [지정할 폴더명]
sudo chown -R centos:centos mysql
  • -R : 폴더와 폴더 내부 파일까지 전부 소유자와 그룹이 변경됨

 

( 6 / 12 ) mysql 폴더에 my.cnf 파일 생성 및 내용 추가

💡my.cnf 파일이란?
Unix 계열 MySQL 엔진에서 사용하는 configure 파일. Windows 계열에서는 my.ini 라는 이름으로 사용된다.

cd mysql
touch my.cnf
vi my.cnf
## 내용 ##
[client]
port=3306  # 접속시 사용할 Port 설정
socket=/home/centos/mysql/mysql.sock  # 사용할 소켓 파일 설정
[mysqld]
socket=/home/centos/mysql/mysql.sock
basedir=/home/centos/mysql  # base directory 설정
datadir=/home/centos/mysql/data  # data directory 설정
user=mysql  # 접속 유저명
key_buffer_size=64M  # 메모리에 있는 인덱스 블록에서 사용되는 버퍼의 크기, MyISAM 테이블에서 사용하고 있는 모든 쓰레드에서 공유하는 버퍼 크기
max_allowed_packet=32M  # 가장 크게 생성될 수 있는 packet 1개 크기(바이트) 설정
#query_cache_size=32M
max_connections=2625  # 동시에 접근 가능한 커넥션 수 설정
max_connect_errors=2000000  # 발생할 수 있는 최대 에러 개수
wait_timeout=60  # API를 이용한 client 프로그램(PHP, JDBC, ODBC...) 상에서 최대 연결시간
explicit_defaults_for_timestamp = 1
pid-file=/home/centos/mysql/mysqld.pid
log-error=/home/centos/mysql/logs/mysqld.log
bulk_insert_buffer_size=0

설정할 variable을 그룹별로 모아서 중괄호로 기술하는 것을 원칙으로 한다.

 

variable 작성 규칙

  1. 주석은 # 으로 처리한다.
  2. variable과 value 사이에는 공백이 있어도 무방하다.
  3. variable 앞에 -, --는 사용하지 않는다.
  4. my.cnf에 기술된 variable은 처음 서버가 로드 될때만 적용된다.
  5. my.cnf에 기술되지 않은 variable은 default값으로 설정된다.
  6. 모든 varaiable은 그룹 안에 속해야 한다.

 

( 7 / 12 ) libaio 다운로드

mkdir data
mkdir logs
sudo yum install libaio -y

💡 libaio이란?
데이터베이스 서버에 필수인 비동기 라이브러리.
libaio가 설치되어 있지 않으면 intialization 단계나 이후 서버 시작 단계에서 실패할 수 있으니 설치를 진행한다.

 

( 8 / 12 ) my.cnf 파일 경로 지정

/home/centos/mysql/bin/mysqld --defaults-file=/home/centos/mysql/my.cnf --initialize

--default-file= 옵션을 사용하면 지정된 파일만 읽기 때문에 주의해야 한다.

참고) my.cnf 외에 다른 cnf 파일을 지정하여 사용하고 싶을 경우 --defaults-extra-files로 설정할 수 있다.
예를 들면 여러 대의 MySQL 서버를 운영하는 경우, 기본적인 설정은 my.cnf를 사용하여 설정하고, 서버별 특이 사항은 다른 cnf 파일을 생성하여 configuration 내용을 관리하는 경우이다.

 

( 9 / 12 ) mysql 실행

/home/centos/mysql/bin/mysqld --defaults-file=/home/centos/mysql/my.cnf &

 

( 10 / 12 ) logs/mysqld.log 에서 임시비밀번호 찾기

cd logs
cat mysqld.log

 

( 11 / 12 ) mysql 폴더에서 실행

cd ..
/home/centos/mysql/bin/mysql -uroot -p '임시비밀번호' -S/home/centos/mysql/mysql.sock

 

( 12 / 12 ) 다운로드 받은 압축파일 삭제

rm mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz

 

✋🏻 여기서 잠깐 ! PATH 설정하기


⭐️ 경로를 등록하고 사용하는 것이 편리합니다.⭐️

  1. /etc/profile 수정하기
# pwd 했을 때 / 인 상태에서
sudo vi /etc/profile
  1. GG 이용해서 파일 맨 끝으로 가서 추가하고 저장하기(:wp)
export PATH="$PATH:/home/centos/mysql/bin"
  1. 변경된 파일 적용하기
    source /etc/profile


참고) PATH에 넣을 경로는 my.cnf 에 basedir 경로에 bin만 추가한 것과 같다.

2. 설치 결과

Replication

  • replicaof 커맨드로 간단하게 복제 연결
  • 비동기식 복제
  • Master가 다운되더라도 Replica가 서비스를 계속 할 수 있음
  • HA 기능이 없으므로 장애 상황 시 수동 복구
    • replicaof no one
    • 서버 다운시 AOF 또는 RDB로 재시작
  • replication 과정에서 fork가 발생하므로 메모리 부족 발생 가능
  • 특정 커맨드 disable 하기

 

Sentinel

센티널은 일반 노드들을 실시간으로 모니터링(monitoring)하는 역할

자동 페일오버 가능한 HA 구성

  • 마스터가 비정상이면 자동 페일오버(Automatic Failover)
  • 연결 정보 변경 필요 없음
  • 센티널 노드는 항상 3대 이상, 홀수로 존재해야 함
    • 과반수 이상의 센티널이 동의해야 페일오버 진행
    • 예) 네트워크의 잠깐의 오버타임 때문에 마스터 노드가 죽었다고 생각하는 하나의 센티널이 있다고 가정할 때, 과반수 이상의 센티널이 "OK"해야 비로소 그 마스터 노드는 죽은 것이고, 그때 Replica에서 마스터 노드를 선출한다.
  • 알림 : 감시하고 있는 인스턴스가 페일오버 되었을 때 Pub/Sub으로 애플리케이션(클라이언트)에게 알리거나 shell script로 관리자에게 이메일이나 SMS으로 알림 가능

 

Cluster

스케일 아웃과 HA 구성

 

  • 키를 여러 노드에 자동으로 분할해서 저장 (샤딩)
  • 모든 노드가 서로를 감시하며 마스터 비정상 상태일 때 자동 페일오버
  • 최소 3대의 마스터 노드 필요

 

아키텍처 선택 기준

데이터 유형과 해당 데이터에 대한 액세스 패턴을 잘 고려해서 선택해야 한다.

읽기 전략

Look-Aside(Lazy Loading)

데이터를 읽는 작업이 많을 때 사용 (가장 일반적으로 사용하는 방법)

Cache Hit

  1. 데이터를 요청한다.
  2. 먼저 cache 서버(redis)를 확인한다.
  3. cache에 데이터가 있으면 DB를 조회하지 않고 cache에 있는 데이터를 바로 반환한다. (Cache Hit)

Cache Miss

 

  1. 데이터를 요청한다.
  2. 먼저 cache 서버(redis)를 확인한다.
  3. cache 서버에 데이터가 없으면 DB를 조회하여 cache 서버에 저장하고 데이터를 반환한다. (Cache Miss)

 

Lazy Loading

cache는 찾는 데이터가 없을 때에만 입력되기 때문에 lazy loading이라고도 부름

이 구조는 redis가 다운되더라도 바로 장애로 이어지지 않고 DB에서 데이터를 가지고 올 수 있음

 

Cache Warming

대신 cache에 붙어있던 커넥션이 많이 있었다면 그 커넥션이 다 DB에 붙게 돼서 DB에 갑자기 많은 부하가 몰릴 수 있음

이런 경우 cache miss가 많이 발생해서 성능에 저하가 올 수 있음

→ 미리 DB에서 cache로 데이터를 밀어넣어 주는 작업

Cache Warming🔥

 

쓰기 전략

Write-Around

일단 모든 데이터는 DB에 저장되고 cache miss가 발생했을 때만 cache(redis)에서 데이터를 끌어오는 방법

이 경우 cache 데이터와 DB 데이터가 다를 수 있다는 단점이 있다.

 

Write-Through

DB에 데이터를 저장할 때 cache에도 함께 저장하는 방법

cache는 항상 최신 정보를 가지고 있다는 장점이 있지만 

저장할 때마다 두 단계 스텝을 거쳐야 하기 때문에 상대적으로 느리다.

 

무조건 cache에 데이터를 저장하기 때문에 일종의 리소스 낭비를 가지고 올 수 있어

expire time을 설정하는 것이 좋다.

 

+ Recent posts