Menggunakan penerusan tulis lokal di Amazon SQL Aurora My DB cluster - Amazon Aurora

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menggunakan penerusan tulis lokal di Amazon SQL Aurora My DB cluster

Penerusan tulis lokal (dalam klaster) memungkinkan aplikasi Anda mengeluarkan transaksi baca/tulis langsung pada Replika Aurora. Transaksi ini kemudian diteruskan ke instans DB penulis untuk di-commit. Anda dapat menggunakan penerusan tulis lokal ketika aplikasi Anda memerlukan read-after-write konsistensi, yang merupakan kemampuan untuk membaca tulisan terbaru dalam suatu transaksi.

Replika baca menerima pembaruan secara asinkron dari penulis. Tanpa penerusan tulis, Anda harus bertransaksi pembacaan apa pun yang memerlukan read-after-write konsistensi pada instance DB penulis. Atau Anda harus mengembangkan logika aplikasi kustom yang kompleks untuk memanfaatkan beberapa replika baca untuk skalabilitas. Aplikasi Anda harus sepenuhnya membagi semua lalu lintas baca dan tulis, sehingga mempertahankan dua set koneksi basis data untuk mengirim lalu lintas ke titik akhir yang benar. Overhead pengembangan ini memperumit desain aplikasi ketika kueri merupakan bagian dari satu sesi logis, atau transaksi, di dalam aplikasi. Selain itu, karena lag replikasi dapat berbeda di antara replika baca, sulit untuk mencapai konsistensi baca global di semua instans di dalam basis data.

Penerusan tulis menghindari kebutuhan untuk membagi transaksi tersebut atau mengirimkannya secara eksklusif ke penulis, yang menyederhanakan pengembangan aplikasi. Kemampuan baru ini memudahkan pencapaian skala baca untuk beban kerja yang perlu membaca penulisan terbaru dalam suatu transaksi dan tidak sensitif terhadap latensi penulisan.

Penerusan tulis lokal berbeda dari penerusan tulis global, yang meneruskan penulisan dari klaster DB sekunder ke klaster DB primer dalam basis data global Aurora. Anda dapat menggunakan penerusan tulis lokal dalam klaster DB yang merupakan bagian dari basis data global Aurora. Untuk informasi selengkapnya, lihat Menggunakan penerusan menulis dalam basis data global Amazon Aurora.

Penerusan tulis lokal membutuhkan Aurora My SQL versi 3.04 atau lebih tinggi.

Memeriksa apakah klaster DB memiliki penerusan tulis yang diaktifkan

Untuk menentukan bahwa Anda dapat menggunakan penerusan tulis di klaster DB, konfirmasikan bahwa klaster memiliki atribut LocalWriteForwardingStatus disetel ke enabled.

Dalam AWS Management Console, pada tab Konfigurasi halaman detail untuk cluster, Anda melihat status Diaktifkan untuk penerusan tulis replika baca lokal.

Untuk melihat status setelan penerusan tulis untuk semua cluster Anda, jalankan yang berikut ini AWS CLI perintah.

aws rds describe-db-clusters \ --query '*[].{DBClusterIdentifier:DBClusterIdentifier,LocalWriteForwardingStatus:LocalWriteForwardingStatus}' [ { "LocalWriteForwardingStatus": "enabled", "DBClusterIdentifier": "write-forwarding-test-cluster-1" }, { "LocalWriteForwardingStatus": "disabled", "DBClusterIdentifier": "write-forwarding-test-cluster-2" }, { "LocalWriteForwardingStatus": "requested", "DBClusterIdentifier": "test-global-cluster-2" }, { "LocalWriteForwardingStatus": "null", "DBClusterIdentifier": "aurora-mysql-v2-cluster" } ]

Sebuah klaster DB dapat memiliki nilai berikut untuk LocalWriteForwardingStatus:

  • disabled – Penerusan tulis dinonaktifkan.

  • disabling – Penerusan tulis dalam proses penonaktifan.

  • enabled – Penerusan tulis diaktifkan.

  • enabling – Penerusan tulis dalam proses pengaktifan.

  • null – Penerusan tulis tidak tersedia untuk klaster DB ini.

  • requested – Penerusan tulis telah diminta, tetapi belum aktif.

