KDT/Cloud

231215 Cloud

001cloudid 2023. 12. 15. 12:50
728x90

EC2 인스턴스 DB서버(MariaDB) 설정

시작전 확인 사항

rpm -qa httpd mariadb

→ db설치 확인

 

 sudo systemctl status httpd

→ 아파치 동작 확인

 

 sudo systemctl start httpd

→ 아파치 실행

 

sudo systemctl enable httpd

→ 부팅 시 아파치 자동 실행

 

sudo systemctl status mariadb

→ mariadb 상태 확인

 

sudo systemctl start mariadb

→ mariadb 실행

 

sudo systemctl enable mariadb

→ 부팅 시 mariadb 자동 실행

 

※링크(link)

  • 윈도우의 바로가기와 같은 개념
  • 리눅스에서 systemctl enable 서비스명 을 입력하면 심볼릭 링크가 생성됨

ex) 

sudo systemctl enable mariadb
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.

 

ls -l /etc/systemd/system/multi-user.target.wants/mariadb.service

lrwxrwxrwx 1 root root 39 Dec 15 00:23 /etc/systemd/system/multi-user.target.wants/mariadb.service -> /usr/lib/systemd/system/mariadb.service

※l : link, - : file, d : directory

→ symlink(심볼릭 링크)를 생성

 

파일시스템(FileSystem)

  • 물리적인 저장장치(ex) 하드 디스크)에 파일을 생성, 저장, 관리하기 위한 논리적인 자료구조를 '파일시스템'이라고 함
  • 물리적인 디스크는 논리적인 파티션(partition)으로 나누어지며, 각 파티션 별로 고유한 파일시스템을 생성함
    (윈도우 : NTFS, 리눅스 : EXT2, EXT3, EXT4, XFS 등)

파일시스템 구성

  • 하나의 파티션은 부트블록 + 슈퍼블록 + 아이노드 리스트 + 데이터블록 형태로 구성
  • 부트블록 : 운영체제를 부팅하거나 초기화하기 위한 부트스트랩(bootstrap) 코드를 담고 있는 블록
  • 슈퍼블록 : 해당 파일시스템을 관리하기 위한 정보를 담고 있는 블록
  • 아이노드 리스트 : 파일들에 대한 속성 정보를 담고 있음
    → i-node number, 파일 타입, 접근 권한, link count, 소유자, 소유그룹, 파일크기, MAC Time
  • 데이터블록 : 실제 파일의 내용(데이터)이 저장되는 블록

 

i-node

  • 리눅스는 파일을 생성할 때, 두 가지 절차를 갖는데,
    첫째 파일의 데이터를 저장하기 위한 디스크 내의 공간을 확보하고,
    두번째 파일에 대한 기본 정보를 저장하기 위해 i-node(index node)라는 구조를 만듦
  • i-node에는 리눅스가 파일을 사용하는데 필요한 모든 정보가 들어 있음
  • 모든 파일이나 디렉토리는 각각 1개씩의 index를 가짐

 

