동일한 시스템에서 MySQL 마스터-슬레이브 복제

게시 됨: 2022-03-11

MySQL 복제는 하나의 MySQL 데이터베이스 서버(마스터)의 데이터를 하나 이상의 MySQL 데이터베이스 서버(슬레이브)에 자동으로 복사할 수 있도록 하는 프로세스입니다. 일반적으로 확장성을 위해 여러 서버에 읽기 액세스를 분산하는 데 사용되지만 마스터 오버로드를 방지하기 위해 페일오버 또는 슬레이브의 데이터 분석과 같은 다른 목적으로도 사용할 수 있습니다.

마스터-슬레이브 복제는 단방향 복제(마스터에서 슬레이브로)이므로 쓰기 작업에는 마스터 데이터베이스만 사용되는 반면 읽기 작업은 여러 슬레이브 데이터베이스에 분산될 수 있습니다. 이것이 의미하는 바는 마스터-슬레이브 복제가 확장 솔루션으로 사용되는 경우 쓰기 작업을 위한 하나와 읽기 작업을 위한 두 번째 데이터 원본을 정의해야 한다는 것입니다.

MySQL 마스터-슬레이브 복제

MySQL 개발자는 일반적으로 하나의 시스템에서만 작업하고 네트워크나 인터넷 연결에 의존하지 않는다는 논리로 해당 시스템에서 전체 개발 환경을 사용하는 경향이 있습니다. 예를 들어 변경 사항을 다른 곳에 배포하기 전에 개발 환경에서 복제를 테스트해야 하기 때문에 마스터-슬레이브 복제가 필요한 경우 동일한 시스템에서 생성해야 합니다. 단일 MySQL 인스턴스의 설정은 매우 간단하지만 두 번째 설정과 마스터-슬레이브 복제를 설정하기 위해 약간의 추가 노력이 필요합니다.

이 단계별 자습서에서는 Ubuntu Linux를 호스트 운영 체제로 선택했으며 제공된 명령은 해당 운영 체제에 대한 것입니다. 다른 운영 체제에서 MySQL 마스터-슬레이브 복제를 설정하려면 특정 명령을 수정해야 합니다. 그러나 동일한 시스템에서 MySQL 마스터-슬레이브 복제를 설정하는 일반적인 원칙은 모든 운영 체제에서 동일합니다.

MySQL 마스터-슬레이브 복제

첫 번째 MySQL 인스턴스 설치

머신에 이미 하나의 MySQL 데이터베이스 인스턴스가 설치되어 있는 경우 이 단계를 건너뛸 수 있습니다.

Ubuntu에 MySQL을 설치하는 가장 쉬운 방법은 터미널 프롬프트에서 다음 명령을 실행하는 것입니다.

 sudo apt-get install mysql-server

설치 과정에서 MySQL root 사용자의 암호를 설정하라는 메시지가 표시됩니다.

mysqld_multi 설정

동일한 머신에서 두 개의 MySQL 인스턴스를 효율적으로 관리하려면 mysqld_multi 를 사용해야 합니다.

mysqld_multi 설정의 첫 번째 단계는 기존 my.cnf 파일에 두 개의 개별 [mysqld] 그룹을 생성하는 것입니다. Ubuntu에서 my.cnf 파일의 기본 위치는 /etc/mysql/ 입니다. 따라서 즐겨 사용하는 텍스트 편집기로 my.cnf 파일을 열고 기존 [mysqld] 그룹의 이름을 [mysqld1] 으로 변경합니다. 이름이 변경된 이 그룹은 첫 번째 MySQL 인스턴스 구성에 사용되며 마스터 인스턴스로도 구성됩니다. MySQL 마스터-슬레이브 복제에서와 같이 각 인스턴스에는 고유한 server-id 가 있어야 하며 [mysqld1] 그룹에 다음 줄을 추가합니다.

 server-id = 1