Aplikasi dan SQL kompatibilitas dengan penerusan tulis

Anda dapat menggunakan jenis SQL pernyataan berikut dengan penerusan tulis:

  • Pernyataan bahasa manipulasi data (DML), sepertiINSERT,DELETE, danUPDATE. Ada beberapa pembatasan pada properti pernyataan ini yang dapat Anda gunakan dengan penerusan tulis, seperti yang dijelaskan di bawah ini.

  • Pernyataan SELECT ... LOCK IN SHARE MODE dan SELECT FOR UPDATE.

  • Pernyataan PREPARE dan EXECUTE.

Pernyataan tertentu tidak diizinkan atau dapat menghasilkan hasil usang saat Anda menggunakannya dalam klaster DB dengan penerusan tulis. Oleh karena itu, pengaturan EnableLocalWriteForwarding dinonaktifkan secara default untuk klaster DB. Sebelum diaktifkan, periksa untuk memastikan bahwa kode aplikasi Anda tidak terpengaruh oleh pembatasan ini.

Pembatasan berikut berlaku untuk SQL pernyataan yang Anda gunakan dengan penerusan tulis. Dalam beberapa kasus, Anda dapat menggunakan pernyataan pada klaster DB dengan penerusan tulis yang diaktifkan. Pendekatan ini berfungsi jika penerusan tulis tidak diaktifkan dalam sesi oleh parameter konfigurasi aurora_replica_read_consistency. Jika Anda mencoba menggunakan suatu pernyataan yang tidak diizinkan karena adanya penerusan tulis, Anda akan melihat pesan kesalahan seperti berikut ini:

ERROR 1235 (42000): This version of MySQL doesn't yet support 'operation with write forwarding'.
Bahasa definisi data (DDL)

Connect ke instance DB penulis untuk menjalankan DDL pernyataan. Anda tidak dapat menjalankannya dari instans DB pembaca.

Memperbarui tabel permanen menggunakan data dari tabel sementara

Anda dapat menggunakan tabel sementara pada klaster DB dengan penerusan tulis yang diaktifkan. Namun, Anda tidak dapat menggunakan DML pernyataan untuk memodifikasi tabel permanen jika pernyataan mengacu pada tabel sementara. Misalnya, Anda tidak dapat menggunakan pernyataan INSERT ... SELECT yang mengambil data dari tabel sementara.

Transaksi XA

Anda tidak dapat menggunakan pernyataan berikut pada klaster DB saat penerusan tulis diaktifkan dalam sesi. Anda dapat menggunakan pernyataan ini pada klaster DB yang tidak memiliki penerusan tulis yang diaktifkan, atau dalam sesi dengan pengaturan aurora_replica_read_consistency yang kosong. Sebelum mengaktifkan penerusan tulis dalam sebuah sesi, periksa apakah kode Anda menggunakan pernyataan ini.

XA {START|BEGIN} xid [JOIN|RESUME] XA END xid [SUSPEND [FOR MIGRATE]] XA PREPARE xid XA COMMIT xid [ONE PHASE] XA ROLLBACK xid XA RECOVER [CONVERT XID]
LOADpernyataan untuk tabel permanen

Anda tidak dapat menggunakan pernyataan berikut pada klaster DB dengan penerusan tulis yang diaktifkan.

LOAD DATA INFILE 'data.txt' INTO TABLE t1; LOAD XML LOCAL INFILE 'test.xml' INTO TABLE t1;
Pernyataan plugin

Anda tidak dapat menggunakan pernyataan berikut pada klaster DB dengan penerusan tulis yang diaktifkan.

INSTALL PLUGIN example SONAME 'ha_example.so'; UNINSTALL PLUGIN example;
SAVEPOINTpernyataan

Anda tidak dapat menggunakan pernyataan berikut pada klaster DB saat penerusan tulis diaktifkan dalam sesi. Anda dapat menggunakan pernyataan ini pada klaster DB yang tidak memiliki penerusan tulis yang diaktifkan, atau dalam sesi dengan pengaturan aurora_replica_read_consistency yang kosong. Periksa apakah kode Anda menggunakan pernyataan ini sebelum mengaktifkan penerusan tulis dalam sebuah sesi.

