Node-redis: 재 μ—°κ²° ν›„ ꡬ독이 데이터λ₯Όλ°›μ§€ λͺ»ν•¨

에 λ§Œλ“  2017λ…„ 07μ›” 05일  Β·  6μ½”λ©˜νŠΈ  Β·  좜처: NodeRedis/node-redis

node_redis : 2.7.1
redis : 3.2
ν”Œλž«νΌ : μ•„λ§ˆμ‘΄ λ¦¬λˆ…μŠ€
기술:
redis의 μŠ€λƒ… 샷이 λ°œμƒν•˜λ©΄ redis ν΄λΌμ΄μ–ΈνŠΈμ˜ 연결이 λŠμ–΄μ§‘λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” λ‹€μ‹œ μ—°κ²°ν•˜κ³  λ‹€μ‹œ κ΅¬λ…ν•˜μ§€λ§Œ 더 이상 데이터λ₯Ό μˆ˜μ‹ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. redis-cliλ₯Ό 톡해 SAVE λͺ…령을 μ‹€ν–‰ν•˜μ—¬ μž¬ν˜„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

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');

둜그

초기 μ—°κ²°

info: Connected to Redis
info: subscription_set:
info: Subscribed to:  test 1

redis-cliμ—μ„œ SAVE λͺ…λ Ή μ‹€ν–‰

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

이 μ‹œμ μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈλŠ” 더 이상 채널 ν…ŒμŠ€νŠΈμ— κ²Œμ‹œ 된 데이터λ₯Ό μˆ˜μ‹ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 질문이 μžˆκ±°λ‚˜ μž¬ν˜„μ„ μœ„ν•΄ μΆ”κ°€ 정보가 ν•„μš”ν•˜λ©΄ μ•Œλ €μ£Όμ„Έμš”.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ’‹μ•„, λ“œλ””μ–΄ μ•ˆμ •μ μœΌλ‘œ μž¬ν˜„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λͺ‡ 가지 μš”κ΅¬ 사항이 μžˆμŠ΅λ‹ˆλ‹€.

  • redis 3.2.0- tcp-keepalive 0 μ„€μ •ν•΄μ•Όν•©λ‹ˆλ‹€.
  • 채널 μ„€μ •
  • μ—°κ²°ν•  λ…Έλ“œ 슀크립트 ꡬ성 및 채널 ꡬ독
  • 2 μ‹œκ°„ 1 λΆ„ κΈ°λ‹€λ¦½λ‹ˆλ‹€

당신이 보게 될 것은 (적어도 λ‚˜λ₯Ό μœ„ν•΄) 2 μ‹œκ°„λ§ˆλ‹€ ECONNRESET 였λ₯˜λΌλŠ” κ²ƒμž…λ‹ˆλ‹€. 이 μ‹œμ μ—μ„œ μ†ŒμΌ“μ€ μ—¬μ „νžˆ ​​redisμ—μ„œ μ—΄λ €μžˆλŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ λ…Έλ“œ ν”„λ‘œμ„ΈμŠ€κ°€ 그것에 λŒ€ν•œ μ°Έμ‘°λ₯Ό μžƒκ³  μƒˆ μ†ŒμΌ“μ„ μ—΄μ—ˆμ„κΉŒμš”? λ°€μƒˆ 2 μ‹œκ°„ 블둝 λ‹Ή 1 개의 ν΄λΌμ΄μ–ΈνŠΈκ°€ μ—°κ²°λ˜μ—ˆκ³  redis-cliμ—μ„œ CLIENT LIST λ₯Ό λ°œν–‰ ν•  λ•Œ ν˜„μž¬ 싀행쀑인 ν”„λ‘œμ„ΈμŠ€κ°€ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

ν΄λΌμ΄μ–ΈνŠΈκ°€ λͺ¨λ‘ μ„±κ³΅μ μœΌλ‘œ λ‹€μ‹œ μ—°κ²°λ˜μ—ˆμ§€λ§Œ 데이터λ₯Όλ°›μ§€ λͺ»ν–ˆλ‹€λŠ” 점에 μœ μ˜ν•΄μ•Όν•©λ‹ˆλ‹€. λ‚˜λŠ” 데이터가 λ°€λ € λ‚˜κ³  μžˆλ‹€λŠ” 직감이 μžˆμ§€λ§Œ μƒˆλ‘œμš΄ 연결이 μ•„λ‹Œ 이전 연결에 λŒ€ν•œ μ§κ°μž…λ‹ˆλ‹€.ν•˜μ§€λ§Œ 그것은 μ™„μ „νžˆ μ§κ°μž…λ‹ˆλ‹€.

