Laporan ini menyajikan hasil pengujian benchmark kinerja untuk PolarDB for PostgreSQL pada berbagai beban kerja tipikal berdasarkan standar de facto Yahoo! Cloud Serving Benchmark (YCSB). Laporan ini menyediakan data kuantitatif untuk membantu pemilihan teknologi, desain aplikasi, dan perencanaan kapasitas. Hasil pengujian menunjukkan kemampuan baca-tulis yang stabil dan berkinerja tinggi pada berbagai skala data, serta performa luar biasa dalam skenario kueri titik (Point Lookup). Dengan volume data 100 GB, kinerja puncak mencapai 109.808 Operasi Per Detik (OPS).
Rangkuman hasil pengujian
Tabel berikut menunjukkan kinerja puncak (OPS) untuk setiap model pengujian pada berbagai volume data.
Skenario pengujian | Volume data 1 GB (OPS) | Volume data 10 GB (OPS) | Volume data 100 GB (OPS) | Volume data 1 TB (OPS) |
100% tulis (Insert) | 41.430 | 39.861 | 33.357 | 36.248 |
100% pembaruan (Update) | 44.177 | 41.486 | 38.062 | 30.782 |
100% dibaca (Dibaca) | 80.573 | 82.856 | 109.808 | 75.108 |
50% baca + 50% pembaruan | 45.010 | 42.962 | 39.805 | 32.021 |
100% pemindaian rentang (Scan) | 1.073 | 1.089 | 1.075 | 922 |
Hasil di atas merupakan nilai kinerja puncak yang diperoleh dari pengujian pada berbagai tingkat konkurensi.
Metode dan lingkungan pengujian
Konfigurasi lingkungan
Komponen | Spesifikasi dan konfigurasi |
Kluster pengujian (PolarDB) |
|
Klien pengujian stres (ECS) |
|
Wilayah penyebaran | Beijing, Zona K |
Alat benchmark
Metrik kinerja: OPS (Operations Per Second), yaitu jumlah operasi yang diproses database per detik.
Model beban kerja
Lima skenario bisnis tipikal disimulasikan dengan mengonfigurasi CoreWorkload YCSB. Model data pengujian menggunakan catatan yang masing-masing berisi 10 bidang. Setiap bidang memiliki nilai sepanjang 100 byte, sehingga setiap catatan berukuran sekitar 1 KB.
Beban Kerja YCSB | Deskripsi skenario | Konfigurasi parameter inti |
| 100% tulis |
|
| 100% pembaruan |
|
| 100% kueri titik |
|
| 50% baca + 50% pembaruan |
|
| 100% kueri rentang |
|
Lampiran: Langkah-langkah pengujian
Lampiran ini menjelaskan langkah-langkah untuk mereproduksi pengujian kinerja. Anda dapat menggunakan langkah-langkah ini untuk otentikasi sekunder atau pengujian khusus.
1. Konfigurasi YCSB
Sebelum menjalankan pengujian, Anda harus mengonfigurasi klien DynamoDB YCSB.
Konfigurasi kredensial identitas
Edit file
dynamodb/conf/AWSCredentials.properties. Masukkan kredensial identitas untuk akun DynamoDB khusus yang telah Anda buat di PolarDB console Buat akun DynamoDB khusus.# Nama akun adalah ID AccessKey accessKey = <YOUR_ACCESS_KEY_ID> # Kunci rahasia secretKey = <YOUR_SECRET_ACCESS_KEY>Konfigurasi properti koneksi
Edit file
dynamodb/conf/dynamodb.propertiesuntuk menentukan informasi koneksi ke kluster PolarDBKonfigurasi Titik akhir DynamoDB.# Jalur mutlak file autentikasi dynamodb.awsCredentialsFile = /path/to/your/AWSCredentials.properties # Buat tabel usertable di kluster terlebih dahulu. Contoh ini membuat tabel usertable hanya dengan kunci partisi bernama pk. dynamodb.primaryKey = pk # Titik akhir DynamoDB untuk PolarDB. Harus menyertakan awalan http://. dynamodb.endpoint = http://<your-polardb-ddb-endpoint>:<port> # Parameter wilayah harus diatur menjadi kosong. dynamodb.region = # Nama dan tipe kunci utama untuk tabel pengujian. Harus konsisten dengan tabel pengujian. dynamodb.primaryKey = HASH
2. Sesuaikan operasi Pembaruan YCSB
Klien DynamoDB YCSB resmi secara default menggunakan parameter AttributeUpdates yang sudah tidak digunakan lagi untuk melakukan pembaruan. Untuk memastikan kompatibilitas dengan parameter UpdateExpression baru yang didukung oleh PolarDB, Anda harus memodifikasi kode sumber YCSB.
Jalur file:
dynamodb/src/main/java/site/ycsb/db/DynamoDBClient.javaMetode yang dimodifikasi:
update()
Kode asli
@Override
public Status update(String table, String key, Map<String, ByteIterator> values) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("updatekey: " + key + " from table: " + table);
}
Map<String, AttributeValueUpdate> attributes = new HashMap<>(values.size());
for (Entry<String, ByteIterator> val : values.entrySet()) {
AttributeValue v = new AttributeValue(val.getValue().toString());
attributes.put(val.getKey(), new AttributeValueUpdate().withValue(v).withAction("PUT"));
}
UpdateItemRequest req = new UpdateItemRequest(table, createPrimaryKey(key), attributes);
try {
dynamoDB.updateItem(req);
} catch (AmazonServiceException ex) {
LOGGER.error(ex);
return Status.ERROR;
} catch (AmazonClientException ex) {
LOGGER.error(ex);
return CLIENT_ERROR;
}
return Status.OK;
}Setelah pembaruan (menggunakan UpdateExpression)
@Override
public Status update(String table, String key, Map<String, ByteIterator> values) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("updatekey: " + key + " from table: " + table);
}
StringBuilder updateExp = new StringBuilder("SET ");
Map<String, String> attrNames = new HashMap<>();
Map<String, AttributeValue> attrValues = new HashMap<>();
boolean first = true;
for (Map.Entry<String, ByteIterator> entry : values.entrySet()) {
String attr = entry.getKey();
if (!first) {
updateExp.append(", ");
}
String attrName = "#" + attr;
String valueName = ":" + attr;
updateExp.append(attrName).append(" = ").append(valueName);
attrNames.put(attrName, attr);
attrValues.put(valueName, new AttributeValue(entry.getValue().toString()));
first = false;
}
UpdateItemRequest req = new UpdateItemRequest()
.withTableName(table)
.withKey(createPrimaryKey(key))
.withUpdateExpression(updateExp.toString())
.withExpressionAttributeNames(attrNames)
.withExpressionAttributeValues(attrValues);
try {
dynamoDB.updateItem(req);
} catch (AmazonServiceException ex) {
LOGGER.error(ex);
return Status.ERROR;
} catch (AmazonClientException ex) {
LOGGER.error(ex);
return CLIENT_ERROR;
}
return Status.OK;
}3. Jalankan pengujian
Pengujian dibagi menjadi dua fase: load (untuk memuat data awal) dan run (untuk menjalankan beban kerja). Contoh berikut adalah untuk pengujian dengan volume data 1 GB (1 juta catatan), 128 thread konkuren, dan model read-only:
Untuk menguji dengan volume data berbeda, Anda dapat memodifikasi parameter recordcount dan operationcount dalam perintah.
Muat data (Fase Load)
# Deskripsi: # -s: Menampilkan pembaruan status. # -P workloads/workload_read_only: Menentukan file beban kerja dasar. # -P /path/to/dynamodb.properties: Menentukan file konfigurasi koneksi database. # -p recordcount=1000000: Menentukan jumlah total catatan. # -p operationcount=1000000: Menentukan jumlah total operasi yang akan dijalankan. # -threads 128: Menentukan jumlah thread konkuren. nohup ./bin/ycsb load dynamodb -s \ -P workloads/workload_read_only \ -P /path/to/dynamodb.properties \ -p recordcount=1000000 \ -p operationcount=1000000 \ -threads 128 \ > load.log 2>&1 &Jalankan pengujian (Fase Run)
nohup ./bin/ycsb run dynamodb -s \ -P workloads/workload_read_only \ -P /path/to/dynamodb.properties \ -p recordcount=1000000 \ -p operationcount=1000000 \ -threads 128 \ > run.log 2>&1 &