본문 바로가기
MySQL HA & DR/Group Replication

2. Getting Started

by 모모레 2017. 2. 28.

MySQL Group Replication은 MySQL server에 플러그인 형태로 제공된다. 그래서 그룹내 각 서버들은 Group Replication을 사용하기 위해 플러그인을 설치해서 설정해야 하는 것이 필요하다. 여기에서는 3대의 서버를 가지고 어떻게 구성할 수 있는지에 대해 자세히 알아볼 것이다. 


1. Deploying Group Replication in Single-Primary Mode

그룹 내의 각 서버의 인스턴스들은 물리적인 장비로 따로 따로 구성되어 독립적으로 운영된다. 여기에서는 하나의 물리 장비에서 3개의 MySQL 인스턴스를 사용하여 어떻게 구성하는 지에 대해 알아볼 것이다. 이 말은 각각 3개의 데이터 디렉토리가 필요하다는 것을 의미한다. 


https://dev.mysql.com/doc/refman/5.7/en/images/gr-3-server-group.png


여기에서는 Group Replication에 대해 어떻게 설치할 것인지에 대해서만 이야기를 나눌 것이지, MySQL 인스턴스를 어떻게 설치할 것인지에 대한 것을 정리하지는 않을 것이다. 


1.1 Deploying Instance for Group Replication 

먼저 사용하고자 하는 MySQL 을 설치하여 인스턴스를 생성한다. MySQL Ver. 5.7.17부터 Group Replication이 내부에 포함되어 있으므로 해당 버전 이상으로 설치하면 좋다. 


1.2 Configuring an Instance for Group Replication 


1.2.1 Group Replication Server Settings


Group Replication 플러그인을 설치하기 위해서는 MySQL Server 인스턴스의 정보를 정확하게 설정해야 한다. 즉, my.cnf에 해당 정보를 모두 기입하여 저장하는 것을 추천한다. 또한, 디렉토리 정보는 절대 경로로 설정하는 것을 추천한다. 


예제는 다음과 같다. 


[mysqld]


# server configuration

datadir=<full_path_to_data>/data/s1

basedir=<full_path_to_bin>/mysql-5.7/


port=24801

socket=<full_path_to_sock_dir>/s1.sock



1.2.2 Replication Framework 

MySQL Group Replication을 구성하기 위해 MySQL Replication 은 다음과 같이 설정해야 한다. 


server_id=1

gtid_mode=ON

enforce_gtid_consistency=ON

master_info_repository=TABLE

relay_log_info_repository=TABLE

binlog_checksum=NONE

log_slave_updates=ON

log_bin=binlog

binlog_format=ROW


MySQL Group Replication은 GTID를 사용하여 Replication을 구성해야 한다. 그리고, 해당 정보를 테이블로 구성하여 관리해야만 한다. 또한 모든 서버가 관련된 바이너리 로그를 모두 가질 수 있게 log_slave_updates로 활성화 시켜야 하고, 빈로그 포맷은 무조건 ROW로 설정해야 한다. 이때 바이너리 로그 이벤트의 체크섬은 비활성화 해야 한다. 


1.2.3 Group Replication Settings

이제 Group Replication을 설정한다. my.cnf 에 다음과 같이 설정해야 한다.

 

transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "127.0.0.1:24901"
loose-group_replication_group_seeds= "127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903"
loose-group_replication_bootstrap_group= off

 

여기서 loose로 시작하는 시스템 변수는 MySQL Group Replication을 설정하기 위해 사용하는 시스템 변수를 의미한다. 해당 변수들은 서버가 시작할 때 Group Replication이 같이 로딩되지 않으면 서버를 계속 시작하게 만든다.

 

-- 첫번째 설정은 각각의 트랜잭션 정보를 인코딩 할때 XXHASH64 알고리즘을 사용하여 인코딩한다는 것을 의미한다.

-- 두번째 설정은 생성되고 사용하게 되는 그룹의 이름을 의미한다. 해당 그룹의 이름은 aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa 이다.

-- 세번째 설정은 서버가 시작할때 그룹 리플리케이션을 자동으로 띄우지 않게 설정한다는 것을 의미한다.

-- 네번째 설정은 플러그인이 사용하는 로컬 서버 정보를 지정한 것이다. 해당 정보를 가지고 그룹 내에서 다른 서버들과 통신한다. 여기서 설정하는 정보는 외부에서 접근할 때 사용하는 정보가 아니라 내부 서버들 끼리 통신하는데 사용하는 통신 정보임을 기억해야 한다. 그래서 해당 정보는 서로간에 통신하는데 문제없는 정보이어야 한다. 

