DB

[YCSB] MySQL 8.4.5에 YCSB 실행하기

폭풍저그김탁구 2025. 8. 20. 17:10

 

YCSB는 야후에서 만든 벤치마크인데, 원래 NoSQL 용으로 개발되었다.

하지만 많은 OLTP 논문에서 TPC-C를 비롯해 YCSB까지는 제시하고 있다. 
실생활과 유사한 TPC-C는 반드시 필요한 것 같고, Read-Write ratio를 조절하는 것에 대한 차이는 YCSB로 제시한다.

나는 MySQL 8.4.5를 사용하고 있기 때문에 여기서 YCSB를 돌리는 과정을 글로 남겨본다.

 

두 가지 버전이 있는데, 하나는 brain frank cooper의 YCSB와 benchbase에 구현된 YCSB가 있다.
뭐가 원본인지는 모르겠지만... benchbase가 여러모로 범용성이 좋은 것 같아서 후자 추천!

 

 


[Brain Frank Cooper 버전]

0.  다운로드

- YCSB 다운로드
$ git clone https://github.com/brianfrankcooper/YCSB && cd YCSB && mvn -pl jdbc -am -DskipTests package

- Connector/J JAR 다운로드
$ cd YCSB
$ mvn org.apache.maven.plugins:maven-dependency-plugin:3.8.1:copy -Dartifact=com.mysql:mysql-connector-j:8.4.0 -DoutputDirectory=.

 

1. MySQL 환경 세팅

cd ~
BASE_DIR=`pwd -P`

echo "INIT MYSQL"
$BASE_DIR/mysql-8.4.5-build/bin/mysqld --defaults-file=$BASE_DIR/my.cnf --initialize-insecure --user=mysql --datadir=$BASE_DIR/mysql_data --basedir=$BASE_DIR/mysql-8.4.5
sleep 10

echo "RUN MYSQL"
$BASE_DIR/mysql-8.4.5-build/bin/mysqld --defaults-file=$BASE_DIR/my.cnf --datadir=$BASE_DIR/mysql_data & >/dev/null
sleep 20

echo "SET PASSWORD on MYSQL"
$BASE_DIR/mysql-8.4.5-build/bin/mysql -uroot mysql -e "CREATE DATABASE ycsb;"
$BASE_DIR/mysql-8.4.5-build/bin/mysql -uroot mysql -e "CREATE USER 'ycsb'@'%' IDENTIFIED BY 'ycsbpass';"
$BASE_DIR/mysql-8.4.5-build/bin/mysql -uroot mysql -e "GRANT ALL PRIVILEGES ON ycsb.* TO 'ycsb'@'%';"
$BASE_DIR/mysql-8.4.5-build/bin/mysql -uroot mysql -e "FLUSH PRIVILEGES;"

$BASE_DIR/mysql-8.4.5-build/bin/mysql -uycsb -pycsbpass ycsb < $BASE_DIR/YCSB/jdbc/src/main/resources/sql/create_table.mysql

$BASE_DIR/mysql-8.4.5-build/bin/mysqladmin -uroot  shutdown

- 이때 create_table.mysql 파일을 보면 PK가 255 으로 선언되어 있는데, PK 길이 제한에 걸려서 191로 내렸다
- 만약에 실험을 여러번 진행할 거면 log, data 파일들을 백업해두자

 

2. YCSB 데이터 로드 및 실험 진행

# (예) JAR 경로 변수
JAR=./YCSB/mysql-connector-j-8.4.0.jar

# 1) 데이터 적재 
# workload - 의미 없음
# fetchsize - select 시 한 번에 가져오는 row 수
# batchsize - insert 배치 row 개수
# recordcount - record 개수

cd YCSB
 python3 bin/ycsb load jdbc \
   -P workloads/workloada \
   -s \
   -p status.interval=5 \
   -threads 32 \
   -p db.driver=com.mysql.cj.jdbc.Driver \
   -p db.url="jdbc:mysql://127.0.0.1:3306/ycsb?useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true" \
   -p db.user=ycsb -p db.passwd=ycsbpass \
   -p jdbc.autocommit=false \
   -p jdbc.fetchsize=10 \
   -p db.batchsize=1000 \
   -p table=usertable \
   -p recordcount=100000 \
   -cp $JAR

# 2) 벤치마크 실행 (동시성/운영시간은 필요에 맞게 조정)
# workloada - R:W=50:50
python3  bin/ycsb run jdbc \
  -P workloads/workloada \
  -p status.interval=5 \
  -p db.driver=com.mysql.cj.jdbc.Driver \
  -p db.url="jdbc:mysql://127.0.0.1:3306/ycsb?useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true" \
  -p db.user=ycsb -p db.passwd=ycsbpass \
  -p jdbc.autocommit=false \
  -p jdbc.fetchsize=10 \
  -p db.batchsize=1000 \
  -p table=usertable \
  -p recordcount=100000 \
  -p operationcount=200000 \
  -threads 64 -target 0 \
  -s \
  -cp $JAR > new.log