SAVEPOINT t1_save; ROLLBACK TO SAVEPOINT t1_save; RELEASE SAVEPOINT t1_save;

Tingkat isolasi untuk penerusan tulis

Dalam sesi yang menggunakan penerusan tulis, Anda hanya dapat menggunakan tingkat isolasi REPEATABLE READ. Meskipun Anda juga dapat menggunakan tingkat isolasi READ COMMITTED dengan Replika Aurora, tingkat isolasi tersebut tidak berfungsi dengan penerusan tulis. Untuk informasi tentang tingkat isolasi REPEATABLE READ dan READ COMMITTED, lihat Aurora Tingkat isolasi saya SQL.

Menjalankan pernyataan multibagian dengan penerusan tulis

DMLPernyataan dapat terdiri dari beberapa bagian, seperti INSERT ... SELECT pernyataan atau DELETE ... WHERE pernyataan. Dalam kasus ini, seluruh pernyataan diteruskan ke instans DB tulis dan berjalan di sana.

Transaksi dengan penerusan tulis

Jika mode akses transaksi disetel ke hanya-baca, penerusan tulis tidak digunakan. Anda dapat menentukan mode akses untuk transaksi dengan menggunakan pernyataan SET TRANSACTION atau pernyataan START TRANSACTION. Anda juga dapat menentukan mode akses transaksi dengan mengubah nilai variabel sesi transaction_read_only. Anda dapat mengubah nilai sesi ini hanya saat Anda terhubung dengan klaster DB yang memiliki penerusan tulis diaktifkan.

Jika transaksi yang berlangsung lama tidak mengeluarkan pernyataan apa pun dalam waktu yang lama, transaksi tersebut kemungkinan melebihi periode batas waktu idle. Periode ini memiliki nilai default satu menit. Anda dapat mengatur parameter aurora_fwd_writer_idle_timeout untuk meningkatkannya hingga satu hari. Transaksi yang melebihi batas waktu idle dibatalkan oleh instans tulis. Pernyataan berikutnya yang Anda kirimkan akan menerima kesalahan waktu habis. Kemudian Aurora akan mengembalikan transaksi.

Jenis kesalahan ini dapat terjadi dalam kasus lain ketika penerusan tulis menjadi tidak tersedia. Misalnya, Aurora membatalkan transaksi apa pun yang menggunakan penerusan tulis jika Anda memulai ulang klaster DB atau jika Anda menonaktifkan penerusan tulis.

Ketika instans penulis dalam sebuah klaster yang menggunakan penerusan tulis lokal dimulai ulang, transaksi dan kueri yang aktif dan diteruskan pada instans pembaca yang menggunakan penerusan tulis lokal akan ditutup secara otomatis. Setelah instans penulis tersedia lagi, Anda dapat mencoba kembali transaksi ini.

Parameter konfigurasi untuk penerusan tulis

Grup parameter DB Aurora mencakup pengaturan untuk fitur penerusan tulis. Detail tentang parameter ini dirangkum dalam tabel berikut, dengan catatan penggunaan setelah tabel.

Parameter Cakupan Tipe Nilai default Nilai valid
aurora_fwd_writer_idle_timeout Klaster Integer tanpa tanda 60 1-86.400
aurora_fwd_writer_max_connections_pct Klaster Integer panjang tanpa tanda 10 0–90
aurora_replica_read_consistency Klaster atau instans Enum '' (null) EVENTUAL, SESSION, GLOBAL

