웹사이트 검색

Debian 10을 사용하여 MariaDB Galera 다중 마스터 동기식 복제를 설정하는 방법


이 페이지에서

  1. 요구 사항\n
  2. 1단계: MariaDB 설치
  3. 2단계: MariaDB 구성
  4. 3단계: 클러스터 부트스트랩
  5. 4단계: 테스트
  6. 5단계: 문제 해결 도움말\n
  7. 추가 정보

MariaDB는 두 가지 고가용성(HA) 및 클러스터링 솔루션을 제공합니다. 첫 번째는 주로 로드 밸런싱, HA 및 백업 목적을 위해 다양한 토폴로지로 구성할 수 있는 표준 MariaDB 마스터/슬레이브 복제입니다. 두 번째는 다중 마스터 동기 클러스터링 솔루션인 MariaDB Galera입니다. 주요 기능은 다음과 같습니다.

  • 다중 마스터: Galera 클러스터의 모든 노드는 읽기 및 쓰기 작업을 모두 수행할 수 있어 더 나은 확장성을 제공합니다.\n
  • 노드는 자동으로 클러스터에 가입할 수 있으며 실패 시 제거됩니다.\n
  • Galera 복제는 동기식입니다. 즉, 한 노드의 변경 사항이 다른 노드에 적용되도록 보장됩니다. 이론적으로 이것은 노드가 실패할 때 데이터가 손실되지 않도록 합니다.\n

이 가이드는 Galera 클러스터에서 MariaDB 설치 및 구성 과정을 안내합니다. 데모를 위해 3개의 Debian 10 노드를 사용할 예정이지만 노드 수(≥3)를 사용할 수 있습니다. Galera 클러스터에 두 개의 노드를 설정하는 것은 기술적으로 가능하지만 실패한 노드로 인해 다른 노드가 중지되므로 내결함성을 제공하지 않습니다.

요구 사항

  • 3개 이상의 Debian 10 인스턴스.
  • 루트 사용자 또는 sudo 권한이 있는 모든 사용자에 대한 액세스.\n
  • $EDITOR 환경 변수를 설정해야 합니다.\n

참고: Galera 클러스터는 WAN 또는 LAN을 통해 작동할 수 있습니다. 노드가 사설 네트워크를 공유하는 경우 해당하는 경우 사설 IP 주소를 사용하십시오. 그렇지 않으면 WAN 주소를 사용해야 합니다.

sudo 사용자를 사용하는 경우 다음을 사용하여 이 설정 기간 동안 루트 셸을 열고 사용합니다.

sudo -s

1단계: MariaDB 설치

이 단계는 모든 노드에서 실행되어야 합니다.

다음 명령을 사용하여 MariaDB, Galera 라이브러리 및 Rsync를 설치합니다. 후자는 Galera에서 사용합니다.

apt update
apt install -y mariadb-server mariadb-client galera-3 rsync

MariaDB 서비스가 활성화되어 있는지 확인합니다.

systemctl enable mariadb.service

mysql_secure_installation 스크립트를 사용하여 MariaDB 인스턴스를 보호하십시오.

mysql_secure_installation

아래와 같이 질문에 답하고 MySQL 루트 사용자에 대해 강력한 암호를 선택했는지 확인하십시오.

Enter current password for root (enter for none): Press <Enter>
Set root password? [Y/n] y
New password: your_password
Re-enter new password: your_password
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y
All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

2단계: MariaDB 구성

이 단계는 모든 노드에서 실행되어야 합니다.

모든 노드에서 MariaDB 서비스를 중지합니다.

systemctl stop mariadb.service

기본적으로 MariaDB 데몬은 localhost에서만 연결을 수신합니다. 클러스터가 작동하려면 외부에서 액세스할 수 있는 주소로 변경해야 합니다. 이렇게 하려면 옵션 파일 /etc/mysql/mariadb.conf.d/50-server.cnf를 편집합니다.

$EDITOR /etc/mysql/mariadb.conf.d/50-server.cnf

다음 줄을 찾으십시오.

bind-address = 127.0.0.1

