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.
Topik
- Mengaktifkan penerusan tulis lokal
- Memeriksa apakah klaster DB memiliki penerusan tulis yang diaktifkan
- Aplikasi dan SQL kompatibilitas dengan penerusan tulis
- Tingkat isolasi untuk penerusan tulis
- Konsistensi baca untuk penerusan tulis
- Menjalankan pernyataan multibagian dengan penerusan tulis
- Transaksi dengan penerusan tulis
- Parameter konfigurasi untuk penerusan tulis
- CloudWatch Metrik Amazon dan Aurora Variabel status SQL saya untuk penerusan tulis
- Mengidentifikasi transaksi dan kueri yang diteruskan
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), seperti
INSERT
,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
danSELECT FOR UPDATE
. -
Pernyataan
PREPARE
danEXECUTE
.
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
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 pengaturanmax_connections
untuk penulis. Misalnya, jikamax_connections
adalah 800 danaurora_fwd_master_max_connections_pct
atauaurora_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 pengaturanmax_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)