2023.11.08(수) - Day 8

  • 강의 내용
    • Review
    • DB 이중화 및 부하 분산
    • Haproxy


Review

  • Linux
    pwd / touch / mv / mkdir / rm -rf / cd / ls / vi
     ps -ef / netstat -anlp / systemctl / yum
     ...
  • 경로
    • 절대 경로
      • 무조건 /부터 전부 다 입력
    • 상대 경로
      • 현재 위치를 기준으로 입력
  • Client
    • 서버가 제공하는 서비스를 이용하는 프로그램
  • Server
    • 서비스를 제공하는 프로그램
  • Web Server
    • 서버 컴퓨터에 저장된 파일을 다운로드할 수 있는 서비스를 제공
  • DB Server
    • 데이터를 안전하게 테이블 형태로 CRUD할 수 있는 서비스를 제공
  • DB Client Program
    • Workbench, MYSQL 등을 이용해 SQL로 데이터를 CRUD하는 프로그램
      • SQL
        • DDL (Data Definition Language)
          • 데이터베이스를 정의하는 언어
          • 데이터를 생성, 수정, 삭제하는 등의 데이터의 전체의 골격을 결정하는 역할
          • CREATE / ALTER / DROP / TRUNCATE
        • DML (Data Manipulation Language)
          • 정의된 데이터베이스에 입력된 레코드를 조회, 수정, 삭제하는 등의 역할
          • SELECT / INSERT / UPDATE / DELETE
        • DCL (Data Control Language)
          • 데이터베이스에 접근하거나 객체에 권한을 주는 등의 역할을 하는 언어
          • GRANT / REVOKE / COMMIT / ROLLBACK
  • LAN
    • 하나의 네트워크
    • 가까운 곳에 있는 컴퓨터끼리 연결한 것
  • INTERNET
    • LAN + LAN + LAN + ... + LAN
    • 전 세계의 LAN들을 연결한 큰 네트워크
  • IP 주소
    • 컴퓨터가 사용하는 주소
    • 다른 컴퓨터를 찾아가기 위한 주소
    • 집 주소
    • IP 주소는 절대 같을 수 없다.
  • Subnet Mask
    • IP 주소에서 앞 부분 / 뒷 부분을 나눠주는 것
      • 앞 부분 - 네트워크 (대역) 의미 (같은 아파트 의미)
      • 뒷 부분 - 특정 컴퓨터 의미 (동 호수)
  • 공유기
    • IP 주소 하나를 공유
    • 내 네트워크와 인터넷을 연결하는 역할
      • 공유기도 네트워크 통신을 하려면 IP 주소가 있어야 함.
        • 내 네트워크에서 사용하는 IP 주소 하나
          • 공인 IP
            • 공유해서 사용하는 단 하나의 IP
        • 인터넷에서 사용하는 IP 주소 단 하나
          • 사설 IP
            • 공유기에 연결된 컴퓨터들이 사용하는 IP 주소
  • Gateway
    • 왜 공유기의 IP 주소를 설정하라고 했을까?
      • 인터넷으로 가는 주소 (문을 알려주는 것)
      • 공유기를 통해서 나가니까 공유기의 주소로 설정한 것.
  • Port
    • 프로그램을 찾아가기 위한 주소
  • 포트포워딩
    • 공유기의 IP 주소 (공인 IP)의 특정 port로 오면 사설 IP의 특정 port로 가도록 설정
    • 사설 IP는 알려줘도 절대 접속하지 못함.


위 내용으로 평가 진행할 예정!!!



DB 이중화 및 부하 분산

  • DB 서버 Replication
  • DB 서버 Cluster

실습

  • 가상머신 리눅스 2대 준비 (linux1, linux2)

    • IP 설정
    • MYSQL-SERVER 설치
    • 방화벽 끄기
    • MYSQL 초기 설정
  • linux1 (master) / linux2 (slave) 설정
    110.110.xxx.xx2 (master)에
    110.110.xxx.xx3 (slave)를 위한 계정 생성 및 권한 부여 (ltw2)

  • linux2 (master) / linux1 (slave) 설정
    110.110.xxx.xx3 (master)에
    110.110.xxx.xx2 (slave)를 위한 계정 생성 및 권한 부여 (ltw2)

    110.110.xxx.xx2 (slave)에 master 설정 추가

    이제 양쪽에서 CRUD DATABASE를 해도 동기화 Okay!!
    -> 양쪽에서 데이터 동기화가 되고 있는 것.


  • 가상 머신 리눅스 1대 준비 (linux3)
    • IP 설정
      • 110.110.xxx.xx1 (centOS_server1)
    • 방화벽 끄기

