MariaDB
 sql >> Teknologi Basis Data >  >> RDS >> MariaDB

Apa yang Harus Diperhatikan jika Replikasi MySQL Anda Lagging

Pengaturan cluster replikasi master/slave adalah kasus penggunaan umum di sebagian besar organisasi. Menggunakan Replikasi MySQL memungkinkan data Anda direplikasi di lingkungan yang berbeda dan menjamin bahwa informasi akan disalin. Ini asinkron dan utas tunggal (secara default), tetapi replikasi juga memungkinkan Anda untuk mengonfigurasinya menjadi sinkron (atau sebenarnya "semi-sinkron") dan dapat menjalankan utas budak ke beberapa utas atau paralel.

Ide ini sangat umum dan biasanya datang dengan penyiapan sederhana, menjadikan slave-nya sebagai pemulihan atau solusi cadangan. Namun, ini selalu ada harganya terutama ketika kueri buruk (seperti kurangnya kunci utama atau unik) direplikasi atau ada masalah dengan perangkat keras (seperti masalah jaringan atau IO disk). Ketika masalah ini terjadi, masalah yang paling umum dihadapi adalah jeda replikasi.

Replikasi lag adalah biaya penundaan untuk transaksi atau operasi yang dihitung berdasarkan perbedaan waktu eksekusi antara node utama/master dengan node standby/slave. Sebagian besar kasus tertentu di MySQL bergantung pada kueri buruk yang direplikasi seperti kurangnya kunci utama atau indeks buruk, perangkat keras jaringan yang buruk atau kartu jaringan yang tidak berfungsi, lokasi yang jauh antara wilayah atau zona yang berbeda, atau beberapa proses seperti pencadangan fisik yang berjalan dapat menyebabkan database MySQL Anda untuk menunda penerapan transaksi yang direplikasi saat ini. Ini adalah kasus yang sangat umum ketika mendiagnosis masalah ini. Di blog ini, kami akan memeriksa cara menangani kasus ini dan apa yang harus dilakukan jika Anda mengalami jeda replikasi MySQL.

"SHOW SLAVE STATUS":Mantra MySQL DBA

Dalam beberapa kasus, ini adalah solusi terbaik ketika berhadapan dengan jeda replikasi dan sebagian besar mengungkapkan semua penyebab masalah dalam database MySQL Anda. Cukup jalankan pernyataan SQL ini di node slave Anda yang diduga mengalami lag replikasi.

Bidang awal yang biasa dilacak untuk masalah adalah,

  • Slave_IO_State - Ini memberi tahu Anda apa yang sedang dilakukan utas. Bidang ini akan memberi Anda wawasan yang baik jika kesehatan replikasi berjalan normal, menghadapi masalah jaringan seperti menyambung kembali ke master, atau mengambil terlalu banyak waktu untuk melakukan data yang dapat menunjukkan masalah disk saat menyinkronkan data ke disk. Anda juga dapat menentukan nilai status ini saat menjalankan SHOW PROCESSLIST.
  • File_Log_Master -  Nama file binlog master tempat utas I/O saat ini diambil.
  • Baca_Master_Log_Pos - posisi file binlog dari master tempat utas I/O replikasi telah dibaca.
  • Relay_Log_File - nama file log relai yang saat ini sedang dijalankan oleh utas SQL
  • Relay_Log_Pos - posisi binlog dari file yang ditentukan dalam Relay_Log_File yang telah dieksekusi utas SQL.
  • Relay_Master_Log_File - File binlog master yang telah dieksekusi oleh utas SQL dan kongruen dengan nilai Read_Master_Log_Pos.
  • Seconds_Behind_Master -  kolom ini menunjukkan perkiraan perbedaan antara stempel waktu saat ini pada slave dengan stempel waktu pada master untuk peristiwa yang saat ini sedang diproses pada slave. Namun, bidang ini mungkin tidak dapat memberi tahu Anda kelambatan yang tepat jika jaringan lambat karena perbedaan detik diambil antara utas SQL budak dan utas I/O budak. Jadi mungkin ada kasus yang bisa terjebak dengan utas I/O budak yang membaca lambat, tapi saya menguasainya sudah berbeda.
  • Slave_SQL_Running_State - status utas SQL dan nilainya identik dengan nilai status yang ditampilkan di SHOW PROCESSLIST.
  • Retrieved_Gtid_Set - Tersedia saat menggunakan replikasi GTID. Ini adalah set GTID yang sesuai dengan semua transaksi yang diterima oleh slave ini.
  • Dieksekusi_Gtid_Set - Tersedia saat menggunakan replikasi GTID. Ini adalah kumpulan GTID yang ditulis dalam log biner.