클러스터에 사설 네트워크를 사용 중이고 MariaDB를 다른 네트워크(즉, WAN)에 노출하지 않으려면 각 노드에 로컬 IPv4 주소를 지정하십시오. 그렇지 않으면 MariaDB가 모든 인터페이스에서 수신하도록 지시하는 0.0.0.0을 사용합니다. 예를 들어:

bind-address = 0.0.0.0

변경 사항을 저장하고 텍스트 편집기를 종료합니다.

이제 클러스터 관련 옵션을 구성하겠습니다. 새 옵션 파일을 만듭니다.

$EDITOR /etc/mysql/mariadb.conf.d/99-cluster.cnf

파일에 다음과 같은 합리적인 구성을 입력하고 IP 주소를 바꿉니다. 모든 노드에서 동일해야 합니다.

[galera]

wsrep_on = on wsrep_provider = /lib/galera/libgalera_smm.so wsrep_cluster_address = gcomm://192.0.2.1,192.0.2.2,192.0.2.3 wsrep_cluster_name = galera_cluster_0 default_storage_engine = InnoDB innodb_autoinc_lock_mode = 2 innodb_doublewrite = 1 binlog_format = ROW

  • wsrep_on = on은 Galera에서 사용하는 기본 기능인 쓰기 세트 복제를 활성화합니다.\n
  • wsrep_provider는 galera 라이브러리의 경로를 지정합니다. Debian 10의 /lib/galera/libgalera_smm.so에 있는 galera-3 패키지에서 제공합니다.\n
  • wsrep_cluster_address는 다른 클러스터 구성원의 주소를 하나 이상 포함해야 합니다. 클러스터의 모든 구성원을 나열하는 것이 좋습니다. 특별한 순서는 필요하지 않습니다.\n
  • wsrep_cluster_name은 클러스터에 고유해야 하며 동일한 galera 클러스터의 모든 노드에서 동일해야 합니다.\n
  • Galera가 제대로 작동하려면 나머지 옵션이 필요하며 변경해서는 안 됩니다.\n

3단계: 클러스터 부트스트랩

진행하기 전에 MariaDB가 모든 노드에서 중지/비활성 상태인지 확인하십시오.

systemctl status mariadb.service

클러스터를 시작하려면 노드에서 먼저 클러스터를 생성해야 합니다. Debian 10에서는 galera_new_cluster 스크립트로 이 작업을 수행할 수 있습니다. 스크립트는 한 노드에서만 실행되어야 하며 클러스터를 초기화하려면 한 번만 실행해야 합니다.

galera_new_cluster

그러면 현재 노드에서 MariaDB가 시작됩니다. 다음과 같이 실행 중인지 확인하십시오.

systemctl status mariadb.service

그런 다음 다음을 사용하여 다른 노드에서 MariaDB를 시작합니다.

systemctl start mariadb.service

이제 클러스터가 작동해야 합니다.

4단계: 테스트

클러스터가 의도한 대로 작동하는지 확인하려면 노드를 선택하고 MariaDB에 로그인합니다.

mysql -u root -p

다음 명령문을 발행하여 데이터베이스를 작성하십시오.

> CREATE DATABASE test0;
> \q

그런 다음 다른 모든 노드에서 이 새 데이터베이스를 확인합니다.

mysql -u root -p -e "SHOW DATABASES;"

위 명령은 test0이 포함된 목록을 반환해야 합니다.

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test0              |
+--------------------+

모든 노드에서 클러스터에 기록하여 보다 철저하게 테스트할 수 있습니다. 테스트에 만족하면 클러스터에서 불필요한 데이터베이스를 정리하십시오. 모든 노드를 사용할 수 있습니다.

mysql -u root -p -e "DROP DATABASE test0;"

5단계: 문제 해결 팁

노드/클러스터의 현재 상태에 대한 정보를 보려면 다음 쿼리를 사용하십시오.

mysql -u root -p -e "SELECT * FROM information_schema.global_status WHERE variable_name IN ('WSREP_CLUSTER_STATUS','WSREP_LOCAL_STATE_COMMENT','WSREP_CLUSTER_SIZE','WSREP_EVS_REPL_LATENCY','WSREP_EVS_DELAYED','WSREP_READY');"

