MariaDB 5.5 Collecting Stats for Galera Cluster v1.1
13.09.12 | v1.1 | Galera Cluster 추가 |
13.08.05 | v1.0 |
|
|
|
|
1. Collecting Stats
MariaDB Galera Cluster 에서 성능지표로 활용가능한 Table 은 다음과 같다.
다음의 모든 테이블은 information_schema Database 에 위치
l GLOBAL_VARIABLES (wsrep_* 를 포함함)
l GLOBAL_STATUS (wsrep_* 를 포함함)
l PROCESSLIST
각각은 세션에서 다음과 같이 조회할 수 있다.
l show variables like ‘%키워드%’
l show status like ‘%키워드%’
l show processlist
상/하의 관계는 시스템 명령으로 조회하던 걸 쿼리를 통해 조회할 수 있는것에 불과하다.
각 테이블의 의미는 다음과 같다.
GLOBAL_VARIABLES
ð 말 그대로 GLOBAL VARIABLES 정보를 가지고 있다. GLOBAL VARIABLES 는 자주 변하는 값이 아니기에 자주 수집 할 필요는 없다.
다만 수집해 두면 특정 VARIABLES 이 언제 수정되었는지 조회가 가능하다는 점이 유용하다.
특히 메모리 VARIABLES 관련은 성능이나 시스템 안정성에 영향을 끼치는 부분으로 변경 추이를 추적할 필요가 있다.
wsrep_* 는 Galera Cluster 와 연관 된 Variables 이다.
GLOBAL_STATUS
GLOBAL (SYSTEM – LEVEL) 의 STATUS 정보를 가지고 있다. DB STARTUP 이래로 누적값을 가지고 있다.
의미있는 데이터를 뽑기 위해서는 시점과 시점의 비교, 변화추이가 필요하다.
wsrep_* 는 Galera Cluster 와 연관 된 status 이다.
PROCESSLIST
ð PROCESS (THREAD) 정보를 가지고 있다. USER-LEVEL 의 작업 내용을 추적하기 위해서는 이 테이블의 데이터 저장이 필요하다.
INTERVAL 도 짧게 가져갈수록 더 많은 유용한 정보를 수집할 수 있다.
다만 connection 이 많을수록 DB 저장공간 소모가 커지므로 적절한 타협점을 찾아야 한다.
앞서 언급한 3개의 테이블에 대해 각 노드가 각기 다른 값을 가진다는게 주요 포인트이다. (구성에따라 같을수도 있다.)
때문에 위 정보들을 캡쳐할 때 어느 위치에서 캡쳐했는지 추가적인 정보가 반드시 필요하다.
2. Collecting method
크게 두 가지 수집 방법이 있다.
l crontab
l event
둘다 job 스케쥴링을 지원한다.
다만 event 의 경우는 event 를 컨트롤하는 요소가 시스템 변수 밖에 없다.
때문에 실행을 컨트롤하기 위해서는 위 변수를 변경하거나 해당 event 를 삭제해야 한다.
위와 같은 이유 때문에 crontab 에 등록해 수집하는게 편하다.
데이터를 저장할 테이블에 대해서는 어떤 노드에서 들어온 데이터인지 구분자가 필요하다.
3. Practice
<DB, TABLE>
create database dbstat collate = euckr_bin;
create table dbstat.global_variables (
ctime datetime,
inst_id int(1),
v_name varchar(64),
v_value varchar(2048),
key (ctime));
create table dbstat.global_status (
ctime datetime,
inst_id int(1),
v_name varchar(64),
v_value varchar(1024),
key(ctime));
create table dbstat.processlist (
ctime datetime ,
inst_id int(1),
id bigint(4) ,
user varchar(16) ,
host varchar(64) ,
db varchar(64) ,
command varchar(16) ,
time int(7) ,
state varchar(64) ,
info longtext ,
time_ms decimal(22,3) ,
stage tinyint(2) ,
max_stage tinyint(2) ,
progress decimal(7,3) ,
key (ctime));
<SCRIPT>
# col_variables.sh
#!/bin/bash
/data/galera/bin/mysql -u'monitor' -p'mon$xde1' -h'172.18.174.161' -P3307 dbstat << EOF
insert into dbstat.global_variables
select date_format(now(),'%y%m%d%h%i%s'), 1, variable_name, variable_value from information_schema.GLOBAL_VARIABLES
where variable_name not like '%ARIA%'
and variable_name not like '%RELAY_LOG%'
and variable_name not like '%REPLICATE%'
and variable_name not like '%SSL%'
order by 1 ;
COMMIT;
exit
EOF
# GLOBAL STATUS 수집 : 5분 주기
# col_status.sh
#!/bin/bash
/data/galera/bin/mysql -u'monitor' -p'mon$xde1' -h'172.18.174.161' -P3307 dbstat << EOF
insert into dbstat.global_status
select date_format(now(),'%Y%m%d%H%i%s'), 1, VARIABLE_NAME,VARIABLE_VALUE
from information_schema.GLOBAL_STATUS
where VARIABLE_NAME not like 'SSL_%'
and VARIABLE_NAME not like '%ARIA%'
and VARIABLE_NAME not in ('COMPRESSION','RPL_STATUS','SLAVE_RUNNING');
COMMIT;
exit
EOF
# PROCESSLIST 수집 : 5분 주기
# col_processlist.sh
#!/bin/bash
/data/galera/bin/mysql -u'monitor' -p'mon$xde1' -h'172.18.174.161' -P3307 dbstat << EOF
insert into dbstat.processlist
select date_format(now(),'%Y%m%d%H%i%s'), 1, id, user, host, db, command, time, state, info, time_ms, stage, max_stage, progress
from information_schema.PROCESSLIST;
COMMIT;
exit
EOF
<CRONTAB>
0 */6 * * * /bin/bash /data/galera/scripts/col_variables.sh 1>/dev/null 2>/dev/null
0 * * * * /bin/bash /data/galera/scripts/col_status.sh 1>/dev/null 2>/dev/null
*/5 * * * * /bin/bash /data/galera/scripts/col_processlist.sh 1>/dev/null 2>/dev/null
4. IMPROVEMENTS