[DB] haproxy를 이용한 분산 처리

최동혁·2023년 2월 13일
0

데이터베이스

목록 보기
18/18

양방향 master-slave 설정

  1. 바로 이전 게시글에서 했던 master, slave 설정을 해준다.

  2. 저번에는 Active(쓰기 전용) - Active(읽기 전용)으로, msater에서는 쓰기로 slave에서는 읽기만 할 수 있게끔 세팅을 했다.

  3. 하지만 이번에는 Active(읽기, 쓰기) - Active(읽기, 쓰기)로 설정을 할 것이다.

  4. 저번 세팅에 추가해야 될 것은?

    • /etc/my.cnf.d/mysql-server.cnf 파일에 slave도 밑에 log-bin = mysql-bin 추가한다. 물론 server-id는 master와 다르게 2번으로 설정.
    • systemctl 명령어로 재시작
    • master 쪽 user 설정
    CREATE USER 'test1'@'%' IDENTIFIED BY 'Dkagh1234!';
    GRANT REPLICATION SLAVE ON *.* TO 'test1'@'%';
    • slave 쪽 user 설정
    CREATE USER 'test2'@'%' IDENTIFIED BY 'Dkagh1234!';
    GRANT REPLICATION SLAVE ON *.* TO 'test2'@'%';
    • 서로가 서로의 master, slave가 되는 것이다.
    • 그 후, 아무곳에서 database 생성
    CREATE DATABASE cdh;
    
    USE cdh;
    
    CREATE TABLE student ( sname VARCHAR(10), sage INT );
    
    INSERT INTO student (sname, sage) VALUES ('kim', 30);
    
    quit
    • 백업 파일 생성
      • mysqldump -u root -p --all-databases > back.db
    • 백업 파일 전송
      • scp ./back.db [슬레이브 IP]:/root/back.db
        • 말이 슬레이브지 다른 vm ip를 써주면 된다.
    • master 설정
    • test2 입장에서
      change master to
      master_host='[test1 IP]',
      master_user='test1',
      master_password='Dkagh1.',
      master_log_file='mysql-bin.[test1의 로그 번호]',
      master_log_pos=[test1의 포지션 번호];
    • test1 입장에서
      change master to
      master_host='[test2 IP]',
      master_user='test2',
      master_password='Dkagh1.',
      master_log_file='mysql-bin.[test2의 로그 번호]',
      master_log_pos=[test2의 포지션 번호];
    • 그 후, 각자 start slave; 쿼리문으로 실행시켜준다.
    • 그러면 서로 읽기, 쓰기가 가능해지는 관계가 된다.

비밀번호 제거한 유저 만들기

  • haproxy에서 mysql에 접근하기 위해서는 비밀번호가 없는 mysql 사용자가 필요하다.

  • 그렇기 때문에 우리는 비밀번호 정책을 제거한 후, 임의의 사용자를 만들어야 한다.

  • mysql -u root -p 로 mysql 서버에 로그인 (비밀번호 정책 제거)

    • uninstall plugin validate_password; (5.7버전)
    • uninstall component 'file://component_validate_password'; (8.0버전)
    • 둘 중 하나는 될 것이다. 자신의 버전에 맞게 쓰도록 하자.
    • quit 쿼리로 나오고, 시스템을 다시 재시작해준다.
  • 패스워드 없는 사용자 생성

    • mysql -u root -p (로그인)
    • CREATE USER '사용자 이름'@'%'; 권한도 없고 패스워드도 없는 사용자가 생성됨 (나는 remote로 정했음)
    • GRANT ALL PRIVILEGES ON . TO '사용자 이름'@'%';

    • 나의 경우 위의 쿼리문 두 개를 실행시키면 remote라는 비밀번호 없는 사용자가 생긴다.
    • 두개의 서버 중 한곳에다가 remote user를 만들면 자동으로 다른 서버에 생성된다.

haproxy 설정

  • 다른 vm에 haproxy 설치
    • yum install haproxy
  • setenforce 0 (로컬 방화벽 중단)
  • systemctl stop firewalld (방화벽 중단)
  • 설정
    • vi /etc/haproxy/haproxy.cfg


    • 가장 아랫줄에 위의 그림처럼 작성해주자.

    • 분산 처리해주는 알고리즘 RR 알고리즘을 사용했는데 운영체제때 다루었던 알고리즘이기에 넘어가겠다.

    • option mysql-check user 뒤에 비밀번호를 제거한 mysql 사용자 명인 remote를 써주자(만약 remote가 아니라면 본인이 설정한 이름)

    • 그 밑에 server (db 서버명) (그 서버의 ip):3306 check

    • 여기서 db 서버명은 자기 마음대로 쓰면 된다.

    • 총 2개를 설정했으니 두개 써주자.

  • systemctl restart haproxy 로 haproxy 서비스 재시작.
  • 현재 haproxy를 설치한 vm의 ip주소:9000/haproxy_stats로 접속해보자.

  • 위의 페이지가 뜬다.

  • 우리는 두개의 db 서버로 분산 처리를 하기 때문에 2개가 떠있는 것을 볼 수있다.

  • mysql에서 실제로 접속했을 때 분산 처리가 되는지 확인해보자.

  • 세팅은 위의 그림처럼 해주면 된다.

  • username은 우리가 비밀번호 없이 접속할 수 있게 만들어준 user의 이름을 써주고, hostname은 haproxy를 설치한 vm의 ip를 써준다.

  • connection name은 설정하고 싶은 아무거나 설정하면 된다.

  • 여러개를 접속해서 쿼리문으로 show variables like '%server_id%'; 를 작성하고 결과를 본다면?

  • 이렇게 server_id가 바뀌면서 분산 처리가 되는 것을 볼 수있다.
  • 첫번째는 접속했을때 1번 server_id로 접속이 되고, 두번째 접속은 2번 server_id로 접속이 된다.
profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글