Misalnya, mari kita ambil contoh di bawah ini yang menggunakan replikasi GTID dan mengalami jeda replikasi:

mysql> show slave status\G

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.10.70

                  Master_User: cmon_replication

                  Master_Port: 3306

                Connect_Retry: 10

              Master_Log_File: binlog.000038

          Read_Master_Log_Pos: 826608419

               Relay_Log_File: relay-bin.000004

                Relay_Log_Pos: 468413927

        Relay_Master_Log_File: binlog.000038

             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: 826608206

              Relay_Log_Space: 826607743

              Until_Condition: None

               Until_Log_File: 

                Until_Log_Pos: 0

           Master_SSL_Allowed: No

           Master_SSL_CA_File: 

           Master_SSL_CA_Path: 

              Master_SSL_Cert: 

            Master_SSL_Cipher: 

               Master_SSL_Key: 

        Seconds_Behind_Master: 251

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: 45003

                  Master_UUID: 36272880-a7b0-11e9-9ca6-525400cae48b

             Master_Info_File: mysql.slave_master_info

                    SQL_Delay: 0

          SQL_Remaining_Delay: NULL

      Slave_SQL_Running_State: copy to tmp table

           Master_Retry_Count: 86400

                  Master_Bind: 

      Last_IO_Error_Timestamp: 

     Last_SQL_Error_Timestamp: 

               Master_SSL_Crl: 

           Master_SSL_Crlpath: 

           Retrieved_Gtid_Set: 36272880-a7b0-11e9-9ca6-525400cae48b:7631-9192

            Executed_Gtid_Set: 36272880-a7b0-11e9-9ca6-525400cae48b:1-9191,

864dd532-a7af-11e9-85f2-525400cae48b:1-173,

df68c807-a7af-11e9-9b56-525400cae48b:1-4

                Auto_Position: 1

         Replicate_Rewrite_DB: 

                 Channel_Name: 

           Master_TLS_Version: 

1 row in set (0.00 sec)

Mendiagnosis masalah seperti ini, mysqlbinlog juga dapat menjadi alat Anda untuk mengidentifikasi kueri apa yang telah berjalan pada posisi binlog x &y tertentu. Untuk menentukan ini, mari kita ambil Retrieved_Gtid_Set, Relay_Log_Pos, dan Relay_Log_File. Lihat perintah di bawah ini:

[[email protected] mysql]# mysqlbinlog --base64-output=DECODE-ROWS --include-gtids="36272880-a7b0-11e9-9ca6-525400cae48b:9192" --start-position=468413927 -vvv relay-bin.000004

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;

/*!50003 SET @[email protected]@COMPLETION_TYPE,COMPLETION_TYPE=0*/;

DELIMITER /*!*/;

# at 468413927

#200206  4:36:14 server id 45003  end_log_pos 826608271 CRC32 0xc702eb4c        GTID last_committed=1562 sequence_number=1563    rbr_only=no

SET @@SESSION.GTID_NEXT= '36272880-a7b0-11e9-9ca6-525400cae48b:9192'/*!*/;

# at 468413992

#200206  4:36:14 server id 45003  end_log_pos 826608419 CRC32 0xe041ec2c        Query thread_id=24 exec_time=31 error_code=0

use `jbmrcd_date`/*!*/;

SET TIMESTAMP=1580963774/*!*/;

SET @@session.pseudo_thread_id=24/*!*/;

SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;

SET @@session.sql_mode=1436549152/*!*/;

SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;

/*!\C utf8 *//*!*/;

SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;

SET @@session.lc_time_names=0/*!*/;

SET @@session.collation_database=DEFAULT/*!*/;

ALTER TABLE NewAddressCode ADD INDEX PostalCode(PostalCode)

/*!*/;

SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;

DELIMITER ;

# End of log file

/*!50003 SET [email protected]_COMPLETION_TYPE*/;

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

Ini memberi tahu kita bahwa ia mencoba mereplikasi dan mengeksekusi pernyataan DML yang mencoba menjadi sumber kelambatan. Tabel ini adalah tabel besar yang berisi 13 juta baris.

Centang SHOW PROCESSLIST, SHOW ENGINE INNODB STATUS, dengan kombinasi perintah ps, top, iostat