정상적인 3노드 클러스터는 다음을 반환해야 합니다.

+---------------------------+----------------+
| VARIABLE_NAME             | VARIABLE_VALUE |
+---------------------------+----------------+
| WSREP_CLUSTER_SIZE        | 3              |
| WSREP_CLUSTER_STATUS      | Primary        |
| WSREP_EVS_DELAYED         |                |
| WSREP_EVS_REPL_LATENCY    | 0/0/0/0/0      |
| WSREP_LOCAL_STATE_COMMENT | Synced         |
| WSREP_READY               | ON             |
+---------------------------+----------------+

  • WSREP_CLUSTER_SIZE는 클러스터 구성 요소의 현재 노드 수를 나타냅니다.\n
  • WSREP_CLUSTER_STATUS는 클러스터 전체가 아니라 클러스터 구성 요소의 상태를 나타냅니다.
  • WSREP_EVS_DELAYED는 지연된 노드 목록을 보여줍니다. 정상 클러스터에서는 빈 값이 필요합니다.\n
  • WSREP_EVS_REPL_LATENCY는 복제 대기 시간을 min/avg/max/stddev/samplesize 형식으로 표시합니다. 값은 초 단위로 표시됩니다. 대기 시간이 너무 길면 성능이 저하될 수 있습니다.\n
  • WSREP_LOCAL_STATE_COMMENT는 현재 노드 상태를 보여줍니다.\n
  • WSREP_READY는 노드가 쿼리를 수락할 수 있는지 여부를 나타냅니다.\n

3노드 클러스터의 노드 연결이 끊어지면 클러스터는 2개의 노드로 구성된 기본 구성 요소와 기본이 아닌 구성 요소로 분할됩니다. 기본 구성 요소는 정전의 영향을 받지 않고 계속해서 정상 작동합니다. 기본이 아닌 구성 요소의 관점에서 위에 표시된 쿼리는 다음을 반환합니다.

+---------------------------+--------------------------------------------------------------------------------------------------------------------------------+
| VARIABLE_NAME             | VARIABLE_VALUE                                                                                                                 |
+---------------------------+--------------------------------------------------------------------------------------------------------------------------------+
| WSREP_CLUSTER_SIZE        | 1                                                                                                                              |
| WSREP_CLUSTER_STATUS      | non-Primary                                                                                                                    |
| WSREP_EVS_DELAYED         | 6b7864f2-fe7d-11e9-84ab-93e58c0d2907:tcp://192.0.2.1:4567:3,a421be89-fe7d-11e9-a91e-7e62f7562e58:tcp://192.0.2.3:4567:2        |
| WSREP_EVS_REPL_LATENCY    | 0/0/0/0/0                                                                                                                      |
| WSREP_LOCAL_STATE_COMMENT | Initialized                                                                                                                    |
| WSREP_READY               | OFF                                                                                                                            |
+---------------------------+--------------------------------------------------------------------------------------------------------------------------------+

다른 노드에 대한 연결 문제를 나타내는 WSREP_EVS_DELAYED 값을 확인합니다.

기본 구성 요소 노드에서 동일한 쿼리가 다음을 반환합니다.

+---------------------------+----------------------------------------------------------------+
| VARIABLE_NAME             | VARIABLE_VALUE                                                 |
+---------------------------+----------------------------------------------------------------+
| WSREP_CLUSTER_SIZE        | 2                                                              |
| WSREP_CLUSTER_STATUS      | Primary                                                        |
| WSREP_EVS_DELAYED         | a2217526-fe7d-11e9-8692-1f2f0cdb403d:tcp://192.0.2.2:4567:2    |
| WSREP_EVS_REPL_LATENCY    | 0/0/0/0/0                                                      |
| WSREP_LOCAL_STATE_COMMENT | Synced                                                         |
| WSREP_READY               | ON                                                             |
+---------------------------+----------------------------------------------------------------+

단일 노드 장애로부터 복구하기 위해 수동 개입이 필요하지 않습니다. 실패한 노드가 클러스터에 다시 연결되면 자동으로 클러스터와 동기화됩니다.

추가 정보

고급 구성 옵션은 Galera Cluster 시스템 변수를 참조하십시오.