두 번째 MySQL 인스턴스에 대해 별도의 [mysqld] 그룹이 필요하므로 모든 현재 구성과 함께 [mysqld1] 그룹을 복사하고 동일한 my.cnf 파일에 아래에 붙여넣습니다. 이제 복사한 그룹의 이름을 [mysqld2] 로 변경하고 슬레이브 구성에서 다음과 같이 변경합니다.

 server-id = 2 port = 3307 socket = /var/run/mysqld/mysqld_slave.sock pid-file = /var/run/mysqld/mysqld_slave.pid datadir = /var/lib/mysql_slave log_error = /var/log/mysql_slave/error_slave.log relay-log = /var/log/mysql_slave/relay-bin relay-log-index = /var/log/mysql_slave/relay-bin.index master-info-file = /var/log/mysql_slave/master.info relay-log-info-file = /var/log/mysql_slave/relay-log.info read_only = 1

두 번째 MySQL 인스턴스를 슬레이브로 설정하려면 마스터의 서버 ID와 달라야 하므로 server-id 를 2로 설정합니다.

두 인스턴스가 모두 동일한 시스템에서 실행되므로 두 번째 인스턴스의 port 는 기본적으로 3306 인 첫 번째 인스턴스에 사용된 포트와 달라야 하므로 3307 로 설정합니다.

이 두 번째 인스턴스가 동일한 MySQL 바이너리를 사용하도록 하려면 socket , pid-file , datadirlog_error 에 대해 다른 값을 설정해야 합니다.

또한 두 번째 인스턴스를 슬레이브로 사용하려면( relay-log , relay-log-indexrelay-log-info-file 매개변수), master-info-file 을 설정하기 위해 relay-log 를 활성화해야 합니다.

마지막으로 슬레이브 인스턴스를 읽기 전용으로 만들기 위해 매개변수 read_only1 로 설정합니다. 이 옵션은 슬레이브의 변경을 완전히 방지하지 못하므로 주의해야 합니다. read_only1 로 설정되어 있어도 SUPER 권한이 있는 사용자만 업데이트를 허용합니다. MySQL은 최근 SUPER 사용자가 변경하는 것을 방지하기 위해 새로운 매개변수 super_read_only 를 도입했습니다. 이 옵션은 버전 5.7.8에서 사용할 수 있습니다.

[mysqld1][mysqld2] 그룹 외에도 my.cnf 파일에 새 그룹 [mysqld_multi] 를 추가해야 합니다.

 [mysqld_multi] mysqld = /usr/bin/mysqld_safe mysqladmin = /usr/bin/mysqladmin user = multi_admin password = multipass

두 번째 MySQL 인스턴스를 설치하고 둘 다 시작하면 MySQL 인스턴스를 종료할 수 있도록 multi_admin 사용자에게 적절한 권한을 부여합니다.

두 번째 MySQL 인스턴스에 대한 새 폴더 생성

이전 단계에서 우리는 두 번째 MySQL 인스턴스에 대한 구성 파일을 준비했습니다. 해당 구성 파일에서 두 개의 새 폴더가 사용됩니다. 적절한 권한으로 해당 폴더를 생성하려면 다음 Linux 명령을 사용해야 합니다.

 mkdir -p /var/lib/mysql_slave chmod --reference /var/lib/mysql /var/lib/mysql_slave chown --reference /var/lib/mysql /var/lib/mysql_slave mkdir -p /var/log/mysql_slave chmod --reference /var/log/mysql /var/log/mysql_slave chown --reference /var/log/mysql /var/log/mysql_slave

AppArmor의 추가 보안 설정

일부 Linux 환경에서는 두 번째 MySQL 인스턴스를 실행하기 위해 AppArmor 보안 설정이 필요합니다. 최소한 Ubuntu에서는 필요합니다.

