Jeda replikasi

Halaman ini menjelaskan cara memecahkan masalah dan memperbaiki jeda replikasi untuk replika baca Cloud SQL.

Ringkasan

Replika baca Cloud SQL menggunakan replikasi berbasis baris MySQL menggunakan ID transaksi global (GTID). Perubahan ditulis ke log biner instance utama dan dikirim ke replika, tempat perubahan tersebut diterima, lalu diterapkan ke database.

Jeda replikasi dapat terjadi dalam beberapa skenario, seperti:

  • Instance utama tidak dapat mengirimkan perubahan dengan cukup cepat ke replika.
  • Replika tidak dapat menerima perubahan dengan cukup cepat.
  • Replika tidak dapat menerapkan perubahan dengan cukup cepat.
Menggunakannetwork_lag metrik untuk memantau dua skenario pertama saat instance utama tidak dapat mengirim perubahan dengan cukup cepat atau replika tidak dapat menerima perubahan dengan cukup cepat.

Jeda total diamati dengan metrik replica_lag. Perbedaan antara replica_lag dan network_lag dapat menunjukkan alasan ketiga ketika replika tidak dapat menerapkan perubahan replikasi dengan cukup cepat. Metrik ini dijelaskan di bagian Memantau jeda replikasi di bawah.

Konfigurasi replika yang lebih cepat

Kami memiliki dua cara untuk membuat replika MySQL menerapkan perubahan lebih cepat. Pengguna dapat mengonfigurasi replika mereka dengan opsi berikut:

  • Replikasi paralel
  • Pembersihan berperforma tinggi

Replikasi paralel

Replikasi paralel dapat membantu jeda replikasi dengan mengonfigurasi replika agar menggunakan beberapa thread yang bertindak secara paralel untuk menerapkan perubahan pada replika. Untuk mengetahui informasi tentang cara menggunakan replikasi paralel, lihat Mengonfigurasi replikasi paralel.

Pembersihan berperforma tinggi

Secara default, Cloud SQL untuk MySQL mengosongkan log pengulangan ke disk setelah setiap transaksi. Pembersihan berperforma tinggi mengurangi frekuensi pembersihan log pengulangan ke disk menjadi satu kali per detik, sehingga meningkatkan performa penulisan.

Tetapkan flag innodb_flush_log_at_trx_commit pada replika baca ke 2. Anda juga harus menetapkan flag sync_binlog ke nilai yang lebih tinggi agar flag innodb_flush_log_at_trx_commit berlaku.

Lihat Tips untuk menggunakan flag untuk mengetahui informasi selengkapnya tentang flag ini.

Jika flag innodb_flush_log_at_trx_commit ditetapkan pada replika baca dan Cloud SQL mendeteksi bahwa mungkin terjadi error, Cloud SQL akan otomatis membuat ulang replika.

Mengoptimalkan kueri dan skema

Bagian ini menyarankan beberapa pengoptimalan skema dan kueri umum yang dapat Anda lakukan untuk meningkatkan performa replikasi.

Tingkat isolasi kueri dalam replika baca

Tingkat isolasi transaksi REPEATABLE READ dan SERIALIZABLE memperoleh kunci yang mungkin memblokir perubahan replikasi. Sebaiknya kurangi tingkat isolasi untuk kueri Anda di replika. Tingkat isolasi transaksi READ COMMITTED mungkin akan berperforma lebih baik.

Transaksi yang berjalan lama di database utama

Jika sejumlah besar baris diperbarui dalam satu transaksi, hal ini dapat menyebabkan lonjakan tiba-tiba dalam jumlah perubahan yang perlu diterapkan ke instance utama, lalu dikirim ke replika. Hal ini berlaku untuk pembaruan atau penghapusan pernyataan tunggal yang memengaruhi banyak baris sekaligus. Perubahan dikirim ke replika setelah di-commit. Menerapkan lonjakan perubahan tiba-tiba pada replika dapat meningkatkan kemungkinan pertentangan kunci dalam replika jika beban kueri pada replika juga tinggi, yang menyebabkan jeda replikasi.

