Galera Cluster에서 auto increment 컬럼에 따로 값을 지정하지 않으면 해당 노드들끼리 중복이 생겨 정합성이 깨지는 경우가 생길 수 있다.
그래서 옵션에서 중복허용되지 않게 하기 위해 증가되는 값을 설정함으로써 중복을 방지한다.
예를들어 2개의 노드라고 한다면 1번 노드에서는 1,3,5,7,9로 증가하고 2번 노드에서는 2,4,6,8,10 이런식으로 증가한다.
해당 부분을 테스트하여 공유 및 이에 대한 자세한 내용도 첨부해 본다.
* 해당 서버는 노드수가 5개라 현재 5로 되어 있는 것을 확인할 수 있다
- 1번 노드에서 Insert 진행
- 3번 노드에서 insert 진행
노란색을 보면 28까지는 5씩 증가 했지만 a3 에서 넣는 순간 부터는 29에서 진행 후 다시 5씩 증가하는 것을 확인 가능하다.
좀더 자세한 내용은 아래 확인하면 될 듯 싶다.
[출처] http://h391106.tistory.com/323
1. MariaDB Galera Cluster Variables
wsrep_auto_increment_control
wsrep_causal_reads
wsrep_certify_nonPK
wsrep_cluster_address
wsrep_cluster_name
wsrep_convert_LOCK_to_trx
이 문서는 위 Variables 에 대해 다루고 있다.
테스트에 사용한 MariaDB 는 5.5.39 이며, wsrep_provider_version 은 내장되어 있던 25.3.5(r178) 를 사용하였다.
문서에서 언급 한 각 Variables 의 default, Introduced, deprecated 의 정보는 8.A 를 확인한 내용이며, 이는 wsrep API patch v0.8 를 기준으로 한다.
2. wsrep_auto_increment_control
Default = on
Introduced = 1
Cluster membership 에 변화가 있을 때
auto_increment_increment 와 auto_increment_offset system variables 을 자동으로 조정한다.
Cluster Membership 의 변화란 클러스터를 구성하는 노드에 변화가 있어 클러스터 사이즈가 커지거나 작아지는 경우를 말한다.
계획 된 작업으로 신규 노드를 추가하는 일도, 장애가 발생해 노드가 클러스터 구성에서 빠지는 일도 Cluster Membership 의 변화이다.
wsrep_auto_increment_control = on 사용으로 INSERT 구문으로 인한 충돌을 줄여준다고 한다.
여기서 말하는 충돌은 MariaDB 의 Duplicate entry 에러를 의미하며, pk 로 auto_increment 를 사용하는 경우를 말한다.
auto_increment_increment
Default = (wsrep_cluster_size)
auto_increment_offset
Default = (Cluster 를 구성하는 노드 1, 2, 3, … 순차적으로 값을 가져간다.)
위의 두 파라미터는 Galera cluster 이전에도 존재하던 Variables 이다.
특히 매뉴얼을 보면 MASTER – TO MASTER Replication (DUAL MASTER) 셋팅에서 사용한다고 한다.
3 node Galera Cluster 를 구성하면 다음과 같이 System Variable 값을 가져간다. ( wsrep_auto_increment_control = on )
전 노드 공통으로 auto_increment_increment = 3
각 노드는 auto_increment_offset = [1|2|3]
auto_increment_offset 의 값이 auto_increment_increment 의 값보다 큰 경우 auto_increment_offset 의 값은 무시되며,
이외의 경우 auto_increment 의 기대되는 값은 다음의 공식을 따른다.
(현재의 auto_increment 보다 큰 가장 작은 값 ) = auto_increment_offset + N * auto_increment_increment
wsrep_auto_increment_control = on 을 사용하는 3 NODE CLUSTER 에서 A 라는 테이블이 AUTO_INCREMENT 를 사용하는 B 라는 컬럼을 가진다고 가정하자.
A 테이블의 B 컬럼의 AUTO_INCREMENT 로 할당 된 가장 큰 값이 20 이라고 할 때 기대되는 다음 AUTO_INCREMENT 는 다음과 같다.
auto_increment_increment = 3
auto_increment_offset = 1
ð 22
auto_increment_increment = 3
auto_increment_offset = 2
ð 23
auto_increment_increment = 3
auto_increment_offset = 3
ð 24
결과적으로 auto_increment_offset = on 의 사용으로 AUTO_INCREMENT 를 PKEY 로 사용하는 경우에 대해
INSERT 시 DUPLICATE ENTRY 에러를 줄일 수 있다.
3. wsrep_causal_reads
Default = off
Introduced = 1
Deprecated = 3.6
이 기능은 3.6 에서 deprecated 되었으며, wsrep_sync_wait 로 대체되었다.
wsrep_sync_wait
Introduced = 3.6
아래 값을 지정하면 해당하는 오퍼레이션을 수행하기 전에 동기화 된 읽기 view 를 보장한다.
1 – SELECT, SHOW, BEGIN / START TRANSACTION 을 포함한 READ Statement 를 검사
2 – UPDATE, DELETE statements 를 검사
3 – 1, 2 를 포함한다.
4 – INSERT, REPLACE statement 를 검사
4. wsrep_certify_nonPK
Default = on
Introduced = 1
wsrep_certify_nonPK = on 인 경우 PK 없는 테이블에 대해 DML 을 허용한다.
(내부적으로 pk 를 생성하는 듯 함 – 확인할 것…)
wsrep_certify_nonPK = off 인 경우 PK 없는 테이블에 DML 을 사용하는 경우 다음과 같은 에러가 발생한다.
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
5. wsrep_cluster_address
Cluster Membership 을 구성하는데 사용되는 System Variable 이다.
클러스터의 최초 노드를 구성하는 경우 gcomm:// 셋팅으로 startup 한다.
이 의미는 다른 클러스터 노드에 접속하지 않는다란 뜻이다.
이후 해당 vriable 을 클러스터를 구성하는 전 노드로 업데이트 한다.
A, B, C 라는 3개의 Address 가 있다고 하면 gcomm:// 셋팅으로 인스턴스를 시작한 이후,
gcomm://A,B,C 로 변경한다.
사실 위 과정 없이도 Joiner 노드의 올바른 wsrep_cluster_name 구성과 wsrep_cluster_address 구성이 있다면
startup 하는데 문제가 없다.
6. wsrep_cluster_name
Default = my_wsrep_cluster
Introduced = 1
Logical 한 Cluster name 을 지정한다.
Cluster name 이 다르면 Cluster Membership 참가가 실패한다.
이를 테면 Donor node 에서는 다음과 같은 에러가 발생하다 Joiner node 프로세스가 죽는다.
[Note] WSREP: handshake failed, my group: 'mariatest', peer group: 'my_wsrep_cluster'
이 Variable 셋팅으로 하나의 장비에 여러 서비스 목적의 Cluster 를 구성하는 경우나,
wsrep_cluster_address 를 실수로 잘못 지정한 경우에 데이터를 보호할 수 있다.
7. wsrep_convert_LOCK_to_trx
Default = off
Introduced = 1
LOCK / UNLOCK TABLES 를 BEGIN / COMMIT statements 로 바꿔준다.
암묵적으로 locking sessions 을 transactions 을 사용하도록 변환한다.
이 옵션이 off 인 상태에서는
NODE #1 – lock table test [ read | write ]
NODE #1 – Insert : Waiting
NODE #2 – No Waiting
NODE #3 – No Waiting
on 인 경우에는 같은 테스트에서 NODE #1 에서의 Insert : Waiting 이 없다.
8. REFERENCE
A. wsrep 파라미터
http://galeracluster.com/documentation-webpages/mysqlwsrepoptions.html
B. mariadb 파라미터
https://mariadb.com/kb/en/mariadb/documentation/optimization-and-tuning/system-variables/server-system-variables/
C. wsrep_auto_increment_control
http://www.percona.com/blog/2011/01/12/conflict-avoidance-with-auto_increment_incremen-and-auto_increment_offset/
D. 16.1.2.2 Replication Master Options and Variables
http://dev.mysql.com/doc/refman/5.0/en/replication-options-master.html
E. Bootstrapping the cluster
http://www.percona.com/doc/percona-xtradb-cluster/5.5/manual/bootstrap.html