Topik ini menjelaskan cara memanfaatkan arsitektur terdistribusi dari Alibaba Cloud Object Storage Service (OSS) untuk mempercepat pemrosesan data, mengurangi latensi, dan mempersingkat waktu respons aplikasi. Topik ini bertujuan membantu Anda mengoptimalkan kinerja OSS.
Ubah awalan berurutan menjadi awalan acak
Untuk mengoptimalkan distribusi data dan meningkatkan efisiensi pemrosesan, disarankan menggunakan awalan acak alih-alih awalan berurutan tradisional dalam penamaan objek. OSS secara otomatis mempartisi data berdasarkan urutan pengkodean UTF-8 dari kunci objek untuk mendukung manajemen objek skala besar dan permintaan konkurensi tinggi. Namun, jika Anda menggunakan awalan berurutan seperti cap waktu atau string alfabetis, sejumlah besar objek akan disimpan dalam beberapa partisi saja.
Sebagai contoh, jika Anda melakukan lebih dari 2.000 operasi per detik, masalah berikut dapat terjadi. Operasi pada satu objek, seperti mengunduh, mengunggah, menghapus, menyalin objek, atau memeriksa metadata objek, dihitung sebagai satu permintaan. Sedangkan operasi pada beberapa objek, seperti mengunduh atau mencantumkan beberapa objek, dihitung sebagai beberapa permintaan.
Pembentukan Partisi Hotspot: Permintaan sering diajukan ke objek dalam partisi tertentu, yang mengubah partisi tersebut menjadi partisi hotspot. Akibatnya, kapasitas I/O partisi tersebut habis atau sistem secara otomatis membatasi laju permintaan.
Laju Permintaan Terbatas: OSS secara terus-menerus mempartisi ulang data dalam partisi hotspot untuk menyeimbangkan distribusi data di antara partisi. Proses ini dapat meningkatkan waktu pemrosesan permintaan.
CatatanDistribusi data yang merata dilakukan berdasarkan hasil analisis status sistem dan kemampuan pemrosesan. Objek dengan awalan berurutan dalam kuncinya mungkin disimpan dalam partisi hotspot setelah operasi sebelumnya dilakukan.
Untuk mengatasi masalah ini, Anda dapat mengubah awalan berurutan dalam kunci objek menjadi awalan acak guna mencapai distribusi indeks objek dan beban I/O yang merata di antara partisi yang berbeda.
Gunakan Hash Heksadesimal Sebagai Awalan dalam Kunci Objek
Jika Anda menggunakan tanggal dan ID pelanggan untuk menghasilkan kunci, awalan berurutan yang menggunakan cap waktu termasuk dalam kunci seperti yang ditunjukkan dalam contoh berikut:
sample-bucket-01/2024-07-19/customer-1/file1 sample-bucket-01/2024-07-19/customer-2/file2 sample-bucket-01/2024-07-19/customer-3/file3 ... sample-bucket-01/2024-07-20/customer-2/file4 sample-bucket-01/2024-07-20/customer-5/file5 sample-bucket-01/2024-07-20/customer-7/file6 ...Dalam hal ini, Anda dapat menggunakan hash MD5 dari beberapa karakter ID pelanggan sebagai awalan nama objek. Jika Anda menggunakan hash MD5 dari empat karakter ID pelanggan sebagai awalan nama objek, nama objek diubah seperti yang ditunjukkan dalam contoh berikut:
sample-bucket-01/9b11/2024-07-19/customer-1/file1 sample-bucket-01/9fc2/2024-07-19/customer-2/file2 sample-bucket-01/d1b3/2024-07-19/customer-3/file3 ... sample-bucket-01/9fc2/2024-07-20/customer-2/file4 sample-bucket-01/f1ed/2024-07-20/customer-5/file5 sample-bucket-01/0ddc/2024-07-20/customer-7/file6 ...Jika Anda menggunakan hash heksadesimal dari empat karakter ID pelanggan sebagai awalan nama objek, setiap karakter dapat berupa salah satu dari 16 nilai (0-9 dan a-f). Dengan cara ini, jumlah total kombinasi dari empat karakter adalah 65.536 (164). Di OSS, data dapat didistribusikan secara terus-menerus hingga 65.536 partisi. Anda dapat melakukan hingga 2.000 operasi per detik pada setiap partisi berdasarkan batasan kinerja. Anda dapat menggunakan laju permintaan untuk menentukan apakah jumlah hash dari empat karakter yang digunakan sebagai awalan nama objek memenuhi persyaratan bisnis Anda.
Jika Anda ingin mencantumkan objek yang namanya berisi tanggal tertentu, seperti objek yang namanya berisi string 2024-07-19 dalam bucket bernama sample-bucket-01, Anda hanya perlu memanggil operasi ListObject beberapa kali untuk mencantumkan objek dalam batch di bucket sample-bucket-01, lalu mengelompokkan objek yang namanya berisi tanggal yang ditentukan.
Balikkan Urutan Digit yang Menunjukkan Milidetik dalam Nama Objek
Jika Anda menggunakan cap waktu UNIX yang akurat hingga milidetik untuk menghasilkan nama objek, awalan berurutan termasuk dalam nama objek seperti yang ditunjukkan dalam contoh berikut:
sample-bucket-02/1513160001245.log sample-bucket-02/1513160001722.log sample-bucket-02/1513160001836.log sample-bucket-02/1513160001956.log ... sample-bucket-02/1513160002153.log sample-bucket-02/1513160002556.log sample-bucket-02/1513160002859.log ...Dalam hal ini, Anda dapat membalikkan urutan digit dalam cap waktu UNIX. Dengan cara ini, nama objek tidak berisi awalan berurutan. Setelah Anda membalikkan urutan digit, nama objek ditampilkan seperti yang ditunjukkan dalam contoh berikut:
sample-bucket-02/5421000613151.log sample-bucket-02/2271000613151.log sample-bucket-02/6381000613151.log sample-bucket-02/6591000613151.log ... sample-bucket-02/3512000613151.log sample-bucket-02/6552000613151.log sample-bucket-02/9582000613151.log ...Tiga digit pertama menunjukkan milidetik dan tersedia 1.000 nilai. Digit keempat berubah dengan interval 1 detik. Digit kelima berubah dengan interval 10 detik. Operasi pembalikan meningkatkan keacakan awalan. Dengan cara ini, permintaan didistribusikan secara merata di setiap partisi untuk mencegah masalah batasan kinerja.
Ajukan permintaan HTTP Range untuk mendapatkan sebagian objek
Saat mengunduh objek besar yang ukurannya lebih besar dari 100 MB dari OSS, operasi unduhan mungkin gagal karena lingkungan jaringan yang tidak stabil. Jika Anda ingin mengunduh hanya sebagian objek, Anda dapat mengajukan permintaan HTTP Range. Contoh:
Get /ObjectName HTTP/1.1
Host:examplebucket.oss-cn-hangzhou.aliyuncs.com
Date:Fri, 19 Jul 2024 17:27:45 GMT
Authorization:SignatureValue
Range:bytes=[$ByteRange]Menurut spesifikasi protokol HTTP, Anda dapat mengonfigurasi header permintaan Range untuk menentukan rentang objek yang ingin Anda unduh. Rentang harus berada dalam [0, content-length - 1]. Untuk informasi lebih lanjut, lihat Cara Memperoleh Sumber Daya OSS dengan Membagi Permintaan HTTP Range.
Gunakan percepatan transfer
Anda dapat mengaktifkan percepatan transfer untuk mempercepat pengunggahan dan pengunduhan objek dalam bucket jarak jauh. Sebagai contoh, jika Anda berada di daratan Tiongkok, Anda dapat mengaktifkan percepatan transfer saat mengunggah objek ke atau mengunduh objek dari bucket yang berlokasi di luar daratan Tiongkok. Dengan cara ini, pengunggahan dan pengunduhan objek berukuran gigabyte dan terabyte dipercepat. Fitur percepatan transfer menyediakan solusi end-to-end yang dioptimalkan dengan pusat data yang tersebar di seluruh dunia untuk mempercepat akses ke OSS melalui Internet. Saat fitur ini diaktifkan, permintaan yang ditujukan ke bucket Anda diarahkan ke pusat data terdekat dengan pengguna melalui jalur jaringan dan protokol optimal. Untuk informasi lebih lanjut, lihat Percepatan Transfer.
Cached konten yang sering diakses
Untuk mempercepat akses ke objek yang sering diakses di OSS, disarankan menggunakan Alibaba Cloud CDN. Alibaba Cloud CDN menyimpan konten statis di titik kehadiran (POPs) di seluruh dunia. Anda dapat mengambil konten statis dari POP terdekat, meningkatkan kecepatan dan stabilitas akses situs web.
Saat Anda meminta objek di OSS, Alibaba Cloud CDN pertama-tama memeriksa apakah objek tersebut disimpan di POP. Jika objek tidak disimpan atau sudah kedaluwarsa, objek diminta dari OSS dan disimpan di POP terdekat. Saat objek di OSS berubah, Alibaba Cloud CDN secara otomatis memperbarui cache di POP untuk memastikan konsistensi data antara OSS dan POP.
Dengan menggunakan solusi ini, Alibaba Cloud CDN dapat secara efektif mengurangi beban pada OSS dan meningkatkan kecepatan serta stabilitas akses situs web. Solusi ini sangat cocok untuk perusahaan yang penggunanya tersebar di seluruh dunia. Untuk informasi lebih lanjut, lihat Akses Percepatan dengan Menggunakan Alibaba Cloud CDN.
Gunakan SDK OSS terbaru
SDK OSS menyediakan dukungan bawaan untuk mengoptimalkan kinerja OSS. Berikut ini menjelaskan bagaimana SDK OSS terbaru meningkatkan kinerja OSS:
Dukungan untuk Fitur Baru: Dalam kebanyakan kasus, SDK OSS terbaru mendukung fitur dan peningkatan terbaru. Ini dapat memanfaatkan fitur baru OSS, seperti operasi API terbaru, algoritma yang dioptimalkan, dan metode pengkodean yang lebih efisien untuk meningkatkan kinerja.
Penanganan Kesalahan dan Mekanisme Coba Ulang: SDK OSS terbaru mencakup mekanisme penanganan kesalahan dan coba ulang yang lebih lengkap yang dapat secara otomatis menangani kesalahan umum, seperti kesalahan dengan kode status HTTP 503 yang dikembalikan, untuk mengurangi jumlah operasi gagal yang disebabkan oleh masalah jaringan dan meningkatkan tingkat keberhasilan.
Manajemen Transmisi: SDK OSS terbaru menyediakan tingkat manajemen transmisi yang lebih tinggi, yang mendukung penskalaan otomatis dan menggunakan permintaan range dengan benar untuk throughput yang efisien.
Dukungan untuk Thread Paralel: SDK OSS terbaru mendukung model pemrograman multi-thread, yang dapat memproses permintaan paralel dan meningkatkan kecepatan pemrosesan data.
Optimasi Manajemen Memori: Untuk menggunakan sumber daya memori secara efektif, SDK OSS terbaru telah mengoptimalkan manajemen memori secara mendalam untuk mengurangi overhead memori yang tidak perlu dan meningkatkan efisiensi penggunaan memori.
Peningkatan Kompatibilitas: SDK OSS terbaru berdedikasi untuk menyelesaikan masalah historis dan terus meningkatkan kompatibilitas dengan berbagai pustaka perangkat lunak pihak ketiga dan sistem operasi.
Untuk informasi lebih lanjut tentang cara memperoleh SDK OSS terbaru, lihat Ikhtisar.
Gunakan OSS dan ECS di wilayah yang sama
Untuk memanfaatkan sepenuhnya OSS dan Elastic Compute Service (ECS), disarankan menerapkan instance ECS dan bucket OSS Anda dalam wilayah yang sama. Strategi penyebaran ini dapat secara signifikan mengurangi latensi transmisi data dan meningkatkan kecepatan pembacaan data, sehingga meningkatkan kinerja keseluruhan aplikasi. Jika instance ECS dan bucket OSS Anda berada di wilayah yang sama dan berkomunikasi satu sama lain menggunakan endpoint internal, Anda tidak dikenakan biaya lalu lintas jaringan internal. Dalam hal ini, saat Anda mentransfer sejumlah besar data antara instance ECS dan bucket OSS, Anda tidak dikenakan biaya lebar pita jaringan tinggi, yang mengurangi biaya keseluruhan. Untuk informasi lebih lanjut, lihat Akses ke Sumber Daya OSS dari Instance ECS dengan Menggunakan Endpoint Internal OSS.
Konfigurasikan aplikasi sensitif terhadap latensi untuk mencoba ulang permintaan timeout secara otomatis
OSS membatasi permintaan per detik (QPS) dari operasi API terkait manajemen, seperti GetService (ListBuckets), PutBucket, dan GetBucketLifecycle. Jika aplikasi Anda mengajukan sejumlah besar permintaan pada saat yang sama, kode status HTTP 503 mungkin dikembalikan untuk menunjukkan bahwa pembatasan permintaan dipicu. Dalam hal ini, disarankan mencoba ulang permintaan setelah beberapa detik.
Total QPS dari satu akun Alibaba Cloud adalah 10.000. Jika Anda memerlukan QPS yang lebih tinggi, hubungi Dukungan Teknis. Perhatikan bahwa jika QPS keseluruhan tidak melebihi 10.000 dan permintaan dikirim ke partisi tertentu, server mungkin secara otomatis membatasi laju permintaan dan mengembalikan kode status HTTP 503 karena kapasitas I/O partisi tersebut habis. Jika awalan acak dalam nama objek digunakan untuk distribusi indeks objek dan beban I/O yang merata di antara partisi yang berbeda, OSS secara otomatis meningkatkan jumlah partisi untuk mendukung QPS yang lebih tinggi. Anda hanya perlu menunggu hingga proses selesai. Untuk informasi lebih lanjut, lihat Praktik Terbaik Kinerja dan Skalabilitas OSS.
Saat Anda mengajukan sejumlah besar permintaan untuk objek berbagai ukuran, seperti objek yang lebih dari 128 MB dalam ukuran, disarankan mengukur throughput dan mencoba ulang 5% permintaan terlambat. Dalam kebanyakan kasus, respons terhadap permintaan untuk objek yang lebih kecil dari 512 KB dalam ukuran dikembalikan dalam puluhan milidetik. Jika Anda perlu mencoba ulang permintaan GET atau PUT, disarankan mencoba ulang permintaan 2 detik setelah permintaan dikirim. Jika permintaan gagal beberapa kali, disarankan menutup program dan mencoba ulang permintaan. Sebagai contoh, Anda dapat mencoba ulang permintaan 2 detik setelah permintaan dikirim dan kemudian mencoba ulang permintaan setelah 4 detik.
Jika permintaan dikirim oleh aplikasi Anda untuk objek dengan ukuran yang sama dan Anda ingin waktu respons semua permintaan konsisten, disarankan mengidentifikasi dan mencoba ulang 1% permintaan terlambat. Dalam hal ini, waktu respons permintaan dapat dikurangi saat permintaan dicoba ulang.
Kirim permintaan secara terdistribusi dan bersamaan untuk throughput tinggi
OSS adalah sistem penyimpanan terdistribusi berskala besar. Untuk sepenuhnya memanfaatkan throughput OSS, disarankan mengirim permintaan bersamaan ke OSS dan mendistribusikan permintaan di beberapa node layanan OSS. Dengan cara ini, beban kerja dapat didistribusikan menggunakan beberapa jalur jaringan.
Untuk meningkatkan throughput selama transmisi data, disarankan membuat beberapa thread atau instance dan mengajukan beberapa permintaan dalam thread atau instance untuk mengunggah dan mengunduh data secara bersamaan. Untuk aplikasi tertentu, Anda dapat mengajukan beberapa permintaan dalam thread atau instance berbeda untuk mengakses OSS secara bersamaan. Anda dapat menentukan cara mendistribusikan permintaan berdasarkan arsitektur aplikasi Anda dan struktur objek yang ingin Anda akses.
Sebelum Anda mengubah jumlah permintaan bersamaan, Anda perlu memeriksa metrik kinerja. Disarankan pertama-tama memeriksa penggunaan lebar pita dan sumber daya lain yang dikonsumsi oleh satu permintaan. Ini membantu Anda mengidentifikasi sumber daya dengan penggunaan tertinggi dan menentukan jumlah maksimum permintaan bersamaan yang dapat diproses berdasarkan batas atas sumber daya. Sebagai contoh, jika 10% sumber daya CPU diperlukan untuk memproses permintaan, Anda dapat mengirim hingga 10 permintaan bersamaan.
Distribusikan permintaan ke beberapa koneksi
Hal yang umum adalah mendistribusikan permintaan ke beberapa koneksi untuk kinerja tinggi dalam desain aplikasi. Saat Anda mengembangkan aplikasi berkinerja tinggi, Anda dapat menggunakan OSS sebagai sistem penyimpanan terdistribusi berskala besar alih-alih node penyimpanan tunggal seperti server penyimpanan tradisional. Anda dapat mengirim beberapa permintaan bersamaan ke OSS untuk meningkatkan kinerja aplikasi. Anda dapat mendistribusikan permintaan ke beberapa koneksi untuk sepenuhnya menggunakan lebar pita yang disediakan oleh OSS. OSS tidak memberlakukan batasan pada jumlah koneksi ke bucket.
Tingkatkan jumlah percobaan ulang yang diizinkan
Pertama kali permintaan dikirim, OSS mungkin memerlukan waktu yang lama untuk merespons permintaan karena skalanya yang besar. Dalam hal ini, Anda dapat mengirim ulang permintaan. Anda dapat menggunakan SDK OSS untuk mengonfigurasi periode timeout dan jumlah percobaan ulang yang diizinkan untuk permintaan berdasarkan kebutuhan bisnis Anda.