

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 klaster DB Amazon Aurora MySQL
<a name="aurora-mysql-write-forwarding"></a>

*Penerusan tulis lokal (in-cluster) memungkinkan aplikasi Anda untuk mengeluarkan read/write transaksi 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 *konsistensi baca-setelah-tulis*, yang merupakan kemampuan untuk membaca penulisan terbaru dalam suatu transaksi.

Replika baca menerima pembaruan secara asinkron dari penulis. Tanpa penerusan tulis, Anda harus bertransaksi pembacaan apa pun yang memerlukan konsistensi baca-setelah-tulis pada instans 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](aurora-global-database-write-forwarding.md).

Penerusan penulisan lokal membutuhkan Aurora MySQL versi 3.04 atau lebih tinggi, termasuk versi 8.4.

**Topics**
+ [Mengaktifkan penerusan tulis lokal](aurora-mysql-write-forwarding-enabling.md)
+ [Memeriksa apakah klaster DB memiliki penerusan tulis yang diaktifkan](#aurora-mysql-write-forwarding-describing)
+ [Kompatibilitas aplikasi dan SQL dengan penerusan tulis](#aurora-mysql-write-forwarding-compatibility)
+ [Tingkat isolasi untuk penerusan tulis](#aurora-mysql-write-forwarding-isolation)
+ [Konsistensi baca untuk penerusan tulis](aurora-mysql-write-forwarding-consistency.md)
+ [Menjalankan pernyataan multibagian dengan penerusan tulis](#aurora-mysql-write-forwarding-multipart)
+ [Transaksi dengan penerusan tulis](#aurora-mysql-write-forwarding-txns)
+ [Parameter konfigurasi untuk penerusan tulis](#aurora-mysql-write-forwarding-params)
+ [CloudWatch Metrik Amazon dan variabel status MySQL Aurora untuk penerusan tulis](aurora-mysql-write-forwarding-cloudwatch.md)
+ [Mengidentifikasi transaksi dan kueri yang diteruskan](#aurora-write-forwarding-processlist)

## Memeriksa apakah klaster DB memiliki penerusan tulis yang diaktifkan
<a name="aurora-mysql-write-forwarding-describing"></a>

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

Di Konsol Manajemen AWS, pada tab **Konfigurasi** halaman detail untuk klaster, Anda melihat status **Diaktifkan** untuk **penerusan tulis replika baca lokal**.

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

**Example**  

```
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.

## Kompatibilitas aplikasi dan SQL dengan penerusan tulis
<a name="aurora-mysql-write-forwarding-compatibility"></a>

Anda dapat menggunakan jenis pernyataan SQL berikut dengan penerusan tulis:
+ Pernyataan bahasa manipulasi data (DML), seperti `INSERT`, `DELETE`, dan `UPDATE`. 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. Selain itu, fungsi yang ditentukan pengguna dan prosedur yang ditentukan pengguna tidak didukung. 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.

Batasan berikut berlaku untuk pernyataan SQL yang Anda gunakan untuk 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)**  
Hubungkan ke instans DB tulis untuk menjalankan pernyataan DDL. 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 pernyataan DML untuk mengubah tabel permanen jika pernyataan tersebut 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]
```

**Pernyataan LOAD 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;
```

**Pernyataan SAVEPOINT**  
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
<a name="aurora-mysql-write-forwarding-isolation"></a>

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 [Tingkat isolasi Aurora MySQL](AuroraMySQL.Reference.IsolationLevels.md).

## Menjalankan pernyataan multibagian dengan penerusan tulis
<a name="aurora-mysql-write-forwarding-multipart"></a>

Pernyataan DML mungkin terdiri atas beberapa bagian, seperti pernyataan `INSERT ... SELECT` atau pernyataan `DELETE ... WHERE`. Dalam kasus ini, seluruh pernyataan diteruskan ke instans DB tulis dan berjalan di sana.

## Transaksi dengan penerusan tulis
<a name="aurora-mysql-write-forwarding-txns"></a>

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](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_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
<a name="aurora-mysql-write-forwarding-params"></a>

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](aurora-mysql-write-forwarding-consistency.md).

Untuk mengetahui informasi selengkapnya tentang grup parameter DB, lihat [](USER_WorkingWithParamGroups.md).

## Mengidentifikasi transaksi dan kueri yang diteruskan
<a name="aurora-write-forwarding-processlist"></a>

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](AuroraMySQL.Reference.ISTables.md#AuroraMySQL.Reference.ISTables.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)
```