Tema ini menjelaskan uji kinerja OLAP pada kluster Edisi Kluster dari PolarDB MySQL 8.0 berdasarkan TPC-H. Anda dapat memeriksa performa kluster menggunakan metode yang dijelaskan dalam tema ini.
Lingkungan pengujian
Instance ECS dan kluster PolarDB for MySQL ditempatkan di wilayah dan zona yang sama serta pada VPC yang sama.
Konfigurasi kluster PolarDB for MySQL:
Satu kluster
Mesin database: MySQL 8.0.1 atau MySQL 8.0.2
Edisi produk: Enterprise Edition
Edisi: Edisi Kluster
Tipe spesifikasi: Dedicated
Spesifikasi node: polar.mysql.x8.4xlarge (32 core dan 256 GB)
Jumlah node: 2 (1 node utama dan 1 node baca-saja)
CatatanTitik akhir utama digunakan untuk menghubungkan ke kluster dalam pengujian. Untuk informasi lebih lanjut tentang cara melihat titik akhir utama dari kluster PolarDB for MySQL, lihat Kelola Titik Akhir Kluster.
Konfigurasi instance ECS:
Satu instance
Tipe instance: ecs.c5.4xlarge (16 vCPU dan 32 GiB)
Gambar: CentOS 7.0 64-bit
Disk sistem: ESSD dengan kapasitas 1.000 GB
Alat pengujian
TPC-H adalah tolok ukur umum yang dikembangkan dan dirilis oleh Transaction Processing Performance Council (TPC) untuk mengevaluasi kemampuan kueri analitik database. Tolok ukur TPC-H mencakup delapan tabel dan 22 pernyataan SQL kompleks. Sebagian besar kueri mengandung klausa JOIN pada beberapa tabel, subkueri, dan klausa GROUP BY.
Uji kinerja TPC-H yang dijelaskan dalam tema ini diimplementasikan berdasarkan pengujian tolok ukur TPC-H tetapi tidak dapat memenuhi semua persyaratan pengujian tolok ukur TPC-H. Oleh karena itu, hasil pengujian tidak dapat dibandingkan dengan hasil yang dipublikasikan dari pengujian tolok ukur TPC-H.
Instal alat TPC-H
Masuk ke instance ECS sebagai pengguna root dan jalankan perintah berikut:
TPC-H yang digunakan dalam tema ini adalah TPC-H_Tools_v2.18.0. Anda harus mendaftarkan TPC-H sebelum dapat mengunduhnya.
Untuk menginstal TPC-H pada instance ECS, lakukan langkah-langkah berikut:
Daftar dan unduh paket TPC-H. Unggah paket TPC-H ke instance ECS. Untuk informasi lebih lanjut, lihat Unggah File.
Jalankan perintah berikut untuk mengekstrak paket TPC-H. Dalam contoh ini, file
TPC-H-Tool.zipdigunakan. Ganti dengan nama file aktual.unzip TPC-H-Tool.zipSetelah ekstraksi selesai, temukan lalu masuk ke folder dbgen. Dalam contoh ini,
TPC-H-Tool/dbgendigunakan. Ganti dengan nama file aktual.cd TPC-H-Tool/dbgenSalin file
makefileke direktori ini.cp makefile.suite makefileInstal GCC.
sudo yum install gccCatatanDalam contoh ini, sistem operasi CentOS digunakan. Jika Anda menggunakan sistem operasi lain, sesuaikan perintah instalasi sesuai dengan itu. Misalnya, di Ubuntu, jalankan perintah
sudo apt install gcc.Ubah nilai parameter
CC,DATABASE,MACHINE, danWORKLOADdalam filemakefile.Buka file makefile.
vim makefileTekan tombol
iuntuk mengubah nilai parameter.################ ## CHANGE NAME OF ANSI COMPILER HERE ################ CC = gcc # Nilai saat ini untuk DATABASE adalah: INFORMIX, DB2, TDAT (Teradata) # SQLSERVER, SYBASE, ORACLE, VECTORWISE # Nilai saat ini untuk MACHINE adalah: ATT, DOS, HP, IBM, ICL, MVS, # SGI, SUN, U2200, VMS, LINUX, WIN32 # Nilai saat ini untuk WORKLOAD adalah: TPCH DATABASE= MYSQL MACHINE = LINUX WORKLOAD = TPCHTekan tombol Esc, masukkan
:wq, lalu tekan Enter untuk menyimpan perubahan dan keluar dari mode edit.
Ubah file
tpcd.hdan tambahkan makro baru.Buka file
tpcd.h.vim tpcd.hTekan tombol
iuntuk menambahkan definisi makro berikut dalamdatabase portability defines.#ifdef MYSQL #define GEN_QUERY_PLAN "EXPLAIN PLAN" #define START_TRAN "START TRANSACTION" #define END_TRAN "COMMIT" #define SET_OUTPUT "" #define SET_ROWCOUNT "limit %d;\n" #define SET_DBASE "use %s;\n" #endifTekan tombol Esc, masukkan
:wq, lalu tekan Enter untuk menyimpan dan menutup file.
Kompilasi file.
makeSetelah file dikompilasi, file-file yang dapat dieksekusi berikut dihasilkan di direktori:
dbgen: alat yang digunakan untuk menghasilkan data. Jika Anda menggunakan skrip pengujian InfiniDB, Anda harus menggunakan alat ini untuk menghasilkan data untuk TPC-H.qgen: alat yang digunakan untuk menghasilkan pernyataan SQL. Alat ini menghasilkan pernyataan awal untuk pengujian. Kueri yang dihasilkan menggunakan seed yang berbeda akan berbeda satu sama lain. Untuk memastikan hasil pengujian dapat diulang, gunakan 22 pernyataan SQL yang kompleks dari TPC-H. Anda dapat mengklik di sini untuk mengunduh 22 pernyataan tersebut.
Gunakan dbgen untuk menghasilkan data pengujian.
./dbgen -s 100CatatanParameter
-smenentukan Scale Factor untuk menghasilkan data, yang menunjukkan ukuran dataset benchmark.-s 100menunjukkan bahwa dataset pengujian sekitar 100 GB dihasilkan (ukuran spesifik mungkin sedikit bervariasi tergantung pada struktur tabel dan distribusi data).(Opsional) Gunakan TPC-H untuk menghasilkan kueri.
CatatanUntuk memastikan hasil pengujian dapat diulang, lewati langkah ini dan gunakan 22 pernyataan SQL yang kompleks dari TPC-H. Anda dapat mengklik di sini untuk mengunduh 22 pernyataan tersebut.
Salin
qgendandists.dsske direktori queries.cp qgen queries cp dists.dss queriesHasilkan kueri.
Buat skrip
generate_queries.sh.vim generate_queries.shTekan tombol
idan tambahkan konten berikut ke file:#!/usr/bin/bash # Pergi ke direktori query. cd queries # Hasilkan 22 kueri. for i in {1..22} do ./qgen -d $i -s 100 > db"$i".sql doneTekan tombol Esc, masukkan
:wq, lalu tekan Enter untuk menyimpan dan menutup file.Atur izin eksekusi skrip.
chmod +x generate_queries.shEksekusi skrip
generate_queries.sh../generate_queries.sh
Prosedur pengujian
Hubungkan ke kluster PolarDB for MySQL dari instance ECS untuk menginisialisasi data dan menguji data.
Buat skrip eksekusi untuk memuat data.
Buat file
load.ddldi folderdbgendari TPC-H.vim load.ddlTekan tombol
idan tambahkan konten berikut ke file:load data local INFILE 'customer.tbl' INTO TABLE customer FIELDS TERMINATED BY '|'; load data local INFILE 'region.tbl' INTO TABLE region FIELDS TERMINATED BY '|'; load data local INFILE 'nation.tbl' INTO TABLE nation FIELDS TERMINATED BY '|'; load data local INFILE 'supplier.tbl' INTO TABLE supplier FIELDS TERMINATED BY '|'; load data local INFILE 'part.tbl' INTO TABLE part FIELDS TERMINATED BY '|'; load data local INFILE 'partsupp.tbl' INTO TABLE partsupp FIELDS TERMINATED BY '|'; load data local INFILE 'orders.tbl' INTO TABLE orders FIELDS TERMINATED BY '|'; load data local INFILE 'lineitem.tbl' INTO TABLE lineitem FIELDS TERMINATED BY '|';Tekan tombol Esc, masukkan
:wq, lalu tekan Enter untuk menyimpan dan menutup file.
Ubah file dss.ri untuk membuat kunci primer dan kunci asing tabel.
Salin file
dss.ridan kosongkan filedss.ri.cp dss.ri dss_bk.ri> dss.riBuka file
dss.ri.vim dss.riTekan tombol
idan tambahkan konten berikut ke file:use tpch100g; -- ALTER TABLE REGION DROP PRIMARY KEY; -- ALTER TABLE NATION DROP PRIMARY KEY; -- ALTER TABLE PART DROP PRIMARY KEY; -- ALTER TABLE SUPPLIER DROP PRIMARY KEY; -- ALTER TABLE PARTSUPP DROP PRIMARY KEY; -- ALTER TABLE ORDERS DROP PRIMARY KEY; -- ALTER TABLE LINEITEM DROP PRIMARY KEY; -- ALTER TABLE CUSTOMER DROP PRIMARY KEY; -- Untuk tabel REGION ALTER TABLE REGION ADD PRIMARY KEY (R_REGIONKEY); -- Untuk tabel NATION ALTER TABLE NATION ADD PRIMARY KEY (N_NATIONKEY); ALTER TABLE NATION ADD FOREIGN KEY NATION_FK1 (N_REGIONKEY) references REGION(R_REGIONKEY); COMMIT WORK; -- Untuk tabel PART ALTER TABLE PART ADD PRIMARY KEY (P_PARTKEY); COMMIT WORK; -- Untuk tabel SUPPLIER ALTER TABLE SUPPLIER ADD PRIMARY KEY (S_SUPPKEY); ALTER TABLE SUPPLIER ADD FOREIGN KEY SUPPLIER_FK1 (S_NATIONKEY) references NATION(N_NATIONKEY); COMMIT WORK; -- Untuk tabel PARTSUPP ALTER TABLE PARTSUPP ADD PRIMARY KEY (PS_PARTKEY,PS_SUPPKEY); COMMIT WORK; -- Untuk tabel CUSTOMER ALTER TABLE CUSTOMER ADD PRIMARY KEY (C_CUSTKEY); ALTER TABLE CUSTOMER ADD FOREIGN KEY CUSTOMER_FK1 (C_NATIONKEY) references NATION(N_NATIONKEY); COMMIT WORK; -- Untuk tabel LINEITEM ALTER TABLE LINEITEM ADD PRIMARY KEY (L_ORDERKEY,L_LINENUMBER); COMMIT WORK; -- Untuk tabel ORDERS ALTER TABLE ORDERS ADD PRIMARY KEY (O_ORDERKEY); COMMIT WORK; -- Untuk tabel PARTSUPP ALTER TABLE PARTSUPP ADD FOREIGN KEY PARTSUPP_FK1 (PS_SUPPKEY) references SUPPLIER(S_SUPPKEY); COMMIT WORK; ALTER TABLE PARTSUPP ADD FOREIGN KEY PARTSUPP_FK2 (PS_PARTKEY) references PART(P_PARTKEY); COMMIT WORK; -- Untuk tabel ORDERS ALTER TABLE ORDERS ADD FOREIGN KEY ORDERS_FK1 (O_CUSTKEY) references CUSTOMER(C_CUSTKEY); COMMIT WORK; -- Untuk tabel LINEITEM ALTER TABLE LINEITEM ADD FOREIGN KEY LINEITEM_FK1 (L_ORDERKEY) references ORDERS(O_ORDERKEY); COMMIT WORK; ALTER TABLE LINEITEM ADD FOREIGN KEY LINEITEM_FK2 (L_PARTKEY,L_SUPPKEY) references PARTSUPP(PS_PARTKEY,PS_SUPPKEY); COMMIT WORK;Tekan tombol Esc, masukkan
:wq, lalu tekan Enter untuk menyimpan dan menutup file.
Instal klien MySQL.
sudo yum install mysqlCatatanDalam contoh ini, sistem operasi CentOS digunakan. Jika Anda menggunakan sistem operasi lain, sesuaikan perintah instalasi sesuai dengan itu.
Gunakan akun privileged account dan primary endpoint dari kluster untuk menghubungkan ke kluster PolarDB for MySQL. Untuk informasi lebih lanjut, lihat Buat Akun Privileged dan Hubungkan ke Database.
mysql -h <Primary endpoint of the PolarDB cluster> -P <Port> -u <Username of the database> -p <Password of the database>CatatanJika pesan kesalahan "
Access denied for user 'xxx'@'xxx' (using password: YES)" muncul, nama pengguna atau kata sandi salah. Periksa apakah informasi yang dimasukkan benar.Buat database
tpch100gdan pindah ke database saat ini.CREATE DATABASE tpch100g; use tpch100g;Buat tabel.
source ./dss.ddlCatatandss.ddlada di direktoridbgen.Muat data.
source ./load.ddlCatatanload.ddlada di direktoridbgendan dibuat pada langkah pertama.Buat kunci primer dan kunci asing.
source ./dss.riCatatandss.riada di direktoridbgendan dimodifikasi pada langkah kedua.(Opsional) Buat indeks.
Anda harus menjalankan perintah
exit;untuk keluar dari klien MySQL. Lalu, buat skrip di instance ECS dan eksekusi. Contoh skrip:#!/usr/bin/bash host=$1 port=$2 user=$3 password=$4 db=$5 sqls=("create index i_s_nationkey on supplier (s_nationkey);" "create index i_ps_partkey on partsupp (ps_partkey);" "create index i_ps_suppkey on partsupp (ps_suppkey);" "create index i_c_nationkey on customer (c_nationkey);" "create index i_o_custkey on orders (o_custkey);" "create index i_o_orderdate on orders (o_orderdate);" "create index i_l_orderkey on lineitem (l_orderkey);" "create index i_l_partkey on lineitem (l_partkey);" "create index i_l_suppkey on lineitem (l_suppkey);" "create index i_l_partkey_suppkey on lineitem (l_partkey, l_suppkey);" "create index i_l_shipdate on lineitem (l_shipdate);" "create index i_l_commitdate on lineitem (l_commitdate);" "create index i_l_receiptdate on lineitem (l_receiptdate);" "create index i_n_regionkey on nation (n_regionkey);" "analyze table supplier" "analyze table part" "analyze table partsupp" "analyze table customer" "analyze table orders" "analyze table lineitem" "analyze table nation" "analyze table region") for sql in "${sqls[@]}" do mysql -h$host -P$port -u$user -p$password -D$db -e "$sql" doneCatatanSaat membuat skrip, pastikan skrip memiliki izin yang diperlukan. Dalam contoh ini, skrip
create_indexes.shdigunakan. Anda dapat menggunakan perintahchmod +x create_indexes.shuntuk menambahkan izin ke skrip.Saat mengeksekusi skrip, Anda harus melewati parameter yang sesuai. Dalam contoh ini, skrip
create_indexes.shdijalankan sebagai perintah./create_indexes.sh <host> <port <port> <user> <password> <database>. Parameter dalam skrip di atas:<host>: titik akhir kluster.
<port>: port.
<user>: nama pengguna database.
<password>: kata sandi database.
<database>: nama database.
Jika pesan peringatan "
[Warning] Using a password on the command line interface can be insecure" muncul saat skrip dieksekusi, skrip menggunakan perintahmysql -h <database connection address> -P <database port> -u <database account> -p <database password> -e<SQL>. Oleh karena itu, sistem akan meminta Anda memasukkan kata sandi di baris perintah, yang dapat menyebabkan pengguna lain di sistem melihat kata sandi dengan menjalankan perintah seperti ps. Pesan ini tidak memengaruhi operasi Anda. Setelah operasi selesai, Anda dapat pergi ke konsol PolarDB untuk mengubah kata sandi database.Untuk mengukur peningkatan kinerja yang dibawa oleh kueri paralel, eksekusi kueri berikut untuk memuat indeks ke dalam memory pool:
#!/bin/bash host=$1 port=$2 user=$3 password=$4 dbname=$5 MYSQL="mysql -h$host -P$port -u$user -p$password -D$dbname" if [ -z ${dbname} ]; then echo "dbname not defined." exit 1 fi table_indexes=( "supplier PRIMARY" "supplier i_s_nationkey" "part PRIMARY" "partsupp PRIMARY" "partsupp i_ps_partkey" "partsupp i_ps_suppkey" "customer PRIMARY" "customer i_c_nationkey" "orders PRIMARY" "orders i_o_custkey" "orders i_o_orderdate" "lineitem PRIMARY" "lineitem i_l_orderkey" "lineitem i_l_partkey" "lineitem i_l_suppkey" "lineitem i_l_partkey_suppkey" "lineitem i_l_shipdate" "lineitem i_l_commitdate" "lineitem i_l_receiptdate" "nation i_n_regionkey" "nation PRIMARY" "region PRIMARY" ) for table_index in "${table_indexes[@]}" do ti=($table_index) table=${ti[0]} index=${ti[1]} SQL="select count(*) from ${table} force index(${index})" echo "$MYSQL -e '$SQL'" $MYSQL -e "$SQL" done
Jalankan kueri.
Anda harus menjalankan perintah
exit;untuk keluar dari klien MySQL. Lalu, buat skrip di instance ECS dan eksekusi. Contoh skrip:#!/usr/bin/env bash host=$1 port=$2 user=$3 password=$4 database=$5 resfile=$6 echo "start test run at"`date "+%Y-%m-%d %H:%M:%S"`|tee -a ${resfile}.out for (( i=1; i<=22;i=i+1 )) do queryfile="./queries/Q"${i}".sql" start_time=`date "+%s.%N"` echo "run query ${i}"|tee -a ${resfile}.out mysql -h ${host} -P${port} -u${user} -p${password} $database -e" source $queryfile;" |tee -a ${resfile}.out end_time=`date "+%s.%N"` start_s=${start_time%.*} start_nanos=${start_time#*.} end_s=${end_time%.*} end_nanos=${end_time#*.} if [ "$end_nanos" -lt "$start_nanos" ];then end_s=$(( 10#$end_s -1 )) end_nanos=$(( 10#$end_nanos + 10 ** 9)) fi time=$(( 10#$end_s - 10#$start_s )).`printf "%03d\n" $(( (10#$end_nanos - 10#$start_nanos)/10**6 ))` echo ${queryfile} "the "${j}" run cost "${time}" second start at"`date -d @$start_time "+%Y-%m-%d %H:%M:%S"`" stop at"`date -d @$end_time "+%Y-%m-%d %H:%M:%S"` >> ${resfile}.time doneCatatanSebelum Anda mengeksekusi skrip, konfirmasikan item berikut:
Pastikan skrip memiliki izin yang diperlukan. Dalam contoh ini, skrip
run_queries.shdigunakan. Anda dapat menggunakan perintahchmod +x run_queries.shuntuk menambahkan izin ke skrip.Periksa direktori tempat Anda saat ini berada. Skrip dalam contoh dijalankan di direktori
dbgen. Ubahqueryfile="./queries/Q"${i}".sql"sesuai dengan itu. Jika tidak, pesan kesalahan "ERROR at line 1: Failed to open file 'QXX.sql'" akan muncul.Pastikan Anda telah mengunggah dan mengekstrak 22 kueri dalam file terlampir ke direktori
dbgen/queries. Jika Anda menggunakan pernyataan kueri lainnya, ubahqueryfile="./queries/Q"${i}".sql"sesuai kebutuhan. Jika tidak, pesan kesalahan "ERROR at line 1: Failed to open file 'QXX.sql'" akan muncul.
Saat mengeksekusi skrip, Anda harus melewati parameter yang sesuai. Dalam contoh ini, skrip
run_queries.shdijalankan sebagai perintah./run_queries.sh <host> <port> <user> <password> <database> <resfile>. Parameter dalam skrip di atas:<host>: titik akhir kluster.
<port>: port.
<user>: nama pengguna database.
<password>: kata sandi database.
<database>: nama database.
<resfile>: nama file hasil.
Jika pesan peringatan "
[Warning] Using a password on the command line interface can be insecure" muncul saat skrip dieksekusi, skrip menggunakan perintahmysql -h <database connection address> -P <database port> -u <database account> -p <database password> -e<SQL>. Oleh karena itu, sistem akan meminta Anda memasukkan kata sandi di baris perintah, yang dapat menyebabkan pengguna lain di sistem melihat kata sandi dengan menjalankan perintah seperti ps. Pesan ini tidak memengaruhi operasi Anda. Setelah operasi selesai, Anda dapat pergi ke konsol PolarDB untuk mengubah kata sandi database.
Hasil
Untuk informasi lebih lanjut, lihat Kinerja Kueri Paralel.