cf.)

  • Mirror
    • Active - Active
  • Hot
    • Active - Stanby
  • Warm
  • Cold


부하 분산

  • 이제 A 서버, B 서버 둘 다 사용 가능.

  • 하나 남은 리눅스 서버르 부하 분산 진행할 것.

    yum install haproxy         // h proxy라고 부른다.
  • 우리는 DB의 부하 분산을 하려고 하는 거지만 대부분의 것들의 부하 분산 가능

    vi /etc/haproxy/haproxy.cfg

    #default 아래 (line 63) 다 지우고 위 내용 추가

    systemctl restart haproxy

    • haproxy 모니터링 페이지
    • MYSQL 서버에 계정 추가
      • haproxy가 설치되어 있는 곳의 IP 주소를 허용해줘야 함.
        • CREATE USER 'haproxy'@'%';
        • CREATE USER 'haproxy2'@'110.110.xxx.xx1';

      listen mysqld-ha
      		 bind :3306
             ## haproxy가 3306 port를 사용하겠다.
             ## haproxy의 3306 port로 오면 2개의 서버 중 한 대로 보내주겠다.
             
                mode tcp
                ## tcp로만 보내겠다. (but, 동작은 4 layer처럼 할 것)
                
                balance roundrobin
                ## 순서대로 하나씩 보내주겠다.
                
                option mysql-check user haproxy
                
                server mysqld1 110.110.xxx.xx2:3306 check
                server mysqld2 110.110.xxx.xx3:3306 check
                ## haproxy라는 사용자로 check하겠다.
                ## DB 서버에 haproxy라는 사용자를 만들어야 한다.
                ## 양방향으로 되어 있으니까 아무 곳이나 만들면 된다.
                ## 접속할 수만 있고 비밀번호도 필요 없다.
      그럼 이제 haproxy를 이용해서 부하 분산을 할 수 있다. cf.)
      setsebool -P haproxy_connect_any = 1
      위 코드 실행하니까 정상 실행!!
      아래 방화벽 푸는 옵션 허용 명령
      setenforce 0
      알고 보니 위 방화벽 푸는 옵션과 같은 명령어인데 방화벽 끄는 걸 깜빡했나보다..



Haproxy 정리

## 1. haproxy 설치 및 설정
yum install haproxy

vi /etc/haproxy/haproxy.cfg

## 63번 줄 아래로 모두 삭제 후 아래 내용 추가
listen stats     ## haproxy 모니터링 페이지 설정
	bind :9000     ## 웹 브라웆를 이용해서 9000번 포트로 접속하면
    stats enable     ## haproxy 모니터링 페이지로 접속됨
    stats realm Haproxy\Statistics     ## http://[서버IP]:9000/haproxy_stats
    stats uri /haproxy_stats

## 서비스 재시작
systemctl restart haproxy 

## test
## 1) haproxy 모니터링 페이지에서 확인
http://[프록시 서버 IP]:9000/haproxy_stats 접속했을 때 웹 페이지가 나와야 함.


## 2. MYSQL 서버 추가
## 1) MYSQL 서버에 계정 추가
## haproxy라는 이름의 계정 추가
CREATE USER 'haproxy'@'[리눅스3 PC IP]';

## 2) haproxy 설정
vi /etc/haproxy/haproxy.cfg

## 마지막 줄에 추가

listen mysqld-ha
		bind :3306
        mode tcp
        balance roundrobin
        option mysql-check user haproxy
        
        server mysqld1 110.110.xxx.xx2:3306 check
        server mysqld2 110.110.xxx.xx3:3306 check
     
     
## 3. DB 서버 부하 분산 확인
## 1) DB 서버에 접속할 수 있는 사용자 생성
CREATE USER 'test'@'%' IDENTIFIED BY 'xxxxxxxx';

## 2) workbench에서 접속 테스ㅡ
hostname : [haproxy]가 설치된 pc의 IP]
usernME : [위에서 생성한 계정]

## 접속 후

SHOW variables LIKE '%server_id%';

## 새로 접속할 때마다 server_id가 바뀌어야 정상!!


cf.)
SQL은 대부분 다 비슷한데

  • MYSQL
    • myisam
      • 처리가 더 빠름
    • innodb
      • 안전

빠르게 처리하는 것 보다 우리는 안전하게 처리하는 것이 더 중요함.


