본문 바로가기

카테고리 없음

MariaDB Galera Cluster Variables v1.0

MariaDB Galera Cluster Variables #1

 

 

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