복제 SQL 데이터베이스에서 원본 데이터베이스에서 다른 데이터베이스(또는 여러 데이터베이스)로 또는 그 반대로 데이터를 복사하는 프로세스입니다. 한 데이터베이스 서버의 데이터는 지속적으로 하나 이상의 서버에 복사됩니다. 복제를 사용하여 복제된 서버 풀에 요청을 분산 및 균형을 유지하고 MariaDB 데이터베이스의 장애 조치 및 고가용성을 제공할 수 있습니다. MariaDB(및 MySQL)는 마스터-마스터라는 두 가지 유형의 데이터베이스 복제를 사용할 수 있습니다. 및 마스터-슬레이브 . 이 기사에서는 Linux CentOS 7에서 두 가지 유형의 MariaDB 복제를 구성하는 방법을 고려할 것입니다.
MariaDB 설치
앞서 CentOS 7에서 MariaDB 설치 프로세스를 설명하는 기사를 게시했습니다. https://woshub.com/mariadb-install-configure-tunning-centos 링크에서 읽을 수 있습니다. 따라서 MariaDB 설치 자체에 초점을 맞추지 않고 복제 구성 방법으로 넘어갑니다.
MariaDB에서 단순 마스터-마스터 복제 구성
마스터-마스터 복제 체계에서 모든 MariaDB/MySQL 데이터베이스 서버를 사용하여 데이터를 쓰거나 읽을 수 있습니다. 복제는 특수 binlog 파일을 기반으로 하며 마스터 서버는 데이터베이스와의 모든 작업을 저장합니다. 슬레이브 서버는 마스터에 연결하고 해당 데이터베이스에 명령을 적용합니다.
1. MariaDB:첫 번째 마스터 서버 구성(Master-1)
my.cnf에 다음 줄을 추가합니다. 첫 번째 MariaDB 서버의 파일:
#replication server_id = 1 report_host = master log_bin = /var/lib/mysql/mariadb-bin log_bin_index = /var/lib/mysql/mariadb-bin.index relay_log = /var/lib/mysql/relay-bin relay_log_index = /var/lib/mysql/relay-bin.index
service mariadb restart
복제를 구성할 사용자 생성:
mysql
create user 'test_master'@'%' identified by 'test_master';
grant replication slave on *.* to 'test_master'@'%';
슬레이브를 추가하려면 Master-1 서버에서 bin_log 데이터를 가져와야 합니다.
MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +--------------------+----------+--------------+------------------+ | mariadb-bin.000002 | 664 | | | +--------------------+----------+--------------+------------------+ 1 row in set (0.000 sec)
2. MariaDB:두 번째 마스터 서버 구성(Master-2)
두 번째 MariaDB 서버에 연결하고 my.cnf 파일을 열고 여기에 다음 구성을 추가합니다.
#replication server_id = 2 report_host = master2 log_bin = /var/lib/mysql/mariadb-bin log_bin_index = /var/lib/mysql/mariadb-bin.index relay_log = /var/lib/mysql/relay-bin relay_log_index = /var/lib/mysql/relay-bin.index
두 번째 서버에서도 새 사용자 생성:
create user 'test_master2'@'%' identified by 'test_master2';
grant replication slave on *.* to 'test_master2'@'%';
Master-2에서 bin_log 가져오기:
MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +--------------------+----------+--------------+------------------+ | mariadb-bin.000001 | 667 | | | +--------------------+----------+--------------+------------------+ 1 row in set (0.000 sec)
소프트웨어 복제 클러스터에서 MariaDB 서버 간의 연결을 구성해 보겠습니다.
슬레이브 중지:
STOP SLAVE;
두 번째 서버에 Master-1 추가:
CHANGE MASTER TO MASTER_HOST='IP_master1', MASTER_USER='test_master', MASTER_PASSWORD='test_master', MASTER_LOG_FILE='mariadb-bin.000002', MASTER_LOG_POS=664;
복제 시작:
START SLAVE;
Master-1에 연결하고 동일한 단계를 따르되 대신 두 번째 서버에 대한 정보를 지정하십시오.
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='10.2.10.36', MASTER_USER='test_master2', MASTER_PASSWORD='test_master2', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=667;
START SLAVE;
두 번째 서버 상태 확인:
show slave status \G
스크린샷에서 볼 수 있듯이 두 서버 사이에 연결이 되어 있고 오류가 발생하지 않습니다.
3. MariaDB 서버 간 복제를 확인하는 방법은 무엇입니까?
그런 다음 두 MariaDB 서버 간의 복제가 master+master에서 작동하는지 확인하기 위해 Master-1에 새 데이터베이스를 만들고 여기에 테이블을 만듭니다.
MariaDB [(none)]> create database master1;
MariaDB [(none)]> use master1;
MariaDB [master1]> CREATE TABLE hello (
-> AuthorID INT NOT NULL AUTO_INCREMENT,
-> AuthorName VARCHAR(100),
-> PRIMARY KEY(AuthorID)
-> );
이 데이터베이스가 두 번째 마스터에서 자동으로 복제되고 동일한 테이블을 포함하는지 확인하십시오.
MariaDB [(none)]> show databases;
+--------------------+ | Database | +--------------------+ | information_schema | | master1 | | mysql | | performance_schema | +--------------------+
MariaDB [(none)]> use master1;
MariaDB [master1]> show tables;
+-------------------+ | Tables_in_master1 | +-------------------+ | hello | +-------------------+
데이터베이스는 두 번째 마스터에서도 생성되었습니다. 전체 주기를 확인하려면 두 번째 마스터 서버의 Master1 데이터베이스에 테이블을 생성하고 첫 번째 서버에 나타나는지 확인하십시오.
MariaDB [master1]> CREATE TABLE hello_master1 (
-> AuthorID INT NOT NULL AUTO_INCREMENT,
-> AuthorName VARCHAR(100),
-> PRIMARY KEY(AuthorID)
-> );
hello_master1 테이블이 첫 번째 서버에 복제되었습니다.
MariaDB [master1]> show tables;
+-------------------+ | Tables_in_master1 | +-------------------+ | hello | | hello_master1 | +-------------------+
보시다시피 마스터-1에 새로운 테이블이 등장했습니다. 복제가 작동합니다.
MariaDB에서 마스터-슬레이브 복제를 설정하는 방법
마스터-슬레이브 MariaDB 복제 모드에서는 하나의 서버가 슬레이브 역할을 하며 마스터 서버의 데이터가 지속적으로 여기에 기록됩니다. 슬레이브 서버에서 수행한 모든 변경 사항은 마스터 서버로 전송되지 않습니다. 이 데이터베이스 복제 유형은 더 탄력적이며 더 자주 사용됩니다. 이 구성에서는 항상 최신 데이터베이스를 가진 백업 서버를 가지고 있으며 슬레이브 서버가 실패하더라도 마스터는 데이터를 잃지 않습니다. 또한 앱이 슬레이브 서버에서 데이터를 읽고 마스터 서버에만 데이터를 쓰도록 프로젝트에 대한 데이터베이스 로드를 분산할 수 있습니다. 따라서 데이터베이스 응답을 최대한 빠르게 만듭니다.
MariaDB 데이터베이스의 master+slave 복제 설정 시 위와 같이 마스터 서버(master1)가 설정됩니다.
슬레이브 서버로 이동합니다. 슬레이브 my.cnf 파일에 다음 구성을 추가합니다.
#replication server_id = 2 report_host = slave2 log_bin = /var/lib/mysql/mariadb-bin log_bin_index = /var/lib/mysql/mariadb-bin.index relay_log = /var/lib/mysql/relay-bin relay_log_index = /var/lib/mysql/relay-bin.index
MariaDB 서비스를 다시 시작합니다. 첫 번째 서버에서 bin_log 정보 가져오기:
MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +--------------------+----------+--------------+------------------+ | mariadb-bin.000001 | 664 | | | +--------------------+----------+--------------+------------------+
슬레이브 서버의 mariadb 콘솔에서 다음 명령을 실행합니다.
MariaDB [(none)]> STOP SLAVE;
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='IP_master', MASTER_USER='test_master', MASTER_PASSWORD='test_master', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=664;
MariaDB [(none)]> START SLAVE;
SET GLOBAL read_only = ON;
또한 데이터베이스 메모리 덤프를 생성하여 슬레이브 서버의 MariaDB에 데이터를 초기 업로드하는 데 사용해야 합니다.
슬레이브 상태를 확인하려면:SHOW SLAVE STATUS\G;
마스터에서 데이터베이스를 생성하려면:
MariaDB [(none)]> create database master_hello;
Slave 서버에서도 데이터베이스가 생성되었는지 확인하십시오:
MariaDB [(none)]> show databases;
+--------------------+ | Database | +--------------------+ | information_schema | | master_hello | | master_test | | mysql | | performance_schema | | test | +--------------------+
Slave 서버에 데이터베이스를 생성하고 해당 데이터베이스가 마스터에 복제되었는지 확인합니다.
보시다시피 데이터베이스를 생성했으며 Slave에 존재합니다. 마스터에 등장했는지 확인해보자. 그렇지 않다. 데이터는 슬레이브에서 마스터로 복제되지 않습니다.
이는 MariaDB 복제가 한 방향으로만 작동함을 의미합니다. 다시 확인하고 master_hello를 삭제해 보겠습니다. 슬레이브 서버의 데이터베이스:
마스터 서버에서 삭제되었는지 확인:
보시다시피 정상이고 데이터베이스가 존재합니다.
추신:mariadb 복제를 구성할 때 방화벽이 가장 빈번하게 발생하는 몇 가지 함정에 직면할 수 있습니다. 기본적으로 방화벽은 CentOS에 설치되어 MariaDB 복제 포트(TCP 3396)를 차단합니다. iptables를 사용하여 포트를 열거나 방화벽을 비활성화할 수 있습니다(최상의 옵션은 아님).
데이터베이스가 연결을 기다리는 IP 주소는 my.cnf.의 bind-address 매개변수에 지정됩니다. 로컬 및 외부 연결을 허용하려면 이 줄에 주석을 달고 마스터에서 연결을 허용하는 iptables 규칙을 추가해야 합니다. /slave IP 주소를 포트 3306에 연결합니다.
iptables -I INPUT -p tcp -s ip_address_slave_server --dport 3306 -j ACCEPT
iptables -I INPUT -p tcp --dport 3306 -j DROP
초기 설정 중에 이 문제가 발생했지만 쉽게 감지됩니다. 슬레이브 상태 확인을 실행하면 SHOW SLAVE STATUS\G
, 다음 오류가 표시됩니다.
#replication
에 일부 매개변수를 추가할 수 있습니다. my.cnf 파일에서 차단하십시오. 아래에서 몇 가지 예와 유용한 매개변수에 대한 간략한 설명을 드리겠습니다. mariadb 데이터베이스 복제를 구성할 때 도움이 될 수 있는 다른 기능의 몇 가지 예를 보여 드리겠습니다.
server_id = 1
— 서버 ID를 지정합니다. 일반적으로 1부터 시작하지만 복제에 사용되는 다른 서버의 번호와 일치하지 않는 번호를 사용할 수 있습니다.
report_host = master
— 일반적으로 서버의 호스트 이름을 지정하지만 대신 해당 IP 주소를 입력할 수도 있습니다.
log_bin = /var/lib/mysql/mariadb-bin
— 업데이트 로그(log_bin)의 경로입니다.
log_bin_index = /var/lib/mysql/mariadb-bin.index
— 현재 활성화된 로그와 이전에 사용된 로그를 확인할 수 있습니다.
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index
— 복제 로그입니다.
특정 데이터베이스 또는 선택한 데이터베이스의 복제본을 구성하려면 다음 매개변수를 사용하십시오.
replicate-do-db = dbname
— 여러 데이터베이스가 필요한 경우 쉼표로 구분하여 이름을 지정하십시오.
복제에서 일부 데이터베이스를 제외하려면(일반적으로 서비스 데이터베이스는 복제에서 제외:information_schema, mysql 및 performance_schema):
binlog-ignore-db = dbname
bin_log에 대한 로그 기록 시간을 설정하려면:
expire_logs_days = 10
— 여기서 10은 로그가 저장될 일 수입니다.
또한 마스터 서버의 데이터가 다른 이름으로 데이터베이스에 기록된 경우 구성 파일에서 설정할 수 있습니다.
replicate-rewrite-db=dbmastername->dbslavename
복제 구성이 완료되었습니다. 이 기사를 사용하면 아무 문제 없이 마스터 + 마스터 및 마스터 + 슬레이브 모드에서 MariaDB 복제를 구성할 수 있다고 생각합니다.