Untuk mengontrol permintaan tulis yang masuk, gunakan pengaturan ini:

  • aurora_fwd_writer_idle_timeout – Jumlah detik instans yang diperlukan oleh instans DB tulis untuk menunggu aktivitas pada koneksi yang diteruskan dari instans pembaca sebelum menutupnya. Jika sesi tetap idle setelah periode ini, Aurora akan membatalkan sesi.

  • aurora_fwd_writer_max_connections_pct – Batas atas pada koneksi basis data yang dapat digunakan pada instans DB penulis untuk menangani kueri yang diteruskan dari instans pembaca. Ini dinyatakan sebagai persentase dari pengaturan max_connections untuk penulis. Misalnya, jika max_connections adalah 800 dan aurora_fwd_master_max_connections_pct atau aurora_fwd_writer_max_connections_pct adalah 10, maka penulis mengizinkan maksimal 80 sesi terusan serentak. Koneksi ini berasal dari pool koneksi yang sama yang dikelola oleh pengaturan max_connections.

    Pengaturan ini hanya berlaku pada penulis saat penerusan tulis diaktifkan. Jika Anda menurunkan nilai, koneksi yang ada tidak akan terpengaruh. Aurora mempertimbangkan nilai baru pengaturan saat mencoba membuat koneksi baru dari klaster DB. Nilai default-nya adalah 10, mewakili 10% dari nilai max_connections.

catatan

Karena aurora_fwd_writer_idle_timeout dan aurora_fwd_writer_max_connections_pct adalah parameter klaster, semua instans DB di setiap klaster memiliki nilai yang sama untuk parameter ini.

Untuk informasi selengkapnya tentang aurora_replica_read_consistency, lihat Konsistensi baca untuk penerusan tulis.

Untuk mengetahui informasi selengkapnya tentang grup parameter DB, lihat .

Mengidentifikasi transaksi dan kueri yang diteruskan

Anda dapat menggunakan tabel information_schema.aurora_forwarding_processlist untuk mengidentifikasi transaksi dan kueri yang diteruskan. Untuk informasi selengkapnya tentang tabel ini, lihat information_schema.aurora_forwarding_processlist.

Contoh berikut ini menunjukkan semua koneksi yang diteruskan pada instans DB tulis.

mysql> select * from information_schema.AURORA_FORWARDING_PROCESSLIST where IS_FORWARDED=1 order by REPLICA_SESSION_ID; +-----+----------+--------------------+----------+---------+------+--------------+--------------------------------------------+--------------+--------------------+---------------------------------+----------------------+----------------+ | ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO | IS_FORWARDED | REPLICA_SESSION_ID | REPLICA_INSTANCE_IDENTIFIER | REPLICA_CLUSTER_NAME | REPLICA_REGION | +-----+----------+--------------------+----------+---------+------+--------------+--------------------------------------------+--------------+--------------------+---------------------------------+---------------------------------------+ | 648 | myuser | IP_address:port1 | sysbench | Query | 0 | async commit | UPDATE sbtest58 SET k=k+1 WHERE id=4802579 | 1 | 637 | my-db-cluster-instance-2 | my-db-cluster | us-west-2 | | 650 | myuser | IP_address:port2 | sysbench | Query | 0 | async commit | UPDATE sbtest54 SET k=k+1 WHERE id=2503953 | 1 | 639 | my-db-cluster-instance-2 | my-db-cluster | us-west-2 | +-----+----------+--------------------+----------+---------+------+--------------+--------------------------------------------+--------------+--------------------+---------------------------------+----------------------+----------------+

Pada instans DB pembaca penerusan, Anda dapat melihat thread yang terkait dengan koneksi DB penulis ini dengan menjalankan SHOW PROCESSLIST. Nilai REPLICA_SESSION_ID pada penulis, 637 dan 639, sama dengan nilai Id pada pembaca.

mysql> select @@aurora_server_id; +---------------------------------+ | @@aurora_server_id | +---------------------------------+ | my-db-cluster-instance-2 | +---------------------------------+ 1 row in set (0.00 sec) mysql> show processlist; +-----+----------+--------------------+----------+---------+------+--------------+---------------------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +-----+----------+--------------------+----------+---------+------+--------------+---------------------------------------------+ | 637 | myuser | IP_address:port1 | sysbench | Query | 0 | async commit | UPDATE sbtest12 SET k=k+1 WHERE id=4802579 | | 639 | myuser | IP_address:port2 | sysbench | Query | 0 | async commit | UPDATE sbtest61 SET k=k+1 WHERE id=2503953 | +-----+----------+--------------------+----------+---------+------+--------------+---------------------------------------------+ 12 rows in set (0.00 sec)