Pertimbangkan untuk membagi transaksi besar menjadi beberapa transaksi yang lebih kecil.

Kunci utama tidak ada

Replika baca Cloud SQL menggunakan replikasi berbasis baris, yang berperforma buruk jika tabel MySQL yang direplikasi tidak memiliki kunci utama. Kami merekomendasikan agar semua tabel yang direplikasi memiliki kunci utama.

Untuk MySQL 8 atau yang lebih baru, sebaiknya tetapkan flag sql_require_primary_key ke ON untuk mewajibkan tabel dalam database Anda agar memiliki kunci utama.

Penguncian eksklusif karena DDL

Perintah bahasa definisi data (DDL), seperti ALTER TABLE dan CREATE INDEX, dapat menyebabkan jeda replikasi dalam replika karena kunci eksklusif. Untuk menghindari pertentangan kunci, pertimbangkan untuk menjadwalkan eksekusi DDL saat beban kueri lebih rendah pada replika.

Replika kelebihan muatan

Jika replika baca menerima terlalu banyak kueri, replikasi dapat diblokir. Pertimbangkan untuk membagi pembacaan di antara beberapa replika untuk mengurangi beban pada setiap replika.

Untuk menghindari lonjakan kueri, pertimbangkan untuk melakukan throttling replika baca kueri baca di logika aplikasi Anda atau di lapisan proxy jika Anda menggunakannya.

Jika ada lonjakan aktivitas pada instance utama, pertimbangkan untuk menyebarkan update.

Database primer monolitik

Sebaiknya lakukan sharding database utama secara vertikal (atau horizontal) untuk mencegah satu atau beberapa tabel yang terjeda menahan semua tabel lainnya.

Memantau jeda replikasi

Anda dapat menggunakan metrik replica_lag dan network_lag untuk memantau jeda replikasi dan mengidentifikasi apakah penyebab jeda berada pada database utama, jaringan, atau replika.

MetrikDeskripsi
Jeda replikasi
(cloudsql.googleapis.com/database/replication/replica_lag)

Jumlah detik saat status replika terjeda dibandingkan status instance utama. Ini adalah perbedaan antara waktu saat ini dan stempel waktu asli saat database utama meng-commit transaksi yang saat ini diterapkan pada replika. Secara khusus, penulisan mungkin dianggap tertinggal meskipun telah diterima oleh replika, jika replika belum menerapkan penulisan ke database.

Metrik ini melaporkan nilai Seconds_Behind_Master saat SHOW SLAVE STATUS dijalankan di replika. Untuk mengetahui informasi selengkapnya, lihat Memeriksa Status Replikasi di Manual Referensi MySQL.

Nomor error thread I/O terakhir
(cloudsql.googleapis.com/database/mysql/replication/last_io_errno)

Menunjukkan error terakhir yang menyebabkan thread I/O gagal. Jika nilainya bukan nol, ini berarti replikasi rusak. Hal ini jarang terjadi, tetapi bisa saja terjadi. Periksa dokumentasi MySQL untuk memahami apa yang ditunjukkan oleh kode error. Misalnya, file binlog dalam instance utama mungkin telah dihapus sebelum replika menerimanya. Cloud SQL biasanya akan otomatis membuat ulang replika jika replikasi rusak. Metrik last_io_errno ini mungkin memberi tahu Anda alasannya.

Nomor error thread SQL terakhir
(cloudsql.googleapis.com/database/mysql/replication/last_sql_errno)

Menunjukkan error terakhir yang menyebabkan thread SQL gagal. Jika nilainya bukan nol, ini berarti replikasi rusak. Hal ini jarang terjadi, tetapi bisa saja terjadi. Periksa dokumentasi MySQL untuk memahami apa yang ditunjukkan oleh kode error. Cloud SQL biasanya akan otomatis membuat ulang replika jika replikasi rusak. Metrik last_sql_errno ini dapat memberi tahu Anda alasannya.

Latensi jaringan
(cloudsql.googleapis.com/database/replication/network_lag)