자, 이것이 node_redis 버그인지 λ˜λŠ” μ‹€μ œλ‘œ node의 버그인지 100 % ν™•μ‹ ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€. λ§Œμ•½ 이것이 잘λͺ»λœ 파일 μž₯μ†ŒλΌλ©΄ μ•Œλ €μ£Όμ„Έμš”. μ‹œλ„ν•˜κ³  디버그 / λ‹¨κ³„μ μœΌλ‘œ μ§„ν–‰ν•˜λŠ” 것이 μ’‹μ§€λ§Œ μ‹œκ°„μ΄ μ œν•œλ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

μˆ˜μ • 사항은 연결을 ν™œμ„± μƒνƒœλ‘œ μœ μ§€ν•˜λŠ” tcp-keepalive 300 ν•˜λŠ” κ²ƒμ΄μ—ˆμ§€λ§Œ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„±κ³΅μ μœΌλ‘œ λ‹€μ‹œ μ—°κ²°ν•  수 μžˆμ–΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— λΆˆμ•ˆμ •ν•œ λŠλ‚Œμ΄ λ“­λ‹ˆλ‹€.

λͺ¨λ“  6 λŒ“κΈ€

@BridgeAR @iamjem # 1249와 κ΄€λ ¨μ΄μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

μžμ„Έν•œ μ„€λͺ…을 ν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 아직 μž¬ν˜„ ν•  수 μ—†μŠ΅λ‹ˆλ‹€. redis-cliλ₯Ό 톡해 SAVE λ₯Ό λ°œν–‰ν•˜λ©΄ 연결이 μž¬μ„€μ •λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

redis μ„œλ²„λ₯Ό μˆ˜λ™μœΌλ‘œ μ€‘μ§€ν•˜κ³  λ‹€μ‹œ μ‹œμž‘ν•˜λ©΄ λ©”μ‹œμ§€κ°€ μ œλŒ€λ‘œ μˆ˜μ‹ λ˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 이것을 Macμ—μ„œ ν…ŒμŠ€νŠΈν•˜κ³  있으며 Linuxμ—μ„œλ„ μž¬ν˜„ν•˜λ €κ³  λ…Έλ ₯ν•  κ²ƒμž…λ‹ˆλ‹€.

음 ... ν₯λ―Έ λ‘­κ΅°μš”. μ†ŒμŠ€μ—μ„œ λΉŒλ“œ 된 μ™„μ „ν•œ 재고 redis μ„€μΉ˜λ‘œ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. λ‚΄κ°€ λ³€κ²½ ν•œ μœ μΌν•œ μ˜΅μ…˜μ€ 원격 연결을 ν—ˆμš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 곧 μ‚΄νŽ΄λ³΄κ³  무슨 일인지 μ•Œμ•„λ‚Ό 수 μžˆλŠ”μ§€ μ•Œμ•„ λ³Όκ²Œμš”. @jdegger

@jdegger μ €λŠ” λ‘œμ»¬μ—μ„œ μž¬ν˜„ ν•  수 μ—†μœΌλ©° 맀우 ꡬ체적인 쑰건 ν•˜μ—μ„œ 만 AWSμ—μ„œλ§Œ κ°€λŠ₯ν•©λ‹ˆλ‹€. 이 AMI의 두 번째 볡사본을 μƒμ„±ν•˜κ³  μž¬ν˜„ ν•  μˆ˜μžˆλŠ” μ½”λ“œλ₯Ό 제곡 ν•  수 μžˆμ§€λ§Œ AWSμ—μ„œ μ‹€ν–‰ν•˜λŠ” 것과 κ΄€λ ¨λœ 것 κ°™μŠ΅λ‹ˆλ‹€. 관심이 μžˆμœΌμ‹œλ©΄ μ•Œλ €μ£Όμ„Έμš” ... 그렇지 μ•ŠμœΌλ©΄ κ³„μ†ν•΄μ„œ 문제λ₯Ό μ’…λ£Œν•˜κ² μŠ΅λ‹ˆλ‹€.

μ’‹μ•„, λ“œλ””μ–΄ μ•ˆμ •μ μœΌλ‘œ μž¬ν˜„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λͺ‡ 가지 μš”κ΅¬ 사항이 μžˆμŠ΅λ‹ˆλ‹€.

  • redis 3.2.0- tcp-keepalive 0 μ„€μ •ν•΄μ•Όν•©λ‹ˆλ‹€.
  • 채널 μ„€μ •
  • μ—°κ²°ν•  λ…Έλ“œ 슀크립트 ꡬ성 및 채널 ꡬ독
  • 2 μ‹œκ°„ 1 λΆ„ κΈ°λ‹€λ¦½λ‹ˆλ‹€

당신이 보게 될 것은 (적어도 λ‚˜λ₯Ό μœ„ν•΄) 2 μ‹œκ°„λ§ˆλ‹€ ECONNRESET 였λ₯˜λΌλŠ” κ²ƒμž…λ‹ˆλ‹€. 이 μ‹œμ μ—μ„œ μ†ŒμΌ“μ€ μ—¬μ „νžˆ ​​redisμ—μ„œ μ—΄λ €μžˆλŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ λ…Έλ“œ ν”„λ‘œμ„ΈμŠ€κ°€ 그것에 λŒ€ν•œ μ°Έμ‘°λ₯Ό μžƒκ³  μƒˆ μ†ŒμΌ“μ„ μ—΄μ—ˆμ„κΉŒμš”? λ°€μƒˆ 2 μ‹œκ°„ 블둝 λ‹Ή 1 개의 ν΄λΌμ΄μ–ΈνŠΈκ°€ μ—°κ²°λ˜μ—ˆκ³  redis-cliμ—μ„œ CLIENT LIST λ₯Ό λ°œν–‰ ν•  λ•Œ ν˜„μž¬ 싀행쀑인 ν”„λ‘œμ„ΈμŠ€κ°€ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

ν΄λΌμ΄μ–ΈνŠΈκ°€ λͺ¨λ‘ μ„±κ³΅μ μœΌλ‘œ λ‹€μ‹œ μ—°κ²°λ˜μ—ˆμ§€λ§Œ 데이터λ₯Όλ°›μ§€ λͺ»ν–ˆλ‹€λŠ” 점에 μœ μ˜ν•΄μ•Όν•©λ‹ˆλ‹€. λ‚˜λŠ” 데이터가 λ°€λ € λ‚˜κ³  μžˆλ‹€λŠ” 직감이 μžˆμ§€λ§Œ μƒˆλ‘œμš΄ 연결이 μ•„λ‹Œ 이전 연결에 λŒ€ν•œ μ§κ°μž…λ‹ˆλ‹€.ν•˜μ§€λ§Œ 그것은 μ™„μ „νžˆ μ§κ°μž…λ‹ˆλ‹€.

자, 이것이 node_redis 버그인지 λ˜λŠ” μ‹€μ œλ‘œ node의 버그인지 100 % ν™•μ‹ ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€. λ§Œμ•½ 이것이 잘λͺ»λœ 파일 μž₯μ†ŒλΌλ©΄ μ•Œλ €μ£Όμ„Έμš”. μ‹œλ„ν•˜κ³  디버그 / λ‹¨κ³„μ μœΌλ‘œ μ§„ν–‰ν•˜λŠ” 것이 μ’‹μ§€λ§Œ μ‹œκ°„μ΄ μ œν•œλ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

μˆ˜μ • 사항은 연결을 ν™œμ„± μƒνƒœλ‘œ μœ μ§€ν•˜λŠ” tcp-keepalive 300 ν•˜λŠ” κ²ƒμ΄μ—ˆμ§€λ§Œ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„±κ³΅μ μœΌλ‘œ λ‹€μ‹œ μ—°κ²°ν•  수 μžˆμ–΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— λΆˆμ•ˆμ •ν•œ λŠλ‚Œμ΄ λ“­λ‹ˆλ‹€.

ν—‰

λ˜ν•œ ECONNRESET 였λ₯˜κ°€ 2 μ‹œκ°„λ§ˆλ‹€ λ°œμƒ 함을 λ³΄μ—¬μ€λ‹ˆλ‹€. ν•˜μ§€λ§Œ tcp-keepaliveλ₯Ό ν™•μΈν–ˆλŠ”λ° 300μž…λ‹ˆλ‹€.

CONFIG GET tcp-keepalive
1) "tcp-keepalive"
2) "300"
이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰

κ΄€λ ¨ 문제

Mickael-van-der-Beek picture Mickael-van-der-Beek  Β·  6μ½”λ©˜νŠΈ

Alchemystic picture Alchemystic  Β·  6μ½”λ©˜νŠΈ

b96705008 picture b96705008  Β·  7μ½”λ©˜νŠΈ

betimer picture betimer  Β·  5μ½”λ©˜νŠΈ

id0Sch picture id0Sch  Β·  4μ½”λ©˜νŠΈ