Topik ini menjelaskan cara mengidentifikasi dan mengatasi ketidakkonsistenan data setelah sinkronisasi Redis.
Deskripsi masalah
Setelah Anda menggunakan Data Transmission Service (DTS) untuk menyinkronkan Redis, data antara sumber dan tujuan tidak konsisten.
Contoh
Setelah menggunakan Data Transmission Service (DTS) untuk menyinkronkan data Redis, Anda menjalankan perintah info keyspace guna memeriksa kunci di sumber dan tujuan. Output menunjukkan ketidakkonsistenan data, dengan proporsi besar kunci memiliki waktu kedaluwarsa.
xxx> info keyspace
# Keyspace
db0:keys=769509,expires=227386,avg_ttl=3426607441
db3:keys=254,expires=0,avg_ttl=0
db2:keys=17,expires=2,avg_ttl=837582
db1:keys=2,expires=0,avg_ttl=0
db15:keys=2,expires=0,avg_ttl=0
[work@rec01 bin]$ ./redis-cli -a 'xxx'
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> info keyspace
# Keyspace
db0:keys=772864,expires=230736,avg_ttl=3380950183
db1:keys=2,expires=0,avg_ttl=0
db2:keys=17,expires=2,avg_ttl=868931
db3:keys=254,expires=0,avg_ttl=0
db15:keys=2,expires=0,avg_ttl=0
127.0.0.1:6379>
Penyebab
Mengandalkan nilai expires dari perintah info keyspace saja untuk memverifikasi konsistensi data bersifat menyesatkan karena perintah tersebut memberikan perkiraan, bukan nilai pasti.
-
Dalam output perintah
info keyspace:-
keysmenunjukkan jumlah total kunci. -
expiresmenunjukkan jumlah kunci yang memiliki waktu kedaluwarsa, termasuk kunci yang belum maupun sudah kedaluwarsa.
-
Oleh karena itu, saat Anda menggunakan nilai expires untuk memeriksa konsistensi, kunci yang secara logis telah kedaluwarsa tetapi belum dihapus secara aktif oleh Redis tetap dihitung. Hal ini menyebabkan ketidakkonsistenan data yang tampak antara sumber dan tujuan.
Redis menghapus kunci yang kedaluwarsa dalam kondisi berikut:
-
Redis secara berkala membersihkan kunci kedaluwarsa saat CPU menganggur.
-
Saat sebuah kunci diakses, Redis memeriksa apakah kunci tersebut telah kedaluwarsa dan menghapusnya jika iya.
-
Selama operasi SCAN, Redis memeriksa dan menghapus kunci kedaluwarsa yang ditemui.
Untuk informasi lebih lanjut tentang kebijakan penggantian kunci kedaluwarsa di Redis, lihat How Redis Handles Expired Keys.
Solusi
Untuk memverifikasi konsistensi data, gunakan salah satu metode berikut:
Saat memeriksa kemungkinan loss data setelah sinkronisasi, jangan hanya mengandalkan statistik expires, karena mencakup data yang telah kedaluwarsa sehingga membuat nilai expires menjadi ukuran konsistensi yang tidak andal.
-
Untuk database sumber dan tujuan, gunakan jumlah
keysdan kurangi dengan jumlahexpiresuntuk mendapatkan jumlah kunci permanen. Jika selisih hasil antara kedua database sangat kecil, data dapat dianggap konsisten. -
Gunakan tool redis-full-check untuk verifikasi. Untuk informasi lebih lanjut, lihat Use the redis-full-check tool.
Bagaimana cara membuat jumlah kunci dalam output info keyspace tampak konsisten?
Kami menyarankan untuk membersihkan data Redis yang telah kedaluwarsa. Metode untuk database cloud dan database yang dikelola sendiri adalah sebagai berikut:
-
Tair (Redis OSS-Compatible): Masuk ke Konsol Tair (Redis OSS-Compatible) dan gunakan fitur Clear Data. Untuk ApsaraDB for Redis, buka kotak dialog Clear Data di Konsol, pilih tab Expired Data, pilih waktu eksekusi (Immediately atau Within Maintenance Window), lalu klik OK. Aksi ini menjalankan perintah SCAN untuk menghapus semua data kedaluwarsa sekaligus dari instans. Operasi ini tidak dapat dikembalikan, dan data yang dihapus tidak dapat dipulihkan.
-
Database Redis yang dikelola sendiri: Gunakan tool redis-full-check untuk menjalankan verifikasi. Tool ini mengeksekusi perintah seperti SCAN, yang memicu pembersihan data kedaluwarsa selama proses berlangsung.