Durasi waktu, dalam detik yang diperlukan dari penulisan binlog di database utama untuk mencapai thread IO di replika.

Jika network_lag nol, atau dapat diabaikan, tetapi replica_lag tinggi, ini menunjukkan bahwa thread SQL tidak dapat menerapkan perubahan replikasi dengan cukup cepat.

Memverifikasi replikasi

Untuk memverifikasi bahwa replikasi berfungsi, jalankan pernyataan berikut terhadap replika tersebut:

mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
               Slave_IO_State: Queueing master event to the relay log
                  Master_Host: xx.xxx.xxx.xxx
                  Master_User: cloudsqlreplica
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.199927
          Read_Master_Log_Pos: 83711956
               Relay_Log_File: relay-log.000025
                Relay_Log_Pos: 24214376
        Relay_Master_Log_File: mysql-bin.199898
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 24214163
              Relay_Log_Space: 3128686571
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: Yes
           Master_SSL_CA_File: master_server_ca.pem
           Master_SSL_CA_Path: /mysql/datadir
              Master_SSL_Cert: replica_cert.pem
            Master_SSL_Cipher:
               Master_SSL_Key: replica_pkey.pem
        Seconds_Behind_Master: 2627
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 321071839
                  Master_UUID: 437d04e9-8456-11e8-b13d-42010a80027b
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: System lock
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set: 437d04e9-8456-11e8-b13d-42010a80027b:52111095710-52120776390
            Executed_Gtid_Set: 437d04e9-8456-11e8-b13d-42010a80027b:1-52113039508
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)

Jika replikasi terjadi, kolom pertama, Slave_IO_State, akan menampilkan Waiting for master to send event atau pesan serupa. Selain itu, kolom Last_IO_Error kosong.

Jika replikasi tidak terjadi, kolom Slave_IO_State akan menampilkan status Connecting to master dan kolom Last_IO_Error akan menampilkan status error connecting to master cloudsqlreplica@x.x.x.x:3306.

Menurut dokumentasi MySQL, beberapa kolom menarik lainnya yang terkait dengan jeda replikasi mencakup hal berikut:

KolomDeskripsi
Master_Log_File
Nama file log biner sumber yang saat ini dibaca oleh thread I/O
Read_Master_Log_Pos
Posisi dalam file log biner sumber saat ini yang telah dibaca oleh thread I/O.
Relay_Log_File
Nama file log relai yang saat ini dibaca dan dijalankan oleh thread SQL.
Relay_Log_Pos
Posisi dalam file log relai saat ini yang telah dibaca dan dijalankan oleh thread SQL.
Relay_Master_Log_File
Nama file log biner source yang berisi peristiwa terbaru yang dijalankan oleh thread SQL.

Pada contoh sebelumnya, Relay_Master_Log_File memiliki nilai mysql-bin.199898. Master_Log_Filememiliki nilaimysql-bin.199927 Akhiran numerik 199898 kurang dari 199927. Artinya, meskipun replika telah menerima file log mysql-bin.199927 yang lebih baru, replika tersebut masih menerapkan mysql-bin.199898 lama.

Dalam hal ini, thread SQL tertinggal dalam replika.

Anda juga dapat terhubung ke database utama dan menjalankan:

  SHOW MASTER STATUS;

Perintah ini menunjukkan file binlog mana yang sedang ditulis di database utama.

Jika file log biner database utama lebih baru daripada Master_Log_File yang berada dalam replika, artinya thread I/O mengalami ketertinggalan. Replika masih membaca file log biner lama dari database utama.

Saat thread I/O tertinggal, metrik network_lag juga tinggi. Jika thread SQL tertinggal, tetapi thread I/O tidak, berarti metrik network_lag tidak terlalu tinggi, tetapi replica_lag tinggi.

Perintah sebelumnya memungkinkan Anda mengamati detail jeda saat jeda terjadi, tetapi metrik network_lag dan replica_lag memberi Anda cara untuk melihat kemunculan jeda di masa lalu.

Membuat ulang replika yang tertinggal