AppArmor를 올바르게 설정하려면 선호하는 텍스트 편집기로 /etc/apparmor.d/usr.sbin.mysqld 파일을 편집하고 다음 행을 추가하십시오.

 /var/lib/mysql_slave/ r, /var/lib/mysql_slave/** rwk, /var/log/mysql_slave/ r, /var/log/mysql_slave/* rw, /var/run/mysqld/mysqld_slave.pid rw, /var/run/mysqld/mysqld_slave.sock w, /run/mysqld/mysqld_slave.pid rw, /run/mysqld/mysqld_slave.sock w,

파일을 저장한 후 이러한 변경 사항을 적용하려면 시스템을 재부팅하십시오.

두 번째 MySQL 인스턴스 설치

두 번째 MySQL 인스턴스를 설치하기 위해 몇 가지 다른 접근 방식을 따를 수 있습니다. 이 튜토리얼에서 제공하는 접근 방식은 첫 번째와 동일한 MySQL 바이너리를 사용하며 두 번째 설치에는 별도의 데이터 파일이 필요합니다.

이전 단계에서 구성 파일과 필요한 폴더 및 보안 변경 사항을 이미 준비했으므로 두 번째 MySQL 인스턴스의 최종 설치 단계는 MySQL 데이터 디렉터리의 초기화입니다.

새 MySQL 데이터 디렉토리를 초기화하려면 다음 명령을 실행하십시오.

 mysql_install_db --user=mysql --datadir=/var/lib/mysql_slave

MySQL 데이터 디렉토리가 초기화되면 mysqld_multi 서비스를 사용하여 두 MySQL 인스턴스를 모두 시작할 수 있습니다.

 mysqld_multi start

적절한 호스트 및 포트와 함께 mysqladmin 을 사용하여 두 번째 MySQL 인스턴스의 root 비밀번호를 설정하십시오. 호스트와 포트가 지정되지 않은 경우 mysqladmin 은 기본적으로 첫 번째 MySQL 인스턴스에 연결합니다.

 mysqladmin --host=127.0.0.1 --port=3307 -u root password rootpwd

위의 예에서는 암호를 "rootpwd"로 설정했지만 더 안전한 암호를 사용하는 것이 좋습니다.

mysqld_multi 의 추가 설정

"mysqld_multi 설정하기" 섹션의 끝에서 나는 나중에 multi_admin 사용자에게 적절한 권한을 부여할 것이라고 썼으므로 지금이 그 때입니다. 이 사용자에게 두 인스턴스 모두에서 적절한 권한을 부여해야 하므로 먼저 첫 번째 인스턴스에 연결해 보겠습니다.

 mysql --host=127.0.0.1 --port=3306 -uroot -p

로그인한 후 다음 두 명령을 실행합니다.

 mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'; mysql> FLUSH PRIVILEGES;

MySQL 클라이언트를 종료하고 두 번째 인스턴스에 연결합니다.

 mysql --host=127.0.0.1 --port=3307 -uroot -p

로그인한 후 위와 동일한 두 명령을 실행합니다.

 mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'; mysql> FLUSH PRIVILEGES;

MySQL 클라이언트를 종료합니다.

부팅 시 자동으로 두 MySQL 인스턴스 시작

mysqld_multi 설정의 마지막 단계는 init.d 에 자동 부팅 스크립트를 설치하는 것입니다.

그렇게 하려면 /etc/init.dmysqld_multi 라는 새 파일을 만들고 적절한 권한을 부여하십시오.

 cd /etc/init.d touch mysqld_multi chmod +x /etc/init.d/mysqld_multi

즐겨 사용하는 텍스트 편집기로 이 새 파일을 열고 다음 스크립트를 복사합니다.

 #!/bin/sh ### BEGIN INIT INFO # Provides: scriptname # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start daemon at boot time # Description: Enable service provided by daemon. ### END INIT INFO bindir=/usr/bin if test -x $bindir/mysqld_multi then mysqld_multi="$bindir/mysqld_multi"; else echo "Can't execute $bindir/mysqld_multi"; exit; fi case "$1" in 'start' ) "$mysqld_multi" start $2 ;; 'stop' ) "$mysqld_multi" stop $2 ;; 'report' ) "$mysqld_multi" report $2 ;; 'restart' ) "$mysqld_multi" stop $2 "$mysqld_multi" start $2 ;; *) echo "Usage: $0 {start|stop|report|restart}" >&2 ;; esac

다음 명령을 사용하여 기본 runlevelsmysqld_multi 서비스를 추가하십시오:

 update-rc.d mysqld_multi defaults

머신을 재부팅하고 다음 명령을 사용하여 두 MySQL 인스턴스가 모두 실행 중인지 확인합니다.

 mysqld_multi report

마스터-슬레이브 복제 설정

이제 동일한 머신에서 실행 중인 두 개의 MySQL 인스턴스가 있을 때 첫 번째 인스턴스를 마스터로 설정하고 두 번째 인스턴스를 슬레이브로 설정합니다.

구성의 한 부분은 "mysqld_multi 설정" 장에서 이미 수행되었습니다. my.cnf 파일에 남아 있는 유일한 변경 사항은 마스터에서 바이너리 로깅을 설정하는 것입니다. 이렇게 하려면 [mysqld1] 그룹에서 다음 변경 사항 및 추가 사항으로 my.cnf 파일을 편집하십시오.

 log_bin = /var/log/mysql/mysql-bin.log innodb_flush_log_at_trx_commit = 1 sync_binlog = 1 binlog-format = ROW

이러한 변경 사항을 적용하려면 마스터 MySQL 인스턴스를 다시 시작합니다.

 mysqld_multi stop 1 mysqld_multi start 1

슬레이브가 올바른 복제 권한으로 마스터에 연결하려면 마스터에 새 사용자를 생성해야 합니다. 적절한 호스트 및 포트와 함께 MySQL 클라이언트를 사용하여 마스터 인스턴스에 연결합니다.

 mysql -uroot -p --host=127.0.0.1 --port=3306

복제를 위한 새 사용자 생성:

 mysql> CREATE USER 'replication'@'%' IDENTIFIED BY 'replication'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';

MySQL 클라이언트를 종료합니다.

마스터 데이터의 덤프를 생성하려면 다음 명령을 실행하십시오.

 mysqldump -uroot -p --host=127.0.0.1 --port=3306 --all-databases --master-data=2 > replicationdump.sql

여기에서 백업 파일 내부에 CHANGE MASTER 문을 포함하는 주석을 포함하기 위해 --master-data=2 옵션을 사용합니다. 이 주석은 백업 시 복제 좌표를 나타내며 나중에 슬레이브 인스턴스의 마스터 정보 업데이트를 위해 해당 좌표가 필요합니다. 다음은 해당 주석의 예입니다.

 -- -- Position to start replication or point-in-time recovery from -- -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=349;

이전 단계에서 생성한 덤프를 슬레이브 인스턴스로 가져옵니다.

 mysql -uroot -p --host=127.0.0.1 --port=3307 < replicationdump.sql

마지막으로 슬레이브 인스턴스가 마스터 인스턴스에 연결하기 위해서는 슬레이브에 대한 마스터 정보가 적절한 연결 매개변수로 업데이트되어야 합니다.

적절한 호스트 및 포트와 함께 MySQL 클라이언트를 사용하여 슬레이브 인스턴스에 연결합니다.

 mysql -uroot -p --host=127.0.0.1 --port=3307

마스터 정보를 업데이트하려면 다음 명령을 실행하십시오(위에서 설명한 대로 덤프 파일 replicationdump.sql 에서 복제 좌표 가져오기).

 mysql> CHANGE MASTER TO -> MASTER_HOST='127.0.0.1', -> MASTER_USER='replication', -> MASTER_PASSWORD='replication', -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=349;

슬레이브를 시작하려면 다음 명령을 실행하십시오.

 mysql> START SLAVE;

복제가 실행 중인지 확인하려면 다음 명령을 실행합니다.

 mysql> SHOW SLAVE STATUS \G

축하합니다. 동일한 시스템에서 MySQL 마스터-슬레이브 복제가 이제 성공적으로 설정되었습니다.

MySQL 마스터-슬레이브 복제

마무리

프로덕션 환경의 확장 솔루션에 필요한 경우 개발 환경에서 마스터-슬레이브 복제를 구성하면 유용합니다. 이렇게 하면 쓰기 및 읽기 작업을 위해 구성된 별도의 데이터 소스도 갖게 되므로 추가 배포 전에 모든 것이 예상대로 작동하는지 로컬에서 테스트할 수 있습니다.

또한 여러 슬레이브에 읽기 작업을 분산하는 로드 밸런서를 테스트하기 위해 동일한 시스템에 여러 슬레이브 인스턴스를 구성할 수 있습니다. 이 경우 이 매뉴얼을 사용하여 동일한 단계를 모두 반복하여 다른 슬레이브 인스턴스를 설정할 수 있습니다.