Topik ini mencakup error umum dan solusinya untuk Tair (kompatibel dengan Redis).
Ikhtisar error
Kategori | Item error |
Exception Redis umum | |
redis-cli | |
Exception umum modus proxy | |
Skrip Lua dan transaksi | |
Klien Jedis | |
Klien Lettuce | |
Klien Redisson | |
Klien Spring Data Redis | |
Klien StackExchange.Redis | |
Klien Predis | |
Klien phpredis | |
Klien Go-redis | |
Klien node-redis |
Exception Redis umum
ERR illegal address
Penyebab kemungkinan: Alamat IP klien Anda tidak ditambahkan ke daftar putih instans Tair.
Solusi: Tambahkan alamat IP klien Anda ke daftar putih instans Tair. Untuk informasi lebih lanjut, lihat Lakukan diagnostik koneksi.
ERR Sentinel compatibility mode is disabled
Penyebab kemungkinan: Mode kompatibel Sentinel tidak diaktifkan untuk instans Tair.
Solusi: Aktifkan mode kompatibel Sentinel untuk instans di Konsol. Untuk informasi lebih lanjut, lihat Aktifkan mode kompatibel Sentinel.
ERR max number of clients reached
Penyebab kemungkinan: Jumlah maksimum koneksi ke instans Tair telah tercapai.
Solusi:
Periksa apakah terjadi kebocoran koneksi pada klien. Misalnya, pastikan fungsi
closedipanggil setelah penggunaan JedisPool pada klien Jedis.Periksa apakah sesi koneksi saat ini berjalan sebagaimana mestinya. Untuk informasi lebih lanjut, lihat Kelola sesi instans. Anda dapat menghentikan sesi atau meningkatkan konfigurasi instans untuk menambah jumlah maksimum koneksi ke instans.
NOAUTH
Penyebab kemungkinan: Autentikasi berbasis kata sandi dikonfigurasi untuk instans Tair, tetapi klien tidak memberikan kata sandi atau memberikan kata sandi yang salah.
Solusi: Gunakan username dan kata sandi yang benar untuk mengakses instans. Untuk informasi lebih lanjut, lihat Metode logon untuk instans.
Jika Anda menggunakan klien Lettuce versi 6.4.0.RELEASE hingga 6.4.1.RELEASE, error ini dapat terjadi meskipun Anda memberikan kata sandi yang benar. Masalah ini muncul ketika Lettuce menambahkan dukungan untuk CLIENT SETINFO dan telah diperbaiki di versi 6.4.2.RELEASE. Untuk informasi lebih lanjut, lihat redis/lettuce#3035.
Jika Anda mengalami masalah ini, Anda dapat secara manual mengalihkan protokol ke RESP2 atau meningkatkan klien ke Lettuce 6.4.2.RELEASE atau versi yang lebih baru. Jika Anda menggunakan klien Spring Data Redis, tingkatkan ke Spring Data Redis 3.4.2 atau versi yang lebih baru.
WRONGPASS invalid username-password pair
Penyebab kemungkinan: Kata sandi tidak valid.
Solusi: Gunakan username dan kata sandi akun yang benar untuk terhubung ke instans. Untuk informasi lebih lanjut, lihat Terhubung ke instans.
Jika mode kompatibel Sentinel diaktifkan untuk instans, rujuk topik Gunakan mode kompatibel Sentinel untuk terhubung ke instans.
ERR invalid password
Penyebab kemungkinan: Kata sandi tidak valid.
Solusi: Gunakan username dan kata sandi akun yang benar untuk terhubung ke instans. Untuk informasi lebih lanjut, lihat Terhubung ke instans.
Jika error ini dilaporkan di Data Management (DMS), penyebab kemungkinannya adalah kata sandi yang disimpan oleh DMS saat logon terakhir tidak cocok dengan kata sandi saat ini untuk instans tersebut. Di instance list DMS, temukan instans tersebut dan pilih More > Edit di kolom Actions. Kemudian, masukkan kata sandi baru di bidang Database Password dan coba lagi.
Connection reset by peer
Penyebab kemungkinan: Koneksi ditutup karena exception pada buffer klien.
Solusi: Periksa kode aplikasi atau sesuaikan ukuran buffer klien. Untuk informasi lebih lanjut, lihat bagian Unexpected end of stream.
UnknownHostException
Atau, error failed to connect: xxx.redis.rds.aliyuncs.com could not be resolved terjadi.
Penyebab kemungkinan: Klien tidak dapat melakukan resolusi nama domain instans Tair.
Solusi: Konfigurasikan server DNS dengan benar. Untuk informasi lebih lanjut, lihat Bagaimana cara memecahkan masalah koneksi yang disebabkan oleh kegagalan resolusi DNS?
OOM: Penggunaan memori > 'maxmemory'
Penyebab kemungkinan: Memori maksimum yang dikonfigurasi untuk instans Tair telah tercapai.
Jika instans Tair menggunakan arsitektur kluster, penggunaan memori pada shard data tertentu mungkin melebihi memori maksimum yang dikonfigurasi untuk shard data tersebut.
Solusi:
Jika penggunaan memori instans mencapai 100%, kami menyarankan Anda meningkatkan konfigurasi instans. Untuk informasi lebih lanjut, lihat Ubah konfigurasi instans.
Jika penggunaan memori pada satu shard data mencapai 100%, kemungkinan terdapat large key dalam instans. Anda dapat menggunakan fitur analisis key offline atau diagnostik instans untuk mengidentifikasi penyebabnya.
WRONGTYPE: Tipe data salah
Penyebab kemungkinan: Perintah tidak valid untuk tipe data kunci tersebut. Misalnya, menjalankan perintah HASH pada kunci String.
Solusi: Perbaiki kode atau perintah yang salah. Untuk informasi lebih lanjut, lihat Redis Commands.
ERR unknown command 'xxx'
Penyebab kemungkinan: Instans saat ini tidak mendukung perintah ini.
Error ERR unknown command 'WAIT' menunjukkan bahwa perintah WAIT tidak didukung oleh mode proxy pada arsitektur kluster. Anda harus menggunakan mode koneksi langsung.
Solusi: Periksa perintah yang didukung oleh versi instans saat ini. Untuk informasi lebih lanjut, lihat Dukungan dan batasan perintah untuk Tair (Edisi Perusahaan), Dukungan dan batasan perintah untuk Redis Edisi Open-Source, dan Batasan perintah untuk instans yang menggunakan arsitektur kluster atau pemisahan baca/tulis.
Kami menyarankan Anda meningkatkan instans ke versi minor terbaru untuk mendapatkan fitur baru dan stabilitas yang lebih baik. Untuk informasi lebih lanjut, lihat Tingkatkan versi minor dan versi proxy.
Command 'xxx' not supported
Penyebab kemungkinan: Perintah tertentu dari Tair dinonaktifkan di Alibaba Cloud, atau perintah-perintah ini ditentukan oleh #no_loose_disabled-commands. Untuk informasi lebih lanjut, lihat Perintah yang didukung oleh Redis Edisi Open-Source dan Nonaktifkan perintah berisiko tinggi.
Solusi: Hapus perintah yang ingin Anda jalankan dari daftar perintah yang dinonaktifkan yang ditentukan oleh #no_loose_disabled-commands.
NOPERM this user has no permissions to run the 'xxx'
Penyebab kemungkinan: Perintah tertentu dari Tair dinonaktifkan di Alibaba Cloud, atau perintah-perintah ini ditentukan oleh #no_loose_disabled-commands. Untuk informasi lebih lanjut, lihat Perintah yang didukung oleh Redis Edisi Open-Source dan Nonaktifkan perintah berisiko tinggi.
Solusi: Hapus perintah yang ingin Anda jalankan dari daftar perintah yang dinonaktifkan yang ditentukan oleh #no_loose_disabled-commands.
ERR FLUSHDB is not allowed in migrating mode
Penyebab kemungkinan: Saat jumlah shard data sedang berubah untuk instans kluster Tair cloud-native, perintah FLUSHDB dan FLUSHALL dinonaktifkan.
Solusi: Tunggu hingga perubahan selesai untuk instans kluster Tair cloud-native. Untuk informasi lebih lanjut, lihat Sesuaikan jumlah shard untuk instans.
CROSSSLOT: Kunci tidak berada dalam slot yang sama
Penyebab kemungkinan: Perintah yang melibatkan beberapa kunci lintas slot, seperti DEL, MSET, dan MGET, tidak didukung untuk instans kluster Tair dalam mode koneksi langsung.
Solusi:
Sebelum menjalankan perintah yang melibatkan beberapa kunci, gunakan perintah CLUSTER KEYSLOT untuk memastikan semua kunci berada dalam slot yang sama.
Ubah nama kunci dan terapkan hash tags untuk memastikan kunci yang terlibat dialokasikan dalam slot yang sama. Namun, penting untuk mencegah kesenjangan data saat menggunakan hash tags.
Ubah instans menjadi instans kluster dalam mode proxy yang mendukung perintah yang melibatkan beberapa kunci lintas slot, seperti DEL, MGET, dan MSET. Untuk informasi lebih lanjut, lihat Fitur node proxy.
Error instans read-only
Penyebab kemungkinan: Selama proses alih bencana master-replika, perubahan konfigurasi, atau pembaruan versi minor untuk instans Tair, terjadi koneksi sementara dan instans tetap dalam mode read-only hingga 30 detik.
Solusi: Tunggu hingga instans pulih. Tidak diperlukan operasi manual. Rancang mekanisme penanganan ulang koneksi dan exception untuk aplikasi Anda. Untuk informasi lebih lanjut, lihat Ubah konfigurasi instans.
Failed to connect to any host resolved for DNS name
Penyebab kemungkinan: Daftar putih tidak dikonfigurasi dengan benar.
Solusi: Tambahkan alamat IP klien ke daftar putih instans ECS. Untuk detailnya, lihat Konfigurasikan Daftar Putih IP.
Jika Anda mengakses instans ECS melalui jaringan publik, tambahkan alamat IP egress Anda ke daftar putihnya. Untuk menemukan alamat IP egress Anda, kunjungi https://cip.cc/.
Exception redis-cli
Connection reset by peer
Penyebab kemungkinan: Instans menggunakan arsitektur standar dan enkripsi TLS/SSL diaktifkan, tetapi Anda mencoba terhubung tanpa sertifikat.
Solusi:
Terhubung dengan sertifikat. Untuk informasi lebih lanjut, lihat Terhubung ke instans melalui koneksi terenkripsi TLS/SSL.
Jika Anda tidak perlu menggunakan enkripsi TLS/SSL, nonaktifkan enkripsi TLS dan coba lagi.
ERR must use ssl connection in ssl port
Penyebab kemungkinan: Instans menggunakan arsitektur kluster dan enkripsi TLS/SSL diaktifkan, tetapi Anda mencoba terhubung tanpa sertifikat.
Solusi:
Terhubung dengan sertifikat. Untuk informasi lebih lanjut, lihat Terhubung ke instans melalui koneksi terenkripsi TLS/SSL.
Jika Anda tidak perlu menggunakan enkripsi TLS/SSL, nonaktifkan enkripsi TLS dan coba lagi.
Exception proxy umum
ERR client IP is not in whitelist
Penyebab kemungkinan: Alamat IP klien Anda tidak ditambahkan ke daftar putih instans Tair.
Solusi: Tambahkan alamat IP klien Anda ke daftar putih instans Tair. Untuk informasi lebih lanjut, lihat Lakukan diagnostik koneksi.
NOWRITE: Tidak dapat menulis ke instans read-only
Atau, error NOREAD You can't read against a non-read redis terjadi.
Penyebab kemungkinan: Instans Anda memiliki pembayaran tertunda atau telah kedaluwarsa. Instans berada dalam status Locked.
Solusi: Tambahkan dana ke akun Anda atau perpanjang instans. Untuk informasi lebih lanjut, lihat Kedaluwarsa dan pembayaran tertunda.
ERR syntax error
Penyebab kemungkinan: Sintaks perintah salah. Misalnya, perintah memerlukan empat parameter tetapi hanya menerima tiga.
Solusi: Periksa sintaks perintah. Untuk informasi lebih lanjut, lihat Redis Commands.
ERR no such db node
Penyebab kemungkinan: Saat menjalankan perintah internal Tair, parameter db node yang ditentukan tidak valid.
Solusi: Tentukan parameter db node dengan benar. Nilai db node harus kurang dari jumlah shard data dalam instans. Untuk informasi lebih lanjut, lihat Perintah internal untuk instans dalam mode proxy.
ERR 'xxx' command keys must in same slot
Penyebab kemungkinan: Error ini terjadi ketika transaksi atau skrip mengakses kunci dari slot yang berbeda dalam instans kluster Tair.
Solusi: Ubah transaksi atau skrip tersebut. Anda dapat menggunakan perintah CLUSTER KEYSLOT untuk menanyakan slot tempat kunci yang diminta disimpan.
Instans kluster Tair menggunakan algoritma Cyclic Redundancy Check (CRC) untuk mendistribusikan kunci secara merata di berbagai slot. Jika Anda ingin menyimpan kunci dalam slot yang sama, Anda dapat menggunakan hash tags. Namun, hal ini dapat menyebabkan kesenjangan data. Lakukan dengan hati-hati.
EVAL/EVALSHA: Jumlah kunci harus positif
Penyebab kemungkinan: Tidak ada kunci yang ditentukan atau parameter numkeys diatur ke nilai kurang dari atau sama dengan 0 untuk perintah EVAL dan EVALSHA.
Solusi: Saat menggunakan perintah EVAL dan EVALSHA, Anda harus menentukan setidaknya satu kunci dan mengatur parameter numkeys ke nilai lebih besar dari 0. Untuk informasi lebih lanjut, lihat Penggunaan skrip Lua.
Terlalu banyak permintaan tertunda
Penyebab kemungkinan: Permintaan tertunda menumpuk di backend Tair karena klien menggunakan pipeline yang tidak valid.
Solusi: Kurangi jumlah permintaan yang dipipeline.
ERR redis temporary failure
Penyebab kemungkinan: Saat Anda terhubung ke node instans Tair, terjadi error timeout karena fluktuasi jaringan, koneksi berlebihan, alih bencana master-replika, atau kueri lambat yang sedang berlangsung.
Solusi: Tunggu hingga instans pulih. Tidak diperlukan operasi manual. Rancang mekanisme penanganan ulang koneksi dan exception untuk aplikasi Anda.
ERR redis temporary failure (ErrorCode 7002)
Penyebab kemungkinan: Saat Anda terhubung ke node instans Tair, terjadi error timeout karena perubahan konfigurasi instans atau alih bencana master-replika yang sedang berlangsung.
Solusi: Tunggu hingga instans pulih. Tidak diperlukan operasi manual. Rancang mekanisme penanganan ulang koneksi dan exception untuk aplikasi Anda.
Skrip Lua dan transaksi
NOSCRIPT: Tidak ada skrip yang cocok
Penyebab kemungkinan: Saat menjalankan perintah EVALSHA, skrip yang sesuai dengan nilai SHA1 belum di-cache ke instans Tair.
Solusi: Jalankan perintah EVAL atau SCRIPT LOAD untuk meng-cache skrip yang diperlukan ke instans Tair dan coba lagi. Untuk informasi lebih lanjut, lihat Tangani error NOSCRIPT.
BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.
Penyebab kemungkinan: Skrip Lua mengalami timeout.
Solusi: Jalankan perintah SCRIPT KILL untuk menghentikan eksekusi skrip atau tunggu hingga eksekusi selesai. Untuk informasi lebih lanjut, lihat Tangani timeout skrip Lua.
EVAL command not supported
Penyebab kemungkinan: Perintah terkait EVAL tidak dapat dijalankan.
Solusi: Perbarui instans Anda ke versi minor terbaru. Untuk informasi lebih lanjut, lihat Perbarui versi minor instans.
Keys for eval/evalsha must be in same slot
Solusi: Ubah skrip Lua tersebut. Anda dapat menanyakan slot tempat kunci berada dengan menjalankan perintah CLUSTER KEYSLOT. Untuk informasi lebih lanjut, lihat Batasan skrip Lua pada instans kluster.
ERR bad Lua script for Redis cluster
Penyebab kemungkinan: Error ini mungkin disebabkan oleh batasan node proxy pada skrip Lua.
Solusi: Tentukan semua kunci dalam array. Contoh: EVAL "return redis.call('mget', KEYS[1], KEYS[2])" 2 foo {foo}bar. Kunci tidak boleh diganti dengan variabel Lua. Untuk informasi lebih lanjut, lihat Batasan skrip Lua pada instans kluster.
EXECABORT: Transaksi dibuang
Penyebab kemungkinan: Perintah yang Anda jalankan dalam transaksi memiliki kesalahan sintaks atau kesalahan lainnya.
Solusi: Periksa logika kode Anda dan perbaiki kesalahan sintaks perintah tersebut.
Skrip tidak dapat dihentikan karena melibatkan operasi tulis
Penyebab kemungkinan: Operasi tulis yang terlibat dalam skrip Lua saat ini telah dilakukan. Dalam kasus ini, perintah SCRIPT KILL tidak dapat dijalankan.
Solusi: Temukan instans di Konsol dan klik restart di kolom Actions. Untuk informasi lebih lanjut, lihat Restart instans.
UNKILLABLE: Tidak dapat menghentikan skrip replikasi
Penyebab kemungkinan: Skrip Lua saat ini diteruskan oleh node master ke node replika yang sesuai. Dalam kasus ini, perintah SCRIPT KILL tidak dapat dijalankan.
Solusi: Temukan instans di Konsol dan klik restart di kolom Actions. Untuk informasi lebih lanjut, lihat Restart instans.
NOTBUSY
Penyebab kemungkinan: Tidak ada skrip Lua yang sedang dieksekusi.
Solusi: Tidak diperlukan operasi manual. Jangan menjalankan perintah SCRIPT KILL.
Klien Jedis
Kegagalan memperoleh sumber daya dari pool
Penyebab kemungkinan: Koneksi Jedis tidak dapat dipinjam dari JedisPool.
Saat parameter blockWhenExhausted diatur ke true, yang merupakan nilai default, klien menunggu beberapa milidetik yang ditentukan oleh parameter maxWaitMillis jika tidak ada koneksi yang tersedia dari JedisPool. Jika klien masih tidak dapat memperoleh koneksi Jedis yang tersedia setelah menunggu lama, exception berikut dilemparkan:
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool ... Caused by: java.util.NoSuchElementException: Timeout waiting for idle object at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:449)Saat parameter blockWhenExhausted diatur ke false, exception berikut dilemparkan jika tidak ada koneksi yang tersedia dari JedisPool:
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool ... Caused by: java.util.NoSuchElementException: Timeout waiting for idle object at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:449)
Solusi: Pertimbangkan aspek-aspek berikut untuk memecahkan masalah error ini:
Kebocoran koneksi
Secara default, maxTotal diatur ke 8. Kode berikut menunjukkan bahwa klien Jedis meminjam koneksi dari JedisPool sebanyak delapan kali tetapi tidak mengembalikan koneksi tersebut. Inilah sebabnya klien Jedis tidak dapat menjalankan perintah
jedisPool.getResource().ping()pada percobaan kesembilan untuk memperoleh koneksi lain dari JedisPool.GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379); // Klien meminjam koneksi dari JedisPool sebanyak delapan kali, tetapi tidak mengembalikan koneksi tersebut. for (int i = 0; i < 8; i++) { Jedis jedis = null; try { jedis = jedisPool.getResource(); jedis.ping(); } catch (Exception e) { logger.error(e.getMessage(), e); } } jedisPool.getResource().ping();Kode yang direkomendasikan:
Jedis jedis = null; try { jedis = jedisPool.getResource(); // Perintah yang ingin Anda jalankan. jedis.executeCommand() } catch (Exception e) { // Jika perintah melibatkan kunci, kami menyarankan Anda membuat konfigurasi untuk menampilkan kunci dalam log error. Dengan cara ini, Anda dapat menggunakan kunci untuk mengidentifikasi shard data tempat masalah terjadi. logger.error(e.getMessage(), e); } finally { // Klien tidak menutup koneksi yang dipinjam. Sebaliknya, klien mengembalikan koneksi ke JedisPool. if (jedis != null) jedis.close(); }Nilai kecil untuk parameter maxTotal
Saat sistem memiliki sejumlah besar operasi yang diproses secara konkuren, nilai kecil untuk parameter maxTotal dapat menyebabkan exception. Misalnya, rata-rata waktu eksekusi perintah sekitar 1 ms. Ini dihitung menggunakan rumus berikut:
Waktu yang dikonsumsi untuk meminjam atau mengembalikan sumber daya+ Waktu yang dikonsumsi Jedis untuk menjalankan perintah + Latensi jaringan. Jumlah kueri per detik (QPS) per koneksi sekitar 1.000, dan total QPS yang diharapkan adalah 50.000. Secara teori, Anda memerlukan nilai maxTotal sebesar 50 untuk mencapai QPS yang diharapkan sebesar 50.000. Nilai maxTotal diperoleh dengan membagi 50.000 dengan 1.000.Dalam kasus ini, Anda dapat menjalankan perintah berikut pada klien Anda untuk memperoleh jumlah koneksi klien. Anda dapat menyesuaikan nilai maxTotal berdasarkan nilai yang diperoleh.
netstat -an | grep 6379 | grep EST | wc -lPemblokiran koneksi
Saat koneksi ke instans Tair diblokir karena alasan seperti kueri lambat, semua koneksi menunggu dalam periode timeout yang ditentukan. Dalam kasus ini, saat sejumlah besar operasi diproses secara konkuren, error timeout dapat dilaporkan. Untuk informasi lebih lanjut, lihat java.net.SocketTimeoutException: connect timed out.
Koneksi ditolak
Saat Anda mencoba memperoleh koneksi dari JedisPool dan tidak ada koneksi yang tersedia, Jedis mencoba membuat koneksi Jedis. Namun, upaya koneksi ditolak dan exception dilemparkan. Contoh:
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool at redis.clients.util.Pool.getResource(Pool.java:50) at redis.clients.jedis.JedisPool.getResource(JedisPool.java:99) at TestAdmin.main(TestAdmin.java:14) Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused at redis.clients.jedis.Connection.connect(Connection.java:164) at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:80) at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1676) at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:87) at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:861) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363) at redis.clients.util.Pool.getResource(Pool.java:48) ... 2 more Caused by: java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:579) at redis.clients.jedis.Connection.connect(Connection.java:158) ... 9 moreat redis.clients.jedis.Connection.connect(Connection.java:158)menunjukkan bahwa Jedis mencoba membuat koneksi socket dan memanggil fungsiconnect, tetapi upaya koneksi ditolak. Kode sumber Jedis:socket.setSoLinger(true, 0); 158: socket.connect(new InetSocketAddress(host, port), connectionTimeout);Umumnya, untuk mengatasi masalah ini, Anda harus memeriksa apakah konfigurasi nama domain instans Tair sudah benar dan memeriksa koneksi jaringan dalam periode waktu yang sesuai.
java.net.SocketTimeoutException: connect timed out
Penyebab kemungkinan: Koneksi antara klien Anda dan instans Tair mengalami timeout.
Solusi: Rujuk topik Bagaimana cara memecahkan masalah koneksi di Tair?.
java.net.SocketTimeoutException: Read timed out
Penyebab kemungkinan: Panggilan API Jedis mengalami timeout karena koneksi jaringan tidak stabil, periode timeout baca/tulis yang singkat, kueri lambat, atau pemblokiran koneksi.
Solusi: Tingkatkan periode timeout atau lakukan diagnostik instans untuk memeriksa apakah terjadi masalah kinerja atau exception pada titik waktu yang sesuai.
Jika error ini terjadi di DMS, endpoint VPC atau port instans mungkin telah berubah. Di Konsol DMS, pada daftar database instance, klik kanan instans target dan pilih Edit Instance. Atur Entry Method ke Connection String Address, masukkan endpoint instans yang telah dimodifikasi di kotak teks Connection String Address, dan coba lagi.
No reachable node in cluster
Penyebab kemungkinan: JedisCluster tidak dapat diakses.
Solusi: Saat pertama kali klien Anda terhubung ke instans Tair, periksa apakah alamat IP klien telah ditambahkan ke daftar putih instans Tair. Jika ini bukan pertama kalinya Anda terhubung ke instans Tair, lakukan diagnostik instans untuk mengidentifikasi penyebabnya.
Caused by: java.lang.NumberFormatException: For input string: "6379@13028"
Penyebab kemungkinan: ClusterNodeInformationParser diperkenalkan di Jedis 2.8.0 dan versi sebelumnya untuk menguraikan output dari cluster slots. Namun, Redis open source telah mengubah tipe output tersebut. Inilah sebabnya error NumberFormatException dilaporkan.
Solusi: Perbarui klien Jedis Anda ke versi 2.9.0 atau yang lebih baru.
No more cluster attempts left
Penyebab kemungkinan: Panggilan API mengalami timeout dan lima upaya ulang juga gagal. Secara default, setelah panggilan API mengalami timeout, JedisCluster mencoba ulang lima kali.
Solusi: Tingkatkan periode timeout atau lakukan diagnostik instans.
Unexpected end of stream
Penyebab kemungkinan: Terjadi exception pada buffer klien Jedis. Anda dapat mempertimbangkan aspek-aspek berikut untuk memecahkan masalah error ini:
Beberapa thread berbagi satu koneksi
Umumnya, satu thread menggunakan satu koneksi Jedis. Kode berikut menunjukkan bahwa dua thread berbagi satu koneksi Jedis:
new Thread(new Runnable() { public void run() { for (int i = 0; i < 100; i++) { jedis.get("hello"); } } }).start(); new Thread(new Runnable() { public void run() { for (int i = 0; i < 100; i++) { jedis.hget("haskey", "f"); } } }).start();Untuk mencegah masalah ini dan memastikan keamanan thread, Anda dapat menggunakan JedisPool untuk mengelola koneksi Jedis.
Koneksi menganggur dalam waktu lama
Server menutup koneksi yang menganggur dalam waktu lama. Tanyakan pengaturan timeout instans dan pengaturan terkait JedisPool untuk menentukan apakah perlu memeriksa dan membersihkan koneksi yang menganggur dalam waktu lama secara berkala.
CatatanSecara default, Tair tidak menutup koneksi yang menganggur dalam waktu lama. Jika Anda mengubah nilai parameter timeout, error ini mungkin dilaporkan. Untuk informasi lebih lanjut, lihat Tentukan periode timeout untuk koneksi klien yang menganggur.
Solusi: Periksa apakah beberapa thread berbagi kode Jedis atau apakah server menutup koneksi yang menganggur dalam waktu lama.
java.lang.Long cannot be cast to java.util.List
Penyebab kemungkinan: Error ini dilaporkan jika koneksi Jedis yang sama dibagikan di antara beberapa thread. Hal ini karena Jedis sendiri tidak aman untuk thread dan tidak boleh digunakan secara konkuren di beberapa thread.
Solusi: Gunakan satu koneksi Jedis dalam satu thread. Untuk itu, Anda dapat menggunakan JedisPool.
Broken pipe (Write failed)
Penyebab kemungkinan: Setelah error timeout terjadi pada klien Jedis dalam mode koneksi tunggal dan klien menutup socket, Anda terus menulis data ke instans.
Solusi: Gunakan satu koneksi Jedis dalam satu thread. Untuk itu, Anda dapat menggunakan JedisPool.
Kunci berada dalam slot yang berbeda
Penyebab kemungkinan: JedisCluster melakukan operasi pada kunci yang berada dalam slot yang berbeda.
Solusi: Ubah kunci dengan menggunakan hash tags.
Anda juga dapat menggunakan mode proxy untuk menonaktifkan batasan arsitektur kluster.
Klien Lettuce
Connection to xxx not allowed. This partition is not known in the cluster view.
Penyebab kemungkinan: Secara default, validateClusterNodeMembership diatur ke true dan refreshOption diatur ke null untuk klien Lettuce. Setelah alamat routing instans Tair berubah, tabel rute tidak diperbarui karena refreshOption diatur ke null. Dalam kasus ini, error dilaporkan untuk validateClusterNodeMembership.
Solusi: Tentukan parameter refreshOption dan atur parameter validateClusterNodeMembership ke false. Untuk informasi lebih lanjut, lihat Lettuce.
io.lettuce.core.RedisConnectionException: Unable to connect xxx
Penyebab kemungkinan: Koneksi antara klien Anda dan instans Tair mengalami timeout.
Solusi: Rujuk topik Bagaimana cara memecahkan masalah koneksi di Tair?.
java.nio.channels.UnresolvedAddressException
Penyebab kemungkinan: Error ini kemungkinan besar disebabkan oleh versi Netty.
Solusi: Periksa dependensi Netty Anda dan tingkatkan ke versi yang lebih baru. Untuk informasi lebih lanjut, lihat spring-projects/spring-boot#14307.
ERR Unknown sentinel subcommand 'master'
Penyebab kemungkinan: Dalam mode Sentinel master-replika, klien Lettuce mengirim perintah Sentinel master/slave ke instans Tair. Namun, instans dalam mode kompatibel Sentinel hanya mendukung perintah Sentinel get-master-addr-by-name.
Solusi: Ubah kode Anda untuk beralih ke mode non-Sentinel. Tair menggunakan komponen ketersediaan tinggi internal. Anda tidak perlu menggunakan mode kompatibel Sentinel.
Error 'Unknown command' karena protokol RESP3 tidak didukung
Penyebab kemungkinan: Redis 6.0 dan versi yang lebih baru mendukung protokol RESP3. Anda dapat menjalankan perintah HELLO untuk mengalihkan koneksi ke versi protokol RESP yang diinginkan. Namun, beberapa instans versi sebelumnya tidak mendukung perintah HELLO, sehingga menyebabkan masalah kompatibilitas.
Solusi: Anda dapat mengonfigurasi program Anda untuk menggunakan protokol RESP2 saat mengakses instans Tair. Contoh:
client.setOptions(ClientOptions.builder()
.protocolVersion(ProtocolVersion.RESP2)
.build());Contoh saat Spring Data Redis dengan Lettuce digunakan sebagai klien Redis:
LettuceClientConfiguration lettuceClientConfiguration = LettuceClientConfiguration.builder().
clientOptions(ClientOptions.builder().protocolVersion(ProtocolVersion.RESP2).build()).build();
return new LettuceConnectionFactory(redisClusterConfiguration, lettuceClientConfiguration);Klien Redisson
org.redisson.client.RedisConnectionException: Unable to connect to Redis server xxx
Penyebab kemungkinan: Koneksi antara klien Anda dan instans Tair mengalami timeout.
Solusi: Rujuk topik Bagaimana cara memecahkan masalah koneksi di Tair?.
No enum constant org.redisson.cluster.ClusterNodeInfo.Flag.NOFAILOVER
Penyebab kemungkinan: Ini adalah bug yang dikenal di versi Redisson sebelumnya. Untuk detailnya, lihat redisson/redisson#2399.
Solusi: Perbarui klien Redisson Anda ke versi 3.11.6 atau yang lebih baru.
Klien Spring Data Redis
NOPERM this user has no permissions to run the 'config|get' command
Penyebab kemungkinan: Versi instans Anda ditampilkan sebagai Redis 7.0 di halaman Informasi Instans. Perintah CONFIG dinonaktifkan di instans Tair (kompatibel dengan Redis OSS) yang menjalankan Redis 7.0.
Saat aplikasi dimulai, Spring Data Redis menjalankan perintah CONFIG SET untuk mengatur secara dinamis parameter notify-keyspace-events dan mengaktifkan fitur KeyspaceEventMessageListener. Karena perintah CONFIG GET/SET dinonaktifkan, operasi ini gagal, menyebabkan error startup.
Solusi: Untuk mengatasi masalah ini, atur keyspaceNotificationsConfigParameter ke string kosong. Untuk kode lengkapnya, lihat SpringRedisTest.zip. Untuk informasi lebih lanjut, lihat Spring Data Redis.
@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP, keyspaceNotificationsConfigParameter = "")Selain itu, jika Anda menggunakan KeyExpirationListener, Anda harus mengatur keyspaceNotificationsConfigParameter ke string kosong di konstruktor.
public RedisKeyExpirationListener(RedisMessageListenerContainer redisMessageListenerContainer) {
super(redisMessageListenerContainer);
setKeyspaceNotificationsConfigParameter(""); // Penting
}Klien StackExchange.Redis
Multiple databases tidak didukung
Penyebab kemungkinan: Perintah SELECT tidak didukung untuk instans kluster.
Solusi: Atur parameter cluster_compat_enable ke 0 untuk menonaktifkan kompatibilitas dengan sintaks Redis Cluster open source. Kemudian, restart klien Anda dan coba lagi. Untuk informasi lebih lanjut, lihat Konfigurasikan parameter instans.
Klien Predis
Error while reading line from the server
Penyebab kemungkinan: Permintaan baca mengalami timeout. Mungkin sedang berlangsung kueri lambat.
Solusi: Tingkatkan periode timeout atau atur read_write_timeout ke 0 atau -1. Untuk informasi lebih lanjut, lihat Pertanyaan Predis.
Klien Phpredis
Cannot assign requested address
Penyebab kemungkinan: Klien terhubung ke instans Tair melalui koneksi singkat.
Solusi: Ubah metode koneksi dari connect ke pconnect, atau ubah parameter kernel tcp_max_tw_buckets pada instans ECS klien. Untuk informasi lebih lanjut, lihat Error "Cannot assign requested address".
redis protocol error, got ' ' as reply type byte
Penyebab kemungkinan: Bug pada versi phpredis yang sudah usang. Untuk detailnya, lihat phpredis/phpredis#1585.
Solusi: Tingkatkan phpredis ke versi terbaru.
php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution
Solusi: Konfigurasikan server DNS dengan benar. Untuk informasi selengkapnya, lihat Bagaimana cara memecahkan masalah koneksi yang disebabkan oleh kegagalan resolusi DNS?.
Kemungkinan penyebab: Klien tidak dapat melakukan resolusi nama domain instans Tair.
Klien Go-redis
panic: got 4 elements in cluster info address, expected 2 or 3
Penyebab kemungkinan: Anda menggunakan Redis versi 7.0 atau yang lebih baru dengan versi klien Go-redis yang tidak kompatibel. Lihat redis/go-redis#2085 untuk detailnya.
Solusi: Gunakan go-redis 9.0 atau yang lebih baru.
Klien Node-redis
Perintah SCAN berjalan tak henti atau tidak mengembalikan data
Penyebab kemungkinan: Perintah SCAN mungkin mengembalikan nilai kursor yang melebihi bilangan bulat aman maksimum JavaScript, Number.MAX_SAFE_INTEGER. Hal ini menyebabkan kursor tidak akurat dan loop tak henti. Untuk informasi lebih lanjut, lihat redis/node-redis#2561.
Solusi: Perbarui klien node-redis Anda ke versi 5.0.0 atau yang lebih baru.