반응형

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 라는 컬럼을 가진다고 가정하자.

테이블의 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 를 보장한다.

 

 SELECT, SHOW, BEGIN / START TRANSACTION 을 포함한 READ Statement 를 검사

 UPDATE, DELETE statements 를 검사

 1, 2 를 포함한다.

 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

반응형

+ Recent posts