Buat ulang replika yang tertinggal saat replikasi tertinggal dari durasi yang dapat diterima.

Dengan Cloud SQL, Anda dapat mengonfigurasi replika baca untuk membuat ulang replika itu sendiri jika replikasi tertinggal (atau tertunda) melebihi jangka waktu yang dapat diterima, dan penundaan tersebut berlangsung setidaknya selama lima menit.

Jika Anda menentukan penundaan replikasi yang dapat diterima sebagai kurang dari 360 detik (enam menit), dan penundaan replikasi minimal 361 detik berlangsung selama lebih dari lima menit, maka setelah lima menit, instance utama akan membuat snapshot baru dari dirinya sendiri dan replika baca dibuat ulang menggunakan snapshot ini.

Membuat ulang replika baca yang tertinggal memberikan manfaat berikut:

  • Anda mengontrol rentang yang dianggap dapat diterima untuk penundaan replikasi.
  • Anda dapat mengurangi waktu yang dihabiskan untuk memecahkan masalah penundaan replikasi selama berjam-jam atau bahkan berhari-hari.

Detail fitur tambahan berlaku:

  • Kompatibel dengan versi berikut:
    • MySQL 5.7
    • MySQL 8.0
    • MySQL 8.4
  • Rentang yang dapat diterima untuk jeda atau penundaan replikasi harus ditentukan dalam detik.
  • Nilai minimum yang dapat diterima adalah 300 detik atau lima menit.
  • Nilai maksimum yang dapat diterima adalah 31.536.000 detik atau satu tahun.
    • Jika Anda mengaktifkan pembuatan ulang replika yang tertinggal untuk instance, tetapi tidak menetapkan keterlambatan replikasi maksimum yang dapat diterima, Cloud SQL akan menggunakan nilai default satu tahun.
  • Jenis instance yang didukung:
    • Replika baca
    • Replika baca lintas region
    • Replika beruntun
  • Nilai yang ditetapkan untuk kolom replicationLagMaxSeconds bersifat khusus untuk setiap instance replika. Jika instance utama memiliki beberapa instance replika, Anda dapat menetapkan setiap replika dengan nilai yang berbeda.
  • Saat replika dibuat ulang, pengguna dapat mengalami beberapa periode nonaktif saat operasi berikut selesai:
    • Replikasi dihentikan.
    • Replika dihapus.
    • Snapshot instance utama dibuat.
    • Replika dibuat ulang dari snapshot terbaru ini. Replika baru menggunakan nama dan alamat IP yang sama dengan replika sebelumnya. Akibatnya, MySQL harus berhenti dan dimulai ulang.
    • Replika baru mulai mereplikasi data.
  • replicationLagMaxSeconds adalah kolom tingkat instance. Setiap instance memiliki nilainya sendiri.
  • Jika memiliki beberapa replika baca untuk instance utama yang sama, Anda dapat menetapkan nilai unik untuk kolom replicationLagMaxSeconds untuk setiap replika.

    Menentukan nilai minimum waktu yang berbeda untuk replika yang berbeda dapat membantu Anda menghindari skenario saat semua replika mengalami error secara bersamaan.

Mengaktifkan pembuatan ulang replika yang tertinggal

Fitur membuat ulang replika yang tertinggal dinonaktifkan secara default. Untuk mengaktifkannya saat Anda membuat instance, gunakan salah satu metode berikut:

gcloud

Gunakan perintah gcloud sql instances create untuk membuat instance replika baca baru dengan flag
--replication-lag-max-seconds-for-recreate:

gcloud beta sql instances create REPLICA_INSTANCE_NAME \
  --master-instance-name=PRIMARY_INSTANCE_NAME \
  --database-version=DATABASE_VERSION \
  --tier=TIER \
  --edition=EDITION \
  --region=REGION \
  --root-password=PASSWORD \
  --replication-lag-max-seconds-for-recreate=REPLICATION_LAG_MAX_SECONDS