Dalam beberapa kasus, SHOW SLAVE STATUS tidak cukup untuk memberi tahu kami pelakunya. Ada kemungkinan bahwa pernyataan yang direplikasi dipengaruhi oleh proses internal yang berjalan di budak database MySQL. Menjalankan pernyataan SHOW [FULL] PROCESSLIST dan SHOW ENGINE INNODB STATUS juga menyediakan data informatif yang memberi Anda wawasan tentang sumber masalah.

Misalnya, katakanlah alat pembandingan sedang berjalan yang menyebabkan IO dan CPU disk jenuh. Anda dapat memeriksa dengan menjalankan kedua pernyataan SQL. Gabungkan dengan ps dan perintah teratas.

Anda juga dapat menentukan kemacetan dengan penyimpanan disk Anda dengan menjalankan iostat yang menyediakan statistik volume saat ini yang Anda coba diagnosa. Menjalankan iostat dapat menunjukkan seberapa sibuk atau dimuat server Anda. Misalnya, diambil oleh seorang budak yang lagging tetapi juga mengalami pemanfaatan IO tinggi pada saat yang sama, 

[[email protected] ~]# iostat -d -x 10 10

Linux 3.10.0-693.5.2.el7.x86_64 (testnode5)     02/06/2020 _x86_64_ (2 CPU)



Device:         rrqm/s wrqm/s     r/s w/s rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await svctm  %util

sda               0.00 0.42 3.71   60.65 218.92 568.39   24.47 0.15 2.31 13.79    1.61 0.12 0.76

dm-0              0.00 0.00 3.70   60.48 218.73 568.33   24.53 0.15 2.36 13.85    1.66 0.12 0.76

dm-1              0.00 0.00 0.00    0.00 0.04 0.01 21.92     0.00 63.29 2.37 96.59 22.64   0.01



Device:         rrqm/s wrqm/s     r/s w/s rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await svctm  %util

sda               0.00 0.20 392.30 7983.60  2135.60 49801.55 12.40 36.70    3.84 13.01 3.39 0.08 69.02

dm-0              0.00 0.00 392.30 7950.20  2135.60 50655.15 12.66 36.93    3.87 13.05 3.42 0.08 69.34

dm-1              0.00 0.00 0.00    0.30 0.00 1.20   8.00 0.06 183.67 0.00  183.67 61.67 1.85



Device:         rrqm/s wrqm/s     r/s w/s rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await svctm  %util

sda               0.00 1.40 370.93 6775.42  2557.04 46184.22 13.64 43.43    6.12 11.60 5.82 0.10 73.25

dm-0              0.00 0.00 370.93 6738.76  2557.04 47029.62 13.95 43.77    6.20 11.64 5.90 0.10 73.41

dm-1              0.00 0.00 0.00    0.30 0.00 1.20   8.00 0.03 107.00 0.00  107.00 35.67 1.07



Device:         rrqm/s wrqm/s     r/s w/s rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await svctm  %util

sda               0.00 0.00 299.80 7253.35  1916.88 52766.38 14.48 30.44    4.59 15.62 4.14 0.10 72.09

dm-0              0.00 0.00 299.80 7198.60  1916.88 51064.24 14.13 30.68    4.66 15.70 4.20 0.10 72.57

dm-1              0.00 0.00 0.00    0.00 0.00 0.00   0.00 0.00 0.00 0.00    0.00 0.00 0.00



Device:         rrqm/s wrqm/s     r/s w/s rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await svctm  %util

sda               0.00 0.10 215.50 8939.60  1027.60 67497.10 14.97 59.65    6.52 27.98 6.00 0.08 72.50

dm-0              0.00 0.00 215.50 8889.20  1027.60 67495.90 15.05 60.07    6.60 28.09 6.08 0.08 72.75

dm-1              0.00 0.00 0.00    0.30 0.00 1.20   8.00 0.01 32.33 0.00   32.33 30.33 0.91



Device:         rrqm/s wrqm/s     r/s w/s rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await svctm  %util

sda               0.00 0.90 140.40 8922.10   625.20 54709.80 12.21 11.29    1.25 9.88 1.11 0.08 68.60

dm-0              0.00 0.00 140.40 8871.50   625.20 54708.60 12.28 11.39    1.26 9.92 1.13 0.08 68.83

dm-1              0.00 0.00 0.00    0.30 0.00 1.20   8.00 0.01 27.33 0.00   27.33 9.33 0.28



Device:         rrqm/s wrqm/s     r/s w/s rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await svctm  %util