링크(link)

  • 파일의 링크는 하드링크(Hard Link)와 심볼릭링크(Symbolic Link 또는 Soft Link) 2가지가 있음
  • 링크의 개념을 이해하려면 i-node 개념을 먼저 익여야 함
  • 하드링크를 설정하면 '하드 링크 파일'만 하나 생성되며 같은 inode number를 사용(백업 개념)
  • 심볼릭링크를 성정하면 새로운 inode를 생성하고, 데이터는 원본 파일과 연결되는 효과를 갖는다(바로가기)
  • 하드 링크 생성 방법 : ln [링크대상파일이름][링크파일이름]
  • 심볼릭 링크 생성 방법 : ln -s [링크대상파일이름][링크파일이름]
  • 실습
    1. 빈 파일을 생성
    →touch test1.text text2.txt
    2. ls -al *.txt
    → .txt로 끝나는 파일들의 상세 내용이 표시
    3. ls -ail *.txt
    → -i 옵션을 추가하면 inode 번호까지 표시
    → 12594444 -rw-rw-r-- 1 ec2-user ec2-user 0 Dec 15 01:10 test1.txt
        13130672 -rw-rw-r-- 1 ec2-user ec2-user 0 Dec 15 01:14 test2.txt
    4. 하드링크 생성
    ln test1.txt test1_hlink
    5. ls -ail test* →  inode 번호 확인
    → test1.txt의 inode 번호와 똑같은 번호를 가지는 test1_hlink가 생성되었는지 확인
    12594444 -rw-rw-r-- 2 ec2-user ec2-user 0 Dec 15 01:10 test1_hlink
    12594444 -rw-rw-r-- 2 ec2-user ec2-user 0 Dec 15 01:10 test1.txt
    13130672 -rw-rw-r-- 1 ec2-user ec2-user 0 Dec 15 01:14 test2.txt
    6. test1.txt 내용 수정
    → vi test1.txt i키를 눌러 입력모드 전환 간단한 내용 입력 후 ecs :wq
    7. test1.txt 내용과 test1_hlink의 내용을 비교
    → cat test1.txt
         cat test1_hlink
    → 같은 내용이 같음을 울 수 있음
    → 이는 리눅스가 파일에 접근할 때 inode 번호를 사용하기 때문
    →test1.txt와 test1_hlink는 같은 inode 번호를 사용하므로 같은 파일로 인식
    8. 심볼릭 링크 생성
    → ln -s test2.txt test2_slink
    → test_slink 생성 하늘색으로 표시됨
    9. ls -ail test* → inode 번호 확인
    → 12594448 lrwxrwxrwx 1 ec2-user ec2-user 9 Dec 15 01:21 test2_slink -> test2.txt
         13130672 -rw-rw-r-- 1 ec2-user ec2-user 0 Dec 15 01:14 test2.txt
    → 심볼릭 링크를 통해서 파일을 생성하면 inode 번호가 다르게 생성
    10. 심볼릭 링크의 원본 파일인 test2.txt를 수정
    → vi test2.txt i키를 눌러 입력모드 전환 간단한 내용 입력 후 ecs :wq
    11. test2. txt 와 test2_slink 내용 확인
    → 하드링크와 마찬가지로 둘의 내용이 변경됨
    12. 하드링크와 심볼릭링크의 차이점
      1) 하드링크의 경우 링크 파일의 원본을 삭제해도 하드링크 파일은 아무런 영향이 없지만,
        심볼릭링크의 경우 링크 파일의 원본을 삭제하면 심볼릭링크 파일에 영향을 미침
        → 심볼릭 링크 파일은 원본 파일의 inode 번호를 참조하기 때문. 원본 파일이 삭제되면 심볼링 링크에도 영향
      2) 하드링크 원본 삭제 rm test1.txt
          ls -ail test* → test1.txt가 삭제
          →cat test1_hlink
          → 원본이 사라져도 기존 내용이 그대로 남아 있음
          →  inode 번호도 그대로 가지고 있음
      3) 심볼릭 링크의 원본 삭제 rm test2.txt 
          ls -ail test*
          → text2.txt 가 삭제
          → 12594448 lrwxrwxrwx 1 ec2-user ec2-user  9 Dec 15 01:21 test2_slink -> test2.txt
          → cat test2_slink
          → cat: test2_slink: No such file or directory
          → 원본 파일이 없으므로 내용도 보여줄수 없음
      4) touch test2.txt
          → ls -ail test*
          → 12594448 lrwxrwxrwx 1 ec2-user ec2-user  9 Dec 15 01:21 test2_slink -> test2.txt
          → 심볼릭링크가 다시 원상복구
          → 심볼릭 링크를 통해 파일 시스템을 관하는 경우 이를 통해 보안에 취약해질 수 있음
          → 삭제되었던 test2.txt를 다시 만들면 본래의 형태로 돌아가지만, 파일의 inode번호가 달라져 전혀 다른 파일인
               것을 알 수 있음
          → 악성코드가 이와 같은 겉으로 보기에는 아무런 일도 없었던 듯이 생겨나 있는 경우가 있음
    13. 링크는 파일에 대한 백업의 개념으로도 사용됨
    14. 하드링크는 디렉토리에 대한 링크를 만들 수 없으나, 심볼릭 링크는 가능하다.
      1) mkdir d
          ※make directory 디렉토리 생성
      2) ln d d_hlink
         → -bash: syntax error near unexpected token `in'
         → 하드링크는 디렉토리를 대상으로는 불가
      3) ln -s d d_slink
         → d_slink가 생성

 

DB 백업 복구

sudo mysqldump -u root -p --all-databases;

→mysqldump 명령어는 지정된 데이터베이스 또는 테이블의 내용을 화면(모니터)에 출력

 

백업이라고 하면 파일 형태로 존재

모니터에 출력되는 내용을 파일 형태로 저장하는 과정이 필요

→ 리다이렉션 기호를 통해서 구현

※리다이렉션(redirection)

  • 출력장치(표준 입출력)를 전환(바꿔준다)
  • 입력장치 : 명령어(키보드), 출력장치 : 모니터
  • 명령어를 입력하면 그 출력 내용이 모니터에 나오게 됨
  • 이 때, 출력 내용을 모니터가 아닌 파일로 처리하고 싶을 때 주로 사용
  • 4가지 기호를 사용(<, <<, >, >>)
  • 출력의 방향을 바꿔주는 기술/방법
  • 리눅스의 표준 출력 장치는 모니터

  • echo1
    →1을 모니터에 출력
  • touch test.txt
  • echo 1 > test.txt
    → 1이 화면에 출력되지 않음.
    → cat test.txt
    → cat 명령어를 해 test.txt의 내용을 화면에 출력하면 1이 출력됨
    → 모니터에 출력될 1을 리다이렉션 기호('>')를 사용하여 test.txt 파일에 그 내용을 출력
  • echo 2 > test.txt
    cat test.txt
    → 1은 보이지 않고 2만 출력
    → 리다이렉션 기호('>')는 기존에 있던 내용을 덮어쓰고 새롭게 내용을 만듦
  • echo 3 >> test.txt
    cat test.txt
    → 모니터에 숫자 2와 3을 출력
    ※ '>'와 '>>'는 표준 출력인 모니터로 출력하지 않고 파일로 출력하는(결국 파일에 입력이 됨) 리다이렉션 기호라는 
        점이 공통점이다. '>'는 기존의 파일 내용을 없애고 파일에 입력, '>>'는 기존의 파일 내용을 유지하고 마지막 라인에      추가된다는 차이점이 있음.
        따라서 '>'리다이렉션 기호는 기존의 내용을 삭제하므로 조심해서 사용해야함

mysqldump 명령어는 모니터에 데이터베이스 관련 내용을 출력하므로 리다이렉션 기호를 통해서 파일에 저장

파일명.sql 파일명을 가져야함

→ sudo mysqldump -u root -p --all-databases > MariaDB_All_Backup.sql

데이터베이스 모든 내용이 모니터가 아닌 MariaDB_All_Backup.sql 파일에 저장

[ec2-user@ip-172-31-33-63 ~]$ sudo mysqldump -u root -p --all-databases > MariaDB_All_Backup.sql
Enter password:
[ec2-user@ip-172-31-33-63 ~]$ ls
d  d_slink  MariaDB_All_Backup.sql  test1_hlink  test2_slink  test2.txt  test.txt  wordpress-4.9.6-ko_KR.tar.gz

 

만약, 특정 데이터베이스(스키마)만 백업을 하려고 하면

sudo mysqldump -u root -p shopping_db > shopping_db_backup.sql

이후 ls명령어를 입력하면

d        MariaDB_All_Backup.sql  test1_hlink  test2.txt  wordpress-4.9.6-ko_KR.tar.gz
d_slink  shopping_db_backup.sql  test2_slink  test.txt

 

만약, 특정 데이터베이스의 특정 테이블 하나만 백업하려면

sudo mysqldump -u root -p shopping_db customer > customer_table_backup.sql

 

파일의 내용을 왼쪽 명령어에 입력값으로 사용하는 경우 '<'를 사용

예를 들어 데이터베이스 접속 시 벡업해 놓은 파일을 입력값으로 해서 접속할 때 아래와 같이

sudo mysql -u root -p shopping_db < customer_table_backup.sql

 

또는 특정 파일의 내용을 정렬해서 출력하고 싶다면

sort < 파일이름(ex. list.txt)을 이렵

 

리다이렉션 기호 정리

'>' : 출력을 변화(출력을 감지, 출력 방향을 바꾼다.)

'>>' : 추가(Append)의 개념

'<' : 입력장치를 변환(입력으로 받아들인다.)

→ A < B 는 B(파일의 내용)을 읽어서 A(어떤 명령어)를 실행시켜라의 의미를 가짐

'<<' : << [문자열] 형태로 쓰이며 문자열이 쓰일 때까지 입력 상태를 이어나감

cat >> end

>(입력 상태가 지속)

그림 1. <<

end 문자열이 입력되면 현재까지 입력했던 문자열들이 echo 명령어에 의해 화면에 보여짐

 

cat << end > Hi.txt

>Hi

>Good morning

>end

→입력상태가 end 문자열을 만나 종료되고 입력된 내용을 Hi.txt에 '>'에 의해서 입력된다.

그림 2. cat << end >Hi.txt

※ '<' 와 '>' 를 활용하

sort < list.txt > sort_list.txt

→ list.txt의 내용을 sort(정렬)하고 그 정렬된 내용을 다시 sort_list.txt에 입

 

DB 복구

데이터베이스 복구 시 리다이렉션 기호 '<' 사용

customer_table_backup.sql 파일을 활용하여 customer 테이블 복구하기

 mysql -u root -p shopping_db

 

select * from customer;

→ 테이블 로우값 확인

 

delete from customer where id ='xyz';

→ 로우 값 한 줄 삭제

 

select * from customer;

→ 테이블 확인

id가 'xyz'로 되어 있던 로우값이 삭제

 

exit

→MariaDB 종료

 

sudo mysql -u root -p shopping_db < customer_table_backup.sql

→ 미리 백업해 놓은 파일로 customer 테이블 복구

 

mysql -u root -p shopping_db

→ MariaDB 접속

 

select * from customer;

→테이블 확인

→ id가 'xyz'로 되어 있던 로우값이 생성(복구가 됨)

→ 삭제 되기 전 상태로 복구 되어진 것을 확인

 

MariaDB 데이터베이스서버의 이중화

  • 서버의 이중화란 하나의 데이터베이스 서버와 똑같은 내용을 가진 데이터베이스 서버를 운영하는 것
  • Master와 Slave 개념 사용
  • Master로 설정된 데이터베이스에서 데이터베이스(스키마) 또는 테이블을 생성하면
    Slave 데이터베이스에 자동으로 생성
  • 두 대의 인스턴스가 필요
    새 인스턴스 생성 - 이름 : DB_Slave
  • MobaXterm Session 생성

DB_Slave 설정

  • sudo yum install -y mariadb mariadb-server
  • sudo cp /usr/share/mysql/my-small.cnf /etc/my.cnf
  • sudo vi /etc/my.cnf
  • :set nu - i를 눌러 insert
  • :22 default-character-set = utf
  • 30번 라인 skip-name-resolve
  • 31번 라인 character-set-server = utf8
  • 48번 라인 server-id = 1(Master)에서 server-id = 2(Slave)
    → id의 값을 2로 변경하여 Slave DB임을 인식시킴
  • 51번 라인 log-bin=mysql-bin 주석(#) 해제(지우기)
  • 54번 라인 binlog_format=mixed 주석(#) 해제(지우기)
  • 55번 라인 max_binlog_size=1000M
  • 56번 라인 expire_logs_days = 14
  • esc → :wq
  • sudo systemctl restart mariadb
  • mysql -u root mysql
  • update user set password=password('1') where user='root';
  • flush privileges;
  • exit
  • mysql -uroot -p
    Enter password : 1(변경된 패스워드(1)을 입력해서 마리아DB 접속
  • create database SlaveDB;
    →SlaveDB 데이터베이스를 생성
  • show databases;
    → 확인

'Master'로 인식될 인스턴스로 이동

Session Web으로 돌아와서

mysql -uroot -p

 

grant replication slave on *.* to slaveroot@3.39.251.15 identified by '1234';

3.39.251.15 : DB_Slave 퍼블릭 IPv4주소

 

flush privileges;

 

exit

 

sudo vi /etc/my.cnf

51번 라인 주석해제

54번 라인 주석해제

55번 라인 : max_binlog_size=1000M

56번 라인 : expire_logs_days = 14

 

sudo systemctl restart mariadb

 

Master에서 log_file과 Position을 확인 후 Slave에 동기화시켜야 함

시작위치를 맞춘다

 

show master status;

→ 표 형식으로 Master의 상태를 보여줌(log_file, position 정보)

→ log_file과 position 정보 기억(File : mysql-bin.000001, Position: 245)

→ log_file은 MariaDB를 시작할 때마다 파일명이 변경되고, Position은 SQL 쿼리를 처리하면 변경 됨

※참고 show master status \G; 표가 아닌 줄의 형태로 표현

728x90

'KDT > Cloud' 카테고리의 다른 글

231229 Cloud  (0) 2023.12.29
231222 Cloud  (0) 2023.12.22
231204 Cloud  (0) 2023.12.04
231201 Cloud  (0) 2023.12.01
231124 Cloud  (0) 2023.11.24