Dengan keterangan:

  • REPLICA_INSTANCE_NAME adalah nama instance replika.
  • PRIMARY_INSTANCE_NAME adalah nama instance utama.
  • DATABASE_VERSION adalah versi database dari instance. Contoh, MYSQL_8_0_31.
  • TIER adalah jenis mesin yang ingin Anda gunakan untuk instance replika. Contoh, db-perf-optimized-N-4. Untuk mengetahui informasi selengkapnya, lihat Konfigurasi instance kustom.
  • EDITION adalah edisi yang ingin Anda gunakan untuk instance replika. Contoh, ENTERPRISE_PLUS. Untuk mengetahui informasi selengkapnya, lihat Membuat instance.
  • REGION adalah region yang ingin Anda gunakan untuk instance replika. Contoh, us-central1.
  • PASSWORD adalah sandi root untuk instance.
  • REPLICATION_LAG_MAX_SECONDS adalah latensi atau penundaan replika maksimum yang dapat diterima dalam hitungan detik. Contoh, 600. Nilai minimum yang dapat diterima adalah 300 detik atau lima menit. Nilai maksimum yang dapat diterima adalah 31.536.000 detik atau satu tahun.

REST API

Kolom replicationLagMaxSeconds terletak di resource DatabaseInstance. Tambahkan kolom ini ke isi permintaan:

{
  "settings": {
  "replicationLagMaxSeconds" :REPLICATION_LAG_MAX_SECONDS,
  }
  ...
}

Dengan keterangan:

  • REPLICATION_LAG_MAX_SECONDS adalah jeda atau penundaan replika maksimum yang dapat diterima dalam hitungan detik. Contoh, 600.

Memperbarui jangka waktu pembuatan ulang untuk jeda replikasi

Untuk melihat setelan instance, gunakan salah satu metode yang dijelaskan dalam artikel Melihat informasi ringkasan instance.

Dengan informasi ini, Anda dapat memilih apakah akan memperbarui jangka waktu jeda replika yang Anda tentukan sebagai dapat diterima atau tidak sebelum replika dibuat ulang.

gcloud

Gunakan perintah gcloud sql instances patch untuk memperbarui jangka waktu pembuatan ulang instance berdasarkan lag replikasi:

gcloud beta sql instances patch INSTANCE_NAME \
  --replication-lag-max-seconds-for-recreate=REPLICATION_LAG_MAX_SECONDS

Dengan keterangan:

  • INSTANCE_NAME adalah nama instance.
  • REPLICATION_LAG_MAX_SECONDS adalah latensi atau penundaan replika maksimum yang dapat diterima dalam hitungan detik. Contoh, 700. Jika Anda ingin kembali ke nilai default satu tahun, masukkan 31536000. Nilai minimum yang dapat diterima adalah 300 detik atau lima menit. Nilai maksimum yang dapat diterima adalah 31.536.000 detik atau satu tahun.

REST API

Kebijakan dapat diperbarui menggunakan instances.patch dan instance.insert.

Untuk melihat contoh cara memperbarui setelan menggunakan REST API, lihat Mengedit instance.

Batasan

Batasan berikut berlaku untuk membuat ulang replika yang tertinggal:

  • Nilai untuk replicationLagMaxSeconds hanya dapat ditetapkan dalam detik.
  • Indeks yang dibuat pada replika baca sebelum dilakukannya operasi pembuatan ulang tidak akan disimpan. Jika indeks sudah ada, buat indeks sekunder setelah replika dibuat ulang.
  • Untuk menghindari downtime yang sering terjadi pada replika baca, pembuatan ulang dibatasi hingga satu per hari per instance.
  • Replika baca dengan ketersediaan tinggi dan replika server eksternal tidak didukung dengan fitur ini.
  • Jika Anda mengaktifkan pembuatan ulang replika yang tertinggal pada replika bertingkat, Cloud SQL akan membuat ulang replika daun terlebih dahulu untuk mempertahankan konsistensi replikasi.
  • Membuat ulang replika lintas region akan menimbulkan biaya tambahan.
  • Anda tidak dapat mengaktifkan pembuatan ulang replika yang tertinggal di konsol Google Cloud.

Langkah selanjutnya: