node_redis : 2.7.1
redis : 3.2
platform : Amazon linux
deskripsi:
Saat snapshot redis terjadi, klien redis terputus. Klien menyambungkan kembali dan berlangganan kembali, namun, mereka tidak lagi menerima data. Ini dapat direproduksi dengan mengeluarkan perintah SAVE
melalui redis-cli.
JS
const redis = require('redis');
const redisClient = redis.createClient({
host: config.redisEndpoint,
port: config.redisPort,
});
redisClient.on('connect', () => {
console.log('Connected to Redis');
console.log('subscription_set:', redisClient.subscription_set);
});
redisClient.on('reconnecting', (stats) => {
console.log('Reconnecting to Redis', stats);
});
redisClient.on('error', (error) => {
console.log('Failed to connect to Redis: ', error);
});
redisClient.on('subscribe', (channel, count) => { // eslint-disable-line no-unused-vars
console.log('Subscribed to: ', channel, count);
});
redisClient.on('message', (channel, message) => { // eslint-disable-line no-unused-vars
console.log('Received from: ', channel, message);
});
redisClient.subscribe('test');
Log
Sambungan awal
info: Connected to Redis
info: subscription_set:
info: Subscribed to: test 1
Menerbitkan perintah SAVE di redis-cli
info: Error: Redis connection to 34.213.3.19:6379 failed - read ECONNRESET
info: Reconnecting to Redis delay=983, attempt=4, code=ECONNRESET, errno=ECONNRESET, syscall=connect, address=127.0.0.1, port=6379, total_retry_time=1118, times_connected=1
info: Connected to Redis
info: subscription_set: subscribe_test=test
info: Subscribed to: test 1
Pada titik inilah klien tidak akan lagi menerima data apa pun yang dipublikasikan ke pengujian saluran. Jika Anda memiliki pertanyaan atau memerlukan info lebih lanjut untuk mereproduksi, beri tahu saya.
@BridgeAR @iamjem Mungkin terkait dengan # 1249
Terima kasih atas penjelasan rinci Anda, namun saya belum dapat mereproduksinya. Ketika saya mengeluarkan SAVE
melalui redis-cli, koneksi tidak diatur ulang.
Ketika saya menghentikan server redis secara manual dan memulainya lagi, sepertinya saya menerima pesan dengan baik.
Saya telah menguji ini di Mac, akan mencoba mereproduksinya juga di Linux
Hmmm ... itu menarik. Itu terjadi dengan instalasi redis stok total yang dibangun dari sumber. Satu-satunya pilihan yang saya ubah adalah mengizinkan koneksi jarak jauh. Saya akan segera melihatnya dan melihat apakah saya dapat menemukan apa yang terjadi. @jodohgratis
@jdegger Saya tidak dapat melakukan repro secara lokal, hanya di AWS dalam kondisi yang sangat spesifik. Saya dapat membuat salinan kedua dari AMI ini dan memberikan kode yang memungkinkan Anda untuk mereproduksi tetapi tampaknya itu adalah sesuatu yang spesifik untuk dijalankan di AWS. Beri tahu saya jika Anda tertarik ... jika tidak, saya akan mengatakan lanjutkan dan tutup masalah ini
Oke, akhirnya bisa mereproduksi dengan andal. Ada beberapa persyaratan:
tcp-keepalive 0
Apa yang akan Anda lihat adalah bahwa setiap 2 jam (setidaknya bagi saya) adalah kesalahan ECONNRESET. Pada titik ini, soket tampaknya masih terbuka dalam redis tetapi mungkin proses node telah kehilangan referensi ke sana dan membuka soket baru? Semalam saya memiliki 1 klien yang terhubung per blok 2 jam ditambah proses yang sedang berjalan saat mengeluarkan CLIENT LIST
dari redis-cli.
Penting untuk diperhatikan bahwa semua klien berhasil tersambung kembali tetapi tidak menerima data. Saya memiliki firasat bahwa data sedang didorong keluar, tetapi ke koneksi lama bukan yang baru ... tapi itu benar-benar firasat.
Sekarang, saya tidak 100% yakin apakah ini bug node_redis atau sebenarnya bug dengan node, jadi jika ini adalah tempat yang salah untuk mengajukan, beri tahu saya. Saya akan senang untuk mencoba dan men-debug / melangkah tetapi memiliki waktu terbatas.
Perbaikannya adalah menetapkan tcp-keepalive 300
yang membuat koneksi tetap aktif ... tetapi ini terasa miring karena klien seharusnya dapat berhasil menyambung kembali.
@tokopedia
Kami juga menunjukkan bahwa kesalahan ECONNRESET terjadi setiap 2 jam. Tapi saya memeriksa tcp-keepalive, ternyata 300
CONFIG GET tcp-keepalive
1) "tcp-keepalive"
2) "300"
Komentar yang paling membantu
Oke, akhirnya bisa mereproduksi dengan andal. Ada beberapa persyaratan:
tcp-keepalive 0
Apa yang akan Anda lihat adalah bahwa setiap 2 jam (setidaknya bagi saya) adalah kesalahan ECONNRESET. Pada titik ini, soket tampaknya masih terbuka dalam redis tetapi mungkin proses node telah kehilangan referensi ke sana dan membuka soket baru? Semalam saya memiliki 1 klien yang terhubung per blok 2 jam ditambah proses yang sedang berjalan saat mengeluarkan
CLIENT LIST
dari redis-cli.Penting untuk diperhatikan bahwa semua klien berhasil tersambung kembali tetapi tidak menerima data. Saya memiliki firasat bahwa data sedang didorong keluar, tetapi ke koneksi lama bukan yang baru ... tapi itu benar-benar firasat.
Sekarang, saya tidak 100% yakin apakah ini bug node_redis atau sebenarnya bug dengan node, jadi jika ini adalah tempat yang salah untuk mengajukan, beri tahu saya. Saya akan senang untuk mencoba dan men-debug / melangkah tetapi memiliki waktu terbatas.
Perbaikannya adalah menetapkan
tcp-keepalive 300
yang membuat koneksi tetap aktif ... tetapi ini terasa miring karena klien seharusnya dapat berhasil menyambung kembali.