-- 다섯번째 설정 정보는 그룹내에서 시드 서버로 사용할 서버들에 대한 설정정보이다. 시드 서버란, 그룹에 새로운 서버가 가입할때 가입을 인증하고 가입 프로세스를 진행할 수 있게 도와주는 서버를 말한다. 이 정보는 그룹내의 모든 서버들을 기입할 필요는 없다. 그리고 이 정보는 두번째 서버 부터 사용하는 정보이다. 첫번째 서버가 그룹내에 가입될 때에는 사용하지 않는다. 그룹안에 여러 서버가 가입될 때 동시에 여러 서버가 가입되게는 지원되지 않는다. 순차적으로 작업을 진행해야 한다. 또한, 바로 전에 가입된 서버는 가능하면 시드 서버로 사용하지 않는 것이 좋다. 내부적으로는 아직 가입 완료 상태가 아닐 수 있다. 

-- 여섯번째 정보는 그룹내에 가입할때 부트스트랩을 사용할 것인지를 결정하는 시스템 변수이다. 해당 시스템 변수는 그룹내에 첫번째 서버가 가입될 때에만 사용하거나 전체 그룹을 중단하고 다시 백업을 해야 하는 경우에만 사용하는 변수이다. 그래서 첫번째 서버가 뜬 후에는 해당 변수는 비활성화 해야 한다. 


1.3 User Credentials 


MySQL Group Replication은 비동기 복제 프로토콜을 사용하여 분산 복구를 수행하여 그룹에 서버가 가입될때 동기화 한다. 분산 복구 프로세스는 그룹 구성원간에 트랜잭션을 전송하는 데 사용되는 group_replication_recovery라는 복제 채널을 사용합니다. 따라서 올바른 사용 권한을 가진 복제 사용자를 설정하여 그룹 복제가 구성원 간 직접 복구 복제 채널을 직접 설정할 수 있도록해야합니다. 


이때 사용하는 계정은 REPLICATION-SLAVE 권한이 필요하다. 

mysql> SET SQL_LOG_BIN=0;

Query OK, 0 rows affected (0,00 sec)


mysql> CREATE USER rpl_user@'%';

Query OK, 0 rows affected (0,00 sec)


mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'rpl_pass';

Query OK, 0 rows affected, 1 warning (0,00 sec)


mysql> FLUSH PRIVILEGES;

Query OK, 0 rows affected (0,00 sec)


mysql> SET SQL_LOG_BIN=1;

Query OK, 0 rows affected (0,00 sec)


 다른 서버로 해당 작업이 전달되지 않기 위해 바이너리 로그가 작성되지 않게 작업해야 한다. 그 다음에 다음과 같이 CHANGE MASTER TO 구문을 사용하여 복구 작업이 진행되도록 해야 한다. 


mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='rpl_pass' \\

     FOR CHANNEL 'group_replication_recovery';

Query OK, 0 rows affected, 2 warnings (0,01 sec)

 

1.4 Launching Group Replication 


MySQL Group Replication이 시작되면 Group Replication Plugin을 설치해야 한다. 다음과 같이 실행한다.


INSTALL PLUGIN group_replication SONAME 'group_replication.so';


SHOW PLUGINS 구문을 실행하면 해당 플러그인이 잘 설정되었는지 확인해 볼 수 있다. 


Group Replication을 실행하기 위해 첫번째 서버는 Bootstrap으로 띄워져야 한다. 그룹에 추가되는 첫번째 서버에서만 한번 실행해야 한다. 그래서 해당 시스템 변수는 my.cnf에 저장되어서는 안된다. 만약, 해당 정보가 파일에 ON으로 기록되어 있다면, 해당 서버는 계속 재시작 되면서 두번째 그룹을 만들려고 할 것이다. 결과적으로 같은 이름의 두개의 그룹이 만들어지게 될 것이다. 그래서 Bootstrap은 다음과 같이 Command 형태로 설정하여 사용하는 것이 좋다


SET GLOBAL group_replication_bootstrap_group=ON;

START GROUP_REPLICATION;

SET GLOBAL group_replication_bootstrap_group=OFF;


START GROUP_REPLICATION을 실행하면 Group Replication은 시작된다. 그리고 다음과 같이 정보를 확인해 볼 수 있다. 


mysql> SELECT * FROM performance_schema.replication_group_members;

+---------------------------+--------------------------------------+-------------+-------------+---------------+

| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE  |

+---------------------------+--------------------------------------+-------------+-------------+---------------+

| group_replication_applier | ce9be252-2b71-11e6-b8f4-00212844f856 | myhost      |       24801 | ONLINE        |

+---------------------------+--------------------------------------+-------------+-------------+---------------+

