카테고리 없음
spider engine 설정
dev-lab
2020. 6. 11. 16:39
반응형
docker spider network 구성
docker run -d -e MYSQL_ROOT_PASSWORD=mariadb -p 3301:3306 --name=spider --network=spider-network custom_mariadb
docker run -d -e MYSQL_ROOT_PASSWORD=mariadb -p 3302:3306 --name=dbnode1 --network=spider-network custom_mariadb
docker run -d -e MYSQL_ROOT_PASSWORD=mariadb -p 3303:3306 --name=dbnode2 --network=spider-network custom_mariadb
-- remote 서버에 스파이더 엔진 설치
apt-get install mariadb-plugin-spider
mysql -u root < /usr/share/mysql/install_spider.sql
-- remote server login 후 spider 엔진 확인
show engine;
-- 3곳 다 생성할 것
mysql -u root -p
user mysql;
create user 'spider'@'%' identified by 'mariadb';
grant all on *.* to 'spider'@'%' with grant option;
flush privileges;
-- spider 서버 설정
create server dbnode1 foreign data wrapper mysql options(host 'dbnode1', database 'test', user 'spider', password 'mariadb', port 3306);
create server dbnode2 foreign data wrapper mysql options(host 'dbnode2', database 'test', user 'spider', password 'mariadb', port 3306);
-- 연결된 서버확인
select * from mysql.servers;
-- mariadb 버전확인
select version()
create database if not exists test;
CREATE TABLE test.sbtest1
(
id int(10) unsigned NOT NULL AUTO_INCREMENT,
k int(10) unsigned NOT NULL DEFAULT '0',
c char(120) NOT NULL DEFAULT '',
pad char(60) NOT NULL DEFAULT '',
PRIMARY KEY (id),
KEY k (k)
) ENGINE=spider COMMENT='wrapper "mysql", table "sbtest1"'
PARTITION BY KEY (id)
(
PARTITION pt1 COMMENT = 'srv "dbnode1"',
PARTITION pt2 COMMENT = 'srv "dbnode2"'
) ;
Sysbench란
시스템 성능을 측정할 수 있는 툴로, MySQL에서 내부 프로젝트로 만들다가 Lua 스크립트를 적용한 0.5 버전까지 나왔다가 오랜기간 개발이 중지 되었습니다. 2016년에 다시 개발이 시작되었고 현재 1.0 버전대 개발이 진행중입니다. 기존에는 소스코드를 이용해 설치하는 방식으로 많이 사용하였지만, 현재는 yum 레포지토리를 이용해 설치가 가능합니다. 시스템 뿐만 아니라 MySQL, MariaDB, PostgreSQL에 대한 성능 평가가 가능합니다. 오라클의 경우 Swingbench를 많이 쓰고, MariaDB의 경우는 sysbench 나 DBT2(https://dev.mysql.com/downloads/benchmarks.html) 등을 사용할 수 있습니다.
apt-get install sysbench
# 테스트 테이블 생성하기
sysbench /usr/share/sysbench/oltp_read_only.lua --db-driver=mysql --threads=16 --mysql-socket=/var/run/mysqld/mysqld.sock --mysql-db=test2 --mysql-user=spider --mysql-password=mariadb --mysql-port=3306 --table-size=10000000 prepare
# 샤딩된 테이블에 데이터 복사(나누어 들어가는지 테스트)
insert into test.sbtest1 select * from test2.sbtest1;
-- DB dump
mysqldump -uroot -p 데이터베이스명 테이블명1 테이블명2 테이블명3 > 덤프파일명.sql
-- docker db dump
docker exec CONTAINER /usr/bin/mysqldump -u root –password=root DATABASE > backup.sql
-- docker db import
cat backup.sql | docker exec -i CONTAINER /usr/bin/mysql -u root –password=root DATABASE
or
docker exec -i CONTAINER mysql -u root -pPASSWORD DATABASE < DUMPFILE.sql
docker exec mariadb /usr/bin/mysqldump -u spider -pmariadb music month_popularity_ratio TB_RAW_CP > month_popular_and_raw_cp_dump.sql
키 샤딩은 해시값에 의해 샤딩이 되기 때문에 데이터 분배가 불규칙하다.
-- 새로운 노드 추가
alter table sbtest1 add partition(partition pt3 comment = 'srv "dbnode3"');
#Partition 추가
ALTER TABLE employees ADD PARTITION(PARTITION p4 VALUES LESS THAN (2009));
MAXVALUE가 마지막에 있을 경우 더이상 추가가 되지 않음. reorganize 활용
#Partition 삭제 (삭제 명령은 데이터까지 같이 삭제 된다 주의)
ALTER TABLE employees DROP PARTITION p4;
#기존 파티션의 분리
ALTER TABLE employees
REORGANIZE PARTITION p3 INTO (
PARTITION p3 VALUES LESS THAN (2013),
PARTITION p4 VALUES LESS THAN MAXVALUE
);
#기존 파티션의 병합
ALTER TABLE employees
REORGANIZE PARTITION p2,p3 INTO (
PARTITION p23 VALUES LESS THAN (2012)
);
-- 천만건 해싱 파티션 시
노드 2개 일때 6206684, 3793316
노드 1개 더 추가해 3개 일때 다시 천만건 삽입 시 9468556, 7160677, 3370767
-- partition 추가
create table user_ticket_play_ratio
(
end_date int not null,
purchase_id varchar(45) not null,
raw_cp_id int not null,
artist_id int not null,
artist_name varchar(200) null,
cnt int null,
ratio double null,
primary key (end_date, purchase_id, raw_cp_id, artist_id)
) ENGINE=spider COMMENT='wrapper "mysql", table "user_ticket_play_ratio"'
PARTITION BY range (end_date)
(
PARTITION p202001 values less than (20200201) COMMENT = 'srv "dbnode1"',
PARTITION p202002 values less than (20200301) COMMENT = 'srv "dbnode2"',
PARTITION platest values less than MAXVALUE COMMENT = 'srv "dbnode3"'
);
파티션 키는 기본키에 포함되어있어야 하고 노드들에 같은 테이블이 생성되어있어야 한다.
이용권별 분배금 배치 파티션 분리 후 재 수행
dates=("20200201" "20200202" "20200203" "20200204" "20200205" "20200206" "20200207" "20200208" "20200209" "20200210" "20200211" "20200212" "20200213" "20200214" "20200215" "20200216" "20200217" "20200218" "20200219" "20200220" "20200221" "20200222" "20200223" "20200224" "20200225" "20200226" "20200227" "20200228" "20200229" "20200301" "20200302" "20200303" "20200304" "20200305" "20200306" "20200307" "20200308" "20200309" "20200310" "20200311" "20200312" "20200313" "20200314" "20200315" "20200316" "20200317" "20200318" "20200319" "20200320" "20200321" "20200322" "20200323" "20200324" "20200325" "20200326" "20200327" "20200328" "20200329" "20200330" "20200331" "20200401" "20200402" "20200403" "20200404" "20200405" "20200406" "20200407" "20200408" "20200409" "20200410" "20200411" "20200412" "20200413" "20200414" "20200415" "20200416" "20200417" "20200418" "20200419" "20200420" "20200421" "20200422" "20200423" "20200424" "20200425" "20200426" "20200427" "20200428" "20200429" "20200430")
for TARGET_DATE in ${dates[@]} ;
do
java -jar /Users/user/Desktop/dev/music_payment_spring/target/payment-0.0.1-SNAPSHOT.jar --spring.profiles.active=batch --job.name=userTicketPlayRatioJob endDate=${TARGET_DATE} version=3
done
-- 파티션 재정렬
ALTER TABLE t1 REBUILD PARTITION p0, p1;
-- 로그파일 이어서 작성
sh ../user_ticket_batch.sh.command 2>&1 | tee -a ticket_batch.log
반응형