- load 옵션은 insert만 진행하고 따로 update 같은 건 진행하지 않기 때문에 아무 workload나 줘도 됨
- run 명령어로 진행하는데, 스레드 수나 데이터 크기는 적절히 조절해서 사용하면 된다

옵션은 구글링하면 금방 나오니 패스

 


 

[Benchbase 버전]

0. Benchbase 설치

git clone --depth 1 https://github.com/cmu-db/benchbase.git
cd benchbase
./mvnw clean package -P mysql #여기서 에러 뜨면 maven 버전 확인

cd target
tar xvzf benchbase-mysql.tgz
cd benchbase-mysql

 

>  만약에 java 버전이 안 맞으면 아래 실행

더보기

 

cd benchbase

./mvnw -v
# Java version: 23.x 가 나와야 함

# 아니면 설치

# Ubuntu Pro 구독이 없으면 패키지를 받을 권한이 없다고 에러 뜨니까 아래 실행
sudo apt-get update
sudo apt-get install -y wget gpg apt-transport-https
wget -O- https://packages.adoptium.net/artifactory/api/gpg/key/public \
  | sudo gpg --dearmor -o /usr/share/keyrings/adoptium.gpg
echo "deb [signed-by=/usr/share/keyrings/adoptium.gpg] https://packages.adoptium.net/artifactory/deb focal main" \
  | sudo tee /etc/apt/sources.list.d/adoptium.list
sudo apt-get update

scurl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk install java 23.0.2-tem
sdk default java 23.0.2-tem

source "$HOME/.sdkman/bin/sdkman-init.sh"
./mvnw -v

 

1. MySQL 용 YCSB 데이터 로드

# 초기화 및 계정 생성은 위와 동일하고, table 명만 benchbase로 바꾸면 된다
java -jar benchbase.jar \
  -b ycsb \
  -c config/mysql/my_ycsb_config.xml \
  --create=true \
  --load=true \
  --execute=false

 

10M row 로드 용 xml 파일은 아래 참고

더보기

my_ycsb_config.xml 내용

<?xml version="1.0"?>
<parameters>

    <!-- Connection details -->
    <type>MYSQL</type>
    <driver>com.mysql.cj.jdbc.Driver</driver>
    <url>jdbc:mysql://127.0.0.1:3306/benchbase?rewriteBatchedStatements=true&amp;allowPublicKeyRetrieval=True&amp;createDatabaseIfNotExist=true&amp;sslMode=DISABLED</url>
    <username>ycsb</username>
    <password>ycsbpass</password>
    <reconnectOnConnectionFailure>true</reconnectOnConnectionFailure>
    <isolation>TRANSACTION_REPEATABLE_READ</isolation>
    <batchsize>128</batchsize>

    <!-- Scalefactor in YCSB is *1000 the number of rows in the USERTABLE-->
    <!-- scalefactor: rows = scalefactor * 1000 (10000: 10M) -->
    <scalefactor>10000</scalefactor>

    <!-- Optional: Override the zipfian constant to modify the skew -->
    <!-- <skewFactor>0.99</skewFactor> -->

    <!-- The workload (로드에는 사용X) -->
    <!-- terminals: 클라이언트 스레드 수 -->
    <!-- time: 실행 시간 -->
    <!-- rate: 목표 트랜잭션 처리율 (TPS limit = 10000) -->
    <!-- weights: read, insert, scan, update, delete, read-modify-write 비율 -->
    <terminals>1</terminals>
    <works>
        <work>
            <time>60</time>
            <rate>10000</rate>
            <weights>50,5,15,10,10,10</weights>
        </work>
    </works>

    <!-- YCSB Procedures declaration -->
    <transactiontypes>
        <transactiontype>
            <name>ReadRecord</name>
        </transactiontype>
        <transactiontype>
            <name>InsertRecord</name>
        </transactiontype>
        <transactiontype>
            <name>ScanRecord</name>
        </transactiontype>
        <transactiontype>
            <name>UpdateRecord</name>
        </transactiontype>
        <transactiontype>
            <name>DeleteRecord</name>
        </transactiontype>
        <transactiontype>
            <name>ReadModifyWriteRecord</name>
        </transactiontype>
    </transactiontypes>
</parameters>

 

2. YCSB 실행

java -jar benchbase.jar \
  -b ycsb \
  -c config/mysql/my_ycsb_config.xml \
  --create=false \
  --load=false \
  --execute=true

- 결과는 /benchbase/target/benchbase-mysql/results 에 저장되고, summary 버전을 보면 된다

 

 


TPCC보다 더 단순하고 온전히 성능 체크에만 올인한 느낌의 벤치마크다.
benchbase 버전을 나중에 알아서 좀 억울했다... 훨씬 깔기도 편하고 결과도 친절한듯 ㅜㅜ...