sda               0.00 1.70 284.50 8621.30 24228.40 51535.75    17.01 34.14 3.27 8.19 3.11 0.08 72.78

dm-0              0.00 0.00 290.90 8587.10 25047.60 53434.95    17.68 34.28 3.29 8.02 3.13 0.08 73.47

dm-1              0.00 0.00 0.00    2.00 0.00 8.00   8.00 0.83 416.45 0.00  416.45 63.60 12.72



Device:         rrqm/s wrqm/s     r/s w/s rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await svctm  %util

sda               0.00 0.30 851.60 11018.80 17723.60 85165.90    17.34 142.59 12.44 7.61 12.81 0.08 99.75

dm-0              0.00 0.00 845.20 10938.90 16904.40 83258.70    17.00 143.44 12.61 7.67 12.99 0.08 99.75

dm-1              0.00 0.00 0.00    0.00 0.00 0.00   0.00 0.00 0.00 0.00    0.00 0.00 0.00



Device:         rrqm/s wrqm/s     r/s w/s rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await svctm  %util

sda               0.00 1.10 24.60 12965.40   420.80 51114.45 7.93 39.44    3.04 0.33 3.04 0.07 93.39

dm-0              0.00 0.00 24.60 12890.20   420.80 51114.45 7.98 40.23    3.12 0.33 3.12 0.07 93.35

dm-1              0.00 0.00 0.00    0.00 0.00 0.00   0.00 0.00 0.00 0.00    0.00 0.00 0.00



Device:         rrqm/s wrqm/s     r/s w/s rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await svctm  %util

sda               0.00 0.00 3.60 13420.70    57.60 51942.00 7.75 0.95   0.07 0.33 0.07 0.07 92.11

dm-0              0.00 0.00 3.60 13341.10    57.60 51942.00 7.79 0.95   0.07 0.33 0.07 0.07 92.08

dm-1              0.00 0.00 0.00    0.00 0.00 0.00   0.00 0.00 0.00 0.00    0.00 0.00 0.00

Hasil di atas menampilkan penggunaan IO yang tinggi dan penulisan yang tinggi. Ini juga mengungkapkan bahwa ukuran antrian rata-rata dan ukuran permintaan rata-rata bergerak yang berarti ini merupakan indikasi beban kerja yang tinggi. Dalam kasus ini, Anda perlu menentukan apakah ada proses eksternal yang menyebabkan MySQL mencekik utas replikasi.

Bagaimana ClusterControl Dapat Membantu?

Dengan ClusterControl, menangani lag slave dan menentukan penyebabnya sangat mudah dan efisien. Ini langsung memberi tahu Anda di UI web, lihat di bawah:

Ini mengungkapkan kepada Anda kelambatan budak saat ini yang dialami node budak Anda. Tidak hanya itu, dengan dasbor SCUMM, jika diaktifkan, memberi Anda lebih banyak wawasan tentang apa yang dilakukan oleh health node slave Anda atau bahkan seluruh cluster:

Tidak hanya hal-hal ini tersedia di ClusterControl, ini juga memberi Anda kemampuan untuk menghindari terjadinya kueri buruk dengan fitur-fitur ini seperti yang terlihat di bawah,

Indeks yang berlebihan memungkinkan Anda menentukan bahwa indeks ini dapat menyebabkan masalah kinerja untuk kueri masuk yang mereferensikan indeks duplikat. Ini juga memberi tahu Anda tabel yang tidak memiliki Kunci Utama yang biasanya merupakan masalah umum slave lag saat kueri SQL tertentu atau transaksi yang mereferensikan tabel besar tanpa kunci utama atau unik saat direplikasi ke slave.

Kesimpulan

Mengatasi keterlambatan Replikasi MySQL adalah masalah yang sering terjadi dalam pengaturan replikasi master-slave. Ini bisa mudah didiagnosis, tetapi sulit dipecahkan. Pastikan Anda memiliki tabel dengan kunci utama atau kunci unik yang ada, dan tentukan langkah-langkah dan alat tentang cara memecahkan masalah dan mendiagnosis penyebab lag budak. Efisiensi selalu menjadi kunci saat memecahkan masalah.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana DATE_ADD() Bekerja di MariaDB

  2. Menggunakan Flashback MariaDB di Server MySQL

  3. 4 Cara Menemukan Baris yang Mengandung Huruf Kecil di MariaDB

  4. Membandingkan Pemulihan Point-in-Time Amazon RDS dengan ClusterControl

  5. Cara Mengatur MariaDB untuk menggunakan Output Vertikal