[참고]
https://needjarvis.tistory.com/45
https://velog.io/@gillog/DBInnoDB-VS-MyISAM



Active-Stanby 구성 실습

  • centOS_server2
  • centOS_server3
  • Active할 DB 서버 선택

    • 나는 centOS_server2를 Active로 한다.
    • window처럼 가상의 네트워크 장치를 설치한다.
      • 프로그램을 설치하지 않더라도 window처럼 가상의 네트워크 장치를 사용한다.
    yum install -y keepalived

    특별한 설정을 하지 않아도 keepalived가 다 해준다.

    ## Active
    ## 1) keepalived 설치 및 설정
    
    yum install -y keepalived
    
    vi /etc/keepalived/keepalived.conf
    
    ## 14번 line 주석 처리
    ## 18번 line 밑으로 전부 삭제 ( 100dd -> 커서 아래 100줄 삭제)
    
    vrrp_script_chk_mysql {
    		script "pidof mysqld"
            interval 2        # every 2 seconds
            weight 2
    }
    
    vrrp_instance VI_1 {
    		interface ens160
            state Active
            virtual_router_id 123		         ## Stanby랑 맞춰줘야 하는 값
            unicast_src_ip 110.110.xxx.xx2       ## Active IP
            unicast_peer {
          	  110.110.xxx.xx3                    ## Stanby IP 
            }
          
            priority 102                         ## Stanby보다 Active가 높아야 함.
          
            track_script {
          	     chk_mysql
            }
          
            virtual_ipaddress {
          		   110.110.xxx.xxx/24 dev ens160
                     ## 내가 설정한 가상 IP 주소
                     ## 이 주소로 xx2, xx3 오가면서 실행
            }
    }
    
    systemctl restart keepalived

## Standy
## keepalived 설치 및 설정
yum install -y keepalived

vi /etc/keepalived/keepalived.conf

vrrp_script chk_mysql {
        script "pidof mysqld"
        interval 2                       # every 2 seconds
        weight 2
}

vrrp_instance VI_1 {
        interface ens160
        state BACKUP
        virtual_router_id 123		         # Standby랑 맞춰줘야 하는 값
        unicast_src_ip 110.110.xxx.xx3   # Standby IP
        unicast_peer {
                110.110.xxx.xx2         # Active IP
        }

        priority 101			        # Standby보다 Active가 높아야 하는 값

        track_script {
             chk_mysql
        }

        virtual_ipaddress {
                110.110.xxx.xxx/24 dev ens33
        }
}


systemctl restart keepalived

## DB 서버 Failover 테스트
## 1) workbench에서 접속 테스트
##	hostname : 110.110.xxx.xxx       // [keepalived에서 virtual ip]
##	username : haproxy               // [생성한 계정]

## 접속 후 

show variables LIKE '%server_id%'; 

## 실행해서 server-id를 확인, 
## Active 서버를 끄고 수 초 후 다시 접속

centOS_server2(110.110.xxx.xx2),
centOS_server3(110.110.xxx.xx3)의 DB 서버가 모두 켜져있을 때만 아래 화면이 나옴.

Active-Stanby에서 우선 순위가 높은 centOS_server2(110.110.xxx.xx2)에서 실행되는 것을 확인할 수 있다.


centOS_server2(110.110.xxx.xx2)의 mysqld가 stop했을 때 아래 화면
(Active-Stanby에서 Active의 mysqld가 꺼졌을 때)

centOS_server2(110.110.xxx.xx2)의 mysqld를 start하니
1번 서버 (centOS_server2)로 접속 id가 다시 변경된 것을 확인할 수 있다.
(Active-Stanby에서 우선 순위가 높은 Active의 mysqld가 다시 켜졌을 때)



차이점

Active-Active와 Active-Stanby의 차이점은
Active-Stanby는 keepalived가 Active가 죽고 Stanby가 Active가 되면
바로 접속이 가능하다
(IP 주소를 받아서 Active가 될 때 그 사이에 접속한 사람은 불가)

그리고 Active가 죽고 Stanby에 IP가 할당되면 바로 실행된다.

그리고 다시 죽었던 Active가 Active가 되면 Stanby에 할당된 IP는 keepalived가 없애고 다시 Active에 IP를 할당한다.

profile
Web Developer

1개의 댓글

comment-user-thumbnail
2023년 12월 8일

안녕하세요! 혹시 참여하고 계신 프로그램에 관심이 있는데 메일로 질문 가능할까요..?

답글 달기