18.5.13.3 MySQL Cluster 데이터 노드의 온라인 추가 : 자세한 예제
이 섹션에서는 MySQL Cluster 데이터 노드를 온라인으로 추가하는 방법을 설명하는 자세한 예제를 보여줍니다. 먼저 단일 노드 그룹에 2 개의 데이터 노드를 가진 MySQL Cluster에서 시작하여 두 노드 그룹에 4 개의 데이터 노드 클러스터에서 종료합니다.
구성의 시작 설명을 위해 최소한의 구성으로 다음의 정보만을 포함 config.ini
파일을 클러스터에서 사용한다고 가정합니다.
[ndbd default] DataMemory = 100M IndexMemory = 100M NoOfReplicas = 2 DataDir = /usr/local/mysql/var/mysql-cluster [ndbd] Id = 1 HostName = 192.168.0.1 [ndbd] Id = 2 HostName = 192.168.0.2 [mgm] HostName = 192.168.0.10 Id = 10 [api] Id=20 HostName = 192.168.0.20 [api] Id=21 HostName = 192.168.0.21
데이터 노드 ID와 다른 노드 간의 순서에 간격을두고 있습니다. 그러면 나중에 새롭게 추가되는 데이터 노드에 아직 사용되지 않은 노드 ID를 쉽게 지정할 수 있습니다.
또한 적절한 명령 행 또는 my.cnf
옵션을 사용하여 클러스터를 이미 시작하고, 관리 클라이언트에서 SHOW
를 실행하면 다음 것과 유사한 출력이 생성된다고 가정합니다.
-- NDB Cluster -- Management Client --
ndb_mgm> SHOW
Connected to Management Server at: 192.168.0.10:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=1 @192.168.0.1 (5.6.27-ndb-7.4.9, Nodegroup: 0, *)
id=2 @192.168.0.2 (5.6.27-ndb-7.4.9, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=10 @192.168.0.10 (5.6.27-ndb-7.4.9)
[mysqld(API)] 2 node(s)
id=20 @192.168.0.20 (5.6.27-ndb-7.4.9)
id=21 @192.168.0.21 (5.6.27-ndb-7.4.9)
마지막으로, 다음과 같이 생성 된 단일 NDBCLUSTER
테이블이 클러스터에 포함되어 있다고 가정합니다.
USE n; CREATE TABLE ips ( id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, country_code CHAR(2) NOT NULL, type CHAR(4) NOT NULL, ip_address varchar(15) NOT NULL, addresses BIGINT UNSIGNED DEFAULT NULL, date BIGINT UNSIGNED DEFAULT NULL ) ENGINE NDBCLUSTER;
이 섹션 뒷부분에 나와있는 메모리 사용률 및 관련 정보는이 테이블에 약 50000 개 삽입 한 후에 생성되었습니다.
이 예에서는 데이터 노드 프로세스에 단일 스레드 ndbd를 사용하는 것을 나타냅니다. 그러나 MySQL Cluster NDB 7.0.4 이상에서는 멀티 스레드 ndbmtd를 사용하는 경우에도 아래의 단계 ndbd가 표시된 부분을 ndbmtd에 대체하여이 예를 적용 할 수 있습니다. (Bug # 43108)
1 단계 : 구성 파일의 업데이트 텍스트 편집기에서 클러스터의 글로벌 구성 파일을 열고 2 개의 새로운 데이터 노드에 해당하는 [ndbd]
섹션을 추가합니다. (이러한 데이터 노드에 ID 3과 4를 부여하고 그들이 각각 192.168.0.3와 192.168.0.4의 주소에있는 호스트 시스템에서 실행된다고 가정합니다.) 새로운 섹션을 추가 한 후 config.ini
파일 내용이 다음과 같이 보입니다. 여기서 파일에 추가 한 부분은 굵게 표시되어 있습니다.
[ndbd default]
DataMemory = 100M
IndexMemory = 100M
NoOfReplicas = 2
DataDir = /usr/local/mysql/var/mysql-cluster
[ndbd]
Id = 1
HostName = 192.168.0.1
[ndbd]
Id = 2
HostName = 192.168.0.2
[ndbd]
Id = 3
HostName = 192.168.0.3
[ndbd]
Id = 4
HostName = 192.168.0.4
[mgm]
HostName = 192.168.0.10
Id = 10
[api]
Id=20
HostName = 192.168.0.20
[api]
Id=21
HostName = 192.168.0.21
필요한 변경이 완료되면 파일을 저장합니다.
2 단계 : 관리 서버를 재시작 클러스터 관리 서버를 다시 시작하려면 다음과 같이 별도의 명령을 실행하여 관리 서버를 중지 한 후 다시 시작해야합니다.
다음과 같이 관리 클라이언트의
STOP
명령을 사용하여 관리 서버를 중지합니다.ndb_mgm>
10 STOP
Node 10 has shut down. Disconnecting to allow Management Server to shutdown shell>관리 서버를 종료하면 관리 클라이언트가 종료하기 위해 시스템 쉘에서 관리 서버를 시작해야합니다. 단순하게하기 위해
config.ini
는 관리 서버 바이너리와 같은 디렉토리에 있다고 가정하고 있습니다 만, 실제로는 구성 파일의 정확한 경로를 지정해야합니다. 또한 관리 서버가 구성 캐시가 아니라 파일에서 새로운 구성을 읽을 수 있도록--reload
또는--initial
옵션도 지정해야합니다. 쉘의 현재 디렉토리를 관리 서버 바이너리가 배치되어있는 디렉토리와 동일한 경우는 다음과 같이 관리 서버를 호출 할 수 있습니다.shell>
ndb_mgmd -f config.ini --reload
2008-12-08 17:29:23 [MgmSrvr] INFO -- NDB Cluster Management Server. 5.6.27-ndb-7.4.9 2008-12-08 17:29:23 [MgmSrvr] INFO -- Reading cluster configuration from 'config.ini'
ndb_mgm 프로세스가 다시 시작 된 후 관리 클라이언트에서 SHOW
의 출력을 선택하면 다음과 같이 표시됩니다.
-- NDB Cluster -- Management Client --
ndb_mgm> SHOW
Connected to Management Server at: 192.168.0.10:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=1 @192.168.0.1 (5.6.27-ndb-7.4.9, Nodegroup: 0, *)
id=2 @192.168.0.2 (5.6.27-ndb-7.4.9, Nodegroup: 0)
id=3 (not connected, accepting connect from 192.168.0.3)
id=4 (not connected, accepting connect from 192.168.0.4)
[ndb_mgmd(MGM)] 1 node(s)
id=10 @192.168.0.10 (5.6.27-ndb-7.4.9)
[mysqld(API)] 2 node(s)
id=20 @192.168.0.20 (5.6.27-ndb-7.4.9)
id=21 @192.168.0.21 (5.6.27-ndb-7.4.9)
3 단계 : 기존의 데이터 노드의 롤링 재시작 실행 다음과 같이 RESTART
명령을 사용하면이 단계를 완전히 클러스터 관리 클라이언트에서 제공합니다.
ndb_mgm>1 RESTART
Node 1: Node shutdown initiated Node 1: Node shutdown completed, restarting, no start. Node 1 is being restarted ndb_mgm> Node 1: Start initiated (version 7.4.9) Node 1: Started (version 7.1.36) ndb_mgm>2 RESTART
Node 2: Node shutdown initiated Node 2: Node shutdown completed, restarting, no start. Node 2 is being restarted ndb_mgm> Node 2: Start initiated (version 7.4.9) ndb_mgm> Node 2: Started (version 7.4.9)
각
명령을 실행하면 관리 클라이언트가 X
RESTART「Node
라는 보고서가 출력 될 때까지 대기 한 후 계속합니다. X
: Started (version ...)」
mysql 클라이언트에서 ndbinfo.nodes
테이블을 선택하면 기존의 데이터 노드가 모든 업데이트 된 구성을 사용하여 다시 시작 된 것을 확인할 수 있습니다.
4 단계 : 모든 클러스터 API 노드의 롤링 재시작 실행 mysqladmin shutdown에 이어 mysqld_safe (또는 다른 시작 스크립트)를 사용하여 클러스터의 SQL 노드로 작동하는 각 MySQL 서버를 종료하고 다시 시작합니다. 이것은 다음 것과 비슷합니다. 여기서 password
는 특정 MySQL 서버 인스턴스의 MySQL root
암호입니다.
shell>mysqladmin -uroot -p
081208 20:19:56 mysqld_safe mysqld from pid file /usr/local/mysql/var/tonfisk.pid ended shell>password
shutdownmysqld_safe --ndbcluster --ndb-connectstring=192.168.0.10 &
081208 20:20:06 mysqld_safe Logging to '/usr/local/mysql/var/tonfisk.err'. 081208 20:20:06 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var
당연히 정확한 입력 및 출력은 MySQL이 시스템에 설치되어있는 방법과 장소, 그리고 시작할 때 선택한 옵션 (및 이러한 옵션의 일부 또는 전부를 my.cnf
파일에 지정되어 있는지 여부 )에 따라 다릅니다.
5 단계 : 새로운 데이터 노드의 초기 부팅 수행 다음과 같이 새로운 데이터 노드의 각 호스트 시스템 쉘에서 --initial
옵션을 사용하여 데이터 노드를 시작합니다.
shell> ndbd -c 192.168.0.10 --initial
기존 데이터 노드를 다시 시작하는 경우와는 달리 새로운 데이터 노드는 동시에 시작할 수 있습니다. 데이터 노드의 시작이 완료 될 때까지 기다린 후 다른 데이터 노드를 시작할 필요가 없습니다.
새로운 데이터 노드가 모두 시작될 때까지 기다린 후 다음 단계로 이동합니다. 새로운 데이터 노드가 시작되면 관리 클라이언트의 SHOW
명령의 출력에서 (아래 굵게 표시된 것처럼) 그들이 어떤 노드 그룹에도 속하지 않는 것을 확인할 수 있습니다.
ndb_mgm> SHOW
Connected to Management Server at: 192.168.0.10:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=1 @192.168.0.1 (5.6.27-ndb-7.4.9, Nodegroup: 0, *)
id=2 @192.168.0.2 (5.6.27-ndb-7.4.9, Nodegroup: 0)
id=3 @192.168.0.3 (5.6.27-ndb-7.4.9, no nodegroup)
id=4 @192.168.0.4 (5.6.27-ndb-7.4.9, no nodegroup)
[ndb_mgmd(MGM)] 1 node(s)
id=10 @192.168.0.10 (5.6.27-ndb-7.4.9)
[mysqld(API)] 2 node(s)
id=20 @192.168.0.20 (5.6.27-ndb-7.4.9)
id=21 @192.168.0.21 (5.6.27-ndb-7.4.9)
6 단계 : 새로운 노드 그룹 만들기 이것은 클러스터 관리 클라이언트에서 CREATE NODEGROUP
명령을 실행하여 실행할 수 있습니다. 다음과 같이이 명령은 인수로 새로운 노드 그룹에 포함 된 데이터 노드의 ID를 쉼표로 구분 된 목록을 가지고 있습니다.
ndb_mgm> CREATE NODEGROUP 3,4
Nodegroup 1 created
다시 SHOW
를 발행하면 (마찬가지로 굵게 표시된대로) 데이터 노드 3과 4가 새로운 노드 그룹에 참여한 것을 확인할 수 있습니다.
ndb_mgm> SHOW
Connected to Management Server at: 192.168.0.10:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=1 @192.168.0.1 (5.6.27-ndb-7.4.9, Nodegroup: 0, *)
id=2 @192.168.0.2 (5.6.27-ndb-7.4.9, Nodegroup: 0)
id=3 @192.168.0.3 (5.6.27-ndb-7.4.9, Nodegroup: 1)
id=4 @192.168.0.4 (5.6.27-ndb-7.4.9, Nodegroup: 1)
[ndb_mgmd(MGM)] 1 node(s)
id=10 @192.168.0.10 (5.6.27-ndb-7.4.9)
[mysqld(API)] 2 node(s)
id=20 @192.168.0.20 (5.6.27-ndb-7.4.9)
id=21 @192.168.0.21 (5.6.27-ndb-7.4.9)
7 단계 : 클러스터 데이터 재배포 관리 클라이언트에서 적절한 REPORT
명령을 실행하여 확인할 수 있도록 노드 그룹을 만들 때 기존 데이터 및 인덱스는 자동으로 새 노드 그룹의 데이터 노드에 배포되지 않습니다.
ndb_mgm> ALL REPORT MEMORY
Node 1: Data usage is 5%(177 32K pages of total 3200)
Node 1: Index usage is 0%(108 8K pages of total 12832)
Node 2: Data usage is 5%(177 32K pages of total 3200)
Node 2: Index usage is 0%(108 8K pages of total 12832)
Node 3: Data usage is 0%(0 32K pages of total 3200)
Node 3: Index usage is 0%(0 8K pages of total 12832)
Node 4: Data usage is 0%(0 32K pages of total 3200)
Node 4: Index usage is 0%(0 8K pages of total 12832)
-p
옵션을 붙여 ndb_desc을 사용하면 출력에 분할 정보가 포함되어 있으므로 테이블에서는 아직 2 개의 파티션만을 사용되지 않은 것을 (여기에 굵은 글씨로 표시된 출력 「Per partition info」
섹션) 확인할 수 있습니다.
shell> ndb_desc -c 192.168.0.10 -d n ips -p
-- ips --
Version: 1
Fragment type: 9
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 6
Number of primary keys: 1
Length of frm data: 340
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
FragmentCount: 2
TableStatus: Retrieved
-- Attributes --
id Bigint PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY AUTO_INCR
country_code Char(2;latin1_swedish_ci) NOT NULL AT=FIXED ST=MEMORY
type Char(4;latin1_swedish_ci) NOT NULL AT=FIXED ST=MEMORY
ip_address Varchar(15;latin1_swedish_ci) NOT NULL AT=SHORT_VAR ST=MEMORY
addresses Bigunsigned NULL AT=FIXED ST=MEMORY
date Bigunsigned NULL AT=FIXED ST=MEMORY
-- Indexes --
PRIMARY KEY(id) - UniqueHashIndex
PRIMARY(id) - OrderedIndex
-- Per partition info --
Partition Row count Commit count Frag fixed memory Frag varsized memory
0 26086 26086 1572864 557056
1 26329 26329 1605632 557056
NDBT_ProgramExit: 0 - OK
NDBCLUSTER
테이블마다 mysql 클라이언트에서 ALTER ONLINE TABLE ... REORGANIZE PARTITION
명령문을 실행하여 모든 데이터 노드간에 데이터 재배포되도록 할 수 있습니다. ALTER ONLINE TABLE ips REORGANIZE PARTITION
명령문을 발행 한 후, ndb_desc을 사용하면 다음과 같이 (굵은 출력 관련 부분에 의해)이 테이블의 테이터가 4 개의 파티션을 사용하여 저장되도록 된 것을 확인할 수 있습니다.
shell> ndb_desc -c 192.168.0.10 -d n ips -p
-- ips --
Version: 16777217
Fragment type: 9
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 6
Number of primary keys: 1
Length of frm data: 341
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
FragmentCount: 4
TableStatus: Retrieved
-- Attributes --
id Bigint PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY AUTO_INCR
country_code Char(2;latin1_swedish_ci) NOT NULL AT=FIXED ST=MEMORY
type Char(4;latin1_swedish_ci) NOT NULL AT=FIXED ST=MEMORY
ip_address Varchar(15;latin1_swedish_ci) NOT NULL AT=SHORT_VAR ST=MEMORY
addresses Bigunsigned NULL AT=FIXED ST=MEMORY
date Bigunsigned NULL AT=FIXED ST=MEMORY
-- Indexes --
PRIMARY KEY(id) - UniqueHashIndex
PRIMARY(id) - OrderedIndex
-- Per partition info --
Partition Row count Commit count Frag fixed memory Frag varsized memory
0 12981 52296 1572864 557056
1 13236 52515 1605632 557056
2 13105 13105 819200 294912
3 13093 13093 819200 294912
NDBT_ProgramExit: 0 - OK
일반적으로 ALTER [ONLINE] TABLE
파티션 식별자 목록 및 파티션 정의의 세트와 함께 사용하여 이미 명시 적으로 분할되어있는 테이블에 새로운 파티셔닝을 만듭니다. 이 점에서 새로운 MySQL Cluster 노드 그룹에 데이터를 재배포 여기의 사용법은 예외입니다. 이와 같이 사용하는 경우 table_name
REORGANIZE PARTITIONTABLE
키워드 뒤에 테이블 이름 만 사용하고 다른 키워드와 식별자는 REORGANIZE PARTITION
다음에 계속 않습니다.
자세한 내용은 섹션 13.1.7 "ALTER TABLE 구문" 을 참조하십시오.
또한 낭비되고있는 영역이 재사용 될 수 있도록 각 테이블에 ALTER ONLINE TABLE
문 뒤에 OPTIMIZE TABLE
을 계속 지정해야합니다. INFORMATION_SCHEMA.TABLES
테이블에 대해 다음 쿼리를 사용하면 모든 NDBCLUSTER
테이블의 목록을 얻을 수 있습니다.
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE = 'NDBCLUSTER';
MySQL Cluster 테이블에서는 테이블을 만드는 데 사용 된 CREATE TABLE
문 (또는 다른 스토리지 엔진에서 기존 테이블을 변환하는 데 사용 된 ALTER TABLE
문)의 ENGINE
옵션 NDB
가 사용되었는지, 또는 NDBCLUSTER
가 사용되었는지에 관계없이 INFORMATION_SCHEMA.TABLES.ENGINE
값은 항상 NDBCLUSTER
입니다.
이 문을 실행 한 후에는 다음과 같이 ALL REPORT MEMORY
의 출력 데이터 및 인덱스가 모든 데이터 노드간에 재배포 된 것을 확인할 수 있습니다.
ndb_mgm> ALL REPORT MEMORY
Node 1: Data usage is 5%(176 32K pages of total 3200)
Node 1: Index usage is 0%(76 8K pages of total 12832)
Node 2: Data usage is 5%(176 32K pages of total 3200)
Node 2: Index usage is 0%(76 8K pages of total 12832)
Node 3: Data usage is 2%(80 32K pages of total 3200)
Node 3: Index usage is 0%(51 8K pages of total 12832)
Node 4: Data usage is 2%(80 32K pages of total 3200)
Node 4: Index usage is 0%(50 8K pages of total 12832)
NDBCLUSTER
테이블에 동시에 1 회 DDL 작업 만 수행 할 수 없기 때문에 각 ALTER ONLINE TABLE ... REORGANIZE PARTITION
문이 완료 될 때까지 기다린 후 다음 문을 실행해야합니다.
새로운 데이터 노드가 추가 된 후에 생성 된 NDBCLUSTER
테이블에 대해서는 ALTER ONLINE TABLE ... REORGANIZE PARTITION
명령문을 발행 할 필요가 없습니다. 이 같은 테이블에 추가 된 데이터는 모든 데이터 노드간에 자동으로 배포됩니다. 그러나 새 노드가 추가되기 전에 존재했던 NDBCLUSTER
테이블에서는 그 테이블이 ALTER ONLINE TABLE ... REORGANIZE PARTITION
을 사용하여 재구성 될 때까지 기존 데이터도 새 데이터도 새로운 노드 를 사용하여 배포되지 않습니다.
롤링 재시작을 사용하지 않는 대체 절차 클러스터를 처음 시작할 때 여분의 데이터 노드를 구성하지만, 그들을 시작하지 않음으로써 롤링 다시 시작의 필요성을 피할 수 있습니다. 예전처럼 먼저 하나의 노드 그룹 내의 2 개의 데이터 노드 (노드 1과 2)에서 시작하여 나중에 노드 3과 4로 구성된 두 번째 노드 그룹을 추가하여 클러스터를 4 하나의 데이터 노드까지 확장한다고 가정합니다.
[ndbd default] DataMemory = 100M IndexMemory = 100M NoOfReplicas = 2 DataDir = /usr/local/mysql/var/mysql-cluster [ndbd] Id = 1 HostName = 192.168.0.1 [ndbd] Id = 2 HostName = 192.168.0.2 [ndbd] Id = 3 HostName = 192.168.0.3 Nodegroup = 65536 [ndbd] Id = 4 HostName = 192.168.0.4 Nodegroup = 65536 [mgm] HostName = 192.168.0.10 Id = 10 [api] Id=20 HostName = 192.168.0.20 [api] Id=21 HostName = 192.168.0.21
나중에 온라인에 데이터 노드 (노드 3과 4)를 NodeGroup = 65536
로 구성 할 수 있습니다. 이 경우 노드 1과 2는 각각 다음과 같이 시작할 수 있습니다.
shell> ndbd -c 192.168.0.10 --initial
NodeGroup = 65536
로 구성된 데이터 노드는 StartNoNodeGroupTimeout
데이터 노드 구성 매개 변수의 설정에 의해 지정된 시간 동안 대기 한 후 --nowait-nodes=3,4
를 사용하여 노드 1과 2를 시작했는지 같이 관리 서버에 의해 처리됩니다. 기본적으로 이것은 15 초 (15000 밀리 초)입니다.
StartNoNodegroupTimeout
는 클러스터의 모든 데이터 노드에서 동일해야합니다. 따라서 이것은 개별 데이터 노드가 아니라 항상 config.ini
파일의 [ndbd default]
섹션에 설정하도록하십시오.
두 번째 노드 그룹을 추가 할 준비가되면 다음 추가 단계를 수행 할 필요가있을뿐입니다.
데이터 노드 3과 4를 시작하고 새 노드마다 데이터 노드의 프로세스를 한 번씩 호출합니다.
shell>
ndbd -c 192.168.0.10 --initial
관리 클라이언트에서 적절한
CREATE NODEGROUP
명령을 실행합니다.ndb_mgm>
CREATE NODEGROUP 3,4
mysql 클라이언트에서 기존
NDBCLUSTER
테이블마다ALTER ONLINE TABLE ... REORGANIZE PARTITION
및OPTIMIZE TABLE
문을 발행합니다. (이 섹션의 다른 곳에서 언급했듯이, 이것이 완료 될 때까지 기존의 MySQL Cluster 테이블은 데이터 배포에 새로운 노드를 사용할 수 없습니다.)