1 row in set (0,00 sec)


1.5 Adding Instances to the Group


여기에서는 하나의 생성된 Group에 서버 하나를 추가하는 방법에 대해 알아볼 것이다. 


1.5.1 Adding a Second Instance


두번째 서버를 추가하려면 먼저 설정 파일을 생성해야 한다. 첫번째 서버를 추가한 것과 거의 유사하다. 


[mysqld]


# server configuration

datadir=<full_path_to_data>/data/s2

basedir=<full_path_to_bin>/mysql-5.7/


port=24802

socket=<full_path_to_sock_dir>/s2.sock


#

# Replication configuration parameters

#

server_id=2

gtid_mode=ON

enforce_gtid_consistency=ON

master_info_repository=TABLE

relay_log_info_repository=TABLE

binlog_checksum=NONE

log_slave_updates=ON

log_bin=binlog

binlog_format=ROW


#

# Group Replication configuration

#

transaction_write_set_extraction=XXHASH64

loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"

loose-group_replication_start_on_boot=off

loose-group_replication_local_address= "127.0.0.1:24902"

loose-group_replication_group_seeds= "127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903"

loose-group_replication_bootstrap_group= off



그 다음 서버를 띄운다. 그리고, 다음과 같이 실행하여 데이터 동기화를 진행한다. 


SET SQL_LOG_BIN=0;

CREATE USER rpl_user@'%';

GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'rpl_pass';

SET SQL_LOG_BIN=1;

CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='rpl_pass' \\

FOR CHANNEL 'group_replication_recovery';


작업이 완료되면, Group Replication Plugin을 설치하고 Group Replication을 띄운다. 


mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';

Query OK, 0 rows affected (0,01 sec)


mysql> START GROUP_REPLICATION;

Query OK, 0 rows affected (44,88 sec)



여기서 보면 첫번째 서버와 다른 점이 있다. 즉 여기에서는 SET GLOBAL 구문을 실행하지 않는다는 점이다. group_replication_bootstrap_group=ON이 이미 실행 되었기 때문이다. 


performance_schema.replication_group_members 테이블을 다시 확인하면 그룹에 두 개의 ONLINE 서버가 있음을 확인할 수 있다. 


mysql> SELECT * FROM performance_schema.replication_group_members;

+---------------------------+--------------------------------------+-------------+-------------+---------------+

| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE  |

+---------------------------+--------------------------------------+-------------+-------------+---------------+

| group_replication_applier | 395409e1-6dfa-11e6-970b-00212844f856 | myhost       |       24801 | ONLINE       |

| group_replication_applier | ac39f1e6-6dfa-11e6-a69d-00212844f856 | myhost       |       24802 | ONLINE       |

+---------------------------+--------------------------------------+-------------+-------------+---------------+

2 rows in set (0,00 sec)


1.5.2 그 이후 서버 추가하기 


이후 서버를 추가하는 방법은 두번째 서버 추가하는 방법과 거의 동일하다. 


[mysqld]


# server configuration

datadir=<full_path_to_data>/data/s3

basedir=<full_path_to_bin>/mysql-5.7/


port=24803

socket=<full_path_to_sock_dir>/s3.sock


#

# Replication configuration parameters

#

server_id=3

gtid_mode=ON

enforce_gtid_consistency=ON

master_info_repository=TABLE

relay_log_info_repository=TABLE

binlog_checksum=NONE

log_slave_updates=ON

log_bin=binlog

binlog_format=ROW


#

# Group Replication configuration

#

transaction_write_set_extraction=XXHASH64

loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"

loose-group_replication_start_on_boot=off

loose-group_replication_local_address= "127.0.0.1:24903"

loose-group_replication_group_seeds= "127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903"

loose-group_replication_bootstrap_group= off


서버를 띄우고 다음과 같이 분산 복구 작업을 진행한다. 


SET SQL_LOG_BIN=0;

CREATE USER rpl_user@'%';

GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'rpl_pass';

FLUSH PRIVILEGES;

SET SQL_LOG_BIN=1;

CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='rpl_pass'  \\

FOR CHANNEL 'group_replication_recovery';


플러그인을 설치하고 GROUP_REPLICATION을 시작한다. 


INSTALL PLUGIN group_replication SONAME 'group_replication.so';

START GROUP_REPLICATION;



'MySQL HA & DR > Group Replication' 카테고리의 다른 글

6. Group Replication System Variables  (0) 2017.03.23
5. Group Replication Security  (0) 2017.03.21
4. Group Replication Operations  (0) 2017.03.15
3. Monitoring Group Replication  (0) 2017.03.13
1. Group Replication Background  (0) 2017.02.22