Percona는 MySQL에서 근무하던 엔지니어 몇 명이 설립한 MYSQL 개발 및 컨설팅 회사입니다. Percona Xtradb는 mysql 엔진인 innodb에 Galera패치 등을 적용한 DB엔진입니다. Percona를 이용해서 클러스터를 구축하게 된 이유는 MariaDB보다 먼저 Galera를 포함한 패키지를 배포했기 때문입니다.
Percoan Xtradb Cluster는 Active/active의 고가용성을 지원하는 솔루션이며 클러스터를 구축하기 위한 핵심 기술인 Codership Galera 라이브러리를 포함하고 있습니다. percona XtraDB 클러스터의 기능 중 가장 중요한 기능은 Multi-master replication 및 Synchronous replication 지원한다는 것입니다.
그럼 percona를 이용한 클러스터의 설치 방법 및 동작방식에 대해서 설명을 드리도록 하겠습니다.
Percona의 동작방식을 이해하기 위해선 Galera 클러스터에 대한 이해가 필요합니다.
http://galeracluster.com/에서 제공되는 오픈소스로 Synchronous replication를 지원하는데, Synchronous replication를 지원하기 위해서는 Galera cluster Architecture에 대한 이해가 필요하며, Galera는 아래의 그림처럼 Certification Based Replication방식으로 동기화 처리를 합니다.
참고) http://galeracluster.com/documentation-webpages/galera-documentation.pdf
Certification Based Replication은 트랜잭션을 지원하는 innodb기반에서만 지원을 하는 모델이며, 트랜잭션이 실행이 되면 클러스터에 참여하고 있는 다른 노드에 해당 트랜잭션(Global trx ID)의 처리 가능여부 확인 후 각 노도에 동시에 처리되는 모델입니다.
Percona Xtradb 이용한 Cluster 설치하기.
클러스터를 구성하기 위해서는 서버3대를 기본으로 추전하며 각각의 노도의 Host설정을 다음과 같이 합니다.
node #1
hostname: percona1
IP: 192.168.20.234
node #2
hostname: percona2
IP: 192.168.20.235
node #3
hostname: percona3
IP: 192.168.20.236
설치 전 필요조건은 기본적으로 CentOS6.x버전 설치, 방화벽에서 3306,4444,4567,4568을 오픈하고, SELinux는 disable시키는 것입니다.
설치방법은 RPM기준이며 Centos의 yum repository를 등록합니다.
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
Percona-XtraDB-Cluster-56설치
yum install Percona-XtraDB-Cluster-56
node별 설정
node1의 my.cnf
[mysqld]
datadir=/var/lib/mysql
user=mysql
# Path to Galera library
wsrep_provider=/usr/lib64/libgalera_smm.so
# Cluster connection URL contains the IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://192.168.20.234,192.168.20.235,192.168.20.236
# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW
# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB
# This changes how InnoDB autoincrement locks are managed and is a requirement for Galera
innodb_autoinc_lock_mode=2
# Node #1 address
wsrep_node_address=192.168.20.234
# SST method
wsrep_sst_method=xtrabackup-v2
# Cluster name
wsrep_cluster_name=my_centos_cluster
# Authentication for SST method
wsrep_sst_auth=”sstuser:s3cret”
node1 mysql start시 bootstrap-pxc옵션으로 Cluster를 시작
[root@percona1 ~]# /etc/init.d/mysql bootstrap-pxc
아래의 명령으로 cluster가 정상적으로 start되었는지 확인이 가능합니다.
mysql> show status like ‘wsrep%’;
+—————————-+————————————–+
| Variable_name | Value |
+—————————-+————————————–+
| wsrep_local_state_uuid | c2883338-834d-11e2-0800-03c9c68e41ec |
…
| wsrep_local_state | 4 |
| wsrep_local_state_comment | Synced |
…
| wsrep_cluster_size | 1 |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
…
| wsrep_ready | ON |
+—————————-+————————————–+
Percoan Cluster의 경우 State Snapshot Transfer(SST)를 지원합니다. 즉 node간 데이터 불일치가 발생하는 경우 서로간 sync를 하기 위한 도구를 지원하는데 이를 위한 계정을 생성해야 합니다.
mysql@percona1> CREATE USER ‘sstuser’@’localhost’ IDENTIFIED BY ‘s3cret’;
mysql@percona1> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO ‘sstuser’@’localhost’;
mysql@percona1> FLUSH PRIVILEGES;
node2 , node3 의 설정(해당 IP설정만 각각 다름)
[mysqld]
datadir=/var/lib/mysql
user=mysql
# Path to Galera library
wsrep_provider=/usr/lib64/libgalera_smm.so
# Cluster connection URL contains IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://192.168.20.234,192.168.20.235,192.168.20.236
# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW
# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB
# This changes how InnoDB autoincrement locks are managed and is a requirement for Galera
innodb_autoinc_lock_mode=2
# Node #2 address
wsrep_node_address=192.168.20.235
# Cluster name
wsrep_cluster_name=my_centos_cluster
# SST method
wsrep_sst_method=xtrabackup-v2
#Authentication for SST method
wsrep_sst_auth=”sstuser:s3cret”
node2 , node3 의 mysql start
[root@percona2 ~]# /etc/init.d/mysql start
[root@percona3 ~]# /etc/init.d/mysql start
Node1 , node2 , node3 모두 정상적으로 start가 되면 아래와 같은 정보가 확인됩니다.
show status like ‘wsrep%’;
| wsrep_local_state | 4
| wsrep_local_state_comment | Synced
| wsrep_cert_index_size | 8
| wsrep_cert_bucket_count | 1752
| wsrep_gcache_pool_size | 205253
| wsrep_causal_reads | 0
| wsrep_cert_interval | 0.000000
| wsrep_incoming_addresses | 192.168.20.234:3306,192.168.20.235:3306,192.168.20.236:3306
| wsrep_evs_delayed | e0f7c8af-b9b4-11e5-abf4-de445764f39f:tcp://192.168.20.236:4567:1 |
| wsrep_evs_evict_list |
| wsrep_evs_repl_latency | 0/0/0/0/0
| wsrep_evs_state | OPERATIONAL
| wsrep_gcomm_uuid | 3f1bad43-b99f-11e5-a4d4-568b56afefef
| wsrep_cluster_conf_id | 11
| wsrep_cluster_size | 3
| wsrep_cluster_state_uuid | e6819dce-af5b-11e5-9568-9f48b7ed2555
| wsrep_cluster_status | Primary
| wsrep_connected | ON
| wsrep_local_bf_aborts | 0
| wsrep_local_index | 0
| wsrep_provider_name | Galera
| wsrep_provider_vendor | Codership Oy <info@codership.com> |
| wsrep_provider_version | 3.12.2(rf3e626d)
| wsrep_ready | ON
간단 테스트(node1)
mysql> CREATE DATABASE percona;
Query OK, 1 row affected (0.01 sec)
mysql> use percona;
mysql> CREATE TABLE example (node_id INT PRIMARY KEY, node_name VARCHAR(30));
mysql> INSERT INTO percona.example VALUES (1, ‘percona1’);
Query OK, 1 row affected (0.00 sec)
mysql> select * from percona.example ;
+———+———–+
| node_id | node_name |
+———+———–+
| 1 | percona1 |
+———+———–+
1 row in set (0.00 sec)
Node2의 DB에서 Node1에서 생성한 DB 및 table의 정보를 확인하실 수 있습니다.
mysql>
mysql>
mysql> use percona ;
Database changed
mysql> show tables ;
+——————-+
| Tables_in_percona |
+——————-+
| example |
+——————-+
1 row in set (0.00 sec)
mysql> select * from example ;
+———+———–+
| node_id | node_name |
+———+———–+
| 1 | percona1 |
+———+———–+
1 row in set (0.00 sec)
mysql>
여기까지 percoan Xtradb를 이용한 클러스터 구축 간단 설치 방법이었습니다.
<참고문서>
https://www.percona.com/doc/percona-xtradb-cluster/5.6/howtos/centos_howto.html
https://www.percona.com/doc/percona-xtradb-cluster/5